返回 AI大模型从0到1——理论与实操

C2-05 RAG优化(进阶)


🎯 课程导览:本课程面向已经了解 RAG 基本原理(检索 + 生成)的同学。我们把"朴素 RAG"比作一个刚入职的图书管理员——他知道书在哪里,但工作粗糙、经常答非所问。本节课要把他培养成资深研究员,方法有四大方向:评测(看清问题)、检索优化(找得准)、生成优化(答得好)、多模态与图谱(扩展能力边界)。

一、为什么 RAG 总"差点意思"?—— 先学会测量,再谈优化

很多人调 RAG 系统像"看天吃饭":改一个参数、跑两个例子、觉得好一点就上线了。结果一上线就翻车。

RAG 全链路有 4 个关键环节,每个环节都有对应的"体检指标":

环节 关键问题
① 检索召回 从海量文档里找出相关文档,找到了多少?有多相关?
② 上下文质量 召回来的文档里,有多少内容是真的和用户问题相关的?
③ 生成忠实度 大模型的回答,是不是真的依据了检索到的上下文?
④ 答案相关性 最终答案到底在不在回答用户的问题?

1.1 检索阶段指标

召回率(Recall):召回了多少"应该召回的"。

📖 文档库里有 5 篇与查询真正相关的文档,检索器召回了 3 篇,召回率 = 3/5 = 0.6。召回率越低,意味着你漏掉了"正确答案",系统再聪明也无米下锅。

上下文相关性(Context Relevance, CR):召回来的内容里有多少是有用的。

📖 一篇文档主题相关,但 80% 是凑字数的背景介绍。召回率高,但 CR 低——这就是"看着相关但没用"。

1.2 生成阶段指标

1.3 RAGAS:业界最主流的 RAG 评测框架

Context Precision(上下文精确率)—— 宁可少召回,不要瞎召回

核心思想:检索出来的多个 context 中,真正相关的占比是多少。它惩罚"排在前面的无关文档"——无关文档排在前面会扣分。

类比:图书管理员给你推荐 5 本书,如果前 3 本都跟你的问题无关、只有后 2 本相关,就算命中了也算"不称职"。理想情况是:相关文档排得越靠前越好

计算公式(基于 precision@k 的加权变体):

Plain Text
1
2
3
4
5
Context Precision @ K = (Σ relevant_i × precision@i) / K
其中:
  precision@i = i 之前(含 i)相关文档数 / i
  relevant_i = 1 表示第 i 个 context 相关,否则为 0
  K = 召回文档总数

💡 关键点:Context Precision 强调"排序质量"。如果相关文档排在第 5 位、前面 4 个都无关,即使 Recall 是 100%,Precision 也很低。所以光召回不够,还得排得准。

RAGAS 四大核心指标

指标 评估目标 输入字段 取值
Context Precision(上下文精确率) 检索阶段:返回的上下文有多少是真正相关的 question, contexts, ground_truth 0\~1,越高越好
Context Recall(上下文召回率) 检索阶段:标准答案涉及的内容有多少被检索到了 question, contexts, ground_truth 0\~1,越高越好
Faithfulness(忠实度) 生成阶段:回答的每句话是否都能在上下文找到出处 question, contexts, answer 0\~1,越高越好
Answer Relevancy(答案相关性) 生成阶段:回答是否精准回应了用户问题 question, contexts, answer 0\~1,越高越好

📌 RAGAS 的定位:RAGAS 不是简单地把指标列出来,而是给每个指标设计了:① 计算公式;② 输入数据要求(需要哪些字段);③ LLM 调用 prompt(用 LLM 做裁判);④ Python 实现。一句话总结:用 LLM 当裁判,给 RAG 系统打分

使用业界最主流的 RAGAS 框架进行量化评估。

忠诚度(Faithfulness):回答是否能在检索到的上下文里找到出处。这是对抗"大模型胡编"的核心指标。

