RAG 知识库更新后还答旧内容?文档版本与删除同步排查指南
2026-09-11 · 约 9 分钟阅读
把产品说明换成新文件,知识库助手却继续引用旧规则;删除一份内部资料后,回答中仍然出现旧片段。遇到这类问题,不应直接认定大模型“记住了错误答案”。先检查数据从原始文档到检索结果、缓存和对话上下文的完整路径,通常更有助于定位原因。
本文讨论应用侧的数据更新方法,不依赖特定向量数据库或模型版本,也不声称本地删除可以证明外部服务已删除其留存副本。
一、为文档建立稳定身份
建议把文档标识、修订标识和片段标识分开。文档标识回答“这是哪份资料”,修订标识回答“这是哪次更新”,片段标识回答“这是该修订中的哪一段”。不要仅用文件名作为身份,因为重命名不一定代表内容变化,同名上传也不一定代表同一份资料。
每个检索片段应关联来源、租户、修订状态和有效性。业务服务再维护一份权威文档目录,记录当前生效修订。这样即便旧片段暂时还存在于索引里,也有依据判断它是否允许进入模型上下文。
二、先完成新索引,再切换生效版本
可以把更新设计为“接收文档—解析—切块—生成向量—写入索引—校验—切换生效修订”。其中任一步失败,新修订都不应被误标为完整可用。若文档已经失效,则不能为了保持服务连续性而默认继续提供旧规则,应允许暂时拒答或转人工。
切换前检查片段是否齐全、元数据是否一致、代表性问题是否能检索到正确来源。切换后再安排旧片段清理,避免一边删除旧索引、一边生成新向量,导致用户在中间状态得到混合内容。
这里的“切换”是一种设计目标,不代表所有存储系统都支持跨库原子操作。跨系统实现时,需要用版本过滤、状态检查和补偿任务处理不一致窗口。
三、在检索出口过滤旧修订
下面的 Python 示例演示一道候选片段过滤规则。目录中的修订号和租户都由服务端可信数据提供,不能使用模型输出或客户端自报信息替代鉴权。示例只验证本地逻辑,不执行真实向量检索。
def visible_chunks(chunks, catalog, tenant):
visible = []
for chunk in chunks:
doc = catalog.get(chunk["doc_id"])
if not doc or doc["deleted"]:
continue
if doc["tenant"] != tenant or chunk["tenant"] != tenant:
continue
if chunk["revision"] == doc["active_revision"]:
visible.append(chunk)
return visible
catalog = {"manual": {"deleted": False, "tenant": "demo", "active_revision": "new"}}
chunks = [{"doc_id": "manual", "tenant": "demo", "revision": "old"}]
assert visible_chunks(chunks, catalog, "demo") == []
生产系统还应在检索入口施加权限限制,并处理目录读取失败。不能因为过滤后没有结果,就绕过规则把旧片段重新放回上下文。正确的降级是说明缺少有效资料,而不是悄悄使用已失效文档。
四、删除需要覆盖的不只是向量索引
为删除操作生成可追踪任务,列出原文件、解析文本、片段索引、关键词索引、答案缓存和派生摘要等清理对象。先把文档标记为不可检索,再执行物理清理;对失败步骤保留重试记录和告警,不让“接口返回成功”掩盖未完成工作。
- 检索层:能否再搜到被删除的片段?
- 缓存层:旧答案是否携带该文档的依赖关系?
- 对话层:先前消息是否仍把旧内容传给模型?
- 外部层:上传文件和供应商留存是否有独立管理入口?
备份、审计记录和外部服务的数据处理边界需要另行确认。本文的同步流程不是法律合规结论,也不能代替供应商的数据保留政策核查。
五、缓存键要能够区分知识版本
如果答案缓存只按问题文本命中,同一个问题在文档更新后仍可能取回旧答案。可以让缓存记录依赖的文档修订,读取时检查依赖是否仍有效;或者按知识库发布版本隔离缓存。具体选择取决于更新频率和可接受的缓存失效率。
对摘要和多轮对话也要做相同检查。删除检索片段不会自动重写已存储的会话,因此应明确旧会话继续使用、重新检索或提示用户刷新的策略。不要把所有旧对话永久拼接进新请求,再指望更新索引解决上下文里的历史信息。
六、用合成资料建立回归测试
准备一份包含虚构内部代号的测试文档,更新代号后查询新旧表达,再删除整份文档检查检索证据。记录命中的文档标识与修订,而不是只看最终答案是否“像新的”。这种测试数据只用于验证流程,不应被包装成模型性能测评。
通过 AI API 中转站搭建知识库时,也要比较文件管理、请求追踪与数据处理说明是否满足项目要求。欢迎查看 openairouter.net 中转站对比 和 中转站排行榜,结合自己的更新与删除回归测试完成选型。