博客

RAG 学习笔记

RAG 核心流程、查询与检索优化、索引与生成策略、系统评估和常见问题的整理,标注了各章节的学习优先级。

约 16 分钟读完

下载 Markdown

📌 阅读优先级

星级直接写在正文主要章节标题中,用于表示第一次学习应投入的精力;低星级不代表内容无价值。

星级 分类 建议学习深度
★★★★★ 重点掌握 理解原理,能运行、修改、组合并排查常见问题
★★★ 补充掌握 能读懂并知道何时使用,项目需要时可快速落地
★ 了解即可 建立概念边界,需要时查询,不必投入大量时间记忆

建议先完成所有五星章节,再补三星章节;一星章节可在遇到对应场景时查阅。

★★★★★ 重点掌握

  1. RAG完整流程理解(第1节)

    • 应用场景:知识库问答、文档助手、智能客服、企业内部资料检索
    • 为什么重要:当答案依赖私有、动态或需要引用的数据时,RAG 是连接模型与外部知识的重要方案
    • 核心流程:数据获取→文档分块→向量化→存储→检索→生成
    • 必会概念:每个环节的作用、数据流转方式、常见问题定位
  2. 文档分块策略(第1.2.2节)

    • 应用场景:处理长文档(PDF、网页、Word)时必须分块,否则超过模型上下文长度
    • 为什么重要:分块策略直接影响检索质量,chunk太大找不准,太小丢上下文
    • 核心参数:
      • chunk_size:通常512-1024 tokens(取决于文档类型)
      • chunk_overlap:通常50-200 tokens(防止重要信息被切断)
    • 实战技巧:代码文档用语义分块(按函数边界),普通文章用固定大小+重叠
  3. 向量检索原理(第1.3节)

    • 应用场景:从数千上万篇文档中找到与用户问题最相关的几条
    • 为什么重要:检索质量决定生成质量,检索错了后面都白搭
    • 核心技能:
      • 相似度计算(余弦相似度最常用)
      • top_k参数选择(通常3-10,太多会稀释相关性)
      • 混合检索(向量检索+BM25关键词,提升鲁棒性)
      • 重排序(用Cross-Encoder模型精排top_k结果)
  4. Prompt工程:检索结果注入(第1.4.1节)

    • 应用场景:把检索到的文档片段组装成模型能理解的上下文
    • 为什么重要:好的Prompt能让模型基于检索内容回答,差的Prompt会导致模型忽略检索结果
    • 核心技能:
      • 构建检索增强Prompt(参考资料+用户问题)
      • 引用标注(让模型标注信息来源)
      • 控制生成基于上下文(“仅根据以上资料回答”)
      • 处理检索为空的情况(拒答而非编造)
  5. 评估指标(第1.3.4、1.4.2节)

    • 应用场景:优化RAG系统、对比不同方案、监控生产质量
    • 为什么重要:没有量化指标就是盲目调参,不知道改进是否有效
    • 核心指标:
      • Recall召回率(相关文档找到了多少)
      • Precision准确率(检索结果中相关的占比)
      • MRR(第一个相关结果的位置)
      • Faithfulness(生成内容是否忠于检索结果)
      • Relevance(生成内容是否回答了问题)
  6. 实战调优(第八节)

    • 应用场景:RAG效果不好时的系统性排查和优化
    • 为什么重要:初版RAG系统通常效果不理想,必须会调优
    • 常见问题:
      • 检索不准:优化分块策略、换embedding模型、加混合检索
      • 生成幻觉:加强Prompt约束、检索结果质量过滤
      • 响应太慢:embedding缓存、检索结果缓存、top_k调小
      • 成本太高:换便宜模型、减少检索调用、优化Prompt长度

