Elasticsearch Open Inference API 新增对 Cohere 的 Rerank 3 模型支持

2025年6月22日   |   by mebius

作者:来自 ElasticSerena ChouMax Hniebergall

%title插图%num

了解 Cohere reranking,如何将 Cohere 的 Rerank 3 模型与 Elasticsearch 的 open inference API 一起使用,以及 Elastic 在语义 reranking 方面的路线图。

:原文在 2024 年 4 月发布。在文中提到的 retrievers 检索器早已经在后续的版本中发布。

Elasticsearch 原生集成了业界领先的生成式 AI 工具和服务提供商。你可以查看我们的网络研讨会,了解如何超越 RAG 基础知识,或如何构建可用于生产的 Elastic 向量数据库应用。

要为你的使用场景构建最佳搜索解决方案,现在就开始免费云试用,或者在本地机器上尝试 Elastic。

Elasticsearch Open Inference API 新增对 Cohere 的 Rerank 3 模型支持

Cohere 的 Rerank 3 模型rerank-english-v3.0)现已通过其 Rerank 端点提供,而 Elasticsearch 是唯一在 Cohere Rerank 3 发布中集成支持的向量数据库,已通过其开放 Inference API 无缝支持该模型。

简而言之,什么是 reranking(重排序)?
Reranker 会对现有向量搜索或关键词搜索系统返回的 “前 n 个结果” 进行语义增强,不需要更换模型或更改数据索引,就能显著提升这些结果的相关性,使其更适合作为上下文传递给大语言模型(LLMs)。

Elastic 最近与 Cohere 合作,使 Elasticsearch 开发者能轻松使用 Cohere 的 embeddings(在 Elasticsearch 8.13Serverless 中支持)。将 Cohere 的 rerank 能力引入其中,是对结果精细优化的自然演进。

Cohere Rerank 3 优势:

  • 可直接集成到现有 Elasticsearch 检索流程中,无需大改代码。

  • 支持将来自任何第三方模型的向量 embedding 与 Elastic 一起使用。

  • 在 Elastic 强大的向量数据库和混合搜索能力(hybrid search)支持下,Rerank 3 能进一步提升检索结果质量。

Elastic 的混合搜索方法

在实施 RAG( Retrieval Augmented Generation )时,检索和重排序的策略是客户用来支撑 LLMs 并获得准确结果的关键优化。多年来,客户一直信任 Elastic 来处理他们的私有数据,并能够利用多种第一阶段的检索算法(例如 BM25 /关键词、稠密和稀疏向量检索)。更重要的是,大多数真实世界的搜索用例都受益于混合搜索,而我们从 Elasticsearch 8.9 起就已支持这一功能。

%title插图%num

对于中间阶段的重排序,我们也提供对 Learning To Rank查询重评分的原生支持。在本次演示中,我们将重点介绍 Cohere 的最后阶段重排序功能,并将在后续的博客中介绍 Elastic 的中间阶段重排序能力。

Cohere 的重排序方法

Cohere 的新 Rerank 模型在测试中表现出色。Cohere 报告指出,重排序模型在处理较长上下文时尤其有效。在为密集向量检索准备文档时,由于模型的 token 限制,进行分块是必须的。然而,使用 Cohere 的重排序方法时,基于整个文档上下文而非某一具体分块内容,可以获得显著的效果提升。Rerank 支持 4k token 限制,从而能输入更多上下文,充分发挥该模型在 Elasticsearch 搜索系统中带来的相关性优势。

%title插图%num

(i) 基于 BEIR 基准的通用检索;准确率以 nDCG@10 衡量

(ii) 基于 6 个常见代码基准的代码检索;准确率以 nDCG@10 衡量

(iii) 基于 7 个常见基准的长上下文检索;准确率以 nDCG@10 衡量

(iv) 基于 4 个常见基准的半结构化(JSON)检索;准确率以 nDCG@10 衡量

%title插图%num

如果你对如何使用 LangChainLlamaIndex 进行分块感兴趣,我们在 Search Labs开源仓库中提供了聊天应用参考代码、集成等内容。或者,你也可以利用 Elastic 的段落检索功能,并通过 ingest pipelines 进行分块。

用 Elasticsearch 和 Cohere 构建 RAG 实现

现在你已经大致了解了这些功能的使用方法,接下tgcode来我们进入一个用 Elasticsearch 和 Cohere 构建 RAG 实现的示例。

