AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


微软技术社区:做RAG?向量搜索还不够
发布日期:2024-06-16 09:24:37 浏览次数: 5223 来源:PaperAgent


RAG流程检索器肯定应该支持向量搜索,因为这可以找到与用户查询具有相似语义的文档,但向量搜索还不够。检索器应该支持完全混合搜索,这意味着它可以同时执行向量搜索和全文搜索,然后合并并重新排列结果。这将使RAG流程能够找到语义相似的概念,还可以找到精确匹配项,例如专有名称、ID和数字。  

混合搜索步骤

Azure AI Search提供包含以下所有组件的完整混合搜索:

  1. 它使用距离度量(通常是余弦或点积)执行向量搜索。

  2. 它使用BM25 评分算法执行全文搜索

  3. 它使用倒数秩融合算法合并结果。

  4. 它使用语义排名器(Bing 使用的机器学习模型)对结果重新排名,将每个结果与原始用户查询进行比较并分配 0-4 之间的分数。

什么时候需要混合搜索?

为了证明超越向量搜索的重要性,基于自一家虚构的公司文档,讨论了医疗保健和福利等内部政策。

首先使用AI搜索索引通过纯向量搜索来搜索“什么计划的费用为 45.00美元?”:

search_query = "what plan costs $45.00"search_vector = get_embedding(search_query)r = search_client.search(None, top=3, vector_queries=[VectorizedQuery(search_vector, k_nearest_neighbors=50, fields="embedding")])

该查询的结果包含数字和费用,例如字符串“初级保健访问的共同支付费用通常约为20美元,而专科医生访问的共同支付费用约为50美元。”,但没有一个结果包含用户所寻找的确切费用 45.00 美元。

 

现在使用纯全文搜索尝试该查询:

r = search_client.search(search_query, top=3)

该查询的最佳结果包含健康保险计划费用表,其中一行包含45.00美元。

 

当然,不想局限于全文查询,因为许多用户查询最好通过向量搜索来回答,所以尝试使用混合查询

r = search_client.search(search_query, top=15, vector_queries=[VectorizedQuery(search_vector, k_nearest_neighbors=10, fields="embedding")])

再次,顶部结果是包含成本和精确字符串 $45.00 的表格。当用户在完整的RAG应用程序上下文中提出该问题时,他们会得到他们希望得到的答案:

有多少用户在搜索精确的字符串?想想您在电子邮件中搜索某个人的名字的频率,或者您在网络上搜索某个特定编程函数名称的频率。用户会提出一些查询,而这些查询更适合全文搜索,这就是需要混合搜索解决方案的原因。

 

还有一个原因说明单靠向量搜索是不够的:假设您使用的是通用嵌入模型(如 OpenAI 模型),这些模型通常并不完美适合您的领域。它们对某些术语的理解与完全基于您领域的数据进行训练的模型不同。使用混合搜索有助于弥补嵌入领域的差异。

 

什么时候需要重新排名?

现在相信混合搜索,来讨论最后一步:根据原始用户查询对结果重新排名

现在将使用混合搜索在同一文档中搜索“了解水下活动”:

search_query = "learning about underwater activities"search_vector = get_embedding(search_query)r = search_client.search(search_query, top=5, vector_queries=[VectorizedQuery(search_vector, k_nearest_neighbors=10, fields="embedding")])

该查询的第三个结果包含最相关的结果,即一份提及冲浪课程和水肺潜水课程的福利文件。值得注意的是,“水下”一词未出现在任何文件中,因此这些结果来自向量搜索组件。

如果添加语义排序器会发生什么?

search_query = "learning about underwater activities"search_vector = get_embedding(search_query)r = search_client.search(search_query, top=5, vector_queries=[VectorizedQuery(search_vector, k_nearest_neighbors=50, fields="embedding")],query_type="semantic", semantic_configuration_name="default")

现在,查询的最顶部结果是关于冲浪和潜水课程的文档块,因为语义排序器意识到这是与用户查询最相关的结果。当用户在 RAG 流程中提出这样的问题时,他们会得到一个正确的答案和预期的引用:

搜索在两种情况下都得到了正确的结果,那么为什么要费心使用排名器呢?对于将搜索结果发送 GPT-3.5等LLM的RAG应用程序,通常将结果数量限制为相当低的数量,例如3或5个结果。这是因为研究表明,当向LLM 提供太多上下文时,它们往往会“迷失在中间”。希望前N个结果是最相关的结果,并且不包含任何不相关的结果。通过使用重新排名器,顶级结果更有可能包含与查询最接近的匹配内容。

 

