Skip to content

6.3.4 为什么不同问题类型应该走不同检索策略? ​

先给结论:因为不同问题真正依赖的检索信号并不一样。有人要找术语,有人要找语义,有人要找整篇文档,有人只要一个局部条件。如果所有问题都走同一套检索策略,系统很容易在某一类问题上长期偏科。

所以检索策略分流不是为了让系统更花哨,而是为了让不同问题走对更适合自己的路径。

不同问题到底差在哪 ​

至少常见会差在这几层:

  • 查询表达方式不同
  • 所需精度不同
  • 依赖的上下文范围不同
  • 数据域不同

例如:

  • “错误码 ERR_1042 表示什么?”
  • “会员自动扣费怎么关?”
  • “这份退款政策主要讲了什么?”
  • “createOrder 的 timeout 默认值是多少?”

这四类问题显然不适合完全同一种检索方式。

为什么硬走同一路径会出问题 ​

如果所有问题都用同一路策略,常见后果是:

  • 术语问题精度不稳
  • 长文档问题上下文不完整
  • FAQ 问题召回太散
  • 代码和接口类问题经常偏题

这些问题未必会平均出现在所有查询上,但它们会在某些问题类型上反复出现。

这就是“系统平均看着还行,但某些类问题总翻车”的根源。

一个更实际的分流思路 ​

你可以先把问题粗略分成几类:

1. 精确对象型问题 ​

例如:

  • 编号
  • 型号
  • 接口名
  • 字段名

这类更适合优先强调:

  • BM25
  • 精确匹配

2. 语义问答型问题 ​

例如:

  • “什么情况下不能退款?”
  • “怎么关闭自动续费?”

这类更适合优先强调:

  • 向量检索
  • 混合检索

3. 文档理解型问题 ​

例如:

  • “这篇文档主要讲了什么?”
  • “这个政策整体范围是什么?”

这类往往更适合:

  • 文档级检索
  • 文档聚合后的再处理

4. 复杂约束型问题 ​

例如:

  • 带版本
  • 带租户
  • 带权限
  • 带产品边界

这类往往更依赖:

  • metadata filter
  • 先路由再检索

为什么这件事本质上是“问题分类” ​

不同检索策略之所以要分流,本质上是因为系统先要判断:

  • 当前问题属于哪一种检索形态

这也是为什么查询理解、rewrite、filtering、routing 这几章内容其实是连在一起的。

你只有先看清问题类型,后面的检索策略才不容易走错。

一个常见误区 ​

很多人会把这个问题理解成:

  • 我要选一个最强检索器,把所有问题都交给它

这通常是错误方向。

更稳的方向通常是:

  • 承认不同问题本来就依赖不同信号
  • 再让系统做适当分流

因为真实系统里,真正缺的常常不是“最强单点”,而是“对不同问题做不同处理”。

一句话总结 ​

不同问题类型应该走不同检索策略,因为它们依赖的信号、精度、上下文范围和数据域都不同。把所有问题都塞进同一条检索路径,系统往往会长期偏科;做适当分流,反而更稳。