先这样答
历史对话检索用 cosine,因为它能按语义方向匹配内容,不要求用户重复历史对话里的原词。比如用户说「那个方案」,系统仍可能召回三轮前讨论「技术路线」的内容。两句话说法不同,表达的意思可以接近。
BM25主要做关键词匹配。用户换成口语化说法后,当前查询和历史内容里的关键词可能对不上,召回就会变差。面试里可以把两者的差别说清楚:cosine关注语义是否接近,BM25关注词项是否匹配。回答到这里,要落回历史对话里的实际需求,不要只背两个检索方法的定义。
这个结论来自月之暗面一面原题,但不能把它答成「向量检索总比 BM25 好」。如果用户要找精确的型号、人名或代码,向量检索的效果可能弱。生产环境应使用混合检索,同时利用语义匹配和关键词匹配。这样既能处理「那个方案」这类换说法的查询,也能照顾必须精确命中的词。
面试官会怎么追问
-
「cosine 为什么能找到‘那个方案’对应的技术路线?」 cosine比较向量的语义方向,而不是要求查询和历史文本出现相同关键词。用户说「那个方案」时,查询可能仍与三轮前「技术路线」的讨论在语义方向上接近。因此系统有机会召回那段历史。
-
「那 BM25 在这个场景里为什么不够?」 BM25依赖关键词匹配。用户用口语化表达替换了历史对话里的说法,查询词和历史文本中的词可能对不上。关键词匹配变差,就容易漏掉相关内容。
-
「向量检索是不是可以完全替代 BM25?」 不能这样回答。型号、人名、代码等精确词,向量检索可能处理得较弱。生产环境应采用混合检索,同时保留语义匹配和关键词匹配。
回答的坑
- 把 cosine 说成能理解所有指代,或说它在任何历史对话检索中都优于 BM25。
- 只讲语义召回的优势,却不提型号、人名、代码这类精确词需要混合检索。
同系列的题
—— 本题完 ——