【AI产品经理】RAG知识库怎么构建(上)
RAG知识库构建:我把踩过的坑和想明白的逻辑都写在这里了
做AI产品,RAG是绕不过去的技术路线。很多人以为RAG就是"把文档丢进去,让大模型回答问题",但真正做过的人都知道——知识库构建才是RAG系统最难的环节,没有之一。 模型是现成的,Prompt可以调,但知识库的质量直接决定了系统的天花板。这篇文章把我对RAG知识库构建的理解梳理出来,从核心概念到落地细节,尽量说人话。
一、先搞清楚一件事:RAG为什么存在?
用一句话说:大模型是"闭卷考生",RAG是给它"开卷考试"。
| 闭卷(裸用大模型) | 开卷(RAG系统) | |
|---|---|---|
| 类比 | 不查资料全凭记忆写作 | 先检索文献,再基于资料撰写 |
| 问题 | 忘案例/数据、不知最新信息、可能胡编 | 内容有据可依,答案可溯源 |
| 优势 | 灵活、通用 | 准确、可信 |
我的观点:凡是答案需要"有出处"的场景——客服、法律、医疗、金融——不用RAG就是耍流氓。 裸用大模型在这些场景下就是"一本正经地胡说"。
二、Naive RAG vs Advanced RAG:差在哪?
Naive RAG:四步走完
- 用户提问
- 检索相关文档片段
- 检索结果塞进Prompt送给大模型
- 大模型生成回答
听起来够用了?实际上问题很多: 用户问题表述不精准导致检索不到、检索结果太冗余导致大模型被干扰、多个文档信息冲突没有排序……
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产品经理、能力模型、行业需求
元数据的四大作用:
- 限定检索范围:只查"退货相关"的内容,不查全库
- 结构化筛选:按项目分类、按时间范围过滤
- 原文溯源:回答时标注"来自第3页第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节。"
注意这个回答的三个特征:
- 有据可依——基于文档节选,不是瞎编
- 区分用户身份——VIP和普通用户不同规则
- 可溯源——标注了具体来源文档和章节
写在最后
RAG知识库构建这件事,我最大的感悟是:难度不在某个单点,而在全链路的质量一致性。
文档解析没做好 → chunk切不好 → 检索不准 → 大模型回答跑偏。每一个环节都是下一个环节的天花板。
如果让我给RAG知识库构建排一个"最值得投入精力的环节"优先级:
- 🥇 Chunk切块+元数据——决定检索质量的上限
- 🥈 意图识别——决定用户问题走对路
- 🥉 检索前预处理(查询重写/扩展/路由)——决定召回率
- 4️⃣ 混合索引(关键词+向量)——决定检索的精准度
- 5️⃣ 检索后处理(重排序/摘要/融合)——决定大模型输入的干净程度
别在第一步就偷懒,也别指望某个环节特别强就能弥补其他环节的短板。RAG系统的效果,由最短的那块板决定。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)