RAG 技术详解:检索增强生成
返回RAG(Retrieval-Augmented Generation,检索增强生成)是目前 AI 应用最热门的技术架构之一,也是面试中的高频考点。
一、通俗易懂版:RAG 是什么?
1.1 用一个比喻理解 RAG
想象你在参加一场开卷考试:
-
没有 RAG 的 LLM = 闭卷考试
- 模型只能靠训练时记住的知识回答问题
- 训练数据之外的问题,容易”胡说八道”(幻觉)
- 知识更新慢,训练完就固定了
-
有 RAG 的 LLM = 开卷考试
- 模型可以先翻书(检索外部知识库)
- 找到相关资料后再组织答案(生成)
- 答案有依据,可追溯,更准确
1.2 RAG 解决的核心问题
| 问题 | 描述 | RAG 如何解决 |
|---|---|---|
| 幻觉问题 | 模型编造不存在的事实 | 检索真实文档作为依据 |
| 知识时效性 | 训练数据有截止日期 | 随时更新外部知识库 |
| 领域专业性 | 通用模型不懂垂直领域 | 注入企业/领域私有数据 |
| 答案可追溯 | 无法验证答案来源 | 返回引用来源和片段 |
1.3 RAG 的工作流程(三步走)
┌─────────────────────────────────────────────────────────────────┐
│ RAG 工作流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 用户提问 │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 1. 检索 │ ────▶│ 2. 增强 │ ────▶│ 3. 生成 │ │
│ │ Retrieval │ │ Augmentation│ │ Generation │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ • 向量化 │ │ • 拼接上下文 │ │ • LLM 回答 │ │
│ │ • 相似度搜索 │ │ • 添加提示词 │ │ • 返回答案 │ │
│ │ • 召回 TopK │ │ • 过滤噪声 │ │ • 附带引用 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
步骤详解:
-
检索(Retrieval)
- 把用户问题转换成向量(Embedding)
- 在向量数据库中搜索最相似的文档片段
- 召回 Top-K 个相关片段(通常 3-5 个)
-
增强(Augmentation)
- 把检索到的片段拼接到 Prompt 中
- 格式通常是:
[背景知识] + [用户问题] + [回答要求] - 过滤掉不相关或低质量的片段
-
生成(Generation)
- LLM 根据增强后的 Prompt 生成答案
- 答案要基于提供的背景知识
- 可选:标注引用来源
二、技术架构详解
2.1 RAG 系统核心组件
┌──────────────────────────────────────────────────────────────────┐
│ RAG 系统架构 │
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ 数据源 │ │ 用户界面 │ │ LLM │ │
│ │ (文档) │ │ (提问) │ │ (生成) │ │
│ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ │
│ │ │ │ │
│ ▼ │ │ │
│ ┌────────────┐ │ │ │
│ │ 文档切片 │ │ │ │
│ │ Chunking │ │ │ │
│ └─────┬──────┘ │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ ┌────────────┐ │ │ │
│ │ Embedding │ │ │ │
│ │ 模型 │ │ │ │
│ └─────┬──────┘ │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ ┌────────────┐ ┌─────┴──────┐ ┌─────┴──────┐ │
│ │ 向量数据库 │◀───│ 检索器 │───▶│ Prompt │ │
│ │ Vector DB │ │ Retriever │ │ 组装器 │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘
2.2 关键组件技术选型(2026 年 3 月)
| 组件 | 开源方案 | 商业方案 | 选择建议 |
|---|---|---|---|
| Embedding 模型 | bge-m3, bge-large-zh-v1.5 | OpenAI text-embedding-3 | 中文场景推荐 bge-m3(支持 8K 长度) |
| 向量数据库 | Milvus 2.4.x, Qdrant 1.12.x, Chroma 0.5.x | Pinecone Serverless, Weaviate 1.25.x | 小规模用 Chroma,大规模用 Milvus/Qdrant |
| LLM | Qwen2.5-72B, DeepSeek-V3 | GPT-4o, Claude 3.7 | 根据成本和效果权衡 |
| 编排框架 | LangChain 0.3.x, LlamaIndex 0.12.x | Dify 1.0.x, Flowise 2.0.x | 快速原型用 Dify,定制开发用 LangChain |
2.3 文档切片(Chunking)策略
切片质量直接影响检索效果,常见策略:
# 策略 1:固定长度切片(最简单)
chunk_size = 500 # token 数
chunk_overlap = 50 # 重叠部分,保持上下文连贯
# 策略 2:按语义切片(效果更好)
# - 按段落/章节边界切
# - 按句子完整性切
# - 保持代码块/表格完整
# 策略 3:递归切片(推荐)
# 先按大结构切(章节),再按小结构切(段落)
# 保持层次结构信息
切片大小建议:
| 文档类型 | 推荐 chunk_size | 说明 |
|---|---|---|
| 普通文本 | 300-500 tokens | 平衡检索精度和上下文完整性 |
| 技术文档 | 500-800 tokens | 代码块需要更大上下文 |
| 对话记录 | 200-300 tokens | 单轮对话较短 |
| 表格数据 | 按行/按块 | 保持表格结构完整 |
三、实战:从零搭建 RAG 系统
3.1 最小可行方案(100 行代码,2026 版)
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = TextLoader("docs.txt", encoding='utf-8')
documents = loader.load()
# 2. 切片
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
# 3. 创建向量存储(2026 推荐:bge-m3)
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-m3")
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. 创建检索链
llm = ChatOpenAI(model="gpt-4o", temperature=0.3)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
# 5. 提问
response = qa_chain.run("你的问题是什么?")
print(response)
3.2 生产环境优化点
| 优化方向 | 具体措施 | 效果提升 |
|---|---|---|
| 检索质量 | 混合检索(向量 + 关键词) | +15-20% 准确率 |
| 响应速度 | 向量索引优化、缓存 | 降低 50% 延迟 |
| 答案质量 | Re-Rank 重排序、Prompt 优化 | +10-15% 满意度 |
| 成本控制 | 小模型检索 + 大模型生成 | 降低 60% 成本 |
四、RAG 进阶技术
4.1 混合检索(Hybrid Search)
结合向量检索和关键词检索的优势:
向量检索:语义相似,但可能漏掉关键词匹配
关键词检索:精确匹配,但不懂语义
混合检索 = 向量相似度 × 0.7 + 关键词匹配度 × 0.3
4.2 RAG-Fusion
一种改进的检索策略:
- 用 LLM 生成多个相关问题
- 对每个问题进行检索
- 合并结果并去重
- 用 RRF(倒数排名融合)重新排序
4.3 高级 RAG 模式
| 模式 | 描述 | 适用场景 |
|---|---|---|
| Naive RAG | 基础检索 + 生成 | 快速原型 |
| Advanced RAG | 检索前优化 + 检索后优化 | 生产环境 |
| Modular RAG | 可插拔模块,灵活组合 | 复杂场景 |
| Graph RAG | 结合知识图谱 | 需要推理的场景 |
🎯 面试回答版本
面试官问:“请介绍一下 RAG 技术” 或 “你如何理解检索增强生成?“
标准回答框架(2-3 分钟)
RAG 是 Retrieval-Augmented Generation 的缩写,中文叫"检索增强生成"。
它主要解决大语言模型的两个核心问题:幻觉和知识时效性。
【工作原理】
RAG 的工作流程分三步:
1. 检索:把用户问题向量化,在知识库里搜索相关文档
2. 增强:把检索到的文档片段拼接到 Prompt 里作为背景知识
3. 生成:LLM 根据背景知识生成有依据的答案
【核心价值】
- 让模型能访问外部知识,不局限于训练数据
- 答案可追溯,可以标注引用来源
- 知识库可以随时更新,不需要重新训练模型
【技术要点】
关键组件包括:Embedding 模型、向量数据库、检索器、LLM。
我比较熟悉的技术栈是:bge-large-zh 做 Embedding,
Chroma/Milvus 做向量存储,LangChain 做编排。
【实际应用】
我在 [项目名] 中用 RAG 实现了 [功能],
遇到的主要挑战是 [切片策略/检索精度/响应速度],
通过 [具体方案] 解决了这个问题。
高频追问及应对
| 追问 | 参考回答 |
|---|---|
| ”RAG 和 Fine-tuning 有什么区别?“ | RAG 是外挂知识库,成本低、更新快;Fine-tuning 是改模型权重,成本高、效果好但更新慢。通常优先 RAG,效果不够再考虑微调。 |
| “如何提升 RAG 的检索精度?“ | 三个方向:1) 优化切片策略 2) 混合检索(向量 + 关键词)3) 加 Re-Rank 重排序 |
| ”向量数据库选型考虑什么?“ | 数据规模(百万级以下 Chroma 够用)、查询 QPS、是否需分布式、运维成本 |
| ”RAG 的延迟怎么优化?“ | 1) 向量索引优化(HNSW)2) 缓存热门查询 3) 异步检索 4) 小模型 Embedding |
| ”如何处理长文档?“ | 分层切片 + 层次化检索,先检索章节再检索段落,或者用 Map-Reduce 方式 |
加分项
- 能说出具体数值指标(如”检索准确率从 70% 提升到 85%”)
- 能对比不同方案优劣(如”Chroma 适合原型,Milvus 适合生产”)
- 提到成本意识(如”用小模型做 Embedding 降低 60% 成本”)
避坑指南
❌ 不要说:
- “RAG 就是调 LangChain API”(太浅)
- “没实际用过,只看过文档”(减分)
✅ 要说:
- “我在 XX 场景用过,遇到 XX 问题,用 XX 方案解决”
- “了解原理,也动手实现过 demo”
相关阅读:
- AI 技术概览 - 建立整体认知
- MCP 协议解析 - 了解连接协议
- AI Agent 技术 - 学习智能体架构