你需要一个 Cohere 账号,并对 Cohere Rerank 端点有一定了解。如果你打算使用 Cohere 最新的生成模型 Command R+,请熟悉 Chat 端点

Kibana 中,你可以使用控制台输入这些 Elasticsearch 的操作步骤,即使没有设置 IDE 也没问题。如果你更喜欢使用语言客户端,可以参考提供的指南

Elasticsearch 向量数据库

在之前的公告中,我们提供了一些入门步骤,帮你开始使用 Elasticsearch 向量数据库。你可以查看如何导入示例 books 目录,并使用 Cohere 的 Embed 功能生成向量,详情请阅读公告。或者,如果你愿意,我们也提供了教程Jupyter 笔记本,帮助你开始这一过程。

Cohere 重新排序

以下部分假设你已经导入了数据并执行了第一次搜索。这将让你了解第一次密集向量检索的结果排序情况。

上一次公告结束时,针对示例 books 目录执行了一个查询,查询字符串为 “Snow”,返回了以下按相关度降序排列的结果。

    {
    "took": 201,
    "timed_out": false,
    "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
    },
    "hits": {
    "total": {
    "value": 6,
    "relation": "eq"
    },
    "max_score": 0.80008936,
    "hits": [
    {
    "_index": "cohere-embeddings",
    "_id": "tgcode3VAixI4Bi8x57NL3O03c",
    "_score": 0.80008936,
    "_source": {
    "name": "Snow Crash",
    "author": "Neal Stephenson"
    }
    },
    {
    "_index": "cohere-embeddings",
    "_id": "4FAixI4Bi8x57NL3O03c",
    "_score": 0.6495671,
    "_source": {
    "name": "Fahrenheit 451",
    "author": "Ray Bradbury"
    }
    },
    {
    "_index": "cohere-embeddings",
    "_id": "31AixI4Bi8x57NL3O03c",
    "_score": 0.62768984,
    "_source": {
    "name": "1984",
    "author": "George Orwell"
    }
    },
    {
    "_index": "cohere-embeddings",
    "_id": "4VAixI4Bi8x57NL3O03c",
    "_score": 0.6197722,
    "_source": {
    "name": "Brave New World",
    "author": "Aldous Huxley"
    }
    },
    {
    "_index": "cohere-embeddings",
    "_id": "3lAixI4Bi8x57NL3O03c",
    "_score": 0.61449933,
    "_source": {
    "name": "Revelation Space",
    "author": "Alastair Reynolds"
    }
    },
    {
    "_index": "cohere-embeddings",
    "_id": "4lAixI4Bi8x57NL3O03c",
    "_score": 0.59593034,
    "_source": {
    "name": "The Handmaid's Tale",
    "author": "Margaret Atwood"
    }
    }
    ]
    }
    }

接下来,你需要通过指定 Rerank 3 模型和 API key 来配置 Cohere Rerank 的推理端点。

    PUT _inference/rerank/cohere_rerank
    {
    "service": "cohere",
    "service_settings": {
    "api_key": ,
    "model_id": "rerank-english-v3.0"
    },
    "task_settings": {
    "top_n": 10,
    "return_documents": true
    }
    }

一旦指定了这个推理端点,你就可以通过传入用于检索的原始查询 “Snow” 和我们刚用 kNN 搜索检索到的文档来重新排序结果。记住,你也可以对任何混合搜索查询重复这个过程!

为了演示这一点,同时仍然使用开发控制台,我们会对上面的 JSON 响应做一些清理。

从 JSON 响应中取出 hits,构造如下的 JSON 作为输入,然后 POST 到我们刚配置的 cohere_rerank 端点。

    POST _inference/rerank/cohere_rerank
    {
    "input": ["Snow Crash", "Fahrenheit 451", "1984", "Brave New World","Revelation Space", "The Handmaid's Tale"],
    "query": "Snow"
    }

就是这样,你的结果已经使用 Cohere 的 Rerank 3 模型完成了重新排序。

%title插图%num

我们用来演示这些功能的 books 语料库没有包含大量的段落,且是一个相对简单的示例。在为你自己的搜索体验实现这些功能时,建议你遵循 Cohere 的方法,用第一批检索结果中完整文档的上下文来填充输入,而不仅仅是文档中的某个检索块。

