核心要点
能讲清动机:用户 query 往往太短、口语化、含糊或缺关键词,单条向量检索召回不全,漏掉相关但措辞不同的文档
能列举手段:同义词/术语扩展、LLM 生成多个改写(Multi-Query)、HyDE(先让 LLM 生成假设答案再用它检索)、加入领域上下文或先澄清意图
能说清融合:多路检索结果用 RRF(倒数排名融合)等方法合并、去重、统一重排,避免冗余并兼顾覆盖面
能区分 Query Rewrite:rewrite 偏「改写/澄清单条 query」,expansion 偏「扩成多条、扩大召回」;并能权衡多次检索带来的成本与噪声
标准回答
什么是查询扩展
查询扩展指在检索前把用户原始 query 转换成更丰富的检索信号,而不是只拿原句去向量库查一次。它可以把一条 query 扩成多条等价或互补的子查询,也可以补充同义词、术语、领域上下文,目标是提升召回(recall),把那些「内容相关但措辞不同」的文档也捞回来。
为什么 RAG 需要它
真实用户的提问通常很短、很口语,甚至含指代或错别字,比如「这东西怎么配?」。这类 query 与知识库里完整、书面、术语化的文档在向量空间里并不靠近,单路检索容易漏召回。检索召回是 RAG 的上游环节,召回漏了,后续 rerank 和生成再强也补不回来,所以在入口处扩大召回非常关键。
常见手段
一是同义词与术语扩展,把口语词映射到领域术语(如「配」扩成「配置/部署/参数设置」)。二是 Multi-Query,让 LLM 针对原问题生成若干个不同角度的改写,各自检索后合并。三是 HyDE,先让 LLM 生成一段「假设答案」,再用这段假设文本去检索,让查询向量更贴近文档的分布。四是结合上下文或澄清,把对话历史、用户画像、或一轮澄清得到的信息补进查询。
多路结果如何融合
多条扩展查询会得到多路召回,需要合并去重。常用 RRF(Reciprocal Rank Fusion)按各路排名加权融合,再统一用 reranker 取 Top-K;既能稳定地把多路高排名文档顶上来,又能控制结果规模。
与 Query Rewrite 的区别
两者常被混用,但侧重不同:Query Rewrite 偏「改写、消歧、补全单条 query」,输出通常仍是一条更清晰的查询;Query Expansion 偏「把查询扩成多条或加入更多信号」,核心目的是提高召回覆盖面。实践中二者常配合使用。
代价与平衡
扩展意味着更多 LLM 调用和更多检索请求,带来延迟与成本上升;扩得太多还可能引入不相关文档,稀释上下文、增加噪声甚至诱发幻觉。因此要控制扩展数量、配合 rerank 过滤,并按查询复杂度按需扩展,而非一律全开。
常见误区
⚠️ 常见踩坑
查询扩展不是「扩得越多越好」——盲目生成大量改写会引入噪声文档、稀释上下文并推高成本与延迟;应控制路数、配合 RRF 融合与 rerank 过滤,并按查询难度按需扩展。
追问
追问 1:Query Expansion 和 Query Rewrite 到底怎么区分?
Rewrite 侧重把单条 query 改清楚:消歧、指代消解、补全、规范术语,输出通常还是一条更好的查询;Expansion 侧重扩大召回信号:生成多条改写、补同义词或用 HyDE 生成假设文档,输出是多路检索信号。前者解决「问得不清」,后者解决「召回不全」,工程上常先 rewrite 再 expansion。
追问 2:多条扩展查询的召回结果为什么常用 RRF 而不是简单分数相加?
不同查询、不同检索通道(稀疏/稠密)的相似度分数量纲不一致,直接相加会被某一路的分数尺度主导。RRF 只用每路的排名而非原始分数,按 1/(k+rank) 加权求和,对尺度不敏感、实现简单且鲁棒,能让在多路中都靠前的文档稳定胜出。
追问 3:什么场景下应该少做甚至不做查询扩展?
当 query 已经足够精确(如带明确实体、ID、代码报错原文)时,扩展反而引入噪声、拉低精度;对延迟敏感的实时场景,多次 LLM 调用和多路检索的开销也难以接受。可用轻量分类器或规则判断查询是否「短/含糊」,只对需要的查询触发扩展,实现按需开销。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习