Part 4:RAG检索增强生成 - 给大模型装上"外接大脑"
学习目标:理解RAG如何解决大模型"知识截止"和"专业不准"问题,掌握向量检索的核心原理与优化技巧,能搭建企业级知识库问答系统
一、为什么需要RAG?—— 大模型的3大硬伤
1.1 问题1:知识截止
现象:
用户:"2024年巴黎奥运会奖牌榜是多少?"
ChatGPT-3.5(训练截止2021年):
"抱歉,我无法提供2024年的信息,我的知识截止到2021年。"
根源:
- 模型训练时用的是历史数据
- 训练完成后无法更新知识
- 知识有"保质期",过期就失效
现实痛点:
- 企业新闻、财报、政策变化...模型通通不知道
- 想让AI回答最新信息,除非重新训练(昂贵且慢)
1.2 问题2:专业不准
现象:
用户:"我们公司的《采购管理制度》第5条规定什么?"
通用大模型:
"关于采购管理,一般建议..."(泛泛而谈)
根源:
- 通用模型训练数据:互联网公开内容
- 企业内部文档:几乎没出现在训练集中
- 模型只能"猜",猜对概率极低
现实痛点:
- 企业知识库、内部文档、专业领域知识
- AI回答像"外行",无法用于实际工作
1.3 问题3:无法溯源
现象:
用户:"这个政策从哪来的?引用文件是什么?"
模型:"根据相关法规..."(无法提供来源)
问题:
- 企业场景需要可追溯的回答
- 合规要求、法律咨询必须标注来源
- 无法判断AI回答的可信度
二、RAG是什么?—— 图书馆管理员的比喻
2.1 核心思想:模型 + 检索 = 智能问答
传统大模型:像一个人背熟了百科全书,但书是2021年的版本。
RAG系统:
用户提问 → 系统去图书馆找最新/专业资料 → 把资料给AI → AI基于资料回答
类比:你不是让AI"凭空回答",而是"带着资料答题"
2.2 RAG流程图(5步拆解)
用户问题:"我们公司差旅报销标准是什么?"
↓
Step 1: 文档预处理(整理书架)
- 加载公司差旅制度PDF
- 清洗、切分成段落
- 每个段落300-500字
↓
Step 2: 向量化(给每段打"语义标签")
- 使用Embedding模型(如BGE-M3)
- 每段文字 → 768维向量
- 语义相近的段落,向量距离近
↓
Step 3: 存入向量数据库(建智能索引)
- Chroma/Milvus/Pinecone
- 每条记录:{text: "一线城市住宿标准800元/天", vector: [0.2,0.8,...]}
↓
Step 4: 检索(快速找对资料)
- 用户问题也转成向量
- 计算问题向量 vs 所有段落的相似度
- 取最相似的3-5个段落
↓
Step 5: 增强生成(带着资料答题)
- 把检索到的段落作为"参考资料"给AI
- Prompt:"基于以下资料回答问题,无资料说不知道"
- AI生成回答,并标注引用来源
↓
输出:回答 + 引用标注(如[1]、[2])
关键:AI不是凭空想象,而是"开卷考试"。
三、5步详解:每一步怎么做?
3.1 Step 1: 文档预处理("整理书架")
目标:把原始文档整理成适合检索的"小段落"。
流程:
1. 加载(Loading)
支持的格式:
- PDF(扫描件?OCR识别)
- Word(.docx)
- 网页(HTML)
- Markdown
- 数据库(SQL查询结果)
- CSV/Excel
2. 清洗(Cleaning)
- 去页眉页脚
- 统一编码(避免乱码)
- 删除空白字符
- 去除广告/无关内容
3. 分割(Splitting)—— 最关键的一步!
原则:
- ✅ 段落内语义完整(一个段落讲清楚一件事)
- ✅ 保留上下文重叠(避免语义被拦腰切断)
- ✅ 长度适中(300-500字,或512-1024 tokens)
分割策略:
| 策略 | 怎么做 | 适用场景 |
|---|---|---|
| 按字符切 | 固定500字一刀切 | 简单,但可能切断语义 |
| 按句切 | 遇到句号就切,再拼接 | 保持句子完整 |
| 按语义切 | 用AI判断语义边界(高级) | 高质量,但慢 |
| 递归切 | 先大纲,再章节,再段落 | 文档有清晰结构 |
经验:
- 企业文档(制度、手册):按段落切 ✅
- 长篇小说:按章节切 ✅
- 技术文档:按标题层级切 ✅
重叠(Overlap):
原文:
"...公司成立于2010年。创始人张三拥有20年行业经验..."
↓ 切两段
段1:"...公司成立于2010年。" ← 切断
段2:"创始人张三拥有20年行业经验..."
↓ 问题:段1缺少创始人信息,段2缺少成立时间
解决方案:加入50字重叠
段1:"...公司成立于2010年。创始人张三..."
段2:"张三拥有20年行业经验..."
4. 元数据(Metadata)
- 每个段落加"身份证":
{ "text": "段落内容", "source": "差旅管理制度.pdf", "page": 15, "section": "住宿标准", "last_updated": "2024-01-15" } - 后续可以按来源/日期过滤
3.2 Step 2: Embedding向量化("打语义标签")
目标:把文字转成向量,让"意思相近"的向量距离近。
核心理解:
- 不是关键词匹配!是语义匹配
- "出差" vs "公干" vs "外出办公" → 意思一样,应该向量距离近
Embedding模型选型:
| 模型 | 特点 | 适用场景 |
|---|---|---|
| BGE-M3 | 中文强,支持多语言,多样化检索 | 中文场景🌟首选 |
| text-embedding-3 | OpenAI出品,平衡 | 多语言通用 |
| E5 | 英文强,学术风格 | 英文论文检索 |
| CodeBERT | 代码语义 | 代码搜索 |
| bge-large-zh | 纯中文,1024维 | 专业中文文档 |
对比实验(中文差旅问答):
- BGE-M3:准确率 78%
- text-embedding-3:72%
- 纯字面搜索:45%
选型建议:
- 中文为主 → BGE-M3(HuggingFace有开源)
- 多语言混合 → text-embedding-3
- 预算充足(买API)→ OpenAI
- 私有部署(数据敏感)→ 本地BGE
长文档处理:
- 一个长文档(5000字)不能直接Embedding(超出模型长度限制)
- 方案1:切分成段落,分别Embedding ✅
- 方案2:分段Embedding,加权融合(首尾段权重高)
3.3 Step 3: 向量数据库存储("建智能索引")
目标:快速检索(毫秒级)从百万条记录中找到最相关的K条。
向量搜索原理:
问题向量 q = [0.1, 0.8, ..., 0.3]
数据库向量 v1, v2, v3...
计算:
相似度 = cosine_similarity(q, v1)
= (q·v1) / (|q|·|v1|)
↓
排序,返回Top-K
向量数据库选型:
| 产品 | 类型 | 规模 | 优点 | 缺点 |
|---|---|---|---|---|
| Chroma | 开源/轻量 | <10万 | 简单,Python原生,内存/单文件 | 性能一般,不适合大规模 |
| FAISS | 开源库 | <1亿 | Facebook出品,极快 | 不支持更新,需手动管理 |
| Milvus | 开源/集群 | >1亿 | 云原生,功能全,性能强 | 部署复杂 |
| Pinecone | 托管服务 | 任意 | 不用运维,自动扩容 | 付费,数据在云端 |
| Weaviate | 开源/托管 | <1亿 | 支持混合检索(向量+关键词) | 学习曲线陡 |
选型建议:
- 学习/原型:Chroma ✅(5分钟上手)
- 生产 <100万:Pinecone(省心)或 Milvus(可控)
- 超大规模:Milvus集群
实操对比(Chroma示例):
# 初始化
import chromadb
client = chromadb.PersistentClient(path="./chroma_db")
# 创建集合
collection = client.create_collection(name="company_policy")
# 插入数据
collection.add(
embeddings=[[0.1, 0.8, ...], [0.2, 0.6, ...]], # 向量
documents=["住宿标准:一线城市800元/天", "交通补助:每月500元"], # 原文
metadatas=[{"source": "差旅制度.pdf"}, {"source": "福利手册.pdf"}], # 元数据
ids=["chunk_001", "chunk_002"]
)
# 检索
results = collection.query(
query_embeddings=[[0.1, 0.7, ...]], # 问题向量
n_results=3 # 返回3条
)
3.4 Step 4: 检索优化("快速找对资料")
基础:Top-K检索
K = 3-5(常用)
返回Top-3相似段落
问题:
- K太小:可能漏信息
- K太大:引入噪声(不相关段落干扰)
优化技巧1:HyDE(假设答案引导检索)
思路:
用户问:"公司对新员工培训有哪些要求?"
↓
Step A: 让AI先猜一个"理想答案"
"新员工需要参加入职培训、部门介绍、安全培训..."
Step B: 用这个"理想答案"去检索
(而不是用原始问题)
↓
检索更准!因为假想答案的语义更接近真实文档
适用:问题抽象、文档描述具体的场景
优化技巧2:Query Expansion(查询扩展)
问题:用户问"出差报销",但文档写的是"差旅费报销" → 匹配不上!
方案:自动扩展同义词
"出差" → ["出差", "公干", "外出办公", "差旅"]
"报销" → ["报销", "费用结算", "财务申请"]
↓
5个同义词 × 5个同义词 = 25种组合 → 分别检索 → 合并结果
优化技巧3:混合检索(Hybrid Search)
向量搜索的问题:
- 擅长语义匹配("汽车"≈"轿车")
- 不擅长精确匹配(型号"Model 3"必须精确)
关键词搜索的问题:
- 擅长精确匹配("Model 3")
- 不擅长语义("特斯拉"搜不到"电动车")
Hybrid = 两者结合:
得分 = α × 向量相似度 + β × 关键词BM25分数
↓
既有语义泛化,又有精确召回
方案:Weaviate / Elasticsearch + 向量插件
优化技巧4:重排序(Reranker)
流程:
Step 1: 向量检索 Top-20(宽泛召回)
Step 2: 用更强大的模型重排Top-20
Step 3: 返回重排后的 Top-3
为什么有效:
- 第一轮:快但粗(小模型检索20条)
- 第二轮:慢但精(大模型精排,更准理解语义)
Reranker模型:
- BGE-Reranker(中文)
- Cohere Rerank
- bge-reranker-large
性能权衡:
- 只用向量检索:10ms,准确率 70%
-
- Reranker:50ms,准确率 85% ✅ 推荐
- Reranker Top-50:100ms,准确率 88%(收益递减)
3.5 Step 5: 增强生成("带着资料答题")
目标:让AI基于检索到的资料生成回答,而不是自由发挥。
Prompt设计:
你是公司的智能客服助手。
任务:基于以下【参考文档】,回答用户问题。
要求:
1. 只能使用提供的文档内容
2. 文档中没有的信息,明确回答"资料未提及"
3. 引用来源(如[1]、[2]标注文档序号)
4. 语言简洁,不超过200字
【参考文档】
[1] 《差旅管理制度》2024年版
内容:一线城市住宿标准800元/天,交通补助500元/月...
[2] 《新员工入职指南》
内容:新员工需参加3天入职培训,包括公司文化、安全规范...
【用户问题】
{user_question}
请回答:
关键技巧:
- ✅ 明确"基于文档"(限定范围)
- ✅ "不知道就说不知道"(抑制幻觉)
- ✅ 要求标注来源(可追溯)
- ✅ 限制长度(避免啰嗦)
输出示例:
Q: 一线城市住宿标准多少?
A: 根据《差旅管理制度》[1],一线城市住宿标准为800元/天。
引用:[1]
冲突处理:
文档A说:"住宿标准800元/天"
文档B说:"一线城市住宿标准1000元/天" ← 冲突!
↓
策略1:按时间排序,取最新文档
策略2:取置信度高的(如官方制度 > 会议纪要)
策略3:告诉AI:"检测到矛盾,请提示用户咨询HR确认"
四、实战优化技巧组合
4.1 召回率 vs 准确率平衡
召回率(Recall):相关文档有多少被检索到?
- K太小 → 漏掉重要信息 → Recall↓
- K太大 → 噪声多 → Precision↓
实践策略:
- 先测试K=3/5/10的F1分数(Precision和Recall的调和)
- 业务调优:
- 法律场景:需要高准确率(不能引用错误文件)→ K=3
- 知识探索:需要广撒网 → K=10
4.2 长文档处理:层次化检索
问题:文档有100页,直接检索效率低。
方案:
第一层:检索"哪个文档最相关"
(用文档标题Summary向量)
↓ 找到Top-3文档
第二层:在Top-3文档内检索段落
↓ 返回精确段落
效果:
- 从10万文档 → 筛选100个文档(1ms)
- 从100个文档 × 500段落 = 5万段落 → 找Top-5(5ms)
- 总耗时≈6ms,比直接搜10万段落快100倍
4.3 多轮对话:记忆管理 + 查询重写
问题:用户第二轮问"那它多少钱?","它"指什么?
方案1:压缩历史
第1轮:用户问"iPhone 15 Pro有什么新功能?"
第2轮:用户问"那它多少钱?"
系统自动总结:
"用户想了解iPhone 15 Pro(功能+价格)"
↓
第2轮检索:"iPhone 15 Pro 价格"(上下文补全)
方案2:查询重写
原始问题:"那它多少钱?" ← 模糊,检索效果差
↓
LLM重写为:"iPhone 15 Pro 官方售价"
↓
检索更准确
五、RAG vs 微调 vs Prompt:怎么选?
5.1 三者对比
| 方案 | 成本 | 更新速度 | 准确率 | 适用场景 |
|---|---|---|---|---|
| Prompt工程 | 0元 | 即时 | 中(依赖模型本身) | 通用问答,不涉及专业知识 |
| RAG | 中等(向量DB+Embedding API) | 即时(换文档就行) | 高(提供权威资料) | 企业知识库、最新资讯 |
| 微调 | 高(训练成本) | 慢(需重新训练) | 极高(模型专门化) | 深度垂直领域,严格格式要求 |
5.2 决策树
需要回答专业/最新问题?
↓ Yes
RAG能解决吗?(有文档就能答)
↓ Yes → 用RAG ✅ 首选
↓ No
需要改变模型"思维方式"吗?(如代码生成、数学推理)
↓ Yes → 微调 ✅
↓ No
Prompt工程 + RAG即可 ✅
经验法则:
- 80%场景:Prompt + RAG 够用
- 15%场景:需要微调(专业度要求极高)
- 5%场景:需要从头训练(研究前沿)
六、动手任务
任务1:用LangChain+Chroma搭建迷你RAG
步骤:
- 安装:
pip install langchain chromadb - 准备10篇文档(任选,如公司制度、新闻)
- 代码流程:
# 伪代码 documents = load_docs("./docs") chunks = split(documents, chunk_size=500, overlap=50) embeddings = BGE_M3.encode(chunks) chroma.add(embeddings, chunks) query = "用户问题" similar_chunks = chroma.query(query, k=3) answer = gpt.generate(prompt="基于资料:"+similar_chunks+"回答问题:"+query) - 测试准确率:准备10个问题,人工评估回答质量
任务2:对比BGE-M3 vs text-embedding-3在中文问答效果
实验设计:
- 相同文档集(中文差旅制度,50个段落)
- 相同测试问题(20个QA对)
- 用两种Embedding分别检索
- 指标:Top-3检索的命中率(正确答案是否在Top-3)
预期结果:
- BGE-M3:70-80%
- text-embedding-3:60-70%
- 记录差异案例,分析原因
任务3:设计"带引用标注"的RAG输出格式
要求:
- 设计JSON输出结构:
{ "answer": "回答正文", "references": [ {"id": 1, "text": "引用的原文段落", "source": "文件名.pdf", "page": 12} ], "confidence": 0.85 } - 设计Prompt模板,强制AI标注引用
- 设计前端展示样式(引用标[1]、[2],鼠标悬停显示详情)
✅ 学习检查点
完成Part 4后,您应该能:
-
解释RAG为什么必要
- 知识截止、专业不准、无法溯源三大问题
- RAG如何通过"开卷考试"解决
-
画出RAG完整流程图(5步)
- 文档预处理 → 向量化 → 存储 → 检索 → 增强生成
- 能解释每一步的关键决策点
-
选择合适的Embedding模型和向量数据库
- BGE-M3 vs text-embedding-3
- Chroma vs Milvus vs Pinecone
- 根据场景(中文/多语言、规模、部署方式)决策
-
设计检索优化方案
- HyDE:什么时候用?
- Reranker:精度收益 vs 延迟成本
- 混合检索:向量+关键词
-
评估RAG系统效果
- 召回率 vs 准确率平衡
- 设计测试集(QA对)
- 关键指标:回答准确率、引用完整性、响应时间
📚 延伸阅读
- RAG原始论文:"Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks"(Facebook, 2021)
- 向量数据库:Milvus官方文档(https://milvus.io/)
- Embedding模型:BGE官方仓库(https://github.com/FlagOpen/FlagEmbedding)
- LangChain RAG教程:官方文档的"RAG"章节
- HyDE论文:"Precise Zero-Shot Dense Retrieval without Relevance Labels"
- Reranker:Cohere Rerank API文档
Part 4 结束!
RAG是企业级AI应用最主流的技术,80%的知识库问答需求都靠它。
下一部分 Part 5:Agent智能体架构 —— AI不仅能回答问题,还能主动规划、调用工具、执行任务,成为真正的"智能体"。学习节奏:Part 4建议2周,动手搭建一个Chroma RAG demo,体会"检索→生成"的完整流程。
系列进度:
- ✅ Part 1:Transformer原理大白话
- ✅ Part 2:分词与词向量详解
- ✅ Part 3:提示词工程实战
- ✅ Part 4:RAG检索增强生成(当前)
- 🔄 Part 5:Agent智能体架构
- 🔄 Part 6:MCP协议与Skills系统
- 🔄 Part 7:微调技术通俗解析
- 🔄 Part 8:推理优化与工程部署
- 🔄 Part 9:综合项目实战与职业发展
核心认知:RAG不是"调Prompt",而是系统架构——需要理解文档处理、向量检索、Prompt工程三者配合。实践中常见陷阱是"检索不准"导致下游再强也无用,务必重视Embedding质量和检索优化。
评论区