本指南探讨了使用语义重排序来提升顶级搜索结果相关性的策略,包括直接推理调用、在搜索体验的上下文中,或作为使用检索器的简化搜索流程的一部分。在深入了解细节之前,让我们解释一下什么是语义重排序以及为什么它很重要。
什么是语义重排序?
语义重排序是一种方法,它允许我们利用快速检索方法的速度和效率,同时在其之上叠加语义搜索。它还允许我们立即为现有的 Elasticsearch 安装添加语义搜索功能。
随着机器学习驱动的语义搜索的进步,我们拥有越来越多的工具可以快速地从数百万个文档中找到匹配项。但是,就像为期末考试临时抱佛脚一样,对速度的优化意味着要做出一些权衡,这通常会导致保真度下降。
为了弥补这一点,我们看到一些工具出现在梯度的另一侧,并且越来越容易获得。这些工具速度慢得多,但可以更准确地判断文档与查询的匹配程度。
为了解释一些关键术语:重排序是重新排序检索到的文档集以提高搜索相关性的过程。在语义重排序中,这是借助重排序机器学习模型完成的,该模型计算输入查询与每个文档之间的相关性分数。
重排序器通常对前 K 个结果进行操作,这是一个满足搜索查询的相关候选人的缩小窗口,因为对大量的文档进行重排序成本非常高。
为什么语义重排序很重要?
语义重排序对于搜索用户来说是一个重要的改进层,原因如下。
首先,用户期望从搜索中获得更多,正确的结果不在前十个命中或第一页中,而是在最佳答案中。就像那个古老的搜索笑话一样——隐藏秘密的最佳地点是搜索结果的第二页。但今天的情况更加狭窄:任何低于前一、二或最多三个结果的内容都可能会被丢弃。
对于RAG(检索增强生成)尤其如此——这些生成式 AI 用例需要一个紧密的上下文窗口。最佳文档可能是第四个结果,但如果你只输入前三个结果,你就无法得到正确的答案,模型可能会产生幻觉。
最重要的是,生成式 AI 用例最适合有效的截止点。您可以定义一个最小分数或计算结果被认为是“良好”的结果数量,但这在没有一致评分的情况下很难做到。
语义重排序通过重新排序文档来解决这些问题,以便最相关的文档出现在顶部。它提供可用、规范化和经过良好校准的分数,因此您可以衡量结果与查询的匹配程度。因此,您可以更可靠地获得更准确的顶级结果来馈送到您的大型语言模型,并且如果前 K 个命中中的分数大幅下降,您可以截断结果以防止出现幻觉。
我们如何执行语义重排序?
rerank
推理类型
Elastic 最近引入了推理端点和相关的API。此功能允许我们使用某些服务(例如内置或第三方机器学习模型)来执行推理任务。支持的推理任务有多种形式——例如,sparse_embedding
任务是指 ML 模型(例如 ELSER)接收一些文本并生成一组加权术语,而text_embedding
任务则从输入创建向量嵌入。
Elastic Serverless——以及即将发布的 8.14 版本——添加了一种新的任务类型:rerank
。在第一个迭代中,rerank
支持与Cohere 的 Rerank API 集成。这意味着您现在可以在 Elastic 中创建一个推理端点,提供您的 Cohere API 密钥,并立即享受语义重排序!
让我们通过从Cohere 博客中提取的示例来看看它的实际应用。
假设您已在 Elastic 中使用 Cohere Rerank v3 模型设置了您的rerank
推理端点,我们可以传递一个查询和一个输入文本数组。正如我们所看到的,这些简短的段落都与“capital”一词相关,但不一定与政府所在地的意思相关,而这正是查询的目标。
POST _inference/rerank/cohere-rerank-v3-model
{
"query": "What is the capital of the USA?",
"input": [
"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.",
"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 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.",
"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.",
"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.",
"North Dakota is a state in the United States. 672,591 people lived in North Dakota in the year 2010. The capital and seat of government is Bismarck."
]
}
rerank 任务会返回一个分数数组和文档索引。
{
"rerank": [
{
"index": "3",
"relevance_score": "0.99838966"
},
{
"index": "1",
"relevance_score": "0.587174"
},
{
"index": "0",
"relevance_score": "0.061199225"
},
{
"index": "2",
"relevance_score": "0.032283258"
},
{
"index": "4",
"relevance_score": "0.015365342"
},
{
"index": "5",
"relevance_score": "0.0040072887"
}
]
}
最顶部的条目告诉我们,最高相关性分数 99.8% 是原始列表中的第四个文档(使用基于零的索引为"index": 3
),即"Washington, D.C. ..."
。其余文档在语义上与原始查询的相关性较低。
此重排序推理步骤是优化搜索体验的重要拼图,现在我们准备将其放置在拼图板上!
通过您的应用程序进行当今的搜索结果重排序
利用语义重排序功能的一种方法是在搜索应用程序中实现这样的工作流程
- 用户在您应用程序的 UI 中输入查询。
- 搜索引擎组件检索与该查询匹配的一组文档。这可以使用任何检索策略完成:词汇(BM25)、向量搜索(例如 kNN)或结合了这两种方法的方法,例如 RRF。
- 应用程序获取前 K 个文档,从每个文档中提取我们正在查询的文本字段,然后将此文本列表发送到配置为使用 Cohere 的
rerank
推理端点。 - 推理端点将文档和查询传递给 Cohere。
- 结果是一个分数列表和与每个分数匹配的索引。您的应用程序获取这些分数,将它们分配给文档,并按此分数以降序重新排序它们。这有效地将语义上最相关的文档移动到顶部。
- 如果此流程用于 RAG 以向生成式 LLM 提供一些来源(例如总结答案),那么您可以放心,它将与正确的上下文一起工作并提供答案。
这效果很好,但它涉及许多步骤、数据处理和具有许多活动部件的复杂处理逻辑。我们能否简化它?
使用检索器的未来搜索结果重排序
让我们花一分钟时间讨论检索器。检索器是_search
API 中一种新型的抽象,它不仅仅是一个简单的查询。它是用于获取命中并潜在地修改文档分数及其顺序的端到端搜索流程的构建块。
检索器可以用于管道模式,其中每个检索器单元在搜索过程中执行不同的操作。例如,我们可以配置一个第一阶段检索器来获取文档,将结果传递给第二阶段检索器以与其他结果结合,修剪候选数量等。作为最终阶段,检索器可以更新文档的相关性分数。
很快我们将添加新的重排序功能,其中**文本相似度重排序检索器**将是第一个。它将通过调用rerank
推理端点对前 K 个结果进行重排序。工作流程将简化为单个API调用,从而隐藏所有复杂性!
以下是前面描述的多阶段工作流程作为单个检索器查询的样子
text_similarity_reranker
检索器配置如下:
- 嵌套检索器
- 重排序推理配置
- 其他控制,例如用于消除无关结果的最低分数截止值
下面是一个text_similarity_reranker
查询示例。让我们剖析它以更好地理解各个部分!
POST my-index/_search
{
"retriever": { // Retriever query
"text_similarity_reranker": { // Outermost retriever will perform reranking
"retriever": {
"standard": { // First-stage retriever is a standard Elasticsearch query
"query": {
"match": { // BM25 matching
"text": "What is the capital of the USA?"
}
}
}
},
"field": "text", // Document field to send to reranker
"rank_window_size": 100, // Reranking will work on top K hits
"inference_id": "cohere-rerank-v3-model", // Inference endpoint
"inference_text": "What is the capital of the USA?",
"min_score": 0.6 // Minimum relevance score
}
}
}
该请求将retriever
查询定义为根属性。最外层的检索器将最后执行,在本例中为text_similarity_reranker
。它指定了一个standard
第一阶段检索器,负责获取一些文档。standard
检索器接受一个Elasticsearch query
,在示例中为BM25 match
。
文本相似度重排序器指向包含语义重排序文本的text
文档字段。前100个文档将发送到我们使用Cohere配置的cohere-rerank-v3-model
重排序推理端点进行重排序。只有那些在重排序过程中获得至少60%相关性分数的文档才会返回。
响应与search
查询的结构完全相同。_score
属性是重排序过程中的语义相关性分数,_rank
指的是文档的排序顺序。
{
"took": 213,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.99838966,
"hits": [
{
"_index": "my-index",
"_id": "W7CDBo8BJDa_bRWhW1KH",
"_score": 0.99838966,
"_rank": 1,
"_source": {
"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."
}
}
]
}
}
使用检索器的语义重排序功能将在即将发布的Elastic版本中提供。
结论
语义重排序是一个非常强大的工具,可以提高搜索体验或RAG工具的性能。它可以作为直接推理调用使用,用在搜索体验的上下文中,也可以作为简化检索器搜索流程的一部分使用。用户可以选择最适合其用例和上下文的工具集。
祝您重排序愉快!😃