桌上 答得出处 目录

第 2 节 · 约 30 分钟

源文件删了,chunk 还在,回答仍会引用它。

进索引的每一截都必须能指回父亲。开关是 tombstone,不是网盘回收站。

先讲

四个身份要一起走。文档 id 是业务对象,例如 doc:travel-cn,换文件名也不该换这个号。内容哈希是这一版字节的指纹,哈希变了就是新版本,不要靠最后修改时间独断。chunk 记下 parent:从哪份文档、哪一版切出来。tombstone 是盖在文档 id 上的「已删除」章。检索、缓存、重放摄取,都要先看这枚章。

业务说删,第一步盖 tombstone,让检索立刻滤掉这个 id。第二步删该 id 下全部 chunk。第三步按 doc_id 对账,计数应为 0。源文件可以从对象存储里收,但它不是开关。只删磁盘文件再重建索引:窗口以小时计,重建期间旧段落仍回答。只删 chunk 不盖章,队列重放会把旧段落写回来。

v1 已在、v2 到了:先算 v2 的哈希。若与 v1 相同,什么都别动。若不同,写入带 parent 和 version=2 的新 chunk,再删 version=1 的孩子。只加不删,索引里两版同时可被命中,模型会把作废条款和现行条款拼在一段回答里。

乱序事件常见。更旧的更新晚到,不能靠「谁最后写入谁赢」。比较版本号,旧的那条丢弃。同一 (doc_id, content_hash, chunk_i) 写两次仍是一条。删除 SLA 用分钟说清:tombstone 后 30 秒内检索应看不到。全库 120 万截重建要 4 小时,日常删除等不起。

对账用数说话。docA 在 v1 切出 17 截。tombstone 之后,按 parent 计数应为 0。若仍是 3,那 3 截就是活引用:客服问住宿,450 还会从已死文件里出来。盖章之后 30 秒内检索应看不到这个 id。缓存键里要有文档 id,带这个 doc 的回答键全部 miss。一页 PDF 解析崩了,不要拖死整批。日常删除走短路径,等不起四小时重建。

例:法务作废 travel-cn v1,索引里还有 17 截
  1. 写 tombstone:doc:travel-cn 已删除
  2. 删该 id 下全部 chunk,parent 计数 → 0
  3. 按 doc_id 对账,缓存键 miss
  4. 对象存储的 PDF 可以晚 15 分钟再收
  5. 30 秒内检索看不到这个 id
若第 1 步改成先删 PDF,chunk 还活着,第二天客服仍问到住宿 450。

你来做

现在要删 docA。v1 的 chunk 还在。按你要执行的顺序点。

(还没选)

留下这条短路径。下一节:脚注在,句子里的 128 分钟仍可能是编的。