ChatGPT 和 Elasticsearch:可以将 ChatGPT 与 Elastic 数据结合使用的插件

blog-star-trails-chatgpt.jpg

您可能已经读过上一篇博文,其中介绍了将 Elasticsearch 的相关性功能与 OpenAI 的问答功能结合使用的过程。这篇文章的核心观点是说明如何使用 Elastic 和 OpenAI 的 GPT 模型来建立响应,并向用户返回与上下文相关的内容。

我们构建的应用程序可以公开搜索终端,可以由任何前端服务调用。有一个好消息,OpenAI 现已发布了未来 ChatGPT 插件框架的专用 Alpha 版。

在这篇博文中,您将了解如何使用 Elastic 文档实现这个插件,并将 ChatGPT 的用途扩展到 Elasticsearch 中已编制索引的任何内容。

事务采样总结

什么是 ChatGPT 插件?

ChatGPT 插件是开发用来辅助模型完成知识学习或操作执行的扩展。

例如,我们知道,ChatGPT 的知识仅限于 2021 年 9 月之前,因此任何关于近期数据的问题都不会得到回答。此外,超出模型训练范围、过于具体的问题也不会得到回答。

插件可以拓宽可能的应用范围,并增强模型的功能,但反过来,插件的输出也会因模型本身而增强。

ChatGPT 目前支持的官方插件列表如下所示。随着越来越多的组织试用 ChatGPT,这个列表很快会变得越来越长:

ChatGPT 插件列表

浏览列表会发现,用例正在慢慢增加。以 Expedia 为例,它的插件将 ChatGPT 扩展为可协助制定旅行计划,使 ChatGPT 成为旅行计划助手。

这篇博文旨在帮助 Elastic 实现类似的目标,允许 ChatGPT 访问 Elastic 最新的知识库,协助您完成 Elastic 项目。

插件商店

架构

我们将对我的同事 Jeff Vestal第 1 部分中提供的示例代码稍作修改,这将对成本产生积极影响。

我们将取消对 OpenAI API 的调用,因为现在 ChatGPT 将履行从 Elasticsearch 提取内容并在理解后返回给用户的职责:

Elastic ChatGPT 示意图

1.ChatGPT 调用插件的 `/search` 终端。

  • 这个决定基于插件“规则”`description_for_human`(请参阅下面的 plugin-manifest)。

2.插件代码创建一个发送到 Elasticsearch 的搜索请求。

3.将文档正文和原始 URL 返回给 Python。

4.该插件将文档正文和 URL 以文本形式返回给 ChatGPT。

5.ChatGPT 使用来自插件的信息来创建响应。

重申一下,本文假定您已经设置好了 Elastic Cloud 帐户,对内容进行了矢量化,并拥有一个随时可用的装满数据的 Elasticsearch 集群。如果您还没有完成这些设置,请参阅我们之前的文章,了解详细的操作步骤。

插件代码

OpenAI 为 ChatGPT 构建了一个相当简单易用的插件框架。它部署了一个公开以下内容的服务:

  • 插件清单,说明插件为用户 ChatGPT 提供了哪些功能
  • 插件 openAPI 定义,即功能描述,使 ChatGPT 能够理解可用的 API
可在此处找到插件代码。

插件文件结构

下面的屏幕截图显示了插件结构:

Elasticgpt 文档插件
  • 根据 OpenAI 最佳实践,插件清单存储在 .well-known 目录下的 ai-plugin.json 文件中。
  • 主要服务代码位于 app.py 中。
  • 稍后将插件部署到 Google Cloud Compute 时会用到 Dockerfile。
  • 插件的徽标 (logo.png) 显示在 ChatGPT 插件商店中,此处为 Elastic 徽标。
  • 插件的 OpenAI 描述。

Python 代码

要获取完整的代码,请参考 GitHub 存储库。我们只看这段代码的主要部分:

…
@app.get("/search")
…
@app.get("/logo.png")
…
@app.get("/.well-known/ai-plugin.json")
…
@app.get("/openapi.yaml")
…

我们把所有细节都去掉了,只保留了主要部分。这里有两类 API:

1.OpenAI 构建插件所需的 API:

  • /logo.png:检索插件徽标
  • /.well-known/ai-plugin.json:提取插件清单
  • /openapi.yaml:提取插件 OpenAPI 描述

2.插件 API:

  • /search 是这里唯一一个在 Elasticsearch 中运行搜索且向 ChatGPT 公开的 API

插件清单

插件清单供 ChatGPT 用来验证插件是否存在(可访问)。插件清单定义如下:

{
   "schema_version": "v1",
   "name_for_human": "ElasticGPTDoc_Plugin",
   "name_for_model": "ElasticGPTDoc_Plugin",
   "description_for_human": "Elastic Assistant, you know, for knowledge",
   "description_for_model": "Get most recent elasticsearch docs post 2021 release, anything after release 7.15",
   "auth": {
     "type": "none"
   },
   "api": {
     "type": "openapi",
     "url": "PLUGIN_HOSTNAME/openapi.yaml",
     "is_user_authenticated": false
   },
   "logo_url": "PLUGIN_HOSTNAME/logo.png",
   "contact_email": "info@elastic.co",
   "legal_info_url": "http://www.example.com/legal"
 }

