Press "Enter" to skip to content

使用混合搜索改善RAG管道中的检索性能

带有混合搜索功能的搜索栏

随着最近对检索增强生成(RAG)流程的兴趣,开发人员开始讨论构建具有生产就绪性能的RAG流程面临的挑战。正如生活中的许多方面一样,帕累托原理也在RAG流程中起作用,其中实现初步的80%相对简单,但要实现剩余的20%以实现生产就绪性证明具有挑战性。

一个经常重复的主题是通过混合搜索改进RAG流程的检索组件。

已经积累了构建RAG流程的经验的开发人员已经开始分享他们的见解。一个经常重复的主题是通过混合搜索来改进RAG流程的检索组件。

本文将向您介绍混合搜索的概念,以及它如何通过检索更相关的结果来改善您的RAG流程性能,以及何时使用它。

混合搜索是一种结合两个或更多搜索算法以提高搜索结果相关性的搜索技术。尽管未定义结合了哪些算法,但混合搜索最常指的是传统基于关键词的搜索与现代向量搜索的结合。

传统上,关键词搜索是搜索引擎的明显选择。但是随着机器学习(ML)算法的出现,向量嵌入使得一种名为向量或语义搜索的新的搜索技术成为可能,它允许我们根据数据的语义进行跨数据的搜索。然而,这两种搜索技术都有必须考虑的重要权衡:

  • 基于关键词的搜索:虽然其确切的关键词匹配能力对于特定术语(如产品名称或行业术语)非常有益,但它对拼写错误和同义词非常敏感,这导致它错过了重要的上下文。
  • 向量或语义搜索:虽然其语义搜索功能允许根据数据的语义意义进行多语言和多模态搜索,并使其对拼写错误具有强大的鲁棒性,但它可能会错过重要的关键词。此外,它取决于生成的向量嵌入的质量,并对领域外术语敏感。

将基于关键词和向量搜索组合成混合搜索使您能够利用这两种搜索技术的优点,以提高搜索结果的相关性,特别是针对文本搜索用例。

例如,考虑搜索查询“如何使用.concat()合并两个Pandas DataFrame?”。关键词搜索将有助于找到与方法.concat()相关的结果。然而,由于单词“合并”有“组合”、“连接”和“串联”等同义词,如果我们能利用语义搜索的上下文感知能力将会很有帮助(更多详细信息请参阅何时使用混合搜索)。

如果您感兴趣,可以尝试使用不同的基于关键词、语义和混合搜索查询来搜索此实时演示中的电影(详细实现请参阅本文)。

混合搜索是如何工作的?

混合搜索通过融合基于关键词和向量搜索技术的搜索结果并重新排序它们来实现。

在混合搜索的上下文中,基于关键词的搜索通常使用一种称为稀疏嵌入的表示方法,因此也被称为稀疏向量搜索。稀疏嵌入是具有大多数零值且只有少数非零值的向量,如下所示。

[0, 0, 0, 0, 0, 1, 0, 0, 0, 24, 3, 0, 0, 0, 0, ...]

可以使用不同的算法生成稀疏嵌入。最常用的稀疏嵌入算法是BM25(最佳匹配25),它基于TF-IDF(词频-逆文档频率)方法并对其进行改进。简而言之,BM25根据术语在文档中出现的频率相对于所有文档中出现的频率来强调术语的重要性。

向量搜索是一种现代搜索技术,随着机器学习的进步而出现。现代机器学习算法,如Transformers,可以生成各种模态(文本、图像等)数据对象的数值表示,称为向量嵌入。

这些向量嵌入通常包含丰富的信息并且主要由非零值组成(密集向量),如下所示。这就是为什么向量搜索也被称为密集向量搜索。

[0.634, 0.234, 0.867, 0.042, 0.249, 0.093, 0.029, 0.123, 0.234, ...]

搜索查询被嵌入到与数据对象相同的向量空间中。然后,使用其向量嵌入来计算基于指定相似度度量(如余弦距离)的最相似数据对象。返回的搜索结果按照与搜索查询的相似性进行排序。

基于关键词和向量搜索结果的融合

基于关键词的搜索和向量搜索分别返回一组单独的结果,通常是根据计算得出的相关性排序的搜索结果列表。这些单独的搜索结果必须合并。

将两个列表的排名结果合并为一个单一的排名有许多不同的策略,如Benham和Culpepper的一篇论文所述[1]。

一般来说,搜索结果通常首先进行评分。这些分数可以根据指定的度量标准(如余弦距离)或仅仅是搜索结果列表中的排名计算。

然后,使用参数alpha对计算得出的分数进行加权,该参数决定每个算法的权重并影响结果的重新排序。

混合得分 = (1 - alpha) * 稀疏得分 + alpha * 密集得分

通常,alpha取0到1之间的值,其中

  • alpha = 1:纯向量搜索
  • alpha = 0:纯关键词搜索