❌ 低忠诚度反例:
上下文:珠穆朗玛峰海拔 8848.86 米。
回答:珠穆朗玛峰海拔 5895 米。
→ 数字对不上、上下文里找不到出处,忠诚度 = 0。

答案相关性(Answer Relevance, AR):回答是否精准响应了用户需求。

📖 用户问"地球最高的山是哪座",模型答"登山要注意保暖"——答非所问,AR 极低。

💡 记忆口诀召→准→忠→答,四个环节缺一不可。优化时优先找最弱的那个环节下药。


二、检索优化(上):让"图书管理员"找书更准

类比:检索就像图书管理员帮你找书。书库越大,他越难找——要么书名记错(Query 不准),要么书摆错位置(分块不合理),要么他眼神不好(向量模型不够强)。这一章我们逐个击破。

2.1 分块策略:把"百科全书"切成"百科小卡片"

为什么要切?因为整本百科全书没办法做向量匹配——太长了,要么信息太散,要么算不动。

类比:图书馆不会把《三国演义》整本贴在一个检索码上,而是按章回切,每一回贴一个码。

常见分块方法对比

方法 核心逻辑 优势 适用场景
固定大小分块 按 token 数硬切(如 256 token / 块) 简单、快 日志、无结构文本
递归分块 按段落→句子→词的优先级递归切 保留语义完整 论文、报告
语义分块 相邻句子向量距离近的归一块 块内语义统一 长文本、跨主题
结构化分块 按 Markdown 标题、HTML 标签等切 保留原始结构 文档、技术手册

踩坑提醒:固定大小切分可能把"一株是枣树,还有一株也是枣树"切两半。看似简单,实则破坏语义。法律、医学等一句话信息密度极大的场景,用句子级分块反而比大块好。

"小块召回 + 大块生成"的妙招

类比:你在图书馆想查"鲁迅笔下的孔乙己",管理员先用索引卡(小块)精确定位到那一页,然后从那一(大块)抄下完整段落给你——而不是只给你一行目录。

具体做法:

  • 小块(如句子)用于检索匹配,匹配精度高
  • 找到小块后,取它所属的大块(章节/段落)作为上下文给大模型,避免碎片化

2.2 Query 重写:用户不会问问题怎么办?

类比:用户问"MIT OpenCourseWare 是啥?"——这是个口语化、模糊的查询,检索器不一定能匹配到正确文档。这时候需要请一个"翻译官"(LLM),把用户的话"翻译"成更精准的检索词。

四种翻译手法

手法 举例
扩写 "MIT OpenCourseWare 是啥?" → "请介绍 MIT OpenCourseWare,它是什么、有什么作用"
子问题 "RAG 是什么?" → 拆为 "RAG 的定义"、"RAG 的原理"、"RAG 的应用场景" 三个子问题分别查
多步骤 "世界上最高的山有多高?" → 第一步"最高的山是什么"→第二步"珠穆朗玛峰有多高"
AI 自检 生成回答后,让 LLM 自我评判"这个回答解决了用户的问题吗?",不行就改写再来一次

🧠 进阶技巧 - HyDE:让 LLM 假想一篇"假如文档存在会长什么样"的文章,用它代替原始 Query 去检索。对抽象查询特别有效。

2.3 重排序:粗筛之后再来一道精筛

类比:检索器像搜索引擎,先给你 100 条结果(粗筛);重排序器像资深编辑,再从这 100 条里挑出最靠谱的 5 条(精筛)。

为什么不直接用重排序搜全部?因为重排序需要把"Query + 文档"喂给一个 Transformer,10 万篇文档算一遍要跑很久——先召回 20-50 篇候选,再精排,就快得多。

常见重排序模型

  • BGE-Reranker(base/large):开源中文友好,工业首选
  • CrossEncoder:经典结构,准确率高

实战效果:在 CMRC 数据集上,未重排时 top-1 准确率较低,重排后可达 0.97

2.4 多路召回:集百家之长

