第 56 页 / 共 100 页 / 飞书修订版 6

6.BM25 lexical search

此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)

邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org

==================================================

RAqkbwezro9XPXx44wUc9syxnug.bin

在构建RAG管道时,您会很快发现仅使用语义搜索并不总能返回最佳结果。有时您需要精确的词汇匹配,而这正是语义搜索可能遗漏的。解决方案是使用一种称为BM25的技术,将语义搜索与词汇搜索相结合。

仅使用语义搜索的问题

假设您正在文档中搜索特定的事件ID,如"INC-2023-Q4-011"。虽然语义搜索在理解上下文和含义方面表现出色,但它可能返回语义相关但实际上不包含您要查找的确切词汇的部分。

image1.jpeg

在上面的例子中,语义搜索返回了网络安全部分(确实包含该事件ID),但也返回了完全没有提及该事件的财务分析部分。这是因为语义搜索专注于概念相似性,而不是精确的词汇匹配。

混合搜索策略

解决方案是并行运行语义搜索和词汇搜索,然后合并结果。这样您就能获得两种方法的优势:

image2.jpeg
  • 语义搜索使用embeddings查找概念相关的内容
  • 词汇搜索使用经典文本搜索查找精确的词汇匹配
  • 合并结果将两种方法结合起来,提高准确性

How BM25 Works

BM25(Best Match 25)是RAG系统中用于词汇搜索的流行算法。以下是它处理搜索查询的方式:

image3.jpeg

步骤1:对查询进行分词 将用户的问题分解为单个词项。例如,"a INC-2023-Q4-011" 会被分解为 ["a", "INC-2023-Q4-011"]。

步骤2:统计词频 查看每个词项在所有文档中出现的频率。常见词汇如 "a" 可能出现5次,而特定词项如 "INC-2023-Q4-011" 可能只出现一次。

步骤3:按重要性对词项加权 出现频率较低的词项获得更高的重要性分数。单词 "a" 因为常见而获得较低的重要性,而 "INC-2023-Q4-011" 因为稀有而获得较高的重要性。

步骤4:找到最佳匹配 返回包含更多高权重词项实例的文档。

实现BM25搜索

以下是如何设置基本BM25搜索系统的方法:

# 1. 按章节对文本进行分块

chunks = chunk_by_section(text)

# 2. 创建BM25存储并添加文档

store = BM25Index()

for chunk in chunks:

store.add_document({"content": chunk})

# 3. 搜索存储

results = store.search("What happened with INC-2023-Q4-011?", 3)

# 打印结果

for doc, distance in results:

print(distance, "\n", doc["content"][:200], "\n----\n")

当你运行这个搜索时,你会得到比单独使用语义搜索更好的结果。BM25算法会优先考虑实际包含你特定搜索词的部分,特别是像事件ID这样的稀有词汇。

image4.jpeg

注意现在的结果如何正确地优先显示软件工程部分和网络安全部分——这两个部分都实际包含了你要搜索的事件ID。

为什么这种方法效果更好

BM25 在查找精确匹配方面表现出色,因为它:

  • 对稀有、特定的术语给予更高权重
  • 忽略不增加搜索价值的常见词汇
  • 专注于词频而非语义含义
  • 对技术术语、ID 和特定短语效果特别好

关键洞察是这两种搜索方法具有互补的优势。语义搜索理解上下文和含义,而词汇搜索确保您不会错过精确的术语匹配。通过结合两者,您可以创建一个更强大的搜索系统,既能有效处理概念性查询,也能处理特定查找。

在下一步中,您将学习如何合并来自两个搜索系统的结果,以创建统一的混合搜索体验。

==================================================



此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)
邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org