RAG知识库构建:我把踩过的坑和想明白的逻辑都写在这里了

做AI产品,RAG是绕不过去的技术路线。很多人以为RAG就是"把文档丢进去,让大模型回答问题",但真正做过的人都知道——知识库构建才是RAG系统最难的环节,没有之一。 模型是现成的,Prompt可以调,但知识库的质量直接决定了系统的天花板。这篇文章把我对RAG知识库构建的理解梳理出来,从核心概念到落地细节,尽量说人话。


一、先搞清楚一件事:RAG为什么存在?

用一句话说:大模型是"闭卷考生",RAG是给它"开卷考试"。

闭卷(裸用大模型) 开卷(RAG系统)
类比 不查资料全凭记忆写作 先检索文献,再基于资料撰写
问题 忘案例/数据、不知最新信息、可能胡编 内容有据可依,答案可溯源
优势 灵活、通用 准确、可信

我的观点:凡是答案需要"有出处"的场景——客服、法律、医疗、金融——不用RAG就是耍流氓。 裸用大模型在这些场景下就是"一本正经地胡说"。


二、Naive RAG vs Advanced RAG:差在哪?

Naive RAG:四步走完

  1. 用户提问
  2. 检索相关文档片段
  3. 检索结果塞进Prompt送给大模型
  4. 大模型生成回答

听起来够用了?实际上问题很多: 用户问题表述不精准导致检索不到、检索结果太冗余导致大模型被干扰、多个文档信息冲突没有排序……

Advanced RAG:加了两个关键环节

检索前(Pre-Retrieval)——让检索更"聪明":

模块 解决什么问题 举例
查询路由 去哪里查? 用户问信用卡问题→路由到信用卡知识库,不去查房贷
查询重写 用什么问题查? 用户问"怎么退钱"→重写为"退款流程及注意事项"
查询扩展 用一个还是多个问题查? 用户问"积分规则"→同时查"积分获取""积分有效期""积分兑换"

检索后(Post-Retrieval)——让结果更"干净":

模块 解决什么问题 举例
重排序(Rank) 哪个最相关? 10个召回文档按相关性打分,最优的排前面
摘要(Summary) 内容太冗余? 多个文档总结提炼,减少大模型输入噪音
融合(Fusion) 多文档信息冲突? 多个政策条文融合生成统一回答

我的判断:生产环境没有用Naive RAG的,Advanced RAG才是标配。 那些说"RAG效果不好"的,多半是Naive RAG裸奔的锅,不是RAG路线本身的问题。


三、非结构化数据处理:OCR、文档解析、多模态——不是三选一

知识库的原始数据往往是PDF、Word、扫描件、图片……必须先处理成大模型能用的文本。三种技术各有定位,不是替代关系,而是组合使用

技术 定位 擅长 不擅长 常用工具
OCR 识字 把图片/扫描件转成纯文本 不理解排版和语义,复杂布局识别弱 PaddleOCR、百度OCR、阿里云OCR
文档解析 排版识别 提取标题/段落/表格/脚注等结构信息 依赖排版规则,非标准格式不稳定 PyMuPDF、pdfplumber
多模态大模型 直接看图理解 图文混排、合同/表单的泛理解 贵、慢、不适合精确字段提取 GPT-4o、Claude 3

实际怎么做?我的经验:

  • 规范排版的PDF/Word → 文档解析为主,提取结构+文本
  • 扫描件/照片 → OCR先转文字,再结构化
  • 图文混排、需要"看图说话" → 多模态大模型辅助理解
  • 大多数项目是OCR + 文档解析组合,多模态按需补充

四、元数据:被低估的检索加速器

元数据就是"关于文档的文档"——不属于正文,但能极大提升检索效率。

比如一份《AI产品经理能力模型报告》,元数据可能包括:

  • 来源:《产业数字人才研究与发展报告(2023)》
  • 章节:第4章 第2节
  • 主题标签:AI产品经理、能力模型、行业需求

元数据的四大作用:

  1. 限定检索范围:只查"退货相关"的内容,不查全库
  2. 结构化筛选:按项目分类、按时间范围过滤
  3. 原文溯源:回答时标注"来自第3页第4小节"
  4. 知识统计:哪个主题文档最多、最近更新了哪些

我的观点:不做元数据的RAG系统,检索效率和可信度都会大打折扣。 这一步不能省。


五、Chunk切块:最容易被忽视、但最容易翻车的环节

切块就是把长文档切成小段,每段存为一个检索单元。核心原则:别把语义切断。

为什么要设重叠(Overlap)?

假设一段话跨越了两个chunk的边界:

  • Chunk1:问题描述
  • Chunk2:关键结论/解释

如果没重叠,检索只命中Chunk1就丢了答案,只命中Chunk2又缺上下文。

解决方案:chunk之间设置重叠,占比建议10%~30%。

举个真实例子:SuperCLUE大模型评测报告切chunk时:

  • chunk2包含DeepSeek-R1、QwQ-32B推理表现及性价比数据
  • chunk3包含小参数模型表现,DeepSeek-R1-Distill系列7B/14B版本数学推理得分(77.23分、79.46分)