Elasticsearch 加速语义重排序和检索器的路线图

在 Elasticsearch 即将发布的版本中,我们将继续构建对中间和最终阶段重排序器的无缝支持。我们的最终目标是让开发者能够使用语义重排序来提升任何搜索的结果,无论是 BM25、密集向量检索、稀疏向量检索,还是与混合检索的组合。为实现这一体验,我们正在查询 DSL 中构建一个称为检索器(retrievers)的概念。检索器将提供一种直观的方式来执行语义重排序,并且能让你直接在 Elasticsearch 堆栈中执行通过开放推理 API 配置的内容,而无需在应用逻辑中执行。

将检索器应用到之前的密集向量示例中,重排序体验会有如下不同:

%title插图%num

(i) Elastic 的路线图:通过增加未来自动对索引数据进行分块的功能,简化了索引步骤。

(ii) Elastic 的路线图:kNN 检索器指定了作为推理端点配置的模型(此处为 Cohere 的 Rerank 3)。

(iii) Cohere 的路线图:将结果数据发送到 Cohere 的 Command R+ 之间的步骤,将受益于一个名为 extractive snippets 的计划功能,该功能将允许用户向 Command R+ 模型返回重排序文档中的相关片段。

这是我们在 books 语料库上执行的原始 kNN 密集向量搜索,用于返回查询 “Snow” 的第一批结果。

    GET cohere-embeddings/_search
    {
    "knn": {
    "field": "name_embedding",
    "query_vector_builder": {
    "text_embedding": {
    "model_id": "cohere_embeddings",
    "model_text": "Snow"
    }
    },
    "k": 10,
    "num_candidates": 100
    },
    "_source": [
    "name",
    "author"
    ]
    }

正如这篇博客所解释的,检索文档并将正确的响应传递给推理端点需要几个步骤。在本文发布时,这些逻辑应由你的应用代码处理。

未来,retrievers 可以配置为在单次 API 调用中直接使用 Cohere rerank 推理端点。

    {
    "retriever": {
    "text_similarity_rank": {
    "retriever": {
    "knn": {
    "field": "name_embedding",
    "query_vector_builder": {
    "text_embedding": {
    "model_id": "cohere_embeddings",
    "model_text": "Snow"
    }
    },
    "k": 10,
    "num_candidates": 100
    }
    },
    "field": "name",
    "window_size": 10,
    "inftgcodeerence_id": "cohere_rerank",
    "inference_text": "Snow"
    }
    },
    "_source": [
    "name",
    "author"
    ]
    }

在这种情况下,kNN 查询与我原始的完全相同,但在传入 rerank 端点之前清理响应将不再是必要步骤。retriever 会知道已执行 kNN 查询,并能无缝地使用配置中指定的 Cohere rerank 推理端点进行重新排序。这个原则同样适用于任何搜索,包括 BM25、dense、sparse 和 hybrid。

retrievers 作为实现优秀语义重排序的关键,将成为我们当前和近期的产品路线图重点。

Cohere 的生成模型能力

现在你已经有了一组经过语义重排序的文档,可以用来为你选择的大型语言模型提供基础!我们推荐 Cohere 最新的生成模型 Command R+。在构建完整的 RAG 流程时,你可以在应用程序代码中轻松向 Cohere 的 Chat API 发送用户查询和重排序后的文档。

下面是一个如何在你的 Python 应用代码中实现的示例:

    response = co.chat(message=query, documents=documents, model='command-r-plus')

    source_documents = []
    for citation in response.citations:
    for document_id in citation.document_ids:
    if document_id not in source_documents:
    source_documents.append(document_id)

    print(f"Query: {query}")
    print(f"Response: {response.text}")
    print("Sources:")
    for document in response.documents:
    if document['id'] in source_documents:
    print(f"{document['title']}: {document['text']}")

与 Cohere 的集成已在 Serverless 提供,并且很快将在 Elastic Cloud 或你的笔记本电脑或自管理环境中的版本化 Elasticsearch 版本中可用。我们建议你使用 Elastic Python 客户端 v0.2.0 来连接你的 Serverless 项目开始使用!

祝你重排序顺利!

原文:https://www.elastic.co/search-labs/blog/elasticsearch-cohere-rerank

文章来源于互联网:Elasticsearch Open Inference API 新增对 Cohere 的 Rerank 3 模型支持

Tags: , , , ,