使用 Elasticsearch 推理 API 以及 Hugging Face 模型

了解如何使用推理终端将 Elasticsearch 连接到 Hugging Face 模型,并利用语义搜索和聊天补全功能构建多语言博客推荐系统。

在最近的更新中,Elasticsearch 引入了原生集成,用于连接到托管在 Hugging Face Inference Service 上的模型。在本文中,我们将探讨如何配置此集成,并使用大型语言模型 (LLM) 通过简单的 API 调用执行推理。我们将使用 SmolLM3-3B,这是一款轻量级通用模型,在资源使用和答案质量之间取得了良好的平衡。

准备工作

使用 Hugging Face 推理终端完成聊天

首先,我们将构建一个实用示例,将 Elasticsearch 连接到 Hugging Face 推理终端,以从博客文章集合中生成 AI 驱动的推荐。对于应用知识库,我们将使用公司博客文章数据集,其中包含有价值但通常难以查找的信息。

通过这个终端,语义搜索可以检索与给定查询最相关的文章,而 Hugging Face LLM 则会根据这些结果生成简短的上下文推荐。

让我们来看看我们将要构建的信息流的高级概述:

在本文中,我们将测试 SmolLM3-3B 是否能将其紧凑的大小与强大的多语言推理和工具调用能力相结合。根据搜索查询,我们将把所有匹配的内容(英语和西班牙语)发送到 LLM,以生成一份推荐文章列表,并根据搜索查询和结果提供自定义描述。

以下是具备 AI 推荐生成系统的文章网站用户界面可能的外观。

您可以在已链接的笔记本中找到此应用程序的完整实现。

配置 Elasticsearch 推理终端

要使用 Elasticsearch Hugging Face 推理终端,我们需要两个重要元素:Hugging Face API 密钥和正在运行的 Hugging Face 终端 URL。它应该如下所示:

Elasticsearch 中的 Hugging Face 推理终端支持不同的任务类型:text_embeddingcompletionchat_completionrerank。在这篇博客文章中,我们使用 chat_completion 是因为我们需要模型根据搜索结果和系统提示生成对话式推荐。此终端允许我们使用 Elasticsearch API 以简单的方式直接从 Elasticsearch 执行聊天完成:

这将作为应用程序的核心,接收通过模型传递的提示和搜索结果。有了理论基础,我们就开始实施应用程序。

在 Hugging Face 上设置推理终端

要部署 Hugging Face 模型,我们将使用 Hugging Face 一键式部署,这是一种用于部署模型终端的简单快速的服务。请记住,这是一项付费服务,使用它可能会产生额外费用。此步骤将创建用于生成文章推荐的模型实例。

您可以从一键目录中选择一个模型:

让我们选择 SmolLM3-3B 模型:

从此处获取 Hugging Face 终端 URL:

正如在 Elasticsearch Hugging Face 推理终端文档中提到的,文本生成需要一个与 OpenAI API 兼容的模型。因此,我们需要将 /v1/chat/completions 子路径附加到 Hugging Face 终端 URL。最终结果将如下所示:

有了这个,我们就可以在 Python 笔记本中开始编码了。

生成 Hugging Face API 密钥

创建 Hugging Face 账户,并按照以下说明获取 API 令牌。您可以选择三种令牌类型:细粒度(推荐用于生产,因为它仅提供对特定资源的访问)、读取(适用于只读访问)或写入(适用于读取和写入访问)。在本教程中,读取令牌就足够了,因为我们只需要调用推理终端。请保存此密钥以备下一步使用。

设置 Elasticsearch 推理终端

首先,让我们声明一个 Elasticsearch Python 客户端:

接下来,我们创建一个使用 Hugging Face 模型的 Elasticsearch 推理终端。此终端将允许我们基于博客文章和传递给模型的提示来生成响应。

数据集

该数据集包含将要查询的博客文章,代表整个工作流中使用的多语言内容集:

Elasticsearch 映射

定义数据集后,我们需要创建一个适合博客文章结构的数据模式。以下索引映射将用于在 Elasticsearch 中存储数据:

在这里,我们可以更清楚地看到数据的结构。我们将使用语义搜索来检索基于自然语言的结果,同时使用 copy_to 属性将字段内容复制到 semantic_text 字段中。此外,title 字段包含两个子字段:original 子字段根据文章的原始语言存储英语或西班牙语标题;而 translated_title 子字段仅存在于西班牙语文章中,并包含原始标题的英语翻译。

采集数据

以下代码片段使用批量 API 将博客文章数据集摄取到 Elasticsearch 中:

现在,我们已将文章摄取到 Elasticsearch 中,我们需要创建一个能够针对 semantic_text 字段进行搜索的函数:

我们还需要一个调用推理终端的函数。在这种情况下,我们将使用 chat_completion 任务类型调用终端,以获取流式响应:

现在,我们可以编写一个函数,调用语义搜索函数以及 chat_completions 推理终端和建议终端,以生成将分配到卡片中的数据:

最后,我们需要提取信息并将其格式化以便打印:

让我们通过询问一个有关安全博客文章的问题来测试一下:

如下所示,我们可以看到工作流在控制台中生成的卡片:

您可以在此文件中查看全部结果,包括所有点击和 LLM 响应。

我们正在征集与“安全与漏洞”相关的文章。此问题将用作针对 Elasticsearch 中存储的文档的搜索查询。然后将检索到的结果传递给模型,该模型根据这些结果的内容生成推荐。我们可以看到,该模型出色地生成了引人入胜的短文本,能够激发读者点击的欲望。

结论

本示例展示了如何将 Elasticsearch 和 Hugging Face 结合起来,为 AI 应用程序创建一个快速高效的集中式系统。由于 Hugging Face 拥有丰富的模型目录,这种方法不仅减少了人工操作,还具有灵活性。通过使用 SmolLM3-3B,我们特别看到了紧凑的多语言模型在与语义搜索搭配使用时,仍能提供有意义的推理和内容生成。这些工具共同为构建智能内容分析和多语言应用程序提供了可扩展且高效的基础。

这些内容对您有多大帮助?

没有帮助

有点帮助

非常有帮助

相关内容

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用