★★★ 补充掌握

  1. 向量数据库选型(第1.2.4节)

    • 实用价值:不同场景选不同数据库,选错了会遇到性能/功能瓶颈
    • 选型考量:
      • Milvus:分布式、高性能、适合大规模(百万级以上)
      • Qdrant:易用、支持过滤、适合中小规模+复杂条件
      • Chroma:轻量级、适合原型开发和本地测试
      • FAISS:仅索引库,需自己管理存储
  2. 高级检索技术(第二节)

    • 实用场景:基础RAG效果不够好时的提升方案
    • 核心技术:
      • 查询改写(Query Rewriting):用户问题不清晰时重新表述
      • HyDE:先让模型生成假设答案,再用假设答案做检索
      • MultiQuery:把复杂问题拆成多个子问题分别检索
      • 父文档检索:检索时用小块,返回时给完整段落
  3. 上下文窗口优化(第5.2节)

    • 实用场景:检索到10条结果但模型上下文只能放5条
    • 关键技能:
      • Token预算控制(预留生成空间)
      • 相似度阈值过滤(低于阈值的不要)
      • 智能截断(保留最相关的,超长的截断)
  4. 缓存与延迟优化(第8.4节)

    • 实用价值:大幅降低成本和延迟
    • 三层缓存:
      • Embedding缓存(相同文档不重复向量化)
      • 检索结果缓存(相同问题不重复检索)
      • 生成结果缓存(完全相同的问题直接返回)
  5. 监控与评测(第七节)

    • 实用价值:生产环境持续优化、成本控制
    • 关键指标:检索命中率、平均延迟、Token消耗、用户满意度

★ 了解即可

  1. 查询分解(第二节) - 复杂问题才需要,简单问答不用
  2. RAPTOR 与 ColBERT(第四节) - 基础检索不足且有明确评测收益时再引入
  3. 查询分解与 RAG-Fusion(第二节) - 复杂多意图问题需要时使用
  4. 多模态RAG - 图像/表格检索,生态还不成熟

一、RAG核心流程 ★★★★★

🔥 学习优先级:重点掌握 使用位置: 完成数据处理、索引、检索、上下文组装和生成主链路;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。

1.1 数据获取

从各种数据源获取原始文档数据。

常见数据源:

  • 文本文档(PDF、Word、TXT、Markdown)
  • 网页内容(HTML)
  • 数据库记录
  • API接口数据

1.2 索引构建(Indexing)

1.2.1 文档预处理

# 数据清洗
- 去除无效字符、特殊符号
- 统一编码格式(UTF-8)
- 提取纯文本内容
- 去重处理

1.2.2 文档分块(Chunking)

将长文档切分成适合处理的小块。

分块策略:

  • 固定大小分块:按字符数或token数切分
  • 语义分块:按段落、句子边界切分
  • 重叠分块:块之间保留重叠部分(overlap)

关键参数:

  • chunk_size:每块大小(通常512-1024 tokens)
  • chunk_overlap:重叠大小(通常50-200 tokens)
# 示例
chunk_size = 1000 # 每块1000字符
chunk_overlap = 200 # 重叠200字符

1.2.3 向量化(Embedding)

将文本块转换为向量表示。

常用模型:

  • OpenAI: text-embedding-3-small/large
  • 开源: bge-large-zh、m3e-base
  • 多语言: multilingual-e5-large

向量维度:

  • 通常 768/1024/1536维
  • 维度越高,表达能力越强,但计算成本越大

1.2.4 存储(向量数据库)

常用向量数据库:

  • Milvus:开源、分布式、高性能
  • Qdrant:易用、支持过滤
  • Pinecone:云服务、托管方案
  • Chroma:轻量级、适合原型开发
  • Weaviate:支持混合搜索
  • FAISS:Meta开源、仅索引库

存储内容:

  • 向量(embedding vector)
  • 原始文本块(text chunk)
  • 元数据(metadata):来源、时间、标签等

1.3 检索(Retrieval)

1.3.1 查询处理

  • 查询文本向量化(使用与文档相同的embedding模型)
  • 查询改写/扩展(Query Rewriting)
  • 查询分解(Query Decomposition)

1.3.2 向量检索

