Appearance
5.3.4 什么类型的问题更适合用 BM25?
先给结论:当一个问题的核心在于精确命中某些词,而不是覆盖近义表达时,它通常就更适合优先用 BM25。
也就是说,判断是否更适合 BM25,关键不是看问题写得像不像自然语言,而是看:
- 这个问题最重要的检索信号到底是什么
第一类:带明确编号的问题
如果问题里带有明确编号,BM25 往往更合适。
常见包括:
- 规则编号
- 条款编号
- 型号编号
- 订单号格式说明
- 错误码
这类问题的共同点是:
- 编号本身就是最强区分信号
这时系统首先要做的,不是猜主题,而是先把这个编号命中。
第二类:带专有术语的问题
如果问题里包含明确术语、专名、接口名、字段名,BM25 通常也更占优势。
比如:
- 某个 API 名称
- 某个数据库字段
- 某个内部系统名称
- 某个药品、零件、设备型号
这些对象一旦写出来,它们本身就比“语义接近”更值得优先相信。
第三类:要求高精度、容错空间很小的问题
有些问题不是不能接受“差不多”,而是:
- 一旦命错对象,结果就基本不可用
例如:
- 具体接口说明
- 明确型号参数
- 指定法条条文
- 某个配置项含义
这类问题里,系统宁可先精确抓对象,也不该一开始就过度依赖语义扩散。
第四类:查询本来就很短,但关键词区分度很强
有些查询虽然很短,但并不模糊。
例如:
XG-500ERR_1042createOrderidempotencyKey
这类查询里,最强信号不是上下文语义,而是这个词本身。
这时 BM25 往往比向量检索更直接、更稳。
第五类:文档本身就是术语密集型资料
如果数据源本身大量由这些内容组成,BM25 价值通常会更高:
- 技术文档
- API 文档
- 参数表
- 法规条文
- 设备型号说明
- 产品目录
这些资料里,词项命中的意义往往非常强。
也就是说,不只是“什么问题适合 BM25”,还包括“什么数据天然更适合 BM25 作为重要召回信号”。
一个更实用的判断框架
如果你拿到一个问题,不确定更该信 BM25 还是向量检索,可以先问这 4 个问题:
- 这个问题里有没有明确术语、编号、专名
- 命错一个关键对象,代价是不是很高
- 用户真正想找的,是某个精确对象,还是一个主题范围
- 这份知识库里,这类对象是否本来就区分度很强
如果这 4 个问题里有两到三个答案都偏向“是”,那通常就说明:
- BM25 至少应该是重要信号之一
一个最小对比例子
更适合 BM25 的问题
- “错误码 ERR_1042 表示什么?”
- “
createOrder的timeout默认值是多少?” - “XG-500 的保修期多久?”
更适合语义检索的问题
- “怎么避免重复下单?”
- “会员自动扣费怎么关?”
- “什么情况下不能退款?”
两类问题的差别就在于:
- 前一类更依赖精确对象
- 后一类更依赖语义表达
一个常见误区
很多人会把 BM25 理解成只适合“搜索框里输入几个词”的旧式搜索。
这不准确。
更稳的理解是:
- 只要一个问题的关键在于精确命中词项,它就可能适合 BM25
哪怕这个问题表面上看起来是一整句自然语言,也一样成立。
一句话总结
更适合用 BM25 的问题,通常都具备一个共同点:关键检索信号是精确词项本身,而不是语义泛化。只要问题里包含明确编号、术语、专有名词,或者命错对象代价很高,BM25 往往就应该优先参与召回。