知识更新:别让它自信地回答"上个版本的规定"
增量更新、失效、版本化——RAG 上线后最容易烂掉的一环
你的 RAG 上线了,效果很好。三个月后运费政策调整:市区免运门槛从 59 元改成 79 元。
运营在文档里改好了。但你的索引还是旧的——于是系统继续用斩钉截铁的语气 + 正确的引用格式,告诉每一个用户"满 59 元免运费"。
这比 ap4.1 的裸问编造更危险:它有出处、有格式、看起来完全可信,只是内容过期了。这一节讲怎么防。
公司墙上贴着规章制度。新版发下来了,你把新的贴上去——但没撕掉旧的。员工照着旧的执行,还理直气壮:"墙上写着呢。"
知识更新做不好,你的 RAG 就是那面贴满新旧版本的墙。
四种更新场景,四种处理
| 场景 | 处理 | 容易漏的点 |
|---|---|---|
| 新增文档 | 切分 → 嵌入 → 加进索引 | 最简单,也最容易只做这一个 |
| 修改文档 | 先删旧块,再加新块 | 只加不删 = 新旧版本同时在库,检索时打架 |
| 删除文档 | 从索引删对应块 | 常被忘记,导致回答引用已废止的政策 |
| 重命名/移动 | 视为删除 + 新增 | 引用编号要跟着变(ap4.6 的稳定编号) |
最凶险的是"修改":如果你只是把新版本加进去,旧块还在——检索时两个版本都可能进 top-k,模型看到矛盾信息,要么随机挑一个,要么把两个数字都说出来。用户看到"59 元(或 79 元)"会当场失去信任。
一套够用的更新机制
① 给每个块打上溯源信息
chunk = {
"id": "policy_delivery#p2", # 稳定 ID(文档 + 段落)
"doc_id": "policy_delivery", # 所属文档
"content_hash": "a1b2c3…", # 内容哈希,用来判断"变没变"
"version": "v3.2",
"updated_at": "2026-08-04",
"text": "...",
}
② 增量更新:按文档为单位"先删后加"
def upsert_doc(doc_id, new_text):
new_chunks = split(new_text)
old = index.get_by_doc(doc_id)
if hash_all(new_chunks) == hash_all(old):
return "未变,跳过" # 省掉重复嵌入的钱
index.delete_by_doc(doc_id) # ← 关键:先删干净
index.add(embed(new_chunks))
return f"更新 {len(new_chunks)} 块"
内容哈希的作用:定时任务全量扫一遍文档时,没变的直接跳过,不用重复付嵌入费用。文档多了之后这能省很多。
③ 更新完必须重跑评测
这是最容易被跳过、后果最严重的一步。文档一改,你之前的评测集可能有一半答案就过时了。所以:
- 评测集也要版本化(标注"依据 v3.2 的规定");
- 政策类改动后,先更新评测集的标准答案,再跑分;
- 分数明显掉了 → 大概率是新旧块混在库里,或切分对新文档不适用。
上线后的三个运维习惯
- 给答案带上"依据版本/日期":回答末尾加一句"依据《配送规则 v3.2》(2026-08 更新)"。用户能一眼看出信息新旧,你也能在投诉时快速定位;
- 定时全量校验:每周跑一次"文档哈希 vs 索引哈希"的比对,发现漂移就重建——别指望每次改文档的人都记得通知你的系统;
- 重建索引要能灰度:大规模重建(比如换嵌入模型)时,新旧索引并存、灰度切流量,跑评测确认不掉分再全切(AP7 讲灰度)。
🔧 动手做:模拟一次政策变更(12 分钟)
- 拿你 ap4.2 的知识库,改掉一个关键数字(比如免运门槛 59 → 79),但不更新索引。
- 跑一遍评测集——系统还在用旧答案吗?它有没有一丝犹豫?(不会有,这就是问题所在。)
- 实现
upsert_doc(先删后加 + 内容哈希跳过),重新索引,再跑一遍。 - 制造"只加不删"的事故:把新版块加进去但不删旧块,跑评测——观察模型面对矛盾信息时怎么表现(可能给出两个数字,或随机挑一个)。
- 给回答加上"依据版本/日期"的尾注,看看体验差别。
✅ 做到这里你应该有:一个带溯源信息的索引结构 + 一个增量更新函数 + 一次"只加不删"的事故体验。
为什么:🎉 AP4 完结。ap4.1 那个"编造 5/8"的基线,现在被你用切分 → 检索 → 评测 → 重排 → 引用 → 更新六道工序治住了。
但请记住这一节的位置:前五节决定你的 RAG 上线时有多好,这一节决定它三个月后还剩多少。见过太多 RAG 项目在上线时惊艳、半年后沦为"过期信息生成器"——差别就在有没有这套更新机制。
一个隐蔽的坑:文档改了,你更新了索引、跑了评测,分数暴跌——你以为是索引出了问题,其实是评测集的标准答案还写着旧数字。
规矩:评测集和知识库同步版本化。改文档时,把"哪些评测题的答案会受影响"一起列出来更新。做不到的话,至少在评测集里标注每条的"依据版本",跑分掉了先检查它是不是过期了——别拿过期的尺子量新的东西。
我的知识库:【文档类型和数量】,更新频率【多久一次、谁来改】,存储【文件/数据库/云文档】。请帮我设计更新机制:1) 块的溯源字段设计;2) 增量更新流程(先删后加、哈希跳过);3) 怎么发现「文档改了但没同步」;4) 更新后评测集怎么跟着更新;5) 大规模重建索引的灰度方案。
知识更新四句话:修改必须先删后加、用内容哈希省钱、更新后重跑评测、评测集和文档一起版本化;上线后要有定时校验和灰度重建。
🎉 AP4 完结!第二座山(幻觉)翻过去了:从"裸问编造 5/8"到"检索+引用+可核验"。
下一章是全课的灵魂:AP5 评测体系。你已经在每一章零散地用过评测了——AP5 把它变成制度:评测集怎么建、规则评分与模型判分、幻觉率怎么量、分数跌了不许上线的门禁、以及线上真实失败样本怎么回流。
🔎 来源与核验· 1 条,点开核对