下面是关键词和向量搜索之间的融合的最简示例,它基于排名进行评分,且alpha = 0.5

以排名为基础,使用 alpha 为 0.5,在混合搜索中将关键词和向量搜索结果融合的最简示例(作者制作的,受到 Hybrid search explained 的启发)

如何通过混合搜索改善RAG流水线的性能?

RAG流水线有许多旋钮可以调整以改善其性能。其中一个旋钮是改善检索到的上下文的相关性,然后将其馈送到LLM中,因为如果检索到的上下文与给定的问题不相关,LLM也无法生成相关的答案。

根据上下文类型和查询,您必须确定哪种搜索技术对您的RAG应用最有益。因此,参数 alpha,它控制关键字搜索和语义搜索之间的加权比例,可以视为一个需要调整的超参数。

在使用LangChain的普通RAG流水线中,您可以通过将使用的vectorstore组件设置为检索器,并使用.as_retriever()方法定义检索器组件,具体步骤如下:

# 定义并填充向量存储# 详细信息请参阅 https://towardsdatascience.com/retrieval-augmented-generation-rag-from-theory-to-langchain-implementation-4e9bd5f6a4f2vectorstore = ...# 将向量存储设置为检索器retriever = vectorstore.as_retriever()

然而,这种方法只能实现语义搜索。如果您希望在LangChain中启用混合搜索,您将需要定义一个具有混合搜索能力的特定retriever 组件,例如WeaviateHybridSearchRetriever

from langchain.retrievers.weaviate_hybrid_search import WeaviateHybridSearchRetrieverretriever = WeaviateHybridSearchRetriever(    alpha = 0.5,               # 默认为0.5,即关键字搜索和语义搜索之间的等权重    client = client,           # 传递给Weaviate客户端的关键字参数    index_name = "LangChain",  # 要使用的索引的名称    text_key = "text",         # 要使用的文本键的名称    attributes = [],           # 返回结果中的属性)

其余部分的传统RAG流水线将保持不变。

这个小的代码更改允许您尝试在关键字搜索和向量搜索之间进行不同的加权。请注意,设置alpha = 1等于完全使用语义搜索,相当于直接从vectorstore组件定义检索器(retriever = vectorstore.as_retriever())。

何时使用混合搜索(混合搜索用例)

混合搜索适用于希望实现更接近人类搜索体验的语义搜索能力,同时对于特定术语(例如产品名称或序列号)需要精确短语匹配的用例。

一个很好的例子是Stack Overflow平台,该平台最近通过使用混合搜索扩展了其搜索能力。

像人类一样提问:在Stack Overflow上实现语义搜索

stackoverflow.blog

最初,Stack Overflow使用TF-IDF将关键字与文档匹配[2]。然而,描述您试图解决的编码问题可能很困难。根据您用于描述问题的词语(例如,可以使用不同的方法来合并两个Pandas DataFrames,例如合并、连接和串联),它可能导致不同的结果。因此,在这些情况下,更具上下文感知的搜索方法,例如语义搜索,将更有益处。

然而,另一方面,Stack Overflow的常见用例是复制粘贴错误消息。对于这种情况,精确关键字匹配是首选的搜索方法。此外,您还需要对方法和参数名称进行精确关键字匹配的能力(例如Pandas中的.read_csv())。

可以猜测,许多类似的实际用例从上下文感知语义搜索中受益,但仍依赖于精确关键字匹配。这些用例可以受益于实现混合搜索检索组件。

摘要

本文介绍了混合搜索的背景,即基于关键字和向量搜索的组合。混合搜索合并了分离的搜索算法的搜索结果,并相应地重新排序搜索结果。

在混合搜索中,参数alpha控制着基于关键字和语义搜索之间的权重。该参数alpha可以被视为RAG管道中的一个超参数,用于提高搜索结果的准确性。

使用Stack Overflow [2]案例研究,我们展示了混合搜索在语义搜索可以改善搜索体验的用例中的有用性。然而,在特定术语频繁出现时,精确关键字匹配仍然很重要。

喜欢这个故事吗?

免费订阅以获取我发布新故事时的通知。

每当Leonie Monigatti发布时获取电子邮件。

通过注册,您将创建一个VoAGI帐户(如果您尚未拥有)…

VoAGI.com

领英TwitterKaggle上找到我!

免责声明

本文撰写时,我是Weaviate的开发者倡导者,Weaviate是一个开源向量数据库。

参考文献

文献

[1] Benham, R.,Culpepper, J. S.(2017)。在排名融合中的风险回报权衡。在第22届澳大利亚文件计算研讨会论文集中(第1-8页)。

[2] Haney, D.和Gibson, D.(Stack Overflow博客)。像人类一样提问:在Stack Overflow上实现语义搜索(于2023年11月24日访问)。

图片

除非另有说明,所有图片均由作者创建。

Leave a Reply

Your email address will not be published. Required fields are marked *