类比:你查"林冲的事迹",不能只查一种来源——需要同时查《水浒传》原文、人物志、专家点评。多路召回就是这个思路:

  • 多查询:扩写 + 子问题生成多个 Query
  • 多节点组:同时检索原文、摘要、QA 对
  • 多检索方法:BM25(关键词)+ 向量检索(语义)并行
  • 重排序统一打分:最后用 Reranker 把所有结果按相关性重排

核心优势:单路检索像"独眼龙看世界",多路召回是"多双眼睛交叉验证",召回率和抗噪声能力都更强。


三、检索优化(下):让"图书管理员"记性更好

3.1 Embedding 模型微调:让"图书管理员"更懂你的书

通用 Embedding 模型像"通才图书管理员",但你要做一个金融领域的知识库,他可能不知道"IC"在金融里指"投资资本"而不是"集成电路"。这时就要"定向培训"他。

微调的三个关键概念

  • 正样本(pos):与 Query 相关的文档,训练模型让它们的向量更近
  • 负样本(neg):与 Query 不相关的文档,训练模型让它们的向量更远
  • 指令前缀(prompt):如 "Represent this sentence for searching relevant passages:",告诉模型"这是检索任务"

训练数据格式示例

Plain Text
1
2
3
4
5
6
7
8
9
{
  "query": "What was the total stockholder's equity for Peloton?",
  "pos": ["As of June 30, 2021, Peloton's total stockholder's equity was $1,754.1 million."],
  "neg": [
    "In June 2023, the company repurchased $500 million of common stock...",
    "Overhead costs as a percentage of net sales increased 40 basis points..."
  ],
  "prompt": "Represent this sentence for searching relevant passages: "
}

💡 核心技巧:每个 Query 配 10 个负样本左右(随机采样但要避开自身),用 9:1 切分训练/评测集,再用 flagembedding 框架微调 bge-large-zh-v1.5。

效果验证

金融数据集上微调后,上下文召回率上下文相关性通常都能显著提升——意味着检索更准、生成的依据更靠谱。


四、生成优化:让"研究员"答得更专业

检索再准,模型说不好也白搭。这一章讲怎么让大模型成为合格的"研究员"。

4.1 通用模型在垂直领域的三大短板

短板 例子
专业术语歧义 "IC" 在医学 = 重症监护,在电子学 = 集成电路
长尾知识缺失 罕见病、方言、小众文化
结构化输出失控 要求输出 JSON,结果多了一个逗号、前端崩溃

4.2 微调:让通用模型变"专家"

类比:微调就像让一个全科医生去进修成专科医生——不需要从零学医(预训练),只需要看专科病例强化训练。

两大核心方法

  • 监督微调(SFT):喂领域 QA 对,模型学会"该领域怎么答"
  • LoRA 低秩适配:冻结 99% 参数,只训练 0.1%-1% 的小矩阵,显存省 90%,效果接近全量微调

RAG 场景的微调技巧

💡 三大评测指标(针对"答案必须来自原文"的 RAG 任务):

  • 精确匹配率(EM):回答是不是一字不差
  • 语义相似度(Cosine):回答和标准答案语义有多像
  • 原文包含度(Origin Score):回答的词是否都能在原文 context 找到——这是 RAG 特有的关键指标

训练数据格式

Alpaca 格式

JSON
1
2
3
4
5
6
7
[
  {
    "instruction": "请用下面的文段原文回答:黄独的外皮是什么颜色?\n已知文段:黄独为薯蓣科植物,外皮黄褐色...",
    "input": "",
    "output": "外皮黄褐色"
  }
]

OpenAI 对话格式

json { "messages": [ {"role": "system", "content": "你是专业的医学问答助手"}, {"role": "user", "content": "高血压患者应该注意什么?"}, {"role": "assistant", "content": "低盐饮食、规律运动、定期监测血压..."} ] }text

五、性能优化:让系统跑得更快

类比:一个图书馆即使藏书丰富、检索员厉害,如果每次开门都要把书架重新摆一遍、借书要排队 2 小时,用户也会跑光。这一章解决"快"的问题。

5.1 持久化存储:别每次启动都重新建库

