做RAG的人有个默契:向量相似度搜索是底牌,embedding是信仰。直到某天用户搜"Claude 3.5 Sonnet发布日期",系统返回了Claude 3的文档——关键词完全匹配的那条,被语义相似度淹没了。
Maria Mouschoutzi在Medium上晒过一组内部测试:纯向量检索在特定术语查询上的漏检率,高到让产品经理想摔键盘。这不是模型不行,是语义搜索的先天盲区——它擅长"意思对",不保证"字面对"。
TF-IDF:给每个词发一张"身份证"
关键词搜索的老祖宗叫TF-IDF,全称词频-逆文档频率。名字唬人,逻辑像超市理货:出现次数多的词(TF高)不一定重要,"的""了"天天见,全是噪音;真正值钱的是"在少数文档里高频出现"的词(IDF高),比如你家产品的内部代号。
算分公式直白得像考勤表:TF-IDF = 词频 × 稀有度。一篇文档里"BM25"出现8次,全库只有3篇文档提到它——这词的权重直接拉满。反过来,"人工智能"出现800次,全库8000篇都有——权重稀释到忽略不计。
但TF-IDF有个死穴:它把文档当词袋子,词的位置、长度、字段权重一概不管。长文档天然占便宜,因为词多;短文档哪怕句句切题,总分也拼不过。早年搜索引擎用它,结果前十页全是百度百科——篇幅碾压。
BM25:给TF-IDF打了三个补丁
1990年代,伦敦城市大学的Stephen Robertson团队接手了这个烂摊子。BM25(Best Matching 25)不是第25代迭代,是第25次实验的编号——科研人员的命名浪漫,约等于"最终版_真的最终版_打死不改版"。
第一个补丁叫词频饱和。TF-IDF里词频和得分线性增长,出现100次就是10次的10倍。BM25说:过了某个阈值,再堆词也没用。公式里塞了个饱和函数,词频涨到一定程度,曲线变平。长文档的词海战术,被强行刹车。
第二个补丁是文档长度归一化。BM25算分时会看一眼文档平均长度,短文档的命中词被加权,长文档被削峰。简单说:300字的技术笔记和3000字的综述,终于能同台竞技。
第三个补丁最隐蔽——它允许你给不同字段设权重。标题里的"BM25"比正文里的值钱,作者字段的"Robertson"比普通文本值钱。这套机制后来被Elasticsearch发扬光大,成了工业标配。
Robertson团队1994年的论文里有个细节:BM25的默认参数(k1=1.2, b=0.75)来自TREC数据集的经验拟合,没理论最优证明,但20年后仍是默认值。工程界的"凑合用",有时候比理论完美更耐操。
混合搜索:不是1+1,是各自兜底
回到RAG的场景。向量检索把查询和文档都压成高维向量,算余弦相似度。优势是跨语言、容错强,"笔记本电脑"和"laptop"在向量空间里是邻居。代价是精确词匹配没特权,"GPT-4"和"GPT-3"的向量距离,可能比"GPT-4"和"大语言模型"还远。
BM25反过来:只认字面,不懂变通。用户搜"苹果股价",它不会给你"Apple Inc. 纳斯达克表现"——除非文档里真有"苹果"两个字。
混合搜索的搞法不复杂:同一查询扔给两套系统,各自返回Top-K,再做个融合排序。融合策略五花八门——简单加权、Reciprocal Rank Fusion(RRF)、甚至再用个模型打分。Mouschoutzi没展开讲她的融合配方,但点明了核心:向量检索丢的分,BM25能捡回来;BM25抓瞎的语义关联,向量检索兜底。
有个反直觉的数据点:在MS MARCO数据集上,纯BM25的召回率(Recall@100)能打到与向量检索同一量级,某些子集甚至反超。不是BM25变强了,是向量检索在短查询、专有名词场景下,其实没那么神。
落地时的三个暗坑
第一,BM25不是开箱即用。它需要文本分词、停用词过滤、同义词扩展——中文场景还得搞定分词器。Jieba、HanLP、LTP选哪个,直接影响"北京大学"被切成"北京/大学"还是"北京大学"。切错了,BM25的精准优势直接报废。
第二,混合权重调参是体力活。向量得分和BM25得分量级不同,归一化方式(Min-Max、Z-score、Sigmoid)选错,融合结果会系统性偏向某一侧。Mouschoutzi提到有些团队干脆放弃加权,用RRF——只看排名不看绝对分,粗暴但稳健。
第三,索引成本被低估。向量库(Milvus、Pinecone、Weaviate)和倒排索引(Elasticsearch、OpenSearch)得同时维护,存储翻倍,同步延迟得盯。小公司玩不起,大厂也得算这笔账。
但最隐蔽的成本是认知惯性。做RAG的工程师,简历上写满"Transformer""Contrastive Learning",让他们回头啃IR(信息检索)的老论文,心理门槛比技术门槛高。Mouschoutzi的帖子下面有条评论扎心:"我花了半年优化embedding模型,最后发现加一行BM25召回,NDCG@10涨了15%。"
向量检索和关键词搜索的恩怨,像极了深度学习派和特征工程派的旧仗。2012年ImageNet之后,所有人都说特征工程已死;2020年BERT之后,所有人都说TF-IDF已死。但死透的技术不会出现在生产环境,能出现的,都是还没找到更便宜替代品的。
BM25的复活不是复古,是分层。语义搜索负责"大概对",关键词搜索负责"必须准"。RAG要的是召回率,不是炫技。当你的用户问"2024年Q3财报第14页的毛利率",向量检索可能给你第13页或第15页,BM25能锁定"14"这个数字——如果文档里真有的话。
Mouschoutzi没给最终结论,但留了个线索:她在评估检索质量时,会单独看"精确匹配查询"的子集表现。这个指标不漂亮,整个RAG pipeline再fancy也是沙上建塔。
你的RAG系统,上次跑纯关键词检索的基准测试,是什么时候?
热门跟贴