用户问得模糊?查询重写来兜底
作者:程序员马丁
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
上一篇讲了会话记忆,你的 RAG 系统终于能知道之前聊了什么了。用户先问“iPhone 16 Pro 的退货政策是什么”,再追问“那它的保修期呢”,模型看到了完整的对话历史,知道“它”指的是 iPhone 16 Pro,回答没问题。
但别高兴得太早。
RAG 系统在回答之前,要先去向量数据库检索相关的 chunk。检索系统拿到的 query 是什么?是用户的原始问题——那它的保修期呢。
“它”这个字对检索系统来说没有任何语义信息。向量化之后,“那它的保修期呢”和“iPhone 16 Pro 保修期”的向量距离可能相差甚远。检索召回的结果大概率不是你想要的——可能是“笔记本电脑保修政策”“家电延保服务”这些不相关的内容。
问题出在哪?模型有记忆,但检索系统没有。
解法其实很直接:在检索之前,先把“那它的保修期呢”改写成“iPhone 16 Pro 的保修期”,再拿去检索。这就是今天要讲的 Query 改写(Query Rewrite)。
检索系统的失忆问题
1. 模型有记忆,但检索没有
用一张图来看看问题出在哪。
没有 Query 改写的流程——检索用的是原始 query,召回结果不相关:

加入 Query 改写的流程——先改写再检索,召回精准:

