目 录CONTENT

文章目录

rag-advanced

~梓
2026-06-29 / 0 评论 / 0 点赞 / 2 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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 改写
  • 延迟高:用户等待时间长

八、适用场景

  • 生产级应用,追求准确率
  • 文档量大、问题复杂
  • 对延迟不敏感(或可接受)

九、关键认知

  1. Advanced RAG 三段式:检索前改写、检索中多路、检索后 rerank。
  2. query 改写是多 query 各自检索、合并文档(不是选最好的 query)。
  3. rerank = 重排序:向量检索排过一次,cross-encoder 再排一次。
  4. bi-encoder 分别编码比向量(快,初筛);cross-encoder 一起编码出分数(准,精排)。
  5. 三个模型协作:embedding + rerank + LLM,职责不同不能合并。
  6. 性能与精度平衡:快筛 + 准排。
  7. 精度高但复杂、慢、贵,适合生产级。

Advanced RAG 解决了检索质量,但流程重。实际项目常按需取舍:只加 rerank、或只加 query 改写,不必全套。

0

评论区