
我们深入到技术细节、具体使用场景以及工程落地时的“坑”(注意点)来详细分析。
一、 核心机制的深度差异(为什么它们表现不同?)
1. BM25:基于概率的“精准打击”
数学本质:它是一个加权函数。
TF (词频):词出现的次数越多,分越高,但有一个饱和度限制(出现100次和出现1000次,区别不像1次和10次那么大)。
IDF (逆文档频率):惩罚常用词(如“的”、“是”),奖励稀有词(如“核酸”、“显卡”)。
文档长度归一化:如果一个词在短文档里出现,比在长文档里出现权重更高(因为长文档废话多,包含该词的概率本来就大)。
2. Faiss HNSW:高维空间的“高速公路网”
结构:想象一个多层的地图。
顶层(高速公路):节点很少,节点间距离很远。搜索时先在这里快速跳跃,找到大致区域。
底层(街道):节点密集,连接详细。
搜索过程像送快递:先坐飞机到省(顶层),再坐车到市(中层),最后骑车到小区(底层)。
二、 具体应用场景(在哪里用?)
1. 必须使用 BM25 的场景
特定编码/标识符搜索:
场景:用户搜索订单号ORD-2023-998、错误码Error 404、SKUiPhone 15 Pro Max 256G。
原因:向量模型可能会把iPhone 15和iPhone 14视为语义相似,导致混杂;而 BM25 能确保精准匹配到字符。
2. 必须使用 Faiss HNSW 的场景
模糊意图搜索 / 语义问答 (RAG):
场景:用户问“车子打不着火怎么办?”,知识库里对应文章标题是“发动机启动故障排查”。
原因:字面上没有重合词,BM25 也是零分。向量能识别“打不着火”和“启动故障”是同一回事。
三、 使用的注意点(工程实践中的坑)
1. BM25 的使用注意点
中文:必须使用高质量的分词器(如 Jieba, HanLP, IK Analyzer)。
停用词 (Stop words):必须清洗掉“的”、“了”、“吗”等词,否则它们会干扰相关性计算。
2. Faiss HNSW 的使用注意点
内存消耗极辉 (Memory Hungry):
痛点:HNSW 索引非常占内存。如果你有 1000 万条 768 维的向量,可能需要几十 GB 的 RAM。
解决:如果内存不够,可以使用HNSW+PQ(Product Quantization) 进行量化压缩,但会损失精度。
四、 终极建议:如何架构?
在架构设计中,不要二选一。标准答案是混合检索 (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。