区别就在中间多了一步 Query 改写。这一步把用户含糊的追问转化成了一个清晰、完整、独立的检索查询。
2. 不只是“它”的问题
指代消解(把“它”替换成具体实体)是最常被提到的改写场景,但 Query 改写要解决的问题远不止这个。
看几个电商客服场景下的典型问题:
省略上下文
用户在聊了几轮 iPhone 16 Pro 之后,突然问“还有别的颜色吗?”。别的颜色是什么产品的?检索系统不知道。如果直接拿“还有别的颜色吗”去检索,可能召回所有产品的颜色信息,而不是 iPhone 16 Pro 的。
口语化表达
用户说“东西坏了咋整?”。知识库里的文档标题大概率是产品故障维修流程或售后服务指南,不会写 东西坏了咋整。口语化的 query 和正式文档之间存在语义鸿沟,检索效果打折扣。
多意图混合
用户问“退货流程是什么,运费谁承担?”。这一句话里其实包含两个独立的问题:退货流程和运费承担方。一次检索很难同时命中两个主题的 chunk。
模糊描述
用户说“那个很贵的手机”。哪个?多少钱算贵?检索系统没有上下文,无法理解这种模糊描述。
这些问题的共同点是:用户的原始 query 对检索系统不够友好。Query 改写要做的事情,就是在检索之前把原始 query 转化为一个独立的、完整的、对检索系统友好的查询。
Query 改写的五种策略
1. 指代消解(Coreference Resolution)
指代消解,说白了就是把代词替换成它指代的具体实体。这是多轮对话中最高频的改写场景。
常见的代词和指代表达:
| 代词 / 指代表达 | 示例 | 改写结果 |
|---|---|---|
| 它、它的 | 那它的保修期呢? | iPhone 16 Pro 的保修期 |
| 这个、那个 | 这个支持分期吗? | iPhone 16 Pro 支持分期吗? |
| 上面说的 | 上面说的退货条件再详细说说 | iPhone 16 Pro 拆封后退货条件的详细说明 |
| 同样的问题 | 另一款也是这样吗? | iPhone 16 Plus 的退货政策和 iPhone 16 Pro 一样吗? |
指代消解的关键在于:你必须结合对话历史才能确定代词指的是什么。脱离了对话历史,“它”可以是任何东西。
需要注意一个边界情况:有时候“它”的指代并不明确。比如用户前面同时聊了 iPhone 16 Pro 和 AirPods Pro,然后问“它的保修期呢”,“它”到底指哪个?这种情况下,改写模型需要根据最近的上下文做判断——通常取最近一次被提到的实体。
2. 上下文补全(Context Completion)
人在多轮对话中会自然地省略信息,因为他觉得对方应该知道上下文。但检索系统不知道。
| 原始 query | 省略了什么 | 改写结果 |
|---|---|---|
| 还有别的颜色吗? | 什么产品的颜色 | iPhone 16 Pro 还有其他颜色可选吗? |
| 价格呢? | 什么东西的价格 | iPhone 16 Pro 256GB 白色钛金属的价格是多少? |
| 能退吗? | 什么产品、什么情况下退 | iPhone 16 Pro 拆封后能退货吗? |
| 多久能到? | 什么产品发货到哪里 | iPhone 16 Pro 下单后多久能送到? |
上下文补全和指代消解经常同时出现。“价格呢”既省略了产品名(上下文补全),又省略了主语(可以理解为“它的价格呢”,指代消解)。实际改写时,大模型会一并处理,不需要你单独区分。
3. 口语化转正式(Colloquial to Formal)
用户的提问方式和知识库里的文档写法通常差异很大。用户说人话,文档写书面语。
| 口语 query | 知识库中的正式表达 | 改写结果 |
|---|---|---|
| 东西坏了咋整 | 产品故障报修流程 | 产品故障后的维修和报修流程 |
| 快递咋还没到 | 订单物流查询 / 发货时效 | 订单发货后物流状态查询 |
| 能不能便宜点 | 优惠活动 / 促销政策 / 折扣信息 | 当前可用的优惠活动和折扣信息 |
| 买贵了能补差价不 | 价格保护政策 | 商品降价后是否支持差价补偿 |
这种改写有一个特点:不依赖对话历史。即使是第一轮对话,口语化的 query 也需要转化成更正式的表达。所以口语化转正式其实在单轮对话的 RAG 中也有价值。
不过要注意,口语化转正式不是“翻译”,而是“意图提取”。“能不能便宜点”的意图不是字面上的“降低价格”,而是“查询有没有优惠”。改写模型需要理解用户的真实意图。
4. 多意图拆分(Intent Decomposition)
用户有时候一句话里包含多个问题:
- 退货流程是什么,运费谁承担?→ 两个独立意图
- iPhone 16 Pro 和 iPhone 16 Plus 有什 么区别?→ 一个对比意图,不需要拆
- 我想退货,另外帮我查一下保修期→ 两个完全不相关的意图
拆分后,每个子查询分别去检索,各自召回最相关的 chunk,合并后再生成答案。
不是所有长 query 都需要拆。“iPhone 16 Pro 的价格和颜色”虽然问了两个方面,但通常在同一个产品介绍 chunk 里就能找到,不需要拆成两次检索。拆分的判断标准是:两个意图是否可能分布在不同的 chunk 里。
多意图拆分的实现复杂度比前面几种策略高,而且拆分后每个子查询都要走一遍检索流程,成本翻倍。在实际项目中,如果业务场景下多意图问题不多,可以先不实现这个策略。
5. 关键词扩展(Keyword Expansion)
关键词扩展是补充同义词和相关术语,提高检索的召回率。
| 原始 query | 扩展后 |
|---|---|
| 七天无理由退货 | 七天无理由退货 退换货政策 无条件退款 退货期限 |
| 屏幕碎了 | 屏幕碎裂 屏幕破损 屏幕维修 碎屏险 |
| 充不进去电 | 无法充电 充电故障 充电接口问题 电池问题 |
这种改写主要对**关键词检索(BM25)**有帮助——BM25 是按词匹配的,同义词扩展能提高命中率。对向量检索来说,帮助有限,因为向量检索本身就能理解语义相似性(屏幕碎了和屏幕破损的向量已经很接近了)。
如果你的 RAG 系统用的是混合检索(向量 + BM25),关键词扩展在 BM25 那一路上会有明显提升。
6. 五种策略对比
| 策略 | 解决的问题 | 依赖对话历史 | 实现复杂度 | 对检索的影响 | 适用场景 |
|---|---|---|---|---|---|
| 指代消解 | 代词无法检索 | 是 | 低 | 必需,否则检索失败 | 多轮对话(最常用) |
| 上下文补全 | 省略信息无法检索 | 是 | 低 | 必需,否则检索不精准 | 多轮对话 |
| 口语化转正式 | 口语与文档的语义鸿沟 | 否 | 中 | 有提升,尤其对 BM25 | 单轮 + 多轮 |
| 多意图拆分 | 一次检索无法覆盖多个意图 | 否 | 高 | 有提升,但成本翻倍 | 复杂咨询场景 |
| 关键词扩展 | 同义词不匹配 | 否 | 低 | 对 BM25 有帮助 | 混合检索场景 |
实际项目中,指代消解和上下文补全是必做的(不做的话多轮对话检索基本不可用)。口语化转正式建议做(投入产出比高)。多意图拆分和关键词扩展根据业务需要决定。
用大模型做 Query 改写
前面讲了五种改写策略,但在实际实现中,你不需要为每种策略单独写一套规则。用大模型做改写,一个 Prompt 就能覆盖大部分场景——指代消解、上下文补全、口语化转正式,大模型一次性搞定。
1. 改写 Prompt 的设计
1.1 基础版改写 Prompt
这个 Prompt 适合大多数场景,简单直接:
你是一个查询改写助手。根据对话历史和用户的最新问题,将问题改写为一个独立的、完整的检索查询。
要求:
1. 如果最新问题中包含代词(它、这个、那个等)或省略了关键信息,请结合对话历史补全
2. 如果问题已经足够完整清晰,请原样输出,不要画蛇添足
3. 只输出改写后的查询,不要输出任何解释、前缀或多余内容
4. 改写后的查询应该是一个独立的句子,不依赖对话历史也能理解
对话历史:
{history}
用户最新问题:{query}
改写后的查询:
看几个改写效果:
| 对话历史 | 原始 query | 改写结果 |
|---|---|---|
| 用户问了 iPhone 16 Pro 退货政策 | 那它的保修期呢? | iPhone 16 Pro 的保修期是多久? |
| 用户在聊 AirPods Pro 的颜色 | 价格呢? | AirPods Pro 的价格是多少? |
| 无历史(第一轮) | 东西坏了咋整? | 产品故障后的维修流程 |
| 用户在聊 iPhone 16 Pro | 还有别的吗? | iPhone 16 Pro 还有其他配置或颜色可选吗? |
基础版 Prompt 能很好地处理指代消解和上下文补全,对口语化转正式也有一定效果。