前端按回答里的 chunk_id 跳到文档详情页,知识库重建一次后 id 全部重新生成,历史会话里的引用点开全是 404,客服只能让用户自己搜标题。

一开始怀疑是「旧版本原文被覆盖删除,没有保留快照」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。chunk_id 用 uuid 生成,每次重建都换一批。少数情况下是定位信息只存了块序号,切片策略一变序号就错。

不容易想到的是,前端缓存了旧的 id 到页面地址的映射。

上来先统计历史引用里失效 id 的占比

python -c "print({'stale':312,'total':430})"

随后把 id 改成文档标识加文本哈希的稳定值

python -c "import hashlib;print(hashlib.sha1(('doc-88:'+text).encode()).hexdigest()[:16])"

同时保存页码与字符偏移,支持定位到段落

python -c "print({'doc_id':'doc-88','page':7,'offset':1240})"

建一张旧 id 到新 id 的映射表供历史会话查询

psql "$PG_URL" -c "create table chunk_alias(old_id text primary key, new_id text not null);"

别只看报错消失,验证要多做一步。历史十条引用全部能跳转到对应段落,新写入的块 id 与文本内容一一对应,重建两次后 id 保持不变。

补一句。引用能不能长期有效,取决于 id 是否由内容决定,随机 id 在重建面前毫无意义,另外原文快照要留版本,否则链接对了内容也变了。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189