默认情况下 RAG 系统把向量存在内存里,重启就丢,下次又得重新算一遍——慢、还费算力。

解决方案:用向量数据库把向量、文本、元数据存硬盘。

存储方案 底层 适用场景
MapStore(默认) 内存 技术探索、快速验证
ChromaDB Chroma+FAISS 原型开发、本地测试
Milvus 分布式 企业级、PB 级数据、高并发

进阶技巧:用 Redis 做内存缓存高频访问的向量,"用内存换时间"——查询延迟可降一个数量级。

5.2 向量索引:为什么百万级文档也能秒级检索?

类比:向量索引像书的目录——没有目录你只能一页页翻(O(n)),有目录你可以直接跳到目标章节(O(logn))。

三种主流 ANN 索引对比

索引 原理 适用
IVF(倒排文件) K-means 聚类分簇,搜索时只在相关簇内暴力搜 百万\~千万级
PQ(乘积量化) 高维向量拆成多段量化压缩,压缩比 10-100 倍 亿级、超大内存省
HNSW(层次化小世界) 多层图贪心搜索,速度最快、精度最高 工业级首选

选型建议:对实时性要求高的在线问答,直接用 HNSW。内存吃紧就用 PQ 量化。超大规模且对精度要求不极致才考虑 IVF。

5.3 大模型推理加速

当系统瓶颈在"生成"时:

  • 硬件:GPU(A10/H100),CUDA + Tensor Core
  • 软件:Flash Attention(显存降 50%+)、vLLM(吞吐量提升 23 倍)、LMDeploy(50ms 级延迟)
  • 量化:FP16 → INT8/INT4(AWQ/GPTQ),速度提升 3-4 倍
  • 蒸馏:大模型教小模型,参数减半但保留 90% 性能

六、扩展能力:让"研究员"会看图、会推理

6.1 多模态 RAG:不止会读文字

类比:传统 RAG 是个"文盲研究员"——只能读文字。多模态 RAG 是"全能研究员"——能看图、看表、看公式。

三大核心挑战

  • 多页处理:100 页报告怎么定位关键页
  • 多源引用:跨页交叉验证(如"今年 vs 去年销量对比")
  • 多模态融合:表格数据 + 图表趋势 + 正文叙述 综合理解

PDF 多模态 RAG 的核心流程

步骤 关键要点
文档解析 用 magic-pdf、LayoutLM 提取文本+表格+图像,保留结构
多模态嵌入 CLIP(图文对齐)/ BLIP(图转文) / 直接生成 QA 对
检索生成 Markdown 标签嵌入图像 URL,让 LLM 输出图文并茂的答案

SimpleDoc 实战案例

SimpleDoc 提出"轻量架构 + 双线索检索 + 迭代推理":

  • 双线索:向量粗筛 + 摘要精排
  • 迭代推理:LLM 看完证据后,自主判断"够不够",不够就再查一轮
  • 记忆模块:把历史检索结果存下来,避免重复劳动

向量化效果优化四大技巧

  1. 文本补全:图像加上"图注+标题",让向量带语义
  2. QA 对生成:让 VLM 看图生成 QA 对,扩充索引
  3. 上下文增强:图像+前后 500 字上下文一起编码
  4. 领域微调:用 LoRA 在专业数据上微调多模态模型

🚀 新范式 ColPali:不需要解析 PDF,直接把每页当成"图"编码为页向量。简单粗暴但工程效率提升 40%+。核心是 MaxSim 操作:Query 的每个词向量与页面所有块向量取最大相似度,累加得到页面得分。


七、知识图谱 RAG:让"研究员"会推理

类比:传统 RAG 像背答案,知识图谱 RAG 像理解关系。问"爱因斯坦和牛顿有什么关系",背答案答不上;理解关系能从"影响"边一路走过去。

7.1 为什么需要知识图谱?

朴素 RAG 的三大死穴:

  • 碎片化:返回的是孤立文本块,缺逻辑关联
  • 结构缺失:识别不出"主题 A 是主题 B 的子主题"
  • 多跳推理失败:问"A 公司的 CEO 投资过哪些公司?"——需要 A→CEO→投资→公司 跳四步

