前言
在人工智能盛起的当下,前有ChatGPT珠玉在前,后有Sora(聊聊火出圈的世界AI大模型——Sora)横空出世的消息铺天盖地,笔者作为一名资深数据科学从业者,也进行了很多的探索。最近梳理了一些关于Advanced RAG和ReRank相关的资料,整理到本文中和大家一起分享。
从LangChain4j的一个PR来学习高级 RAG
到目前为止,LangChain4j 仅实现了一个简单的(也称为朴素的)RAG 实现:每次与 LLM 交互时都会调用单个 Retriever
,并将所有检索到的 TextSegments
追加到 UserMessage
的末尾。这种方法非常有限。
本 PR 引入了对更高级 RAG 用例的支持。设计和思维模型受到 这篇文章[1] 和 这篇论文[2] 的启发,建议阅读文章。
本 PR 引入了一个 RetrievalAugmentor
接口,负责在将 UserMessage
发送到 LLM 之前用相关内容增强它。RetrievalAugmentor
可以与 AiServices
和 ConversationalRetrievalChain
一起使用,也可以独立使用。
提供了一个默认的 RetrievalAugmentor
实现(DefaultRetrievalAugmentor
),建议作为一个良好的起点。然而,用户不限于此,可以自由地使用自己的自定义实现。
DefaultRetrievalAugmentor
将整个 RAG 流程分解为更细粒度的步骤和基础组件:
•QueryTransformer
•QueryRouter
•ContentRetriever
(旧的 Retriever
现在已弃用)•ContentAggregator
•ContentInjector
这种模块化设计旨在分离关注点,并简化开发、测试和评估。大多数(如果不是全部)当前已知和经过验证的 RAG 技术都可以表示为上述一个或多个基础组件。
这是分解的 RAG 流程的可视化表示:
advancedrag
这个心智和软件模型旨在简化对高级RAG流程的思考、推理和实现。
上面列出的每个基本组件在 DefaultRetrievalAugmentor
中默认配置了一个合理且简单的默认实现,但可以被更复杂的实现(库内置提供)以及自定义实现覆盖。随着我们发现新技术和实现现有的经过验证的技术,实现列表预计会随着时间的推移而增长。
此 PR 还引入了对以下经过验证的 RAG 技术的开箱即用支持:
•查询扩展•查询压缩•使用 LLM 的查询路由•互惠排名融合[3]•重排序(Cohere Rerank[4] 集成即将在 单独的 PR[5] 中到来)。
混合搜索中使用互惠排名融合(RRF)进行相关性评分
互惠排名融合(RRF)是一种算法,用于评估多个先前排名结果的搜索分数,以产生一个统一的结果集。在 Azure AI 搜索中,当有两个或更多并行执行的查询时,总是使用 RRF。每个查询产生一个排名结果集,RRF 用于合并和均匀化排名,形成一个单一的结果集,返回在查询响应中。RRF 始终用于的场景示例包括混合搜索[6]和多个向量查询同时执行。
RRF 基于互惠排名的概念,互惠排名是搜索结果列表中第一个相关文档的排名的倒数。该技术的目标是考虑项目在原始排名中的位置,并给予在多个列表中排名较高的项目更高的重要性。这可以帮助提高最终排名的整体质量和可靠性,使其更适用于融合多个有序搜索结果的任务。
RRF排名工作原理
RRF通过获取多个方法的搜索结果,为结果中的每个文档分配一个倒数排名得分,然后组合这些得分以创建一个新的排名。其概念是,出现在多个搜索方法顶部位置的文档可能更相关,应该在组合结果中排名更高。
以下是RRF过程的简单解释:
1.从并行执行的多个查询中获取排名的搜索结果。2.为每个排名列表中的结果分配倒数排名得分。RRF为每个结果集中的每个匹配项生成一个新的 @search.score
。对于搜索结果中的每个文档,引擎根据其在列表中的位置分配一个倒数排名得分。得分计算为1/(rank k)
,其中rank
是文档在列表中的位置,k
是一个常数,实验观察到如果将其设置为一个小值,如60,则性能最佳。注意,这个k
值是RRF算法中的一个常数,与控制最近邻居数量的k
完全不同。3.组合得分。对于每个文档,引擎将从每个搜索系统获得的倒数排名得分相加,为每个文档产生一个组合得分。4.引擎根据组合得分对文档进行排名并对它们进行排序。结果列表是融合排名。
只有在索引中标记为searchable
的字段,或在查询中的searchFields
,用于评分。只有标记为retrievable
的字段,或在查询中指定的select
中的字段,才会在搜索结果中返回,连同它们的搜索得分。
并行查询执行
RRF(循环排名融合算法)在有多个查询执行时使用。以下示例说明了并行查询执行发生的查询模式:
•一个全文查询加上一个向量查询(简单混合场景)等于两个查询执行。•一个全文查询加上针对两个向量字段的一个向量查询等于三个查询执行。•一个全文查询加上针对五个向量字段的两个向量查询等于11个查询执行。
混合搜索结果中的分数
每当结果被排名时,@search.score
属性包含用于排序结果的值。分数是由各种方法的排名算法生成的。每种算法都有自己的范围和大小。 下表标识了每种匹配、算法和每种相关排名算法的分数范围所返回的评分属性。
搜索方法 | 参数 | 评分算法 | 范围 |
---|---|---|---|
全文搜索 | @search.score | BM25算法 | 无上限。 |
向量搜索 | @search.score | 使用HNSW配置中指定的相似度度量的HNSW算法。 | 0.333 - 1.00(余弦),0到1对于欧几里得和点积。 |
混合搜索 | @search.score | RRF算法 | 上限受融合查询数量的限制,每个查询最多对RRF分数贡献约1。例如,融合三个查询将产生比只合并两个搜索结果更高的RRF分数。 |
语义排名 | @search.rerankerScore | 语义排名 | 0.00 - 4.00 |
语义排名不参与RRF。它的分数(@search.rerankerScore)总是在查询响应中单独报告。语义排名可以对全文和混合搜索结果进行重新排名,假设这些结果包括具有语义丰富内容的字段。
混合查询响应中排名结果的数量
默认情况下,如果您没有使用分页,搜索引擎将返回全文搜索的前50个最高排名匹配项,以及向量搜索的最相似的 k
个匹配项。在混合查询中,top
决定响应中的结果数量。根据默认设置,返回统一结果集中排名最高的前50个匹配项。
通常,搜索引擎找到的结果数量超过 top
和 k
。要返回更多结果,请使用分页参数 top
、skip
和 next
。分页是您确定每个逻辑页面上的结果数量并浏览完整有效载荷的方式。
全文搜索受到最多 1000 个匹配项的最大限制(参见 API 响应限制[7])。一旦找到 1000 个匹配项,搜索引擎将不再寻找更多。
有关更多信息,请参阅 如何处理搜索结果[8]。
搜索评分工作流程图
下图说明了一个调用关键字和向量搜索的混合查询,通过评分配置文件进行提升,并进行语义排名。
生成上述工作流的查询可能如下所示:
代码语言:javascript复制POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
"queryType":"semantic",
"search":"hello world",
"searchFields":"field_a, field_b",
"vectorQueries": [
{
"kind":"vector",
"vector": [1.0, 2.0, 3.0],
"fields": "field_c, field_d"
},
{
"kind":"vector",
"vector": [4.0, 5.0, 6.0],
"fields": "field_d, field_e"
}
],
"scoringProfile":"my_scoring_profile"
}
另请参阅
•了解更多关于混合搜索[9]•了解更多关于向量搜索[10]
重新排名(ReRank)
如何重新排名工作
Rerank API端点[11] 由 Rerank模型[12] 提供支持,是执行语义搜索的一个简单而强大的工具。给定一个 query
和一个 documents
列表,Rerank会将文档从与查询最相关到最不相关的顺序进行索引。
开始使用
示例请求
首先,让我们设置Cohere SDK:
代码语言:javascript复制import cohere
api_key = ""
co = cohere.Client(api_key)
在下面的示例中,我们使用 Rerank API端点[13] 来索引 docs
列表,从与查询 What is the capital of the United States?
最相关到最不相关的顺序。
请求:
代码语言:javascript复制query = "What is the capital of the United States?"
docs = [
"Carson City is the capital city of the American state of Nevada. At the 2010 United States Census, Carson City had a population of 55,274.",
"The Commonwealth of the Northern Mariana Islands is a group of islands in the Pacific Ocean that are a political division controlled by the United States. Its capital is Saipan.",
"Charlotte Amalie is the capital and largest city of the United States Virgin Islands. It has about 20,000 people. The city is on the island of Saint Thomas.",
"Washington, D.C. (also known as simply Washington or D.C., and officially as the District of Columbia) is the capital of the United States. It is a federal district. The President of the USA and many major national government offices are in the territory. This makes it the political center of the United States of America.",
"Capital punishment (the death penalty) has existed in the United States since before the United States was a country. As of 2017, capital punishment is legal in 30 of the 50 states. The federal government (including the United States military) also uses capital punishment."
]
results = co.rerank(model="rerank-english-v2.0", query=query, documents=docs, top_n=3)
响应:
代码语言:javascript复制{
"results": [
{
"document": {
"text":"Washington, D.C. (also known as simply Washington or D.C., and officially as the District of Columbia) is the capital of the United States. It is a federal district. The President of the USA and many major national government offices are in the territory. This makes it the political center of the United States of America."
},
"index":3,
"relevance_score":0.9871293
},
{
"document": {
"text":"The Commonwealth of the Northern Mariana Islands is a group of islands in the Pacific Ocean that are a political division controlled by the United States. Its capital is Saipan."
},
"index":1,
"relevance_score":0.29961726
},
{
"document": {
"text":"Carson City is the capital city of the American state of Nevada. At the 2010 United States Census, Carson City had a population of 55,274."
},
"index":0,
"relevance_score":0.08977329
},
{
"document": {
"text":"Charlotte Amalie is the capital and largest city of the United States Virgin Islands. It has about 20,000 people. The city is on the island of Saint Thomas."
},
"index":2,
"relevance_score":0.041462272
}
]
}
多语言重新排名
Cohere提供了一个多语言模型 rerank-multilingual-v2.0
。该模型训练了以下语言:
English, Chinese, French, German, Indonesian, Italian, Portuguese, Russian, Spanish, Arabic, Dutch, Hindi, Japanese, Vietnamese
引用
•Advanced RAG[14]•混合搜索评分 (RRF) - Azure AI 搜索 | Microsoft 学习[15]•重新排名[16]
声明
本文由山行翻译整理自网络(见引用处),如果对您有帮助,请帮忙点赞、关注、收藏,谢谢~
References
[1]
这篇文章: https://blog.langchain.dev/deconstructing-rag/
[2]
这篇论文: https://arxiv.org/abs/2312.10997
[3]
互惠排名融合: https://learn.microsoft.com/en-us/azure/search/hybrid-search-ranking
[4]
Cohere Rerank: https://docs.cohere.com/docs/reranking
[5]
单独的 PR: https://github.com/langchain4j/langchain4j/pull/539
[6]
混合搜索: https://learn.microsoft.com/en-us/azure/search/hybrid-search-overview
[7]
API 响应限制: https://learn.microsoft.com/en-us/azure/search/search-limits-quotas-capacity#api-response-limits
[8]
如何处理搜索结果: https://learn.microsoft.com/en-us/azure/search/search-pagination-page-layout
[9]
了解更多关于混合搜索: https://learn.microsoft.com/en-us/azure/search/hybrid-search-overview
[10]
了解更多关于向量搜索: https://learn.microsoft.com/en-us/azure/search/vector-search-overview
[11]
Rerank API端点: https://docs.cohere.com/reference/rerank-1
[12]
Rerank模型: https://docs.cohere.com/docs/models#rerank-beta
[13]
Rerank API端点: https://docs.cohere.com/reference/rerank-1
[14]
Advanced RAG: https://github.com/langchain4j/langchain4j/pull/538
[15]
混合搜索评分 (RRF) - Azure AI 搜索 | Microsoft 学习: https://learn.microsoft.com/en-us/azure/search/hybrid-search-ranking
[16]
重新排名: https://docs.cohere.com/docs/reranking