1201 字
约 4 分钟
3
搜索系统中的 topK:从向量召回到 BM25 重排

搜索系统中的 topK:从向量召回到 BM25 重排

在搜索系统中,topK 最直观的作用就是:

控制最终返回给前端多少条搜索结果。

例如:

topK = 10

表示最终最多返回相关性最高的 10 条结果。

但实际搜索流程通常不是:

搜索 → 找 10 条 → 返回

而是:

大范围召回
   ↓
重新排序
   ↓
截取 Top K
   ↓
返回前端

一、为什么不能直接查询 topK 条?

假设用户搜索:

如何提升工作效率?

知识库里可能存在这些内容:

时间管理技巧
提高办公效率的方法
常用效率工具推荐
员工工作效率提升指南

它们不一定包含完全相同的关键词,但语义上和用户的问题非常接近。

如果一开始只取 10 条,很可能会把真正相关的内容漏掉。

因此系统通常会先扩大候选范围。

例如:

topK = 10

第一阶段可以先召回:

10 × 30 = 300 条

这里的 30 属于业务侧设置的候选集放大倍数,并不是 Elasticsearch 固定要求。

整体变成:

300 条候选文档
        ↓
重新计算相关性
        ↓
排序
        ↓
取前 10 条

二、第一阶段:向量召回

第一阶段主要通过 kNN 向量搜索寻找语义相似的文档。

流程:

用户 Query
   ↓
Embedding
   ↓
Query Vector
   ↓
kNN Search
   ↓
候选文档

例如用户搜索:

如何提升工作效率?

即使文章标题是:

时间管理的五个技巧

因为两个文本在语义上比较接近,所以向量相似度较高,也可能被召回。

这一阶段关注的是:

“这篇文章和用户的问题在意思上像不像?”

而不是要求关键词完全一致。


三、第二阶段:BM25 重排

向量召回解决了“语义相关”的问题,但也可能召回一些:

意思有点像
但并不是用户最想看的内容

所以第二阶段可以加入 BM25 关键词匹配。

例如用户搜索:

工作效率提升

候选集中有:

A:时间管理技巧

B:如何提升员工工作效率

C:常用办公软件介绍

A、B 可能在向量空间里都很接近。

但是 B 又直接出现了:

提升
工作
效率

因此 BM25 得分通常会更高。

这时候 B 就有机会排到 A 前面。


四、最终按照什么排序?

最终排序通常会综合:

向量相似度
+
BM25 关键词相关性

例如:

FinalScore
=
VectorScore × 0.7
+
BM25Score × 0.3

权重只是示例,实际比例需要根据业务效果调节。

整个过程可以理解成:

Vector Score
判断“意思像不像”

BM25 Score
判断“关键词准不准”

        ↓

综合 Score
判断“最终应该排第几”

最后:

sort by FinalScore DESC

然后:

取前 topK 条

返回给前端。


五、完整流程

假设:

topK = 10
候选倍数 = 30

那么搜索流程可以表示成:

用户搜索
   ↓
Embedding
   ↓
kNN 向量搜索
   ↓
召回 300 条候选结果
   ↓
BM25 关键词匹配
   ↓
向量得分 + BM25 得分
   ↓
综合排序
   ↓
取 Top 10
   ↓
返回前端

六、一句话理解 topK

可以把整个搜索过程想象成招聘:

第一轮:
从大量简历里先筛 300 个人
——向量召回

第二轮:
进一步看岗位关键词是否匹配
——BM25 重排

最终:
选出最合适的 10 个人
——topK

所以:

topK 决定的是最终返回多少结果,而候选集大小决定搜索阶段看多少结果。

两者不要混淆。


总结

topK 本质上是搜索系统最终结果数量的控制参数。

整个排序通常经过两个阶段:

第一阶段:kNN
扩大召回范围
关注语义相似度

第二阶段:BM25 / Rescore
重新计算关键词相关性
提高精准度

最终阶段:
综合相关性得分排序
取前 topK 条结果

因此可以把整个思想总结成一句话:

先用向量搜索“广撒网”,再用关键词搜索“精排序”,最后通过 topK 控制返回多少条结果。

搜索系统中的 topK:从向量召回到 BM25 重排
http://www.clxhxhhr.top/posts/637/
作者
clxstart
发布于
2026-09-16
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。