先看结论
- 先判类型再调参:错误分「没召回」「召回了但切片断了」「召回了旧版本」「模型幻觉」四类,改法完全不同。
- 切片第一大坑是跨段切断:一句话被切成两半,检索到也没用。
- 表格问答几乎都不是检索问题,是「整表塞进一个切片」的问题。
- 旧版本不归档,模型会随机引用过期制度——这比答不出来更危险。
- 验证方式:20 个真实问题 + 5 个负样本;只看能答对的题等于没测。
先分类,再改
把所有答错的问题过一遍,分成四类。不同类的改法完全不同,混在一起讨论只会得出「换工具」这种结论。
| 错误类型 | 典型表现 | 该改哪层 |
|---|---|---|
| 没召回 | 问题里的词在文档里有,但搜不出来 | 检索层(同义词、混合检索)或数据层(文档没有这个信息) |
| 召回了但答不上 | 引用的片段只有半句话、缺上下文 | 加工层(切片) |
| 召回了旧版本 | 回答用的是上一版制度/价格 | 数据层(版本归档) |
| 模型幻觉 | 知识库里没有,但它编了一个 | 接入层(负样本训练、强制引用) |
死法一:跨段切断
固定长度切片最容易把一句完整的话切成两半。用户问「报销上限是多少」,召回的片段是「……上限为 500 元」,但前面那句「差旅住宿」被切到上一个切片里了。模型拿到半句话,只能猜。
- 改法:按段落/标题切,不按字符数切;每段保持「一段一义」。
- 改法:切片带前后各 100 字重叠(overlap),给模型补上下文。
- 验收:随便抽 10 个切片,看每一段单独拿出来是否读得懂。
死法二:整表塞入
一份报价表 50 行,被切成一个 2000 字的切片。用户问「A 产品第三档价格」,模型要在 50 行里找一行——准确率可想而知。表格问答几乎都不是检索问题,是结构问题。
- 改法:表格按行转成结构化文本(每行一条,带列名),或转成 JSON/CSV 存,检索时按行召回。
- 改法:表头必须进入每个切片,否则模型不知道「500」是价格还是数量。
- 验收:问 10 个跨行问题,看能不能稳定定位到具体行。
死法三:标题和层级丢失
切片只留正文,不留「这是哪份文件的第几节」。后果:模型不知道这句话的适用范围,也不知道来源。企业场景里,不能溯源的答案等于不能用。
- 改法:每个切片带元数据:文件名、章节路径、生效日期、版本状态。
- 改法:回答时强制返回引用片段和来源路径。
- 验收:随机抽 10 个答案,看能不能点回原文。
死法四:旧版本被召回
同一份制度有 v1、v2、v3 三个文件,全部进了库。检索时三份都召回到,模型随机挑一个——很可能挑到旧的那份。这比答不出来更危险,因为用户会信。
- 改法:文档头部加 status,只让 active 进检索索引;archived 移出或降权。
- 改法:更新文档时重建受影响的分片,别只上传新文件。
- 验收:问一个「最近改过的政策」,答案必须是新版。
死法五:重复与冲突
同一份内容有四个副本:邮件里的、群文件里的、网盘里的、文档库里的。改了一处,其余三处还是旧的。检索时命中哪一份全看运气。
- 改法:建立「唯一入口」,其余副本标记废弃并归档。
- 改法:入库前去重(按内容哈希或标题相似度)。
- 验收:问同一个问题三次,答案必须一致。
四类文档的切片策略
| 文档类型 | 切片方式 | 关键要求 |
|---|---|---|
| FAQ | 一问一答为一个切片 | 答案要自成一体,不依赖上下文 |
| 长文档(制度/手册) | 按章节切,带标题路径 | 每个切片保留章节号,便于引用 |
| 表格/报价单 | 按行转文本或结构化 | 表头必须进每个切片 |
| 合同/扫描件 | 先 OCR,再按条款切 | 条款边界清晰,保留页码 |
怎么验证改对了
不要用「感觉好多了」验收。用固定的 20 题(含 5 个负样本)跑前后对比:召回率、引用准确率、负样本拒答率。20 题自测表就是这个用途,测完你会知道该先改哪一层。
一句总结
先修数据和切片,再调检索和模型。顺序反了,就是花两周换工具、问题一个没少。
相关
选型分析知识库搭建:ima / 乐享 / Dify / RAGFlow / 本地 Markdown,8 个方案怎么选查看 →自测表20 个问题,测出你的知识库哪一层有病查看 →服务知识库诊断:先测 20 个问题,再决定要不要重做查看 →发现错误或有补充?提交纠错;这个频道会持续更新。
最后更新:2026-11-01