定位信息为什么必需
切片入库时把页码、章节、字符偏移等定位信息一起写进元数据,生成回答时才能标注「出自哪一页、哪一节」,也才能点击回原文核对。定位信息是引用的唯一可靠来源:如果让模型自己写出页码或链接,等于让它猜,编造几乎必然发生。
基本信息
| 定位字段 | doc_id、page、section、offset 与 chunk_id |
|---|---|
| chunk_id 设计 | 可由文档标识与位置派生,重建时保持稳定 |
| 生成侧职责 | 模型只输出引用编号,编号到原文的映射由代码完成 |
| 上线校验 | 引用编号越界、指向不存在的切片都要拦截并降级 |
典型使用场景
- 法规与合规问答:答案必须可追溯到具体条款,否则不能交付
- 客服知识库:坐席看到引用编号后要能一键打开原文核对
- 手册类问答:用户按页码回查操作步骤,定位必须准确
- 答案审核:抽检回答时按引用回溯,判断是检索错还是生成错
- 文档更新后复核:按 offset 比对差异,确认引用是否仍然有效
生成带定位的切片
生成带定位的切片
def make_chunk(doc_id, text, page, section, start):
# chunk_id 由文档标识与位置派生,同一内容重复生成结果一致
return {
"chunk_id": f"{doc_id}#p{page}-s{start}",
"text": text,
"meta": {"doc_id": doc_id, "page": page,
"section": section, "offset": start},
}
c = make_chunk("manual", "配置超时时间…", 12, "3.1 超时设置", 4021)
print(c["chunk_id"], c["meta"]) # 引用编号与页码都由这份元数据决定
定位字段的作用
| 字段 | 作用 | 缺失后果 |
|---|---|---|
| chunk_id | 引用的锚点 | 编号无法映射回原文 |
| page | 标注页码并支持跳转 | 用户核对要翻遍全文 |
| section | 展示所属章节 | 脱离文档结构,难以判断是否适用 |
| offset | 字符级偏移 | 内容微调后引用与正文对不上 |
引用编号到元数据的映射由代码完成,不要让模型自行编造页码或链接;模型只负责在句末标注编号,映射与渲染都在后处理里做。
分段结构比页码更稳:页码会随排版调整漂移,章节号与字符偏移在多数更新场景下仍可复用。