此处需要说明几点: 

1.共有两个描述: 

  • description_for_human — 这是人们在 ChatGPT 网页 UI 中安装插件时看到的内容。
  • description_for_model — 让模型了解何时使用插件的说明。 

2.有一些占位符(如 PLUGIN_HOSTNAME)会在 Python 代码中被替换。

OpenAPI 定义

我们的代码将只向 ChatGPT 公开一个 API 终端,允许它搜索 Elastic 文档。描述如下:

openapi: 3.0.1
info:
 title: ElasticDocGPT
 description: Retrieve information front the most recent Elastic documentation
 version: 'v1'
servers:
 - url: PLUGIN_HOSTNAME
paths:
 /search:
   get:
     operationId: search
     summary: retrieves the document matching the query
     parameters:
     - in: query
       name: query
       schema:
           type: string
       description: use to filter relevant part of the elasticsearch documentations
     responses:
       "200":
         description: OK
        

对于定义文件,重点是:

  • 我们获取 ChatGPT 提示内容,并将其作为查询传递给 Elasticsearch 集群。
  • 在 Python 代码中替换一些占位符,例如 PLUGIN_HOSTNAME

在 Google Cloud Platform (GCP) 中部署 Elastic 插件

您可以选择一种部署方法来公开插件,也可以选择使用不同的云服务提供商。在本文中,我们使用的是 GCP,更具体地说是 Google Cloud Run 和 Google Cloud Build。前者用于公开和运行服务,后者用于持续集成。

设置

此设置假定您的 GCP 用户拥有以下权限:

  • 在 Google 容器注册表中使用 Google Cloud Build 构建容器映像
  • 在 Google Cloud Run 中部署容器

如果该用户没有这些权限,您需要在 GCP IAM 页面上更新权限。 

我们将使用 gcloud CLI 来设置环境。您可以在此处找到安装说明。

安装完成后,运行以下命令进行身份验证:

  gcloud auth

然后将项目标识符设置为 GCP 项目:


  gcloud config set project PROJECT_ID

现在就可以开始构建和部署了。

构建和部署

第一步是使用 Cloud Build 构建容器映像,并将映像推送到 Google 容器注册表:

  gcloud builds submit --tag gcr.io/PROJECT_ID/my-python-app

将 PROJECT_ID 替换为您的 GCP 项目 ID,将 my-python-app 替换为您要为容器映像指定的名称。

导出 Python 代码创建 Elasticsearch 客户端所需的环境:


  export YOUR_CLOUD_ID=VALUE 
  export YOUR_CLOUD_PASS=VALUE 
  export YOUR_CLOUD_USER=VALUE

最后,将容器映像部署到 Cloud Run:


  gcloud run deploy my-python-app \
  --image gcr.io/PROJECT_ID/my-python-app \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated \
  --set-env-vars  cloud_id=YOUR_CLOUD_ID,cloud_pass=YOUR_CLOUD_PASS,cloud_user=YOUR_CLOUD_USER

您应该能看到您的服务在 Cloud Run 中运行:

Cloud Run 服务

请注意,您还可以激活持续集成,这样 GitHub 存储库中的任何提交都会触发重新部署。在服务详细信息页面上,单击设置持续部署

在 ChatGPT 中安装插件

当插件部署完成并拥有可公开访问的终端后,就可以在 ChatGPT 中安装它。在本例中,由于插件部署在 Google Cloud Run 中,您可以在此处获取 URL:

Elastic 文档 GPT

然后在 ChatGPT 中,进入插件商店:

插件 Alpha 版

选择“开发自己的插件”:

开发自己的插件

粘贴您从 Google Cloud Run 页面复制的 URL:

输入网站域名

确保可找到插件且插件有效:

找到插件

按照安装说明操作,直到在列表中看到您的插件:

插件 Alpha 版 Elastic

我们来测试一下插件!

好了,现在重头戏来了!请记住,当您的提示超出 ChatGPT 的知识范畴时,它会决定进行委派。要确保这一点,只需提出一个与下面的示例类似的问题:

最新版 Elastic 的功能亮点

按照本文提供的步骤操作,您可以创建自己的插件,并将它部署到云服务提供商或您自己的主机上。这样,您就可以开始探索如何增强 ChatGPT 的知识和功能,利用专业知识和专有知识增强这个已经非常出色的工具。

您现在就可以试用本文中介绍的所有功能!注册 Elastic Cloud 免费试用版并开始使用。

以下是您可能感兴趣的其他博文:

在本博文中,我们可能使用了第三方 生成式 AI 工具,这些工具由其各自所有者拥有和运营。Elastic 对第三方工具没有任何控制权,对其内容、操作或使用不承担任何责任或义务,对您使用此类工具可能造成的任何损失或损害也不承担任何责任或义务。在 AI 工具中使用个人、敏感或机密信息时,请务必谨慎。您提交的任何数据都可能用于 AI 训练或其他目的。Elastic 不保证您所提供信息的安全性或保密性。在使用任何生成式 AI 工具之前,您应自行熟悉隐私惯例和使用条款。

Elastic、Elasticsearch 及相关标志为 Elasticsearch N.V. 在美国和其他国家/地区的商标、徽标或注册商标。所有其他公司和产品名称均为其相应所有者的商标、徽标或注册商标。