乐于分享
好东西不私藏

RAG知识库实战:让AI读懂你的内部文档

RAG知识库实战:让AI读懂你的内部文档

帮一个团队搭RAG知识库,500页PDF的内部技术规范。

装好跑了一周。内部政策问题牛头不对马嘴,项目文档说找不到。

第一反应是PDF没识别好。加了两天OCR,没改善。

💡根子不在PDF,在整个pipeline——从切分到检索排序,每个环节都有窟窿。

以下是两个月里我实际做的事、测的数据、踩的坑。

────────────────────

PDF转了Markdown,手动修了一天

500页PDF,按规范文档结构有标题、表格、代码块、条款编号。

先用工具转Markdown。出来的东西:表格对不上,代码块截断,有些标题混进正文。不是转一下就能用的。

手动修:每条标题对一遍层级,表格补上缺失列,截断的代码块翻PDF原文重截。搞了一天。

这一步没捷径。后面检索质量全靠文档预处理。预处理脏,后面怎么调都没用。

────────────────────

怎么切文档——我测了五种

试试固定长度。512字符一刀。有结构的文档切完每一块前半段是上一段的尾巴,后半段是下一段的头。拿这种块去检索,搜出来的东西前言不搭后语。

然后试递归——段落切完再句子再字符。文字干净的时候还行。碰到标题断在两个块中间、表的行被劈半,检索出来的东西还是对不上。

切分方式

怎么切的

出了什么问题

固定长度

512字符一刀

概念的边界被切烂,查出来的块答非所问

递归

段落→句子→字符逐级

层级识别不准时,整个文档结构都塌

结构化

按标题/章节/条款边界

文档里写的层级不统一,切出来的块大小差太多

语义

句子相似度低于阈值就切

慢,且没比固定长度好多少

父子

大块包小块,小块搜大块回

多了一套映射关系要维护

最后用的结构化+父子。

按章节边界切父块,800-1000字一个。每个父块下面切成子块,200-300字。

搜的时候搜子块,返回带父块。

────────────────────

嵌入模型–三个跑了一轮实测

不写概念。直接说数据。

同一个测试集,三组模型的结果:

模型

通用文档查准率

这500页规范文档的查准率

通用模型

70-80%

40-50%

BGE-M3

75-85%

60-70%

我自己标的领域数据+SFT

80-85%

75-85%

这个项目用的BGE-M3

微调那次是另一个项目。标了七天数据,规范化技术条款+表格+公式那种专业文本。检索准确率从60-70%拉到75-85%,提升很明显。但这个项目没上,时间不够。

────────────────────

检索的几个参数–跑配置跑出来的

top_k、相似度阈值、重排。每个都改了多次。

参数

我设的值

怎么定的

top_k

6

设3查不全,设8噪音太多,6刚好

相似度阈值

0.65

低于0.6假结果太多,高于0.7有不少漏检

重排

BGE Reranker V2

开了之后查准率提了一大截

────────────────────

四种配置跑完的数据

同一批测试问题,四种配置跑出来的命中率和噪音:

配置

命中率

噪音率

固定长度+通用模型+没开重排

55%

40%

结构化分块+通用模型+开重排

70%

20%

结构化分块+BGE-M3+开重排

88%

12%

父子分块+BGE-M3+开重排

92%

8%

向量库用的Milvus。

────────────────────

翻车三次

💡第一次:忘了加重排。跑一周感觉不对,回头查——重排没开。加上当场命中率涨十几个点。

第二次是更新知识库的时候没删旧chunk。新版本文档上传了,旧版本的向量数据还躺在库里。用户搜同一个问题,新旧内容混在一起返回——旧答案有些已经被新规范废止了。

从那以后每次更新文档的步骤固定成:删旧chunk → 重新嵌入 → 重新索引。顺序不能错。

第三次是PDF里的表格。规范文档里有几十张技术参数表。工具转Markdown的时候把多列并成了一列,表头丢了。检查的时候没发现,上线之后有用户搜参数搜出牛头不对马嘴的数据。后来每一张表单独检查一遍——花了大半天。

────────────────────

四种场景,我实际用过的配置

不是推荐,是我在不同项目里搭过的。

客户团队FAQ不到1000条那个,全是一问一答。FAQ自己结构就够均匀了,固定长度512切出来块都差不多。通用嵌入够用,没上BGE-M3。top_k设5,返回五条用户自己翻。跑了一个月没人说搜不到东西,就没再调。

500页规范文档,结构化分块+父子索引+BGE-M3+重排。前面四轮配置跑分就是它。上线后用户搜政策条款,首条命中。偶尔搜不到的是那种跨章节引用的内容——A章引了B章某条款,分块的时候A和B不在同一个父块里。后面对这部分单独补了交叉引用索引。

多部门共享知识库那次,三个部门,文档结构完全不一样。

产品部是需求文档,技术部是API文档,运维是故障手册。

先按部门拆——每个部门建一个向量库。检索的时候先判断这问题更像哪个部门的,再去对应库里搜。混在一起搜过一轮,产品的问题搜出技术文档来,查准率掉了十几个点。

技术文档混代码的,一个开发团队的项目。切之前先扫一遍,把所有代码块的位置标出来。切的时候代码块不跨边界。不然检索返回一段代码头从上一块、尾漏到下一块,没法看。标完之后每个块返回的代码都是完整的。