Elasticsearch 开放式推理 API 添加对 Cohere 的 Rerank 3 模型的支持

“了解 Cohere 重排序、如何使用 Cohere 的 Rerank 3 模型与 Elasticsearch 开放式推理 API 以及 Elastic 的语义重排序路线图。”

Cohere 的 Rerank 3 模型 rerank-english-v3.0 现已在其 Rerank 端点 中可用。作为 Cohere 的 Rerank 3 发布中包含的唯一向量数据库,Elasticsearch 已将其对该新模型的无缝支持集成到我们的开放式推理 API 中。

那么简单来说,什么是重排序?重排序器获取现有向量搜索和关键字搜索系统中的“前 n 个”搜索结果,并对这些结果提供语义提升。有了良好的重排序,您可以获得更好的“前 n 个”结果,而无需更改您的模型或数据索引——最终提供您可以发送到大型语言模型 (LLM) 作为上下文的更好搜索结果。

最近,我们与 Cohere 团队合作,使 Elasticsearch 开发人员能够轻松使用 Cohere 的 嵌入(在 Elasticsearch 8.13 和 Serverless 中可用!)。包含 Cohere 令人难以置信的重排序功能是自然而然的演变,它将解锁所有必要的工具,以便在检索的第一阶段之后真正完善结果。

Cohere 的 Rerank 3 模型可以添加到任何现有的 Elasticsearch 检索流程中,而无需进行任何重大代码更改。鉴于 Elastic 的向量数据库和混合搜索功能,用户还可以将来自任何第三方模型的嵌入引入 Elastic,以与 Rerank 3 一起使用。

在寻求实施 RAG(检索增强生成)时,检索和重排序的策略是客户为 LLM 提供支持并获得准确结果的关键优化。多年来,客户一直信任 Elastic 处理其私有数据,并且能够利用多种第一阶段检索算法(例如,用于 BM25/关键字、密集和稀疏向量检索)。更重要的是,大多数现实世界的搜索用例都受益于 混合搜索,我们从 Elasticsearch 8.9 开始就一直支持它。

对于中间阶段的重排序,我们还提供对 学习排序查询重评分 的原生支持。在本演练中,我们将重点关注 Cohere 的最后一阶段重排序功能,并在后续的博文中介绍 Elastic 的中间阶段重排序功能!

Cohere 对重排序的方法

Cohere 凭借其新的 Rerank 模型取得了惊人的成果。在测试中,Cohere 报告说,重排序模型尤其受益于长上下文。在为您的文档准备密集向量检索时,模型令牌限制的分块是必要的约束。但是,通过 Cohere 的重排序方法,可以根据完整文档中包含的上下文看到重排序的相当大的好处,而不是文档中的特定块。Rerank 具有 4k 个令牌限制,以允许输入更多上下文,从而释放将此模型纳入基于 Elasticsearch 的搜索系统中的完整相关性优势。

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

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

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

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

如果您有兴趣了解如何使用 LangChainLlamaIndex 进行分块,我们在 Search Labs 和我们的开源 存储库 中提供了聊天应用程序参考代码、集成等。或者,您可以利用 Elastic 的 段落检索 功能并使用 摄取管道 进行分块。

使用 Elasticsearch 和 Cohere 构建 RAG 实现

既然您已经对如何利用这些功能有了大致了解,让我们来看一个使用 Elasticsearch 和 Cohere 构建 RAG 实现的示例。

您需要一个 Cohere 帐户以及一些关于 Cohere Rerank 端点 的工作知识。如果您打算使用 Cohere 的最新生成模型 Command R+,请熟悉 Chat 端点

Kibana 中,即使没有设置 IDE,您也可以访问一个控制台来输入 Elasticsearch 中的后续步骤。如果您更喜欢使用语言客户端,您可以在 提供的指南 中重新访问这些步骤。

Elasticsearch 向量数据库

在早期的公告中,我们提供了一些步骤来帮助您开始使用 Elasticsearch 向量数据库。您可以查看这些步骤以了解如何摄取示例 books 目录,并通过阅读 公告 使用 Cohere 的 Embed 功能生成嵌入。或者,如果您愿意,我们还提供 教程Jupyter notebook 来帮助您开始此过程。

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": "3VAixI4Bi8x57NL3O03c",
            "_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 密钥来为 Cohere Rerank 配置推理端点。

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

指定此推理端点后,您现在可以通过传入用于检索的原始查询“Snow”以及我们刚刚使用 kNN 搜索检索到的文档来对结果进行重排序。请记住,您也可以对任何 混合 搜索 查询重复此操作!

为了在仍然使用开发控制台的情况下演示这一点,我们将对上述 JSON 响应进行一些清理。

从 JSON 响应中获取 hits 并为 input 形成以下 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 模型进行了重排序。

我们用来说明这些功能的 books 语料库不包含长篇文本,这是一个相对简单的示例。在为您自己的搜索体验构建此功能时,我们建议您遵循 Cohere 的方法,使用从第一个检索结果集中返回的完整文档中的上下文填充您的 input,而不仅仅是文档中的检索到的片段。

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

在 **即将推出** 的 Elasticsearch 版本中,我们将继续构建对中端和最终阶段重排序器的无缝支持。我们的最终目标是使开发人员能够使用语义重排序来改进任何搜索的结果,无论它是 BM25、密集或稀疏向量检索,还是与混合检索的组合。为了提供这种体验,我们正在将名为 retrievers 的概念构建到查询 DSL 中。检索器将提供一种直观的方式来执行语义重排序,并且还将能够在 Elasticsearch 堆栈中直接执行您在开放式推理 API 中配置的内容,而无需依赖您在应用程序逻辑中执行此操作。

在早期密集向量示例中合并检索器的使用时,重排序体验的不同之处在于

(i) Elastic 的路线图:通过添加 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"
      ]
    }

如本博文中所述,检索文档并将正确的响应传递给推理端点需要几个步骤。在发布本文时,此逻辑应在您的应用程序代码中处理。

将来,检索器可以配置为直接在单个 API 调用中使用 Cohere 重新排序推理端点。

    {
      "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,
          "inference_id": "cohere_rerank",
          "inference_text": "Snow"
        }
      },
      "_source": [
        "name",
        "author"
      ]
    }

在本例中,kNN 查询与我的原始查询完全相同,但在输入重新排序端点之前,清理响应不再是必要的步骤。检索器将知道已执行 kNN 查询,并使用配置中指定的 Cohere 重新排序推理端点无缝地重新排序。相同的原理可以应用于任何搜索,BM25、密集、稀疏和混合搜索。

检索器作为优秀语义重新排序的推动者,已列入我们积极且近期的路线图。

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 版本中提供试用。我们建议您针对您的 Serverless 项目使用Elastic Python 客户端 v0.2.0开始!

重新排序愉快!

Elasticsearch 与行业领先的 Gen AI 工具和提供商具有原生集成。查看我们关于超越 RAG 基础知识的网络研讨会Beyond RAG Basics,或构建生产就绪型应用程序Elastic Vector Database

要为您的用例构建最佳搜索解决方案,请开始免费云试用或立即在您的本地机器上试用 Elastic。

准备好构建最先进的搜索体验了吗?

足够先进的搜索并非一蹴而就。Elasticsearch 由数据科学家、ML Ops 工程师、软件工程师等等许多人提供支持,他们与您一样热爱搜索。让我们联系并共同努力构建神奇的搜索体验,让您获得想要的结果。

亲身体验