知识库更换切片策略后检索为空:索引重建如何平滑过渡
一个运维团队决定把知识库的切片方式从固定长度切换为按段落结构切分。原因合理固定长度经常把一个完整条款切成两半检索时召回的片段缺少上下文模型基于残缺片段生成的回答经常答非所问。切换计划看起来也直接——停掉旧索引用新策略重新切片、生成向量、构建新索引然后切回线上。但重建过程比预期长了很多三万篇文档的重新切片和向量生成跑了将近四个小时。这段时间里用户提问大量返回未找到相关信息智能体要么直接拒答要么在没有知识依据的情况下硬编答案。重建完成后新索引上线但部分查询的召回结果和旧索引差异明显几条之前能答对的问题反而答错了。更麻烦的是重建期间有用户提交了新的知识文档并对旧文档做了修改这些变更没有进入新索引切流后新索引缺少这部分内容。排查时团队发现问题的核心不在切片策略本身——新策略在整体召回质量上预期优于旧的问题出在切换过程缺少过渡管理。旧索引在重建开始时就被标记为下线新索引在构建完成前不可查询中间这段时间检索服务停摆。团队原本计划在低峰期完成重建但四个小时的窗口远超预期低峰期很快过去高峰期用户开始提问检索服务还在重建中。重建期间的知识库变更没有同步到新索引导致新索引上线时已经落后于当前知识库状态。新索引上线后团队也没有做结果一致性校验直接全量切换导致部分查询的行为发生了不可预期的变化。很多团队遇到这类问题习惯把索引重建当作纯粹的数据操作重建完替换掉旧文件就行。这种想法忽略了检索服务是在线服务任何中断都会直接影响用户。也有团队尝试在重建期间保留旧索引继续提供服务重建完成后一次性切换到新索引但这种做法缺少切换前的结果校验新索引的召回质量在真实流量下是否达标缺乏依据。还有团队把重建安排在凌晨认为低峰期不会有用户受到影响但知识库规模一大重建时间可能跨越多个时段凌晨的低峰窗口不一定够用。问题可以从三个方面拆解。一类是旧索引下线与新索引上线之间存在空窗。索引重建需要先对全量文档重新切片、生成向量、构建索引文件这个过程可能持续数小时。如果旧索引在重建开始时就下线那么从重建开始到新索引上线之间检索服务处于不可用状态。空窗期的长短取决于文档规模和向量生成速度文档越多空窗越长对在线服务的影响越大。有些团队试图通过缩小重建批次来缩短空窗但批次太小又会导致索引碎片化反而影响召回质量。另一类是重建期间知识库变更未同步。知识库不是静态的——重建期间会有新文档入库、旧文档修改和过期文档删除。如果新索引的构建基于重建开始时的快照那么构建期间发生的变更不会进入新索引。新索引上线时已经落后于知识库的当前状态用户提问时检索不到最近新增或修改的内容导致回答基于过时信息。这类问题在重建窗口越长、知识库变更越频繁的场景下越突出。还有一类是切片策略变更导致召回结果差异。不同的切片策略对同一篇文档会产生不同的片段划分同一段落在新旧策略下可能被切成不同的粒度和边界。这意味着同一个查询在新旧索引中召回的片段不同模型基于不同片段生成的回答可能不同。新策略在整体上可能优于旧策略但在某些具体查询上可能反而不如旧策略——比如某个查询在旧策略下刚好召回了一个完整条款在新策略下这个条款被拆分后只召回了其中一部分。如果不做结果一致性校验就全量切换这类回退案例会被用户直接遇到。针对切片策略变更和索引重建期间的服务连续性问题青山不语AI工作室将「双索引重建过渡与检索降级」纳入「知识时效与版本优先管理」框架通过一致性快照、增量追平、质量校验、灰度切流和可回滚机制控制索引变更风险。起始环节是一致性快照与版本水位。重建开始前系统对知识库当前状态打一个一致性快照记录此刻所有文档的版本号、内容哈希和切片映射关系。快照是新索引构建的基准——新索引基于这份快照中的文档集合进行切片和向量生成。同时系统建立一个版本水位线标记知识库在快照时刻所处的版本位置。一致性快照、版本水位线建立和增量日志启动必须作为一次原子操作同时完成——如果三者分步启动快照已经打好但增量日志尚未开始接收事件的间隙内发生的知识库变更不会被记录新索引将永久缺少这部分内容。原子启动确保从快照时刻起的所有变更要么全部进入增量日志、要么全部被快照覆盖不存在遗漏窗口。重建期间每一次知识库变更——新增、修改、删除——都生成一条增量事件事件携带变更类型、文档标识、变更前后版本号和时间戳按顺序写入增量日志。版本水位线的作用是让系统随时知道新索引基于哪个版本构建当前知识库已经推进到哪个版本两者之间还差多少增量需要追平。第二环节是双索引并行与增量追平。新索引的构建不依赖旧索引下线而是在旧索引继续提供在线服务的同时在独立的资源上基于一致性快照构建。旧索引保持读写能力用户查询不受影响同时旧索引继续接收知识库变更并实时更新。新索引全量构建完成后系统开始追平重建期间积累的增量事件——按增量日志中的顺序把新增文档切片并入新索引修改文档的旧片段删除后重新切片并入删除文档的片段从新索引中移除。追平完成后新索引的版本水位线推进到当前知识库版本两者一致。如果追平期间又有新的变更产生系统设定一个明确的切换水位作为追平目标通过版本屏障确认屏障前的所有增量事件已全部应用到新索引——屏障之后到达的事件不阻塞当前切流可以在切流后继续追平。只有当版本屏障前的事件全部确认应用、新索引版本水位达到切换水位时才进入下一步校验。第三个环节是结果一致性校验。新索引切流前系统用一批标准查询集对两套索引分别检索比对结果。标准查询集来自历史真实用户问题的采样覆盖高频问题、长尾问题和已知边界问题。比对维度不止于召回片段的重合度还包括四个层面证据命中——两套索引召回的片段是否指向同一篇文档的同一部分有没有新索引丢失了关键证据排序差异——同一段落在新旧索引中的排序位置是否大幅偏移影响模型对信息优先级的判断片段完整性——新策略下召回的片段是否保留了完整的语义边界有没有把一个条款拆成两半导致上下文缺失最终回答质量——基于新旧索引召回结果分别生成回答比对回答的事实准确性和内容完整度。新策略在整体上可能优于旧策略但校验的目的是发现局部回退——如果某些查询在新索引下回答质量下降需要调整切片参数或补充索引配置后再校验而不是强行切换。第四个环节是双索引查询合并与冲突仲裁。在灰度切流的过渡期部分查询会同时命中新旧两套索引两套索引返回的片段可能重叠也可能冲突。系统需要对双索引查询结果做合并处理先按文档标识和片段位置去重避免同一片段被重复返回然后统一重排把两套索引的召回片段放在同一个排序模型下重新评分而不是各自排序后简单拼接当新旧索引对同一文档返回了不同版本的片段时由确定性版本规则仲裁——版本水位更高的片段优先版本水位更低的片段判定为失效版本直接从结果集中剔除不进入模型上下文。版本有效性由版本规则在检索层确定不交给模型在生成回答时自行判断哪个版本有效——模型不具备版本判定能力把版本选择交给模型会导致同一问题在不同时刻得到基于不同版本的回答。冲突仲裁确保过渡期内用户不会同时收到新旧两个版本互相矛盾的信息。第五个环节是灰度切流与回滚。一致性校验通过后系统开始将在线流量从旧索引逐步切换到新索引。切换按比例分批进行首批切流比例和后续扩量步长按业务风险确定——回答错误影响面大的业务从更小的比例起步、以更保守的步长扩量回答错误影响面小的业务可以以更大的比例起步。系统监控每批切流查询的召回质量、响应延迟和用户反馈指标。指标正常则按既定步长扩大新索引的流量比例异常则暂停切换把流量回退到旧索引。全部流量切换完成后进入回滚观察期——旧索引不立即删除而是继续接收知识库变更同步保持与当前知识库版本一致。这样如果在全量运行后发现之前校验未覆盖的问题系统可以把流量切回一个仍然可用的旧索引而不是一套已经过期的索引。观察期结束后旧索引的资源才正式释放。回滚观察期内旧索引持续同步是整个过渡机制中容易被忽略但关键的一环——没有同步的旧索引不能作为回滚目标切回去等于切回一个过期版本。索引重建的核心矛盾是索引质量需要持续优化和检索服务不能长时间中断之间的冲突。一致性快照让重建基于一个明确的基准版本增量追平让新索引在切流前追上知识库的当前状态结果校验让切换风险在事前被发现双索引查询合并让过渡期不产生矛盾结果灰度切流与回滚让变更可控可逆。在我看来这套机制的投入和知识库的变更频率有关知识库内容相对固定、很少调整切片策略时一次性停机重建在影响可控的前提下可以接受但当知识库规模持续增长、切片策略需要迭代优化时没有过渡管理的重建每次都会制造服务中断窗口和内容滞后。判断要不要建这套机制看的不是文档数量多少而是索引重建的频率和检索服务对在线业务的关键程度。