相似度计算方法:

  • 余弦相似度(Cosine Similarity):最常用
  • 欧氏距离(Euclidean Distance)
  • 点积(Dot Product)

检索参数:

  • top_k:返回最相似的k个结果(通常3-10)
  • similarity_threshold:相似度阈值过滤

1.3.3 检索策略

单纯向量检索(Dense Retrieval): 仅使用向量相似度检索。

混合检索(Hybrid Search): 结合向量检索 + 关键词检索(BM25)

# 混合检索
final_score = α × vector_score + (1-α) × keyword_score

重排序(Reranking): 使用更精细的模型对初步检索结果重新排序。

  • Cross-Encoder模型:直接判断query和doc的相关性
  • 常用模型:bge-reranker-large、cohere-rerank
# 检索流程
1. 向量检索:top_k=20
2. 重排序:取top_n=5 最相关结果

1.3.4 检索效果评估指标

Recall(召回率): 检索到的相关文档数 / 总相关文档数

  • 衡量:有多少相关内容被找到了

Precision(准确率/精确率): 检索到的相关文档数 / 检索到的总文档数

  • 衡量:检索结果中有多少是真正相关的

MRR(Mean Reciprocal Rank,平均倒数排名):

MRR = 1/n × Σ(1/rank_i)
  • 衡量:第一个相关结果的排名位置

NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益):

  • 衡量:排序质量(考虑相关性程度和位置)
  • 越靠前的相关文档权重越高

1.4 生成(Generation)

1.4.1 提示词工程(Prompt Engineering)

构建包含检索结果的提示词。

经典模板:

你是一个问答助手。请根据以下参考资料回答用户问题。
【参考资料】
{retrieved_chunks}
【用户问题】
{user_query}
【回答要求】
- 仅根据参考资料回答
- 如果参考资料中没有相关信息,明确说明
- 回答要准确、简洁

1.4.2 调用LLM生成

将构建好的prompt发送给大模型生成答案。

常用模型:

  • GPT-4/GPT-3.5
  • Claude
  • 国产:文心一言、通义千问、ChatGLM

1.4.3 答案后处理

  • 去除冗余信息
  • 格式化输出
  • 添加引用来源
  • 置信度标注

1.4.4 生成效果评估

置信度(Confidence): 模型对答案的确定程度。

相关性/相似度(Relevance): 答案与问题的相关程度。

流畅度(Coherence): 答案的语言表达质量。

依赖度/可归因性(Groundedness): 答案是否基于检索到的参考资料,而非模型自身知识。

  • 检查答案内容是否能在检索文档中找到依据

引用(Citation): 答案是否标注了信息来源。


二、查询优化策略 ★★★

🧩 学习优先级:补充掌握 使用位置: 基础检索不足时改善复杂、模糊或多意图查询;学习要求: 能读懂并知道何时使用,项目需要时可快速落地。

2.1 多查询策略(Multi-Query)

原理: 将用户原始查询扩展为多个相关查询,分别检索后合并结果。

优点:

  • 简单易实现
  • 提升召回率
  • 速度较快

实现方式:

# 原始查询
原始问题:"RAG是什么?"
# 扩展为多个查询
查询1:"RAG的定义是什么?"
查询2:"什么是检索增强生成?"
查询3:"RAG技术原理"
# 分别检索后合并

2.2 RAG-Fusion(多查询结果融合)

原理: Multi-Query的加强版,增加RRF(Reciprocal Rank Fusion,倒数排名融合)对结果重排。

优点:

  • 检索效果更好
  • 融合多个查询的优势

缺点:

  • 复杂度高
  • 速度较慢

RRF公式:

RRF_score(d) = Σ 1/(k + rank_i(d))
# k: 常数(通常60)
# rank_i(d): 文档d在第i个查询结果中的排名

2.3 问题分解策略(Decomposition)

原理: 将复杂问题拆解为多个子问题,逐个解决后合并答案。

分解策略:

顺序分解(Sequential/依赖): 子问题之间有依赖关系,需按顺序执行。

