企业知识库的「可溯源」,到底要溯到哪一层
今年上半年参与了一个企业级知识库平台,我负责文档解析和入库这条链路。客户提的要求里有一条叫”可溯源”,一开始我以为是给答案标个来源文件,后来发现远不止。
客户要的溯源
客户是做工程的,知识库里是规范、图纸说明、历史项目资料。他们问一个问题,模型答了,他们要能:
- 看到答案引用了哪份文件——这是最基本的。
- 点开直接跳到那一页——不是打开文件从头翻。
- 页面上高亮到那一段甚至那个表格——因为他们要核对模型有没有改数字。
第三条才是真正的”可溯源”。答案里说”允许偏差 0.05”,他们要一眼看到原文表格里那个格子。
三级映射
解析入库的时候,每个切片带三层位置信息:
向量(检索命中的单位)
└── 结构化区块 ID(标题 / 段落 / 表格 / 图片,带层级)
└── 原文位置(文件、页码、页面内 bbox 坐标)
- 检索命中的是向量。
- 向量对应一个结构化区块,区块知道自己是哪个章节下的第几个表格。
- 区块记录了原文页码和坐标框,前端用坐标在 PDF 上画高亮。
表格和图片单独处理:表格区块保留单元格结构,图片区块存缩略图引用。命中表格时,前端能高亮到行。
切片和溯源的矛盾
切片粒度小,检索准,但一个切片可能跨两个区块,溯源就糊了。切片粒度大,溯源清楚,检索变粗。
最后的做法:切片可以跨区块,但每个切片记录它覆盖的所有区块 ID。 命中后高亮所有覆盖的区块。多高亮一点比高亮不到强。
多格式
平台要吃的格式很杂:Word、PPT、Excel、PDF、网页、Markdown、图片、音视频。二十多种。每种格式的”位置”含义不一样——PDF 有页和坐标,Word 没有固定页,音频只有时间戳。
统一成一个抽象:location = { file, page?, bbox?, timestamp?, cell? },按格式填能填的字段。前端按字段决定怎么高亮。不追求所有格式都能高亮到坐标,但所有格式都能定位到”哪个文件的哪一块”。
入库链路
上传 ──► 对象存储
──► 解析(按格式分发;PDF 走版面模型,扫描件走 OCR)
──► 切片(记录三级位置)
──► 状态写缓存 / 原始切片写文档库 / 向量写向量库 / 实体关系写图库
解析和向量化是异步任务,按”高优先级 / 需要 GPU / 图谱构建”分三个队列,GPU 队列并发压低避免显存打满。
我学到的
“可溯源”不是一个功能,是一条从解析到前端的约束:每一步都不能丢位置信息。 只要中间有一步把位置丢了,后面再想找回来就是重做。这个约束在设计入库链路的第一天就要定下来。