跳到主要内容
SUN / 笔记
← 全部文章

RAG 高级检索与优化

本文聚焦基础检索链路之外的 Query 改写、多跳检索、自适应检索和上下文压缩。

高级 RAG 技术

基础 RAG 在复杂场景下会遇到问题,催生了多种增强技术。

Query 改写 / 扩展

用户原始问题往往表达不够精确,可以先对问题进行处理:

  • HyDE(Hypothetical Document Embeddings):让 LLM 先"假设"一个答案,用假设答案去检索(假设答案与真实文档更相似)
  • Query Expansion:将一个问题扩展成多个问法,分别检索后合并结果
  • Step-Back Prompting:将具体问题抽象成更宽泛的问题,先检索背景知识
text
用户:苹果公司 2023 年的营收是多少?
↓ HyDE
假设答案:苹果公司2023年营收约为3830亿美元...
↓ 用假设答案去检索,比用原始问题检索更准

多跳检索(Multi-Hop Retrieval)

复杂问题需要多轮检索,每次检索的结果作为下一次检索的依据:

text
问题:A 公司 CEO 的母校在哪个城市?
第1跳:检索 "A 公司 CEO 是谁" → 得到姓名
第2跳:检索 "XX 的母校" → 得到学校名
第3跳:检索 "XX 大学在哪" → 得到城市

Self-RAG

模型自己决定:

  1. 是否需要检索(避免不必要的检索)
  2. 检索到的内容是否相关
  3. 生成的答案是否有依据
  4. 答案是否完整

通过特殊 token 控制检索行为,比固定流程更灵活。

Contextual Compression

检索到的片段可能很长,但与问题相关的只有一部分,可以先压缩再送给 LLM:

text
原始片段:1000字的文档介绍公司历史
↓ 压缩(提取与问题相关的句子)
压缩后:仅保留与问题相关的3句话

Agentic RAG

将 RAG 与 Agent 结合,LLM 自主决定检索策略:

  • 决定检索哪个知识库
  • 决定检索几次
  • 判断是否需要调用外部工具
  • 整合多来源信息

来源拆分自:高德 Agent 研发面,记忆和评测问很细;以下保留原整理中的工程补充与校正。

RAG 系统如何进行 Query 改写?

为什么需要改写?

  1. 弥合语义鸿沟:用户用口语提问,知识库却使用专业表达,两者在向量空间中可能不够接近。
  2. 消除意图模糊:“怎么优化”缺少对象和约束,需要结合业务背景补成可检索的问题。
  3. 关联历史信息:把“它”“那个”“再具体点”等指代还原为独立、完整的检索语句。

三种核心策略

策略 做法 适用场景
语义增强(HyDE) 先生成一个假设性文档,再用其向量检索真实文档 原 Query 太短、口语化,难以靠近专业语料
任务分解 把比较、多实体、多约束问题拆成多个子查询,再汇总结果 “比较 A 公司和 B 公司的财报”一类复杂问题
上下文补全 做指代消解和历史信息提取,生成可独立理解的 Query 多轮对话中的省略、代词和追问

三个工程权衡

风险 解决方式
额外 LLM 调用增加延迟 使用专项小模型;让改写与预检索并行;只对复杂 Query 开启
改写发生语义漂移 比较原 Query 与改写 Query 的语义相似度;原 Query 与改写 Query 混合检索并做结果融合
每条请求都改写导致成本上升 增加意图路由:寒暄、明确短问句直接跳过,模糊或复杂问题才改写

可按以下逻辑路由:

text
明确、单意图 Query      → 直接检索
包含代词或依赖历史       → 上下文补全
比较、多实体、多约束     → 子查询分解
过短、口语化、领域错位   → HyDE 或领域术语扩展
最终始终保留原 Query 作为召回兜底

闭环指标至少包括:Recall@K、MRR/nDCG、改写漂移率、额外延迟、额外 Token 成本,以及最终问答任务成功率。

可直接口述的回答

Query 改写不是简单润色,而是解决语义鸿沟、意图模糊和多轮指代问题。我会按 Query 类型路由:短而口语化的问题做 HyDE 或术语增强,复杂问题拆成子查询,多轮追问做指代消解和上下文补全。工程上要控制延迟、漂移和成本,所以使用小模型或并行流水线,只对复杂请求改写,并保留原 Query 做混合检索。最后用 Recall@K、排序指标、漂移率、延迟和端到端成功率做回归评测。

补充与校正

  • HyDE 生成的是用于检索的假设文档,可能包含错误细节;它的价值是帮助嵌入落到更相关的文档邻域,不能把假设文档本身当作事实答案。HyDE 原论文
  • 视频把 Step-back 和子查询拆解放在同一类工程策略里便于讲解,但原始 Step-Back Prompting 更强调“从具体问题抽象出高层概念和第一性原理”,不等同于普通的多查询拆分。Step-Back Prompting 原论文
  • 改写效果必须在自己的检索器和语料上做 A/B 回归;某个数据集上提升 Recall,不代表所有 Query 都应该改写。

相关笔记

相关文章

强化学习笔记 →上下文工程 →Mission: 掌握多模态 LoRA 与 QLoRA →