跳到正文

RAG Query 改写方法

只比较 Multi-Query、HyDE、子问题分解等改写,补充适用边界与工程取舍

原题:在RAG系统中,如何设计有效的查询改写策略?以及在检索到相关文档后,如何构建合适的提示词来指导大模型生成准确答案?

重排与优化 · 百度真题

30 秒回答

  1. 查询改写的常见策略(HyDE、多查询扩展、子问题分解)
  2. 提示词构建的核心要素(角色定义、上下文组织、引用标注)
  3. 检索后处理的技巧(重排序、上下文截断)
  4. 实际落地中的权衡取舍

回答与解析

答案要点

  • 查询改写的常见策略(HyDE、多查询扩展、子问题分解)
  • 提示词构建的核心要素(角色定义、上下文组织、引用标注)
  • 检索后处理的技巧(重排序、上下文截断)
  • 实际落地中的权衡取舍

查询改写策略

核心目标:弥合用户问题与文档索引之间的语义鸿沟

策略 适用场景 实现要点
HyDE 领域知识密集、术语专业 让模型先生成假设答案,用答案 embedding 检索
多查询扩展 问题表述模糊、同义词多 生成3-5个语义等价变体,并行检索后去重聚合
子问题分解 复杂多跳问题 拆解为原子问题链,逐层检索(如"2024年X公司营收→其CEO是谁→CEO背景")
历史会话改写 多轮对话场景 结合上文指代消解,生成独立完整的 standalone query

关键取舍:改写次数 vs 延迟——通常线上用1-2层改写,复杂场景走异步多路召回。


检索后提示词构建

结构模板(按优先级排序):

【角色】你是{领域}专家,基于提供的参考资料回答问题
【约束】仅使用<reference>内容,无法回答时明确说明
【参考资料】
<reference>
[1] {标题}: {内容片段}...
[2] ...
</reference>
【用户问题】{原始问题}
【输出要求】
- 引用格式:使用[^index^]标注来源
- 冲突处理:若资料矛盾,列出不同观点并说明依据

工程技巧

  • 动态截断:按相关性分数倒序,token 预算留给高分文档
  • 重排序注入:把 Cross-Encoder 分数作为 metadata 放入 prompt,引导模型关注高置信片段
  • 负例过滤:对检索结果做置信度阈值过滤,低分文档直接丢弃而非放入上下文

踩坑经验

  • 改写过度导致语义漂移:加一致性校验(改写 query 与原 query 的 embedding 相似度阈值)
  • 长文档截断丢失关键信息:检索时做段落级切分,而非整篇文档
  • 模型幻觉引用:强制要求"无依据则不标注引用",并在 prompt 里给 few-shot 示例

口语版讲法(约4分钟)

  • 本质是弥合用户意图和文档索引的语义鸿沟
  • 查询改写:HyDE、多查询、子问题,按场景混搭
  • 提示词构建:角色、引用、冲突处理,工程细节
  • 落地风险:改写过度、截断丢失、幻觉,我的取舍

这道题其实在问一个核心矛盾:用户表达的问题和文档库里的索引之间存在语义鸿沟,怎么填上。我会从两个阶段来拆,检索前的查询改写,和检索后的提示词构建。先说查询改写,我一般会看场景选策略。比如用户问得很模糊,像‘退款政策’,我会用多查询扩展,生成几个语义等价的变体,比如‘退货流程’‘退款条件’,并行检索后再去重聚合。这是最稳的。如果问题很专业,比如医疗领域,我会用 HyDE,让模型先生成一个假设答案,再用这个答案的 Embedding 去检索。你可能会想,这不引入幻觉了吗?对,所以前提是你的领域知识库足够封闭,生成的假设答案不会跑偏。再一个,复杂多跳问题,像‘2024年X公司营收多少,它CEO是谁’,我会拆成子问题链,先查营收再查CEO,逐层检索。但真正落地时,我不会只用一种。比如电商客服场景,用户问‘为什么我的订单退款还没到’,既模糊又涉及多步,我会把多查询扩展和子问题分解混着用,线上只用一层改写控制延迟,复杂情况走异步多路召回。这里有个坑:改写过度会导致语义漂移。我上线时会加一致性校验,改写后的query和原query的embedding相似度低于阈值就回退。说白了,改写不是越多越好,得在召回率和速度之间平衡。好,检索到文档后,提示词构建是关键。我的模板核心就三块:角色定义、上下文组织、引用标注。先说角色,比如‘你是电商客服专家,基于参考资料回答’,这能约束模型不瞎编。上下文我会按相关性分数倒序排列,动态截断token预算,把高分文档放前面。重排序这一步很重要,我会用 Cross-Encoder 算分数,作为metadata注入prompt,引导模型关注高置信片段。引用标注强制用 [^index^] 格式,并且要求‘无依据则不标注’,从源头防幻觉。举个例子,用户问‘满减政策’,如果检索到的文档里两条矛盾,一条说‘满200减20’,另一条说‘满300减30’,我会在prompt里要求模型列出不同观点并说明依据,而不是硬选一个。工程上还有个细节:负例过滤。检索结果里置信度低的文档直接丢掉,不放进上下文,避免干扰。这里有个常见失败场景:长文档截断丢失关键信息。我的做法是检索时做段落级切分,而不是整篇文档,这样截断时损失更小。最后说一下我的取舍。我更倾向把查询改写和提示词构建看成一套组合拳,而不是独立优化。改写时留一些弹性,提示词里用引用和角色来兜底。如果只让我选一个重点,我会选 引用标注,因为它在防幻觉上是性价比最高的。 另外,我最近在关注一个方向:当检索到的文档本身质量不高时,怎么让模型自己判断哪些可信。比如用 Self-RAG 让模型先反思检索结果再回答,而不是直接生成。这个在开放域场景里效果不错,但计算开销会翻倍,得看业务能不能接受。

关键一句:当检索文档质量不高时,用Self-RAG让模型先反思再回答,但计算开销翻倍,需业务权衡。

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你在做电商客服RAG,用户问“这个手机保修期多久”,模糊不清。你怎么改写这个查询,让检索更准?改完拿到文档后,prompt又该怎么组装才能让模型给出靠谱答案?

  2. 问法 2 · 层层追问

    RAG系统里,用户query经常跟文档不匹配,你会怎么处理?……嗯,那改写策略有哪些?……具体怎么选?……好,那检索到文档后,怎么构建prompt才能让模型不瞎编、只基于文档回答?

  3. 问法 3 · 直球架构

    设计RAG的查询改写和提示词构建模块。查询改写要考虑哪些策略、怎么选?提示词需要包含哪些要素,如何组织上下文、处理引用和冲突?请讲清架构和关键权衡。

同模块相关题目