此外,还有一个很大的额外好处:现在每个结果的重新排序得分都在0-4之间,这可以轻松过滤掉重新排序得分低于某个阈值(如<1.5的结果)。任何包含向量搜索的搜索算法都总能找到结果,即使这些结果与原始查询根本不太接近,因为向量搜索只是在整个向量空间中寻找最接近的向量。因此,当您的搜索涉及向量搜索时,您理想情况下需要一个重新排序步骤和一种评分方法,这将使您更容易丢弃绝对相关性不够的结果。


实现混合搜索

以 PostgreSQL 数据库为例。它已经内置了全文搜索,并且有一个流行的扩展名为pgvector,用于引入向量索引和距离运算符。下一步是将它们组合在一起进行混合搜索,此示例来自pgvector-python存储库:。

WITH semantic_search AS (SELECT id, RANK () OVER (ORDER BY embedding <=> %(embedding)s) AS rankFROM documentsORDER BY embedding <=> %(embedding)sLIMIT 20),keyword_search AS (SELECT id, RANK () OVER (ORDER BY ts_rank_cd(to_tsvector('english', content), query) DESC)FROM documents, plainto_tsquery('english', %(query)s) queryWHERE to_tsvector('english', content) @@ queryORDER BY ts_rank_cd(to_tsvector('english', content), query) DESCLIMIT 20)SELECTCOALESCE(semantic_search.id, keyword_search.id) AS id,COALESCE(1.0 / (%(k)s + semantic_search.rank), 0.0) +COALESCE(1.0 / (%(k)s + keyword_search.rank), 0.0) AS scoreFROM semantic_searchFULL OUTER JOIN keyword_search ON semantic_search.id = keyword_search.idORDER BY score DESCLIMIT 5

该 SQL 通过运行向量搜索和文本搜索并将它们与 RRF 结合起来执行混合搜索。

另一个示例展示了如何引入交叉编码模型来进行最终的重新排序步骤:

encoder = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')scores = encoder.predict([(query, item[1]) for item in results])results = [v for _, v in sorted(zip(scores, results), reverse=True)]


如有疑问,请评估

在为RAG应用程序选择检索器和检索器选项时,需要评估答案质量。在上面逐步介绍了几个示例查询,但对于面向用户的应用程序,确实需要对大量问题(约200 个)进行批量评估,以查看选项对答案质量的影响。为了更轻松地运行批量评估,我创建了ai-rag-chat-evaluator存储库,它可以针对 RAG 聊天应用程序运行基于 GPT的指标和基于代码的指标。

 

以下是根据我所有的个人博客文章针对RAG应用程序合成生成的数据集进行评估的结果:

很震惊地发现向量搜索本身的表现如此糟糕,平均基础性为 2.79(满分5分),只有2%的答案的引用与基本事实引用相匹配。全文搜索本身表现相当不错,平均基础性为4.87,引用匹配率为89%。没有语义排序器的混合搜索比向量搜索有所改进,平均基础性为3.26,引用匹配率为11%,但使用语义排序器后表现要好得多,平均基础性为4.89,引用匹配率为92%。

 

但为什么向量搜索和无排序混合搜索的得分如此之低呢

  • Azure AI Search 中的全文搜索选项确实很棒。它使用 BM25,并且经过了相当多的实战考验,在向量搜索变得如此流行之前就已经存在了很多年。BM25算法基于TF-IDF,并产生类似于稀疏向量本身的东西,因此它比简单的子字符串搜索更先进。AI Search还使用标准的 NLP 技巧,如词干提取和拼写检查。许多数据库都具有全文搜索功能,但它们并不都像 Azure AI Search 全文搜索那样功能齐全。

  • 标准答案数据集偏向于与全文搜索兼容。通过将我的博客文章输入到 GPT-4 并要求它根据文本提出好的问答来生成示例问题和答案,所以GPT-4 很可能选择使用与我的帖子类似的措辞。实际的提问者可能会使用非常不同的措辞——他们甚至可能用不同的语言提问,比如西班牙语或中文!这就是向量搜索真正发挥作用的地方,也是全文搜索表现不佳的地方。

所以总而言之,如果要使用向量搜索,就绝对必须采用包含所有四个步骤的完整混合搜索,并且评估结果以确保使用最适合该工作的检索选项。

https://techcommunity.microsoft.com/t5/microsoft-developer-community/doing-rag-vector-search-is-not-enough/ba-p/4161073



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询