RAG 技术详解 概述 RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合信息检索与大语言模型生成能力的技术架构,通过从外部知识库检索相关信息来增强 LLM 的回答质量。
为什么需要 RAG?
问题
说明
RAG 解决方案
知识时效性
LLM 训练数据有截止日期
实时检索最新文档
幻觉问题
LLM 可能编造事实
基于真实文档生成
私有知识
LLM 不了解企业内部数据
接入私有知识库
可追溯性
无法验证答案来源
提供引用来源
RAG 学习路线 graph TD
A[RAG基础概念] --> B[文档处理]
A --> C[Embedding原理]
B --> D[文本分割策略]
C --> E[向量数据库]
D --> F[检索策略]
E --> F
F --> G[Naive RAG]
G --> H[Advanced RAG]
H --> I[Modular RAG]
I --> J[企业级RAG]
style G fill:#e1f5fe
style H fill:#fff3e0
style I fill:#f3e5f5
阶段一:基础概念(3-5天)
学习内容
时间
优先级
产出
RAG 核心原理
1天
⭐⭐⭐
理解检索+生成流程
Embedding 模型选型
1天
⭐⭐⭐
掌握主流模型差异
向量相似度计算
1天
⭐⭐
余弦相似度、欧氏距离
向量数据库入门
2天
⭐⭐⭐
完成 Milvus/Chroma 部署
阶段二:核心流程实现(1-2周)
学习内容
时间
优先级
产出
文档加载器
2天
⭐⭐⭐
PDF/Word/网页解析
文本分割策略
2天
⭐⭐⭐
理解 Chunk 策略
索引构建
2天
⭐⭐⭐
完成文档向量化
检索实现
2天
⭐⭐⭐
实现相似度搜索
Prompt 模板设计
1天
⭐⭐
设计 RAG 专用模板
阶段三:进阶优化(2-3周)
学习内容
时间
优先级
产出
混合检索
3天
⭐⭐⭐
向量+关键词检索
重排序(Rerank)
2天
⭐⭐⭐
提升检索精度
查询改写
2天
⭐⭐
HyDE、Query Expansion
多轮对话管理
2天
⭐⭐
对话历史处理
评估指标
2天
⭐⭐⭐
Recall、MRR、RAGAS
阶段四:生产级实践(持续)
分布式向量存储
增量索引更新
多租户隔离
缓存策略
监控与可观测性
RAG 核心架构 标准流程 graph LR
subgraph 离线索引
A[原始文档] --> B[文档加载]
B --> C[文本分割]
C --> D[Embedding]
D --> E[(向量数据库)]
end
subgraph 在线查询
F[用户问题] --> G[Query Embedding]
G --> H[向量检索]
E --> H
H --> I[相关文档]
I --> J[Prompt构建]
F --> J
J --> K[LLM生成]
K --> L[回答]
end
核心组件说明
组件
作用
常用工具
Document Loader
加载多种格式文档
LangChain Loaders, Unstructured
Text Splitter
文本分块
RecursiveCharacterTextSplitter
Embedding Model
文本向量化
OpenAI Ada, BGE, M3E
Vector Store
向量存储与检索
Milvus, Pinecone, Chroma
Retriever
检索策略封装
MultiQueryRetriever, SelfQueryRetriever
LLM
答案生成
GPT-4, Claude, 通义千问
RAG 技术演进对比 三代 RAG 架构对比
维度
Naive RAG
Advanced RAG
Modular RAG
架构
线性流水线
优化流水线
模块化组合
索引
简单分块
层次索引、父子块
多种索引策略
检索
单次向量检索
混合检索 + 重排
多路召回 + 融合
生成
直接拼接上下文
压缩/筛选上下文
自适应生成
适用场景
原型验证
生产环境
复杂企业场景
Naive RAG 最基础的 RAG 实现,流程简单但存在明显缺陷:
1 用户问题 → Embedding → 向量检索 → Top - K 文档 → 拼接 Prompt → LLM 回答
优点 :实现简单、快速上手缺点 :
检索质量依赖分块策略
无法处理复杂查询
上下文利用率低
Advanced RAG 在 Naive RAG 基础上增加预处理和后处理优化:
graph TD
subgraph 预检索优化
A[用户问题] --> B[查询改写]
B --> C[查询扩展]
end
subgraph 检索优化
C --> D[多路召回]
D --> E[重排序Rerank]
end
subgraph 后处理优化
E --> F[上下文压缩]
F --> G[LLM生成]
end
核心优化点 :
优化阶段
技术
说明
预检索
Query Rewriting
重写用户问题提升检索效果
预检索
HyDE
生成假设文档进行检索
检索
Hybrid Search
向量 + BM25 混合检索
检索
Reranking
使用交叉编码器重排
后检索
Context Compression
压缩冗余上下文
后检索
Self-RAG
自我反思与校验
Modular RAG 将 RAG 拆解为可插拔模块,支持灵活组合:
模块类型
可选组件
索引模块
层次索引、知识图谱索引、摘要索引
检索模块
稀疏检索、稠密检索、混合检索
重排模块
Cross-Encoder、ColBERT、LLM Rerank
生成模块
单次生成、迭代优化、多步推理
主流 RAG 框架对比 Python 生态
框架
特点
适用场景
LangChain
功能全面、生态丰富
通用 RAG 开发
LlamaIndex
专注数据索引与检索
复杂文档场景
Haystack
模块化设计、企业级
生产环境
RAGFlow
开箱即用、可视化
快速部署
Java 生态
框架
特点
适用场景
Spring AI
Spring 生态集成
Spring Boot 项目
LangChain4j
功能对标 LangChain
Java 全栈开发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 @Service public class RagService { private final VectorStore vectorStore; private final ChatClient chatClient; public String query (String question) { List<Document> docs = vectorStore.similaritySearch( SearchRequest.query(question).withTopK(5 ) ); String context = docs.stream() .map(Document::getContent) .collect(Collectors.joining("\n\n" )); return chatClient.prompt() .system("基于以下上下文回答问题:\n" + context) .user(question) .call() .content(); } }
Embedding 模型对比
模型
厂商
维度
中文支持
特点
text-embedding-3-large
OpenAI
3072
一般
综合能力强
text-embedding-3-small
OpenAI
1536
一般
性价比高
BGE-large-zh
BAAI
1024
⭐⭐⭐
中文首选
M3E-base
Moka
768
⭐⭐⭐
轻量中文模型
bge-m3
BAAI
1024
⭐⭐⭐
多语言、多粒度
jina-embeddings-v2
Jina AI
768
⭐⭐
长文本支持
💡 提示: 选型建议
中文场景优先使用 BGE 或 M3E
多语言场景使用 bge-m3
追求效果使用 OpenAI text-embedding-3-large
向量数据库对比
数据库
类型
特点
推荐场景
Milvus
开源
高性能、分布式、功能全面
生产环境首选
Pinecone
托管
零运维、简单易用
快速原型、小团队
Chroma
开源
轻量嵌入式、开发友好
本地开发、测试
Weaviate
开源
GraphQL、模块化
复杂查询场景
Qdrant
开源
Rust 实现、高性能
高并发场景
pgvector
插件
PostgreSQL 扩展
已有 PG 环境
检索策略对比
策略
原理
优点
缺点
稀疏检索(BM25)
词频统计
精确匹配、可解释
语义理解弱
稠密检索(向量)
语义相似度
语义理解强
可能丢失关键词
混合检索
两者融合
兼顾精确与语义
需要调权重
多向量检索
段落+摘要多向量
多粒度匹配
索引膨胀
混合检索示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from langchain.retrievers import EnsembleRetrieverfrom langchain_community.retrievers import BM25Retriever bm25_retriever = BM25Retriever.from_documents(documents) bm25_retriever.k = 5 vector_retriever = vectorstore.as_retriever(search_kwargs={"k" : 5 }) ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever, vector_retriever], weights=[0.5 , 0.5 ] )
文本分割策略
策略
说明
适用场景
固定长度分割
按字符数切分
简单文本
递归字符分割
按分隔符层次切分
通用文档
语义分割
按语义边界切分
高质量要求
文档结构分割
按标题/章节切分
结构化文档
父子块策略
小块检索、大块返回
上下文完整性
⚠️ 重要: 分块要点
Chunk Size :通常 500-1000 字符
Overlap :建议 10%-20% 重叠
保持语义完整 :避免句子被切断
评估指标 检索质量
指标
说明
Recall@K
Top-K 中包含正确文档的比例
MRR
正确文档排名的倒数均值
NDCG
归一化折损累积增益
生成质量
指标
说明
Faithfulness
答案是否忠于检索内容
Answer Relevancy
答案与问题的相关性
Context Precision
上下文的精确率
Context Recall
上下文的召回率
📝 注意: RAGAS 框架 推荐使用 RAGAS 进行端到端 RAG 评估,支持自动化评估上述指标
常见问题与优化
问题
原因
解决方案
检索不到相关文档
查询与文档语义差距大
查询改写、HyDE
检索到但排名低
向量相似度不准
添加 Reranker
上下文超长
检索文档过多
上下文压缩、摘要
回答不准确
噪声文档干扰
提高检索阈值、过滤
无法回答最新问题
知识库未更新
增量索引更新
相关笔记
大模型学习路线
LLM应用开发
Prompt Engineering详解