7.2 知识图谱 = 实体 + 关系 + 属性

📖 三元组示例:
(阿基米德)—[发现]→(浮力原理)
(卢俊义)—[担任]→(副先锋)
(宋江)—[结拜]→(李逵)

7.3 两种主流开源方案对比

维度 GraphRAG(微软) LightRAG
核心思路 图谱 + 分层社区 + Map-Reduce 图谱 + 双层关键词 + 增量更新
检索方式 全局搜索 / 局部搜索 / DRIFT 高层级 + 低层级 双层并行
成本 高(GPT-4o 索引 32K 书需 \$6-7) 低(增量更新,无需社区聚类)
适用 全局摘要类("这篇文章讲了什么") 成本敏感、需增量更新

GraphRAG 的杀手锏:分层社区

类比:把一本书的人物关系聚成"梁山好汉社区"、"朝廷官员社区"、"方腊势力社区",每个社区有自己的摘要——检索时先定位社区、再钻细节。

  • 全局搜索:所有社区摘要并行打分,Map-Reduce 汇总
  • 局部搜索:从问题中识别实体,钻取相关实体 + 关系 + 文本片段
  • DRIFT:结合两者,先粗后细

LightRAG 的轻量哲学

  • 双层关键词:高层级("人物事迹")+ 低层级("林冲""八十万禁军教头")
  • 增量更新:新增数据只更新相关节点和边,不重建索引

🎯 实战选择小数据 + 高频更新选 LightRAG;大数据 + 全局理解选 GraphRAG;追求成本可控也选 LightRAG。


八、实战路线图:从 0 到 1 优化一个 RAG 系统

讲了这么多优化技术,按什么顺序上手?下面是推荐路线图

  1. 第一步:搭骨架——朴素 RAG,先跑通端到端流程
  2. 第二步:建指标——召回率、上下文相关性、忠诚度、答案相关性四项指标先建立基线
  3. 第三步:分块调优——试试不同分块策略 + 大小块组合
  4. 第四步:加重排序——BGE-Reranker 立竿见影(典型提升 10-30%)
  5. 第五步:Query 重写——扩写 / 子问题,针对长尾 Query 提升明显
  6. 第六步:多路召回——BM25 + 向量 + 多节点组 + 重排序 组合拳
  7. 第七步:模型微调——垂直领域用 Embedding 微调 + LLM LoRA 微调
  8. 第八步:性能优化——持久化 + 向量索引 + 推理加速,让生产可用
  9. 第九步:场景扩展——多模态(看图)、知识图谱(推理)按需引入

最后一句:RAG 优化没有银弹,数据决定上限,指标决定方向。先建好评测体系,再循序渐进调优,才能让"图书管理员"真正变成"资深研究员"。


附录:常见概念速查

术语 一句话解释
RAG Retrieval-Augmented Generation,先检索后生成,用外部知识补 LLM 的短板
Embedding 把文本变成向量的过程,让语义可计算
Cosine 相似度 两个向量的夹角余弦值,越接近 1 越相似
BM25 经典关键词匹配算法,基于词频和文档长度
CrossEncoder 把 Query 和 Document 同时喂进 Transformer 的精排模型
HNSW 当前最快的向量索引算法,图结构 + 贪心搜索
LoRA Low-Rank Adaptation,只训练极少量参数的微调技术
GraphRAG / LightRAG 基于知识图谱的 RAG 增强方案,全局 vs 轻量两条路线
ColPali 把 PDF 当图片直接编码的新一代多模态检索
HyDE Hypothetical Document Embeddings,假想文档增强检索

🎉 恭喜你学完本课!你已经掌握了 RAG 进阶优化的全套武器库:评测体系、检索优化、生成优化、性能调优、多模态扩展、知识图谱。下一步建议选择一个真实业务场景,亲手把这条路线图走一遍——实战是最好的老师。