做 RAG,检索质量通常不是卡在某一个点上。
很多项目上线以后,都会慢慢碰到类似问题:
- Query 看起来没问题,但召回结果总差一点
- 多路召回加上去了,候选更多了,结果还是不稳
- 重排序也接了,首条结果仍然会偏
- 整条链路越来越复杂,延迟越来越高,质量提升却不成比例
这种时候,最容易走偏的做法,就是继续往系统里叠模块。
更有效的办法,是把整条检索链路拆开,一段一段看问题到底出在哪,再决定改哪一步。
我自己这轮项目优化,基本就是按这个思路做的。
我把一条典型的 RAG 检索链路拆成了四段:
- Query 理解
- 多路召回
- 候选融合
- 重排序与边界控制
然后沿着这四段,一步一步找问题,一步一步做优化。
这篇文章,重点就是把这条路径讲清楚。
如果你也在做 RAG 项目,召回质量不稳定,可以直接按这个思路去排查。
一、先把 RAG 检索链路拆开
先看一条最常见的 RAG 检索流程:
用户 Query→ Query 理解 / 改写→ 多路召回→ 候选合并→ 重排序→ 返回 TopK 给生成模型很多项目里,问题会被笼统地归结成“检索不准”。
其实更准确的说法应该是:
- Query 有没有表达出真正的检索意图
- 多路召回有没有各自承担清晰职责
- 候选融合有没有把噪声一起放大
- 重排序有没有真正把对的内容顶上来
如果这几层不拆开,最后你看到的只是“结果不好”,很难知道问题到底出在哪。
所以做优化时,第一步不是调参数,而是先按这四层去看问题。
二、第一层:先看 Query,很多问题一开始就埋在这里
RAG 检索质量差,第一步要先检查的,其实不是召回器,而是Query 本身。
因为很多 Query 从用户嘴里出来的时候,并不天然适合检索。
它往往会带着几类问题。
1. Query 太短,意图太稀
比如用户问:
最近某家模型公司的开发者接口有什么变化?
这句话对人来说很好理解。
但对检索系统来说,有几个信息是模糊的:
- “某家模型公司”到底是哪家
- “开发者接口”更偏 API、SDK、Agent 框架还是工作流工具
- “变化”是指定价、能力、文档、上线时间,还是生态支持
如果直接拿这句话去检索,语义路线会拉到一批大方向相关的内容,关键词路线会抓到一批带“接口”“开发者”字样的内容,结果看起来都沾边,但真正贴题的比例不高。
2. Query 里有强实体,但没有被显式拆出来
再比如:
OpenAI 新的开发者接口最近有哪些变化
这类 Query 其实已经包含强实体了,但如果系统只把它当作一段整体文本去做 embedding,相当于把几个关键信号混在一起:
- OpenAI
- 新的开发者接口
- 最近
- 变化
这时候,系统很容易召回到:
- OpenAI 模型更新
- OpenAI 开发者工作流
- OpenAI Agent
- OpenAI 定价变化
方向都对,但未必真的是“新的开发者接口”。
3. Query 的主题边界太宽
还有一类 Query,本身就偏宽泛:
最近 AI 编程工具有什么值得关注的更新
这种问题如果不先做 Query 理解,召回器很容易拉进一堆:
- 模型更新
- IDE 工具
- Agent 工作流
- 代码审查
- 插件生态
候选很多,但边界很松,后面排序压力会非常大。
三、我在 Query 层做了什么优化
我没有一开始就做很重的 Query 改写,而是先做两件更基础的事。
1. 先拆出 Query 里的核心锚点
所谓核心锚点,可以理解成:
- 核心实体
- 核心对象
- 核心短语
- 时间约束
- 主题边界
还是拿这个 Query 举例:
OpenAI 新的开发者接口最近有哪些变化
拆出来以后,大概会得到这样的结构:
- 实体锚点:OpenAI
- 对象锚点:开发者接口
- 时间约束:最近
- 问题意图:变化 / 更新
这一层处理的价值很大,因为后面的多路召回终于知道该抓什么了。
2. 把原 Query 和结构化 Query 分开使用
原始 Query 保留给语义检索,因为原句通常更完整。
结构化 Query 交给关键词路线,因为它更适合抓实体和短语。
这样做以后,一个变化会非常明显:
以前很多 Query 看起来“语义差不多”,但实体总抓不稳。
拆完锚点以后,关键词路线终于开始发挥正常价值。
这一步虽然没有单独拿出一张完整打分表,但它直接影响了后面每条召回路线的质量。
尤其对强实体主题,收益非常明显。
四、第二层:多路召回该怎么拆,才能看清问题
Query 层理顺以后,下一步就是召回。
一开始我没有直接做大而全的混合检索,而是先把召回路线拆开单独看。
主要拆成四类:
- 主题语义召回
- 名称型语义召回
- 关键词召回
- 扩召回路线
这一步非常关键,因为很多人做多路召回时,并不知道每一路到底在补什么。
五、主题语义召回,负责定方向
这条路线的任务最明确:
- 识别主题是否一致
- 抓住相近表达
- 在 Query 不够标准时把方向拉回来
这条路线单独使用时的表现大概是:
- 平均 Top3:14.89
- 平均 Top1:5.11
- 平均延迟:3.41 秒
这个结果说明两件事。
第一,它已经接近可用
作为默认主干,它是成立的。
因为它最稳定,方向感最好。
第二,它对强实体的抓力不够
比如遇到:
- 特定 API
- 特定模型
- 特定产品名
- 特定框架名
它能找到方向对的内容,但未必能稳定把最该排前的结果顶上来。
这一步让我明确了一个判断:
主题语义召回适合做主干。
六、名称型语义召回,局部很强,但太重
我还单独测了一条更偏名称、实体、标题表达的语义路线。
它在强实体 Query 上确实会有亮点,单路平均 Top3 做到了14.11。
但问题同样非常明显:
- 平均延迟:10.19 秒
也就是说,它确实有价值,但太重。
它更像是一条局部增强路线,不适合作为默认主干。
如果直接常开,线上成本很难接受。
这一步让我明白了:
有价值的路线,不等于适合常开。
七、关键词召回,负责补实体和短语
关键词路线单独跑出来的数据其实并不好看:
- 平均 Top3:10.56
- 平均 Top1:3.78
- 平均延迟:4.32 秒
如果只看这组数据,很容易误判成“关键词路线没什么用”。
但真正的问题不在这里。
它的问题是:
- 它没有能力独立扛主链路
- 它缺少主题方向约束
- 它容易把词对了但主题不够准的内容一起拉进来
可它的价值同样很清楚:
- 抓 API 名
- 抓模型名
- 抓产品名
- 抓短语
- 抓专有名词
所以这一层我最后给它的角色非常明确:
关键词路线只做补召回,不做主干。
八、扩召回路线,覆盖面变大了,噪声也一起进来了
扩召回这类策略,看起来很有吸引力。
因为直觉上,候选更多,好像就更容易找到对的内容。
实际做下来,这条路最容易出的问题反而是:
- 候选池变脏
- 延迟变高
- 后面的排序压力明显上升
这类路线相关组合的平均 Top3 基本在12.33 到 12.78之间,延迟却普遍在8 到 11 秒左右。
这个结论很直接:
扩召回适合作项目探索项,不适合默认常开。
它可以用来验证边界,但不适合作为日常主链路的一部分。
九、单路线拆完以后,先把职责分清楚
到这一步,对多路召回的理解已经很明确了:
- 主题语义召回负责定方向
- 关键词召回负责补实体和短语
- 名称型语义召回有价值,但成本太高
- 扩召回路线只保留作探索项
这一步非常重要,因为后面所有组合优化,都是建立在这个判断上的。
如果职责都没分清楚,后面的多路召回只会越做越乱。
十、第三层:多路召回怎么组合,才能真正提质量
单路线看完以后,下一步才是组合优化。
这里真正要回答的问题是:
哪些路线叠在一起,是真的在提升质量。
我一共横向比较了15 个非空组合。
其中最值得关注的是两组:
| 组合 | 平均 Top3 信号 | 平均耗时 |
|---|---|---|
| 名称型语义 + 关键词 | 19.78 | 10.71 秒 |
| 主题语义 + 关键词 | 19.11 | 5.11 秒 |
这一步带来的结论非常清楚。
1. 语义 + 关键词,互补关系成立
关键词单路的平均 Top3 是10.56。
而主题语义加关键词以后,平均 Top3 提升到了15.33。
也就是说:
- Top3 提升:+4.77
- 提升幅度:约 45.2%
这说明,关键词路线的价值必须建立在一个稳定的语义主干上。
只有方向先被立住,关键词才是在补强。否则它只是在放大词面匹配。
2. 多路召回有效,不代表越多越好
名称型语义加关键词,在粗看时信号更高。
但它的平均延迟是10.71 秒,而主题语义加关键词只有5.11 秒。
这意味着:
- 它确实更强一点
- 但代价是延迟几乎翻倍
到了这一步,问题已经不再是“哪组分数最高”,而是“哪组更适合做默认链路”。
十一、举一个具体例子,看问题是怎么暴露出来的
还是拿这个 Query 举例:
OpenAI 新的开发者接口最近有哪些变化
只用主题语义召回时
会拉到很多方向正确的内容,比如:
- 开发者工具更新
- OpenAI 模型能力变化
- Agent 工作流
- SDK 相关内容
问题是,这里面真正围绕“新接口”的内容不一定稳定排前。
只用关键词召回时
会拉到很多带这些词的内容:
- OpenAI
- API
- 开发者
- 接口
问题是,这时候会混进很多词面接近但重点不同的内容,比如:
- API 定价
- 开发者生态
- 模型发布
- 通用工作流工具
主题语义 + 关键词组合以后
效果就明显稳定很多:
- 主题语义路线负责控制大方向
- 关键词路线负责把“新接口”这种明确对象往前拉
这个例子很典型,因为它说明了一件事:
召回提升很多时候不是靠换模型,而是靠把不同路线的职责分清楚。
十二、第四层:候选融合以后,还要看重排序是不是在做正确的事
很多 RAG 项目做到多路召回这一步就停了,觉得候选足够了,后面排序自然会解决。
实际做下来,很容易发现另一个问题:
候选合并以后,排序并不会自动把对的内容顶上来。
尤其是这几种情况:
- 主题边界很窄
- 周围近邻内容很多
- 语义接近但主题不对齐
- 实体强约束没有被显式建模
这时候,重排序如果还是只看泛语义相似度,首条结果仍然会偏。
十三、我在重排序前加了一层锚点约束
主链路收敛以后,开始处理真正难的 Query。
这类 Query 的共同特点是:
主题边界很窄,但周围“长得像它”的内容特别多。
比如:
- 某个具体 API
- 某个具体工作流能力
- 某个具体模型功能
- 某个具体产品动作
这些 Query 最大的问题不是“召不回来”,而是“近邻噪声太多”。
所以后面补了一层很关键的思路:
在进入最终重排序前,先做一层锚点约束。
这里的锚点可以理解成:
- 核心实体
- 核心短语
- 核心主题边界
- 用户真正盯住的对象
我做了一轮预过滤优化,结果如下:
| 方案 | 平均 Top1 | 平均 Top3 |
|---|---|---|
| baseline | 6.1 | 16.7 |
| anchor-aware | 6.3 | 17.3 |
| anchor-aware + phrase-aware | 6.3 | 17.3 |
从 baseline 到 anchor-aware:
- Top1 提升:+0.2
- 提升幅度:约 3.28%
- Top3 提升:+0.6
- 提升幅度:约 3.59%
这个提升不算夸张,但很稳定,而且业务含义非常清楚:
语义接近,不等于主题真正对齐。
对于窄边界 Query,锚点约束非常有效。
十四、这里踩过一个很典型的坑
一开始,我把过滤条件设得太硬了。
比如:
- 必须命中某个短语
- 必须命中某个锚点
- 必须同时满足多条规则
这样做的直觉很简单,先把泛候选清掉。
但问题也很快暴露出来:
很多真正相关的内容,表达方式并不完全一样。
如果规则太硬,会把本来应该保留的内容一起误删。
所以后来改成了软过滤:
- 候选足够多时,再逐步收紧
- 候选不足时,允许回退
- 锚点作为增强约束,不作为绝对门槛
这一步非常关键,因为它说明了一个很现实的问题:
重排序前的边界控制,要有弹性。
十五、最后把整条提升路径串起来看
如果把整条 RAG 检索优化路径串起来,其实会很清楚。
第一步,先处理 Query
看 Query 里有没有:
- 强实体没拆出来
- 主题边界太宽
- 时间约束和对象约束没显式表达
第二步,再拆多路召回
单独看每条路线的职责:
- 谁负责语义方向
- 谁负责实体命中
- 谁只是候选更多,噪声也更多
第三步,再做组合优化
比较不同召回组合的收益和成本。
这一轮里,最关键的结论是:
- 主题语义单路:Top3 14.89
- 主题语义 + 关键词:Top3 15.33
- Top3 提升:+0.44
- Top1 提升:+0.33
说明关键词补召回是有效的。
第四步,再做独立调权
不同组合要各自找最优点。
我一共做了54 组权重 sweep,最后收敛出的默认方案是:
- 主题语义权重:0.4
- 关键词权重:0.15
对应结果是:
- 平均 Top3:15.33
- 平均 Top1:5.44
- 平均延迟:5.11 秒
第五步,最后补边界控制
通过 anchor-aware 预过滤,把“语义上像但主题不对齐”的近邻噪声压下去:
- Top1:6.1 → 6.3
- Top3:16.7 → 17.3
十六、这套方法,适合怎么用在自己的项目里
如果你也在做 RAG 项目,我会建议按这个顺序去排查和优化:
1. 先看 Query
先不要急着怪召回器。
先确认 Query 有没有被正确拆成:
- 实体
- 对象
- 主题边界
- 时间约束
2. 再拆单路线
不要一上来就混多路。
先把每条路线单独跑一遍,看清楚:
- 哪条路线稳
- 哪条路线重
- 哪条路线只是在放大噪声
3. 再做组合
重点看组合以后:
- Top1 有没有提升
- Top3 有没有提升
- 延迟涨了多少
4. 再做独立调权
不同组合不能套同一套权重。
要让每一组先跑到自己的最优状态,再横向比较。
5. 最后再做边界控制
等主链路稳定以后,再去处理:
- 近邻噪声
- 窄边界 Query
- 实体锚点
- 短语边界
这样做,整条优化路径会非常清楚,结论也更扎实。
十七、最后收敛出来的经验
这轮项目优化做完以后,我对 RAG 检索质量提升的理解,大概可以压成三句话:
1. Query 没拆清楚,后面每一层都会跟着吃亏
很多检索问题,根源其实出在 Query 表达不够结构化。
2. 多路召回的关键,不是路线多,而是职责清楚
主题语义负责定方向,关键词负责补实体,这种组合才会稳定。
3. 重排序能不能把结果拉稳,很大程度取决于边界控制
语义接近只是第一层,主题对齐才是更重要的那层。
提升 RAG 检索质量,真正有效的路径,是把 Query、召回、融合、重排序这几层逐段拆开,然后一层一层去解决问题。
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋
📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~