【Agent笔记 | 第三篇】RAG优化

目录

[1. 为什么要加 Rerank(重排)?](#1. 为什么要加 Rerank(重排)?)

[2. Recall@K 和 Precision@K 怎么取舍?](#2. Recall@K 和 Precision@K 怎么取舍?)

[3. Top-K 怎么动态调整?](#3. Top-K 怎么动态调整?)

[4. BM25 是什么?](#4. BM25 是什么?)

[5. 如果 BM25 已经很好了,向量检索还有必要吗?](#5. 如果 BM25 已经很好了,向量检索还有必要吗?)


1. 为什么要加 Rerank(重排)?

在 RAG 系统中,检索通常分为两步:初筛(召回)精排(Rerank)

  • 初筛(如向量检索、BM25): 讲究的是"快"和"全"。它需要在海量(百万甚至千万级)文档中迅速找出可能相关的候选者。为了速度,初筛使用的模型往往是双塔结构(Query和Doc各自独立计算向量),这种结构无法捕捉 Query 和 Doc 之间深度的语义交叉关系。

  • 精排(Rerank): 讲究的是"准"。Rerank 模型(通常是 Cross-Encoder)会将 Query 和候选 Doc 拼在一起同时输入模型。由于它能让字词之间产生深度的注意力交互(Attention),因此判断相关性的准确度极高。

总结来说: 加 Rerank 是为了弥补初筛阶段为了速度而牺牲的精度。初筛负责把包含答案的文档"捞"上来,Rerank 负责把最能准确回答问题的文档"排"到最前面,防止不相关的内容干扰大模型(LLM)。

2. Recall@K 和 Precision@K 怎么取舍?

这两个指标在 RAG 中代表了截然不同的诉求:

  • Recall@K(召回率): 在前 K 个检索结果中,包含了多少真正的相关文档。这是 RAG 的生命线。 如果没召回相关文档,大模型再聪明也是"巧妇难为无米之炊"。

  • Precision@K(精确率): 在前 K 个检索结果中,有多大比例是真正相关的。这是防止大模型"幻觉"的关键。 喂给大模型的无关信息越多,它越容易迷失(Lost in the Middle),且浪费 Token。

取舍策略:分阶段优化

在 RAG 系统中,我们不应该在一个阶段同时死磕这两个指标,而是应该分摊给两路流程:

  1. 检索(Retrieve)阶段保 Recall: 把 K 设大一点(例如 K=20 甚至 100),宁可错杀一千,不可放过一个。

  2. 重排(Rerank)阶段保 Precision: 对召回的文档进行精准打分,然后截取排名最高的小部分(例如截取前$3 到 5 个),送给大模型生成答案。

3. Top-K 怎么动态调整?

固定给大模型喂 K=5 个文档是很死板的。有时候 1 个文档就足以完美回答问题,有时候需要综合 10 个文档。动态调整 Top-K 可以有效减少无关上下文带来的噪音。

常用的动态调整策略有三种:

  • 分数阈值截断(Thresholding): Rerank 之后,不仅看排名,还要看绝对分数。比如只保留相似度分数 > 0.8 的文档。如果只有 2 个文档及格,那这一次的 K 就是 2。

  • 断崖式截断(Score Drop / Elbow Method): 观察 Rerank 排序后的分数落差。如果第 1 到第 3 名的分数都是 0.9 左右,而第 4 名突然掉到了 0.6,那么就在第 3 名这里"砍一刀"。

  • 上下文窗口动态适配: 根据大模型的 Context Window 和 Query 的长度,动态计算剩余多少 Token 可以用来塞文档。配合分数优先级,按顺序把高分文档塞进去,直到 Token 达到安全阈值。

4. BM25 是什么?

BM25(Best Matching 25)是信息检索领域最经典、最有效的稀疏检索(Sparse Retrieval)算法。它不需要训练任何神经网络,核心原理是基于词频统计。

它的计算主要考虑三个维度:

  1. TF(词频): 你的搜索词在这个文档里出现了多少次。出现越多,相关性越大。

  2. IDF(逆文档频率): 你的搜索词在所有文档库里有多罕见。像"的"、"是"这种词 IDF 很低;而像"碳纳米管"、"Rerank"这种专业词汇 IDF 很高。罕见词的匹配权重更大。

  3. 文档长度归一化: 如果一个文档非常长,那它命中关键词的概率自然会变大。BM25 会对过长的文档进行适度惩罚,保证公平。

5. 如果 BM25 已经很好了,向量检索还有必要吗?

极其有必要。

BM25 属于"字面匹配",它的强项在于找专有名词、产品型号、身份证号、特定缩写 。但在 RAG 场景中,用户的提问往往是极其口语化的,这就导致了语义鸿沟

  • BM25 的死穴: 假设你的知识库里有一句话叫 "移动设备续航能力不足" 。用户的 Query 是 "手机没电了怎么办"。这两个句子在字面上没有任何交集,BM25 连一个字都匹配不上,直接返回 0 分。

  • 向量检索的强项: 向量模型理解的是"语义"。在向量空间里,"手机"和"移动设备"、"没电"和"续航不足"距离非常近。向量检索能轻松跨越词汇表象,抓取内在含义。

终极解法:混合检索(Hybrid Search)

在生产环境中,最成熟的做法是 BM25 + 向量检索 双路召回。让 BM25 兜底精准的关键词匹配,让向量检索负责泛化的语义理解,最后再通过 Rerank 把两路合并起来重新排序。这也是目前业界主流 RAG 架构的标准范式。

相关推荐
梁山1号1 小时前
【WK飞控调试笔记】
笔记
2301_809051141 小时前
Linux IO模型与并发服务器 学习笔记
笔记·学习
老王熬夜敲代码1 小时前
MCP的个人理解
agent·mcp
暴躁小师兄数据学院1 小时前
【AI大模型应用开发工程师特训笔记】第04讲(第1章):Python基础与环境搭建
人工智能·笔记·python·ai
填满你的记忆1 小时前
《RAG 完整工作流程详解》
java·ai·agent·rag
JaydenAI2 小时前
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱(Token)省时间
ai·c#·agent·caching·maf·chatclient中间件
爱听歌的周童鞋2 小时前
Learn-Claude-Code | 笔记 | Tools & Execution | s03_new Permission
llm·agent·tools·permission·execution·claude code
日晨难再2 小时前
SVN使用笔记
笔记·svn
小陈phd2 小时前
多模态大模型学习笔记(四十一)——从 “能看“ 到 “会想“:一文看懂多模态大模型的三代演进之路
人工智能·笔记·学习