第16章 从实验走向可维护的检索系统
实验结束时,系统已经能解析文档、建立索引、检索、摘录,并处理更新、删除与撤权。把它用于生产仍需要更多部件。扩展的正确顺序,应围绕已经识别的契约补齐能力,而不是先把 SQLite 换成多个服务,再重新寻找一致性定义。
接入层负责事实来源
连接器需要稳定文档身份、可比较版本、删除事件和明确策略来源。拉取失败不能自动解释成源文档已删除;短暂没有权限读取,也不等于应在其他系统中公开旧缓存。应保存同步水位和失败原因,让维护者区分未到达、解析失败、已撤权与已删除。
复杂格式解析应产生带版本的规范投影和原始位置映射。PDF 页码、表格单元格与网页段落无法凭一个字符坐标通吃。新增解析器时,先让引用可以回到源对象,再测召回;否则更好的排名只会更快找到无法核查的文字。
索引迁移需要完整版本
编码器、tokenizer、池化、查询指令和切分配置都属于索引契约。大规模迁移可以并行建立新索引,完成数据校验和权限同步,再切换读取版本;旧索引保留窗口必须服从删除与撤权要求。切换后回滚,也不能把已删除文档和旧 ACL 一起复活。
若使用近似近邻索引,要观察过滤后召回是否下降,以及权限变更多久影响候选。外部向量服务的过滤语法、候选深度和一致性不同,不能用“支持 metadata filter”替代真实撤权实验。每种部署形态都应重跑缓存命中再撤权的反例。
观察行为,而不是收集全部原文
可记录投影版本、事件版本、各通道候选数量、过滤后数量、引用失效原因、拒答次数与写事务失败。原始查询和正文可能包含敏感信息,应按实际权限与保留策略处理;调试日志不应成为绕过检索 ACL 的另一套知识库。
引用失效应区分内容换版、策略换版、文档删除和片段不一致。把它们统一报成“没有答案”,会掩盖索引损坏;把完整原文放进错误日志,又可能扩大泄露面。维护接口与终端回答应具有不同的可观察细节。
发布前保留可复查材料
一次可追查发布至少包含源码提交、语料清单、编码器指纹、评估报告与状态迁移测试结果。书的发布也遵循这个原则:EPUB、在线阅读和实验 ZIP 来自同一次构建,校验文件与 Release 使用同一份产物。只改交付记录不会自动重建电子书,避免内容相同却反复产生不同二进制文件。
生产服务还需要认证、访问审计、容量规划、备份恢复和物理删除策略。本书没有实现这些设施,也没有高可用或侧信道审计结论。将它们逐项加入验收,比在文档末尾笼统写“注意安全”更有行动价值。
最终可以用四个问题检查系统:这段证据来自哪个投影版本,当前用户为什么有权读,原文如何被重新定位,变化发生后旧证据如何失效。模型、数据库与部署平台都可以替换,但这些答案应当始终具体、可运行、可反驳。