语义重排序
本概述主要聚焦于语义重排的高级概念和用例。有关在 Elasticsearch 中设置和使用语义重排的完整实现细节,请参阅 Search API 文档中的参考文档。
重排器可提高早期检索机制所得结果的相关性。语义重排器使用机器学习模型,根据搜索结果与查询之间的语义相似度对搜索结果进行重新排序。
语义重排需要相对庞大且复杂的机器学习模型,并实时响应查询。该技术适用于规模较小的 top-k 结果集,通常作为管道中的最后步骤之一。这是一种提高搜索相关性的强大技术,对关键词检索、语义检索或混合检索算法同样有效。
接下来的部分将详细介绍语义重排的优势、用例和模型类型。最后部分包含关于如何在 Elasticsearch 中实现语义重排的实用高级概述,以及完整参考文档的链接。
语义重排支持多种用例
词法(BM25)检索结果重排
- 只需向任何词法/BM25检索管道添加一个简单的 API 调用,即可实现开箱即用的语义搜索。
- 在现有索引之上添加语义搜索功能,无需重新建立索引,非常适合快速改进。
- 是拥有复杂现有索引的环境的理想选择。
语义检索结果重排
- 通过使用更强大的模型,改善使用 ELSER 稀疏向量嵌入或稠密向量嵌入的语义检索器的结果。
- 在混合检索之上添加精炼层,结合了倒数排名融合 (RRF) 或使用线性检索器进行线性组合
通用应用程序
- 在检索增强生成(RAG)用例或其他涉及大语言模型(LLM)输入的场景中,提供对文档相关性的显式控制。
既然我们已经概述了语义重排的价值,接下来将探讨驱动此过程的具体模型以及它们的区别。
总体而言,语义重排使用两种类型的模型:交叉编码器和双编码器。
在此版本中,Elasticsearch 仅支持交叉编码器用于语义重排。
交叉编码器模型可以被视为一种功能更强大的多合一解决方案,因为它生成感知查询的文档表示。它将查询和文档文本作为一个单一的拼接输入。
双编码器模型将文档或查询文本作为输入。文档和查询嵌入是分别计算的,因此它们彼此不感知。
- 要计算排名分数,需要进行外部操作。这通常涉及计算查询与文档嵌入之间的点积或余弦相似度。
简而言之,交叉编码器提供高准确率,但更消耗资源。双编码器速度更快、成本效益更高,但精度较低。
在未来版本中,Elasticsearch 还将支持双编码器。如果您对交叉编码器和双编码器之间实际差异的更详细分析感兴趣,请展开下一部分。
交叉编码器与双编码器的比较
以下是在为语义重排选择交叉编码器和双编码器时需要考虑的非详尽事项列表
- 由于交叉编码器模型同时处理查询和文档文本,因此它可以更好地推断它们的相关性,作为重排器比双编码器更有效。
- 交叉编码器模型通常更大,计算量更大,从而导致更高的延迟和增加的计算成本。
- 开源交叉编码器明显较少,而双编码器则在规模、语言和其他权衡方面提供了极其丰富的选择。
- 交叉编码器的有效性还可以提高语义检索器的相关性。例如,它们考虑词序的能力可以改进稠密或稀疏嵌入检索。
- 当与特定检索器(如词法/BM25)串联训练时,交叉编码器可以“纠正”这些检索器所犯的典型错误。
- 交叉编码器输出跨查询一致的分数。这使您能够通过为所有查询设置最低分数阈值来在结果集中保持高相关性。例如,在 RAG 工作流中使用结果或将结果馈送给 LLM 时,这一点非常重要。请注意,来自双编码器/嵌入相似度的相似度分数是与查询相关的,这意味着您无法设置通用的截断值。
- 双编码器使用嵌入进行重排。您可以通过在摄入时创建嵌入来改善重排延迟。这些嵌入可以存储用于重排,而无需建立检索索引,从而减少内存占用。
Elasticsearch 提供了两种向搜索管道添加语义重排的方法
- 使用
text_similarity_reranker检索器 - 使用 ES|QL
RERANK命令
两者都使用相同的底层推理端点和重排模型。
这两种方法都需要配置用于 rerank 任务的推理端点。您有以下选项
使用由 Elastic 推理服务 (EIS) 提供支持的预配置
.jina-reranker-v3端点。这是推荐选项。了解有关 Jina 重排模型的更多信息。通过预配置的
.rerank-v1-elasticsearch端点使用 Elastic Rerank 交叉编码器模型,或者使用 推理 API 的 Elasticsearch 服务创建自定义端点。使用 Jina AI Rerank 推理端点创建
rerank端点。使用 Cohere Rerank 推理端点创建
rerank端点。使用 Google Vertex AI 推理端点创建
rerank端点。使用 Eland 从 Hugging Face 将模型上传到 Elasticsearch。使用 Eland 加载模型时,您需要使用
text_similarityNLP 任务类型。然后,使用rerank端点类型设置 Elasticsearch 服务推理端点。有关 Elasticsearch 支持用于语义重排的第三方文本相似度模型列表,请参阅 Elastic NLP 模型参考。
您可以使用检索器或 ES|QL 执行语义重排。
使用检索器语法在单个 _search 调用中以声明方式组合多阶段检索管道。当您想要将重排与诸如 RRF、线性 或 置顶 等其他检索器阶段结合使用时,这非常合适。
您可以使用预配置的重排端点(例如 .jina-reranker-v3 或 .rerank-v1-elasticsearch),或者使用 Elasticsearch 推理 API 创建自定义端点。然后在您的搜索请求中定义一个 text_similarity_reranker 检索器。
示例:基于检索器的语义重排
POST _search
{
"retriever": {
"text_similarity_reranker": {
"retriever": {
"standard": {
"query": {
"match": {
"text": "How often does the moon hide the sun?"
}
}
}
},
"field": "text",
"inference_id": "elastic-rerank",
"inference_text": "How often does the moon hide the sun?",
"rank_window_size": 100,
"min_score": 0.5
}
}
}
有关完整的参考文档,请参阅 text_similarity_reranker 检索器。
使用 ES|QL RERANK 命令将重排添加为管道查询中的一个步骤。当您想要将重排与转换、聚合或带有 COMPLETION 的文本生成等其他 ES|QL 功能结合使用时,这非常合适。
示例:基于 ES|QL 的语义重排
FROM books
| WHERE title : "search query"
| SORT _score DESC
| LIMIT 100
| RERANK "search query" ON title
有关完整的参考文档,请参阅 RERANK 命令。
| 检索器 (Retrievers) | ES|QL | |
|---|---|---|
| 语法 | 声明式 JSON(检索器树) | 管道查询语言 |
| 可组合性 | 与其他检索器嵌套(RRF、线性、置顶、多样化) | 与其他命令管道化(FORK、FUSE、COMPLETION、STATS) |
| 多字段重排 | 仅支持单字段 | 支持多个字段 |
| 适用场景 | _search API 中的多阶段检索管道 |
包含转换或生成的端到端搜索查询 |
| 客户端支持 | 所有 Elasticsearch 客户端 | 所有 Elasticsearch 客户端 |
许多交叉编码器模型的一个局限性是,当它们用于包含长文档的语料库时,性能表现不佳。这是因为许多模型会将输入截断到其 Token 窗口的长度,这可能会在将文档发送给重排器之前切断文档中最相关的部分。预配置的 .rerank-v1-elasticsearch 端点就是以这种方式进行截断的。
text_similarity_reranker 检索器中的 chunk_rescorer 允许显式控制发送给重排器的内容量。这解决了长文档问题,并通过向重排器发送更少的 Token 来控制推理成本。
对打分的分块进行重排是一项专家级功能,如果与不执行截断的模型一起使用,可能会对相关性产生负面影响。
使用分块重新打分的语义重排器搜索请求示例
以下示例展示了使用默认设置的语义重排器通过 chunk_rescorer 控制分块大小。
POST _search
{
"retriever": {
"text_similarity_reranker": {
"retriever": {
"standard": {
"query": {
"match": {
"text": "How often does the moon hide the sun?"
}
}
}
},
"field": "text",
"inference_id": "elastic-rerank",
"inference_text": "How often does the moon hide the sun?",
"chunk_rescorer": {},
"rank_window_size": 100,
"min_score": 0.5
}
}
}
- 阅读
text_similarity_reranker检索器参考以了解语法和实现细节 - 阅读用于管道查询方法的 ES|QL
RERANK命令参考 - 了解有关检索器抽象的更多信息
- 了解有关为您的搜索用例选择查询接口的更多信息
- 了解有关 Elastic 推理 API 的更多信息
- 查看我们的 Python 笔记本,了解如何将 Cohere 与 Elasticsearch 配合使用