Advanced RAG
在 Naive RAG 基础上,针对"检索质量"做系统优化。核心是三段式:检索前改写、检索中多路、检索后重排。追求生产级准确率。
一、核心思想
Naive/Agentic RAG 的检索质量受限于:
- 用户原话未必是好的检索词
- 单路向量检索召回不全
- 向量相似度 ≠ 真正相关(粗排)
Advanced RAG 在检索的三个环节加优化:
检索前: query 改写(生成更好的检索词)
检索中: 多路检索(向量 + 关键词混合)
检索后: rerank 重排序(精排)
二、三个优化方向
1. 检索前:Query 改写
用户原话未必是好的检索词。用 LLM 把问题改写成更适合检索的词。
多查询(Multi-Query)
生成多个不同角度的检索词,每个都去检索一遍,合并结果。
用户: "我想了解禅院飞鸟,还有禅院业"
↓ LLM 改写
q1: "禅院飞鸟 介绍"
q2: "禅院飞鸟 出处 背景"
q3: "禅院业 含义"
q1 → 检索 → 文档 A, B, C
q2 → 检索 → 文档 B, D, E
q3 → 检索 → 文档 F, G
合并去重: A, B, C, D, E, F, G
关键:合并的是文档,不是 query。每个 query 各自检索,各自和知识库比,最后把捞回来的文档合一起。多角度检索覆盖更广。
HyDE(假设文档检索)
让 LLM 先生成一个"假设性答案文档",用这个假设文档的向量去检索。思路:答案和答案更像(比"问题和答案"更接近)。
用户问题 → LLM 生成假设答案(编的)→ 假设答案向量化 → 检索
2. 检索中:多路检索(混合检索)
向量检索(语义匹配)+ 关键词检索(BM25,精确匹配)结合。
- 向量检索:擅长语义相似("汽车" 能匹配 "轿车")
- 关键词检索:擅长精确词匹配(专有名词、代码、ID)
两者结合(混合检索)更稳:语义 + 精确都覆盖。
3. 检索后:Rerank(重排序)
向量检索召回的 top-N 文档,用 cross-encoder 重新打分排序,取最相关的 top-k。
为什么叫"重"排序:向量检索已经按相似度排过一次,rerank 是用更准的模型再排一次。
三、Bi-encoder vs Cross-encoder(核心区分)
理解 rerank 的关键。两种打分方式:
Bi-encoder(双编码器)—— 向量检索用
query → 编码 → query向量
doc → 编码 → doc向量
分数 = 余弦相似度(query向量, doc向量)
- query 和 doc 分别编码,各得向量,再算距离
- doc 向量可预先算好存库
- 快,但 query 和 doc 没有交互,精度有限
Cross-encoder(交叉编码器)—— rerank 用
[query + doc] 一起输入模型 → 一个相关性分数
- query 和 doc 拼一起过模型,直接输出分数
- 不能预计算,每个 query-doc 对都要现跑
- 慢,但准——query 和 doc 在模型内部做 attention 交互,捕捉细粒度匹配
对比
| Bi-encoder | Cross-encoder | |
|---|---|---|
| 输入 | 单条文本 | (query, doc) 对 |
| 输出 | 向量 | 分数 |
| 能否预计算 | 能 | 不能 |
| 速度 | 快 | 慢 |
| 精度 | 一般 | 高 |
| 用途 | 初筛(海量→N) | 精排(N→k) |
类比
- Bi-encoder = 给 query 和 doc 各拍张照片,比两张照片像不像(快但粗)
- Cross-encoder = 把 query 和 doc 摆一起仔细通读,判断多相关(准但慢)
四、完整流程(带数字例子)
设定:知识库有 5 个文档(入库时已向量化)
D1: 禅院飞鸟介绍
D2: 禅院飞鸟出处
D3: 禅院飞鸟内容
D4: CPU排查方法(无关)
D5: 长尾效应(无关)
用户问题
"我想了解禅院飞鸟,还有禅院业是什么"
步骤 1:LLM 改写出 3 个检索词
q1: "禅院飞鸟 介绍"
q2: "禅院飞鸟 出处 背景"
q3: "禅院业 含义"
步骤 2:每个 query 各自向量化,各自和 5 个文档比相似度
q1 向量 vs D1~D5:
| 文档 | 相似度 | |
|---|---|---|
| D1 | 0.92 | 最像 |
| D3 | 0.80 | |
| D2 | 0.71 | |
| D4 | 0.12 | |
| D5 | 0.08 |
取 top-2 → 挑出 D1, D3
q2 → 挑出 D2, D1
q3 → 挑出 D1, D2
步骤 3:合并挑出的文档(去重)
{D1,D3} ∪ {D2,D1} ∪ {D1,D2} = {D1, D2, D3}
候选文档池:D1, D2, D3
步骤 4:rerank(cross-encoder 打分)
把原问题 + 每个候选文档一起输入 cross-encoder,输出分数:
cross-encoder(原问题, D1) → 0.95
cross-encoder(原问题, D3) → 0.88
cross-encoder(原问题, D2) → 0.72
排序:D1(0.95) > D3(0.88) > D2(0.72),取 top-2 → D1, D3
步骤 5:拼进 prompt,LLM 生成回答
流程图
用户问题
↓ LLM 改写
q1, q2, q3
↓ 每个各自向量化,各自和知识库比相似度
q1 → 挑出 D1,D3
q2 → 挑出 D2,D1
q3 → 挑出 D1,D2
↓ 合并文档去重
候选池: D1, D2, D3
↓ rerank(原问题+文档 一起输入cross-encoder打分)
D1(0.95) > D3(0.88) > D2(0.72)
↓ 取top-2
D1, D3
↓ 拼进prompt
LLM 生成回答
五、三个模型协作
完整 Advanced RAG 用三个独立模型:
| 模型 | 职责 | 怎么工作 |
|---|---|---|
| embedding 模型(bi-encoder) | 文本 → 向量,检索 | 单条文本输入,输出向量 |
| rerank 模型(cross-encoder) | query-doc 打分,精排 | query+doc 一起输入,输出分数 |
| LLM | 生成回答 + query 改写 | 对话生成 |
不能合并成一个:训练数据、模型结构、优化目标都不同。embedding 擅长"压成向量",rerank 擅长"判断相不相关",LLM 擅长"生成语言"。
六、性能与精度平衡
先用快的 bi-encoder 筛掉绝大多数(海量文档 → top-N)
再用准的 cross-encoder 精排少数(top-N → top-k)
直接对海量文档全用 cross-encoder 太慢,全用 bi-encoder 不够准。两段式是性能与精度的平衡。
七、优缺点
优点:
- 检索精度高(改写 + 多路 + rerank 三重优化)
- 召回全(多 query 多角度覆盖)
- 精排准(cross-encoder 细粒度判断)
缺点:
- 复杂:流程长,环节多
- 慢:多次检索 + rerank 多次模型调用
- 成本高:多用一个 rerank 模型 + 多次 LLM 改写
- 延迟高:用户等待时间长
八、适用场景
- 生产级应用,追求准确率
- 文档量大、问题复杂
- 对延迟不敏感(或可接受)
九、关键认知
- Advanced RAG 三段式:检索前改写、检索中多路、检索后 rerank。
- query 改写是多 query 各自检索、合并文档(不是选最好的 query)。
- rerank = 重排序:向量检索排过一次,cross-encoder 再排一次。
- bi-encoder 分别编码比向量(快,初筛);cross-encoder 一起编码出分数(准,精排)。
- 三个模型协作:embedding + rerank + LLM,职责不同不能合并。
- 性能与精度平衡:快筛 + 准排。
- 精度高但复杂、慢、贵,适合生产级。
Advanced RAG 解决了检索质量,但流程重。实际项目常按需取舍:只加 rerank、或只加 query 改写,不必全套。
评论区