RAG技术详解

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 文档 → 拼接 PromptLLM 回答

优点:实现简单、快速上手
缺点

  • 检索质量依赖分块策略
  • 无法处理复杂查询
  • 上下文利用率低

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
// Spring AI RAG 示例
@Service
public class RagService {

private final VectorStore vectorStore;
private final ChatClient chatClient;

public String query(String question) {
// 1. 向量检索
List<Document> docs = vectorStore.similaritySearch(
SearchRequest.query(question).withTopK(5)
);

// 2. 构建上下文
String context = docs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n\n"));

// 3. 调用 LLM
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 ⭐⭐ 长文本支持

💡 提示: 选型建议

  • 中文场景优先使用 BGEM3E
  • 多语言场景使用 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 EnsembleRetriever
from langchain_community.retrievers import BM25Retriever

# BM25 稀疏检索
bm25_retriever = BM25Retriever.from_documents(documents)
bm25_retriever.k = 5

# 向量稠密检索
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# 混合检索(权重 0.5:0.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详解

RAG技术详解
https://zmmmmy.github.io/2026/01/13/RAG技术详解/
作者
ZhiMy
发布于
2026年1月13日
许可协议