在RAG中实现混合语义-词汇搜索
本文介绍了如何在检索增强生成(RAG)系统中构建混合搜索策略,结合BM25词汇搜索与语义搜索,并通过互惠排名融合(RRF)合并排名。详细说明了Python实现步骤,包括数据集加载、BM25和语义搜索函数的编写,以及混合搜索的整合。实验表明,混合搜索在小型数据集上也能取得合理结果,优于单独使用任一方法。
在构建现代检索增强生成(RAG)系统时,从原型过渡到生产就绪解决方案的关键步骤之一是实施混合搜索策略。尽管基于稠密向量或嵌入的语义搜索在理解语义、同义词和上下文方面表现出色,但基于关键词的词汇搜索(如BM25)能够覆盖语义搜索忽视的一个小盲点。因此,将两者结合是提升RAG系统检索机制的完美方案。
本文将通过一个温和的编码示例,逐步引导你实现混合搜索策略。首先,需要安装必要的Python库:rank_bm25(BM25算法实现)、sentence-transformers(用于生成文本嵌入)和requests(用于获取数据集)。
接下来,加载数据集。示例使用了一个包含九个关于亚洲国家的文本文档的小型数据集。将文档存储为列表后,开始分阶段实现混合搜索。
第一阶段:词汇搜索(BM25)。使用rank_bm25库对每个文档进行分词,并计算查询与文档的词汇相关性分数,然后返回排名靠前的文档。
第二阶段:语义搜索。使用sentence-transformers中的'all-MiniLM-L6-v2'模型将文档和查询编码为嵌入向量,然后通过余弦相似度计算语义相关性,同样返回排名靠前的文档。
第三阶段:融合。使用互惠排名融合(RRF)将两个排名列表合并。RRF通过为每个文档分配一个基于其排名位置的总分(1/(k+rank)),最终选择总分最高的文档。这里使用标准常数k=60。
最后,通过一个示例查询“哪个国家最以稻田和水田闻名?”测试该系统。语义搜索返回越南、韩国、泰国;BM25返回印度尼西亚、日本、菲律宾;混合搜索返回越南、泰国、印度尼西亚。虽然结果并不完美,但考虑到仅九个文档的数据集,表现合理。
本文强调了在生产环境中扩展RAG系统时,不应仅依赖语义搜索。混合搜索能够提供更全面的检索结果,确保系统的健壮性和可靠性。尝试不同的查询,你会发现混合搜索在平衡语义理解和关键词匹配方面的优势。