Appearance
6.2.2 什么是 Query Expansion?什么时候要扩写查询?
先给结论:Query Expansion 可以先理解成:在保留原始查询核心的基础上,补充更多可能有助于召回的词项、别名、同义表达或子查询,从而扩大候选覆盖范围。
所以它和 rewrite 不一样。
- Rewrite 更像把问题说清楚
- Expansion 更像给问题补更多召回可能性
Expansion 到底在补什么
它最常补的通常是这些东西:
- 同义词
- 别名
- 近义表达
- 相关术语
- 缩写和全称
- 多个子查询视角
例如用户问:
- “自动扣款怎么关”
系统可能扩出:
- 自动续费
- 自动续订
- 取消会员扣费
这时系统不是把原问题改掉,而是在补更多召回入口。
为什么需要 Expansion
因为很多知识库里的表达并不统一。
可能会同时出现:
- 不同团队写法不同
- 中英文术语并存
- 用户说法和文档说法不同
- 同一概念存在多个别名
如果系统只查原始写法,常见风险就是:
- 召回面太窄
扩写的价值就在于:
- 给系统更多“可能命中的入口”
一个最小示意
python
query = "自动扣款怎么关"
expanded_queries = [
"自动扣款怎么关",
"关闭自动续费",
"取消自动续订",
"停止会员自动扣费"
]这段代码想说明的是:
- 扩写不是替换原查询
- 而是围绕原查询补出更多候选表达
什么情况下更值得做 Query Expansion
1. 同义表达很多
如果一个概念本来就有很多叫法,扩写通常很有价值。
例如:
- 自动续费 / 自动续订 / 自动扣款
- 发票 / 开票 / 票据
2. 用户用词和知识库术语差异大
如果你已经观察到用户常说的话和文档常写的话不一样,扩写通常能补召回。
3. 查询本身太短,信号不足
有些查询非常短,例如:
- “续费”
- “报销”
- “保修”
这时适当补一些相关词,有时能让召回更稳。
4. 多语言、缩写和别名很多
例如:
- API 名称既有英文,也有中文描述
- 产品既有型号名,也有内部简称
这类场景下,扩写通常比只查原词更稳。
为什么扩写不能无节制
扩写虽然能补覆盖,但也会直接带来风险:
- 噪声增加
- 意图被扩散
- 候选变杂
- 后续重排负担变大
如果扩得太猛,系统很容易把“补召回”做成“稀释查询”。
所以更稳的做法通常是:
- 只扩那些和当前意图真正相关的表达
而不是把所有沾边的词都塞进去。
Rewrite 和 Expansion 的区别到底在哪
可以先用一句话区分:
Rewrite是把问题整理得更明确Expansion是给问题增加更多召回入口
有时两者会一起出现,但角色不同。
例如:
- 先把“那企业版这里是不是也一样?”改写成完整问题
- 再对“企业版退款规则”补充同义术语或产品名
一个常见误区
很多人会把 Query Expansion 理解成:
- 只要召回不够,就继续扩词
这很危险。
因为有些问题不是扩写不够,而是:
- 路由错了
- 过滤没加
- 索引本身就不对
这时继续扩写,只会把更多噪声带进来。
一句话总结
Query Expansion 是在保留原始查询核心的基础上,补充更多可能有助于召回的词项和表达,从而扩大覆盖范围。它适合解决同义词、别名、术语差异和短查询信号不足的问题,但扩写过度同样会污染召回。