# 示例
原始问题:"2023年哪家公司的AI产品最受欢迎,它的市场份额是多少?"
子问题1:"2023年哪家公司的AI产品最受欢迎?"
→ 答案:OpenAI
子问题2:"OpenAI在2023年的市场份额是多少?"
→ 使用子问题1的答案

并行分解(Parallel/独立): 子问题相互独立,可同时执行。

# 示例
原始问题:"比较GPT-4和Claude的优缺点"
子问题1:"GPT-4的优点和缺点是什么?"
子问题2:"Claude的优点和缺点是什么?"
→ 并行检索,最后合并对比

2.4 Step-Back(回退策略)

原理: 将具体问题回退到更高层次的通用问题,先获取背景知识。

适用场景:

  • 时间序列问题
  • 多步推理问题
  • 需要背景知识的复杂问题

示例:

# 原始问题(具体)
"2024年3月OpenAI发布了什么新功能?"
# 回退问题(通用)
"OpenAI的产品发展历史和重要版本?"
# 流程
1. 先回答回退问题,获取背景知识
2. 再回答原始问题,结合背景给出答案

2.5 HyDE(假设性文档嵌入)

原理: 生成假设性答案,用假答案的embedding去检索,而非用问题embedding。

核心假设: 假答案与真实答案的相似度 > 问题与答案的相似度

流程:

1. 输入用户问题
2. LLM生成假设性答案(可能不准确)
3. 用假答案的embedding进行向量检索
4. 检索到的真实文档作为上下文
5. 重新生成最终答案

优点:

  • 提升检索准确性
  • 适合复杂语义匹配

缺点:

  • 需要额外LLM调用
  • 成本和延迟增加

三、路由与查询构建策略 ★★★★★

🔥 学习优先级:重点掌握 使用位置: 选择正确知识源并构建带过滤条件的检索请求;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。

3.1 路由(Routing)

定义: 智能流量调度,根据查询类型将请求路由到不同的处理流程。

3.1.1 逻辑路由(LLM as Classifier)

原理: 使用LLM作为分类器,判断查询类型并路由。

示例:

# 查询类型分类
- 事实型问题 → 知识库RAG
- 计算型问题 → 调用计算工具
- 闲聊问题 → 直接对话模型
- 代码问题 → 代码知识库

3.1.2 语义路由(Semantic Routing)

原理: 基于查询的语义相似度进行路由。

实现:

# 预定义主题向量
topics = {
"产品功能": embedding("产品相关问题"),
"技术支持": embedding("技术故障问题"),
"价格咨询": embedding("价格优惠问题")
}
# 计算查询与各主题的相似度
query_embedding = embedding(user_query)
similarity_scores = cosine_similarity(query_embedding, topics)
# 路由到最相似主题

最佳实践:

  • 主题数量:5-20个为佳(太少不够细分,太多overlap严重)
  • Fallback机制:相似度都低时的兜底策略
  • A/B测试:对比不同路由策略的效果

3.2 查询构建(Query Construction)

定义: 将自然语言查询转换为结构化查询语句。

3.2.1 关系数据库查询(SQL)

示例:

# 自然语言
"查询2023年销售额超过100万的客户"
# 转换为SQL
SELECT customer_name, SUM(sales)
FROM orders
WHERE year = 2023
GROUP BY customer_name
HAVING SUM(sales) > 1000000

3.2.2 图数据库查询(Cypher)

示例:

# 自然语言
"查找张三的所有二度好友"
# 转换为Cypher
MATCH (p:Person {name: '张三'})-[:FRIEND]->()-[:FRIEND]->(friend)
RETURN friend.name

3.2.3 向量库 + 元数据过滤

示例:

# 自然语言
"查找2024年发布的关于AI的文档"
# 转换为向量检索 + 元数据过滤
{
"query_embedding": embedding("AI相关内容"),
"filter": {
"year": 2024,
"category": "AI"
},
"top_k": 5
}

