大数跨境
0
0

检索算法选型攻略:什么时候用 BM25?什么时候用向量检索(HNSW)?

检索算法选型攻略:什么时候用 BM25?什么时候用向量检索(HNSW)? 二进制跳动
2026-02-03
2
导读:检索算法选型攻略:什么时候用 BM25?什么时候用向量检索(HNSW)?

我们深入到技术细节具体使用场景以及工程落地时的“坑”(注意点)来详细分析。

一、 核心机制的深度差异(为什么它们表现不同?)

1. BM25:基于概率的“精准打击”

数学本质:它是一个加权函数。

TF (词频):词出现的次数越多,分越高,但有一个饱和度限制(出现100次和出现1000次,区别不像1次和10次那么大)。

IDF (逆文档频率):惩罚常用词(如“的”、“是”),奖励稀有词(如“核酸”、“显卡”)。

文档长度归一化:如果一个词在短文档里出现,比在长文档里出现权重更高(因为长文档废话多,包含该词的概率本来就大)。

依赖:完全依赖分词器 (Tokenizer)。如果分词切错了(例如把“南京市长”切成“南京/市长” vs “南京市/长”),BM25 就彻底废了。

2. Faiss HNSW:高维空间的“高速公路网”

数学本质:它是基于图论的近似最近邻搜索(ANN)。

结构:想象一个多层的地图。

顶层(高速公路):节点很少,节点间距离很远。搜索时先在这里快速跳跃,找到大致区域。

底层(街道):节点密集,连接详细。

搜索过程像送快递:先坐飞机到省(顶层),再坐车到市(中层),最后骑车到小区(底层)。

依赖:完全依赖Embedding模型(如 OpenAI text-embedding-3, BGE, BERT)。如果模型认为“苹果”和“安卓”很像,HNSW 就会把它们排在一起。

二、 具体应用场景(在哪里用?)

1. 必须使用 BM25 的场景

特定编码/标识符搜索

场景:用户搜索订单号ORD-2023-998、错误码Error 404、SKUiPhone 15 Pro Max 256G

原因:向量模型可能会把iPhone 15iPhone 14视为语义相似,导致混杂;而 BM25 能确保精准匹配到字符。

极度专业的垂直领域(无训练数据的领域)
场景:搜索某种生僻的化学分子式、特定的法律条款号、公司内部的特殊黑话。
原因:通用的向量模型(如 ChatGPT 背后的模型)没见过这些词,生成的向量是乱的;BM25 只要字匹配上就能搜到。
完全匹配的人名/地名
场景:搜“李彦宏”,你不想搜出“马云”(虽然都是互联网大佬,语义相近,但用户意图是找特定的人)。

2. 必须使用 Faiss HNSW 的场景

模糊意图搜索 / 语义问答 (RAG)

场景:用户问“车子打不着火怎么办?”,知识库里对应文章标题是“发动机启动故障排查”。

原因:字面上没有重合词,BM25 也是零分。向量能识别“打不着火”和“启动故障”是同一回事。

跨语言搜索
场景:用中文搜“苹果”,想把英文文档里的“Apple”也找出来。
原因:多语言 Embedding 模型会将中英文映射到同一向量空间。
多模态搜索
场景:以图搜图,或者输入“一只猫在睡觉”搜出对应的视频片段。
原因:BM25 处理不了像素。

三、 使用的注意点(工程实践中的坑)

1. BM25 的使用注意点

分词是生死的关键

中文:必须使用高质量的分词器(如 Jieba, HanLP, IK Analyzer)。

停用词 (Stop words):必须清洗掉“的”、“了”、“吗”等词,否则它们会干扰相关性计算。

同义词典维护
为了弥补语义缺陷,你通常需要手动维护一个同义词库(Mapping: "JS" -> "JavaScript", "西红柿" -> "番茄")。这是极大的人力成本。
Elasticsearch/OpenSearch
通常不需要自己手写 BM25 算法,直接用 ES 或 OpenSearch,它们默认就是 BM25。

2. Faiss HNSW 的使用注意点

内存消耗极辉 (Memory Hungry)

痛点:HNSW 索引非常占内存。如果你有 1000 万条 768 维的向量,可能需要几十 GB 的 RAM。

解决:如果内存不够,可以使用HNSW+PQ(Product Quantization) 进行量化压缩,但会损失精度。

索引构建慢
痛点:插入数据时,需要实时更新图结构。如果你一次性插入 1 亿条数据,构建索引可能需要数小时甚至数天。
很难“删除”数据
痛点:在 HNSW 图结构中真正删除一个节点并修复图连接是非常复杂的。Faiss 的默认行为通常是“软删除”或需要重建索引。
参数调节 (M 和 efConstruction)
M(每个节点连接多少个邻居):M 越大,精度越高,但内存占用大,插入越慢。
efConstruction(构建时的搜索深度):值越大,索引质量越好,但构建时间越长。
新手建议:先用官方默认参数,性能不够再调。
垃圾进,垃圾出 (Garbage In, Garbage Out)
如果你的 Embedding 模型选得不好(比如用英文模型处理中文),HNSW 搜出来的结果会非常离谱。这是算法本身救不回来的。

四、 终极建议:如何架构?

在架构设计中,不要二选一。标准答案是混合检索 (Hybrid Search)

架构方案:

两路召回

A路 (BM25):用 Elasticsearch 召回 Top 50 个文档(保证关键词都在)。

B路 (Faiss HNSW):用向量数据库(如 Milvus, Qdrant, Faiss)召回 Top 50 个文档(保证语义相关)。

融合 

将 A 和 B 的结果去重、合并。

精排 (Rerank)

使用一个专门的Cross-Encoder 模型(如 BGE-Reranker)对这 50~100 个结果进行精细打分。

Rerank 模型比向量搜索慢,但精准度极高。

总结一句话:

如果你在做商品搜索查代码,优先 BM25;如果你在做ChatGPT式的知识库推荐系统,优先 Faiss HNSW;如果想效果最好,两个一起用 + Rerank


【声明】内容源于网络
0
0
二进制跳动
15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
内容 739
粉丝 0
二进制跳动 15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
总阅读385
粉丝0
内容739