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/ 评论
0 条
还没有评论,先写一条吧。