3.2.4 错误处理

重试机制: SQL/Cypher生成错误时重新生成。

SQL验证:

# 检查SQL安全性
- 禁止DROP/DELETE等危险操作
- 限制查询范围(添加LIMIT)
- 参数化查询防注入

安全检查:

  • 权限验证
  • 敏感数据脱敏
  • 查询超时限制

四、索引生成优化策略 ★★★

🧩 学习优先级:补充掌握 使用位置: 在特定数据规模和文档结构下提升索引表达能力;学习要求: 能读懂并知道何时使用,项目需要时可快速落地。

补:高级索引优化技术

4.1 多表示索引(Multi-Representation Indexing)

原理: 为同一文档生成多个不同的表示形式。

实现方式:

  • 原始文本 + 摘要:同时索引全文和摘要
  • 多粒度切分:段落级 + 句子级
  • 多模型embedding:使用不同embedding模型

优点:

  • 提升不同类型查询的召回率
  • 增强检索鲁棒性

4.2 RAPTOR(递归抽象处理树状检索)

原理: 构建层次化的文档摘要树,支持不同粒度的检索。

结构:

层级0(叶子节点): 原始文档块
层级1: 多个块的摘要
层级2: 多个摘要的摘要
...
根节点: 全文总结

检索策略:

  • 简单问题:在叶子节点(细粒度)检索
  • 概括性问题:在上层节点(粗粒度)检索

优点:

  • 支持多层次理解
  • 适合长文档和复杂查询

4.3 ColBERT(细粒度上下文检索)

原理: Token级别的交互匹配,而非整个chunk的向量匹配。

特点:

  • 每个token都有自己的向量
  • 计算query每个token与document每个token的相似度
  • 精确度更高,但计算成本大

适用场景:

  • 需要精确匹配的场景
  • 关键词敏感的检索

4.4 其他优化技术

文档摘要索引: 为长文档生成摘要,同时索引原文和摘要。

元数据增强: 为每个chunk添加丰富的元数据(标题、章节、标签等)。

时间衰减: 为文档添加时间权重,新文档权重更高。


五、检索优化策略 ★★★★★

🔥 学习优先级:重点掌握 使用位置: 改善召回、相关性、排序和上下文选择;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。

补:提升检索效果的方法

5.1 查询扩展(Query Expansion)

同义词扩展:

"汽车" → ["汽车", "轿车", "车辆", "机动车"]

相关词扩展: 使用词向量找相近概念。

历史查询扩展: 结合用户历史查询优化当前查询。


5.2 上下文窗口优化

父文档检索(Parent Document Retrieval):

  • 索引:小块(精确匹配)
  • 返回:所属的大块(完整上下文)

滑动窗口扩展: 检索到某chunk后,同时返回其前后chunk。


5.3 负样本过滤

低相似度过滤: 设置相似度阈值,过滤不相关结果。

多样性过滤: 避免返回内容高度重复的chunk。


六、生成优化策略 ★★★★★

🔥 学习优先级:重点掌握 使用位置: 压缩上下文、提供引用并降低无依据回答;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。

补:提升生成质量的方法

6.1 上下文压缩

问题: 检索到的chunk过多,超出LLM上下文窗口。

解决方案:

  • 重排后截断:只保留top-k最相关的
  • 摘要压缩:对多个chunk生成摘要
  • LLMLingua:使用模型压缩文本

6.2 引用追踪

添加来源标记:

【来源1】原始文本1...
【来源2】原始文本2...
请在回答时标注信息来源,格式:[1][2]

输出示例:

RAG是检索增强生成技术[1],它结合了检索和生成两个步骤[2]。

6.3 答案验证

自我反思(Self-Reflection): 让LLM检查自己的答案是否符合要求。

事实核查: 对比答案与检索文档,验证一致性。

置信度评分: 让模型给出答案的置信度分数。


七、RAG系统评估 ★★★★★

🔥 学习优先级:重点掌握 使用位置: 量化检索与生成质量并支持持续回归;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。