如果这两个chunk之间没有重叠,用户问"DeepSeek-R1蒸馏模型的数学推理能力如何",可能只命中chunk3却缺少chunk2的上下文对比。

我的建议:切块大小和重叠比例没有万能公式,必须根据你的文档类型和检索场景实际测试调整。 但10%~30%的重叠是经过验证的安全区间。


六、三种索引:关键词、向量、结构化——别只靠一个

索引类型 类比 擅长 不擅长
关键词索引(倒排索引) 图书馆目录:查"合同法"翻到页码5 精准命中、速度快 不理解同义词,不支持模糊问法
向量索引 问"怎么退钱"找到"退款流程"段落 支持自然语言提问、同义词 可能不够精确,偶尔幻觉
结构化索引 按标题/章节/时间建层级 结合元数据提升精准度 需要结构化数据支撑

关键认知:用户问"积分有效期",关键词索引精准命中;用户问"我的积分会不会过期",关键词索引可能搜不到——这时候需要向量索引理解语义。

实际生产中,混合检索(关键词+向量) 效果最好。先用向量召回语义相关的候选,再用关键词精确匹配过滤,两者取长补短。


七、数据库选型:关系库、向量库、图数据库——各管各的

数据库类型 存什么 擅长 举例
关系型数据库 表格数据,字段固定 精确查询:余额、订单、身份 MySQL
向量数据库 Embedding向量 语义检索:查流程、找相似 Qdrant、Milvus
图数据库 实体+关系 知识推理:A关联B、B推导C Neo4j

那用户的问题该查哪个库?靠意图识别。

用户问题 意图分类 走哪个库
"上个月的账单明细" 结构化信息 关系型数据库(SQL)
"银行卡挂失怎么办理?" 非结构化知识 向量数据库(语义检索)
"我卡里还有多少钱?" 结构化信息 关系型数据库(SQL)
"有什么信用卡推荐?" 非结构化知识 向量数据库(语义检索)

我的理解:意图识别是RAG系统的"交通警察"——判断错了,后面的路全走错。


八、意图识别怎么做?从Prompt到微调

简单场景:Prompt直接做

你是一名银行客服意图识别助手,请根据用户问题选择最合适的类别: 1.账户查询 2.转账汇款 3.挂失/冻结 4.信用卡 5.理财咨询 6.投诉建议 7.其他
用户输入 识别结果
"我想看银行卡还有多少钱" 账户查询
"帮我转账5000元到父亲账户" 转账汇款
"信用卡昨天被盗刷了" 信用卡

复杂场景:微调专属意图模型

Prompt方案在意图少(<10类)时够用,但意图多、表达方式复杂时,需要微调专属模型。流程五步:

1. 定义意图分类体系

2. 收集数据

  • 来源:客服对话历史、用户搜索记录
  • 不足时用大模型扩写造数据:

请帮我扩写以下用户问法,生成10条不同说法但意图相同的句子。 原句:"我想查一下我的银行卡余额"

3. 制定标注规范

规范 说明
标签唯一性 每句话只能对应一个主要意图
同义句统一归类 "查钱""看余额""账户里还有多少钱"→都归【账户查询】
无意图的定义 "你好""谢谢"→归【无意图/打招呼】
噪音处理 乱码、错别字过多、与业务无关→剔除

4. 划分数据集

数据集 作用 占比
训练集 训练模型 80%
验证集 调超参数,不参与训练 10%
测试集 最终评估,模型没见过的数据 10%

5. 数据量参考

场景 意图数量 每类样本数 总数据量
一般商业落地 30~100类 200~500条 几千~3万条
高精度客服/政务/金融 >100类 300+条 3万条以上

九、RAG生成答案:最后一步,组装Prompt

检索到的文档片段+用户问题,组装成Prompt送给大模型:


你是一个智能客服,请根据以下信息回答用户的问题。 【用户类型】VIP 【积分有效期】永久有效 【文档节选】"VIP用户的积分将不会被清零,属于长期有效权益。" 问题:我的积分会过期吗?

大模型回答(可溯源):

"VIP用户的积分不会过期。VIP用户积分无有效期,属于长期有效权益。普通用户的积分有效期为12个月。具体请查看《会员积分说明》第3节。"

注意这个回答的三个特征:

  1. 有据可依——基于文档节选,不是瞎编
  2. 区分用户身份——VIP和普通用户不同规则
  3. 可溯源——标注了具体来源文档和章节

写在最后

RAG知识库构建这件事,我最大的感悟是:难度不在某个单点,而在全链路的质量一致性。

文档解析没做好 → chunk切不好 → 检索不准 → 大模型回答跑偏。每一个环节都是下一个环节的天花板。

如果让我给RAG知识库构建排一个"最值得投入精力的环节"优先级:

  1. 🥇 Chunk切块+元数据——决定检索质量的上限
  2. 🥈 意图识别——决定用户问题走对路
  3. 🥉 检索前预处理(查询重写/扩展/路由)——决定召回率
  4. 4️⃣ 混合索引(关键词+向量)——决定检索的精准度
  5. 5️⃣ 检索后处理(重排序/摘要/融合)——决定大模型输入的干净程度

别在第一步就偷懒,也别指望某个环节特别强就能弥补其他环节的短板。RAG系统的效果,由最短的那块板决定。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