补:完整评估体系

7.1 离线评估

检索阶段:

  • Recall@K
  • Precision@K
  • MRR
  • NDCG

生成阶段:

  • BLEU:与参考答案的n-gram重叠
  • ROUGE:召回率导向的重叠度
  • BERTScore:语义相似度

7.2 在线评估

用户反馈:

  • 点赞/点踩
  • 答案有用性评分

业务指标:

  • 答案采纳率
  • 用户满意度
  • 任务完成率

7.3 人工评估

维度:

  • 相关性:答案是否回答了问题
  • 准确性:事实是否正确
  • 完整性:是否遗漏重要信息
  • 流畅性:语言表达质量
  • 可信度:是否基于检索内容

八、常见问题与解决方案 ★★★★★

🔥 学习优先级:重点掌握 使用位置: 定位召回不足、噪声、幻觉、延迟和成本问题;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。

补:实战中的坑与对策

8.1 检索不到相关内容

可能原因:

  • chunk切分不合理(过大或过小)
  • embedding模型不匹配(中英文混用)
  • 查询表达与文档差异大

解决方案:

  • 调整chunk_size和overlap
  • 使用领域特定embedding模型
  • 查询改写/扩展

8.2 检索到无关内容

可能原因:

  • 向量数据库中存在低质量数据
  • 相似度阈值过低
  • 元数据过滤不足

解决方案:

  • 数据清洗和去重
  • 提高相似度阈值
  • 添加元数据过滤条件
  • 使用reranker重排

8.3 答案生成幻觉

可能原因:

  • prompt设计不当
  • 检索内容不足
  • 模型倾向于使用固有知识

解决方案:

  • 强调“仅根据参考资料回答”
  • 提升检索质量
  • 使用依赖度检查工具
  • 添加引用要求

8.4 响应速度慢

瓶颈分析:

  • 向量检索耗时
  • 重排序耗时
  • LLM生成耗时

优化方案:

  • 使用ANN加速向量检索(HNSW)
  • 减少rerank候选数量
  • 使用流式输出
  • 缓存高频查询结果

九、实战工具与框架 ★★★

🧩 学习优先级:补充掌握 使用位置: 按规模、过滤、部署和维护需求选择组件;学习要求: 能读懂并知道何时使用,项目需要时可快速落地。

补:常用开发工具

9.1 RAG框架

LangChain:

  • 最流行的RAG框架
  • 丰富的组件和集成

LlamaIndex:

  • 专注数据索引和检索
  • 强大的查询引擎

Haystack:

  • NLP pipeline框架
  • 支持混合检索

9.2 向量数据库对比

数据库 特点 适用场景
Milvus 高性能、分布式 大规模生产环境
Qdrant 易用、过滤强 中小型项目
Chroma 轻量级、内存 原型开发
Pinecone 云托管、免运维 快速上线
FAISS Meta开源、仅索引 研究和实验

9.3 Embedding模型选择

中文场景:

  • bge-large-zh(推荐)
  • m3e-base
  • text2vec-large-chinese

英文场景:

  • text-embedding-3-large(OpenAI)
  • gte-large
  • e5-large-v2

多语言:

  • multilingual-e5-large
  • paraphrase-multilingual-mpnet-base-v2

十、进阶学习资源 ★

👀 学习优先级:了解即可 使用位置: 需要专项深入时查询论文和项目资料;学习要求: 建立概念边界,不必首次记忆细节,需要时再查询。

补:深入学习方向

10.1 论文推荐

  • RAG原始论文(Lewis et al., 2020)
  • ColBERT论文
  • RAPTOR论文
  • HyDE论文

10.2 实战项目

  • 企业知识库问答系统
  • 文档智能分析助手
  • 客服机器人
  • 法律文书检索系统

10.3 优化方向

  • 多模态RAG(图片+文本)
  • 实时数据更新
  • 个性化检索
  • 对话式多轮RAG

本文由作者整理,AI 辅助润色。