作者:Baha Azarmi
你可能已经阅读过这篇关于我们将 Elasticsearch 的相关性功能与 OpenAI 问答功能相结合的博文。 该帖子的主要思想是说明如何将 Elastic 与 OpenAI 的 GPT 模型结合使用来构建响应并向用户返回上下文相关的内容。
我们构建的应用程序可以公开一个搜索端点并被任何前端服务调用。 好消息是,现在 OpenAI 已经发布了未来 ChatGPT 插件框架的私有 alpha 版。
在此博客中,你将学习如何使用 Elastic 文档实施插件并将 ChatGPT 的使用扩展到在 Elasticsearch 中索引的任何内容。
什么是 ChatGPT 插件?
ChatGPT 插件是为帮助模型完成其知识或执行操作而开发的扩展。
例如,我们知道 ChatGPT 从知识角度的割接时间是 2021 年 9 月,所以任何关于近期数据的问题都不会回答。 此外,任何与超出模型训练范围的过于具体的问题相关的问题都不会得到回答。
插件可以扩大可能的应用范围并增强模型的功能,但相应地,插件的输出会被模型本身增强。
ChatGPT 目前支持的官方插件列表如下。 随着越来越多的组织尝试使用 ChatGPT,你可以预期此列表会迅速扩展:
当你浏览列表时,你会注意到用例在这里慢慢显现出来。 以 Expedia 为例,其插件正在扩展 ChatGPT 以协助规划旅行,使 ChatGPT 成为旅行规划助手。
此博客旨在为 Elastic 实现类似的目标 — 允许 ChatGPT 访问 Elastic 的当前知识库并协助你完成 Elastic 项目。
架构
我们将对我的同事 Jeff Vestal 在第 1 部分中提供的示例代码进行轻微修改,这会对成本产生积极影响。
我们将删除对 OpenAI API 的调用,因为现在 ChatGPT 将履行从 Elasticsearch 获取内容并将其消化回用户的角色:
1)ChatGPT 调用插件的 “/search” 端点。
这个决定是基于插件 “rules”`description_for_human`(见下面的插件清单)。
2)插件代码创建一个发送到 Elasticsearch 的搜索请求。
3)文档正文和原始 url 返回给 Python。
4)插件将文档正文和 url 以文本形式返回给 ChatGPT。
5)ChatGPT 使用来自插件的信息来制作其响应
同样,这篇博文假设你已经设置了你的 Elastic Cloud 帐户,对你的内容进行了矢量化处理,并拥有一个充满数据的 Elasticsearch 集群以供使用。 如果你还没有设置所有这些,请参阅我们之前的帖子以了解要遵循的详细步骤。
插件代码
OpenAI 为 ChatGPT 构建了一个相当易于处理的插件框架。 它部署了一个公开的服务:
- 插件 manifest,解释插件向用户和 ChatGPT 提供的内容
- 插件 openAPI 定义,这是使 ChatGPT 能够理解可用 API 的功能描述
插件代码可以在这里找到。
插件文件结构
下面的屏幕截图显示了结构的样子:
- 根据 OpenAI 最佳实践,插件清单存储在 .well-known 目录下的 ai-plugin.json 文件中。
- 主要服务代码在 app.py 中。
- Dockerfile 稍后将用于将插件部署到 Google Cloud Compute。
- ChatGPT 插件商店中显示的插件徽标 (logo.ong),此处为 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构建插件所需的:
- /logo.png:获取插件标志
- /.well-known/ai-plugin.json:获取插件清单
- /openapi.yaml:获取插件 OpenAPI 描述
2.插件 API:
/search 是这里唯一暴露给 ChatGPT 并在 Elasticsearch 中运行搜索的
插件清单
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 网络用户界面中安装插件时看到的内容。
- description_for_model - 模型了解何时使用插件的说明。
2)Python 代码中有 PLUGIN_HOSTNAME 等占位符被替换。
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 Container Registry 中使用 Google Cloud Build 构建容器镜像
- 在 Google Cloud Run 中部署容器
如果没有,你将需要更新 GCP IAM 页面上的权限。
我们将使用 gcloud CLI 来设置我们的环境。 你可以在此处找到安装说明。
安装后,运行以下命令进行身份验证:
gcloud auth
然后将项目标识符设置为你的 GCP 项目:
gcloud config set project PROJECT_ID
你现在已准备好构建和部署。
构建和部署
第一步是使用 Cloud Build 构建容器镜像并将其推送到 Google Container Registry:
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 中运行:
请注意,你还可以激活持续集成,以便 GitHub 存储库中的任何提交都将触发重新部署。 在服务详细信息页面上,单击设置持续部署。
在 ChatGPT 中安装插件
部署插件并具有可公开访问的端点后,即可将其安装在 ChatGPT 中。 在我们的例子中,由于它部署在 Google Cloud Run 中,你可以在此处获取 URL:
然后在 ChatGPT 中,进入插件商店:
选择做 “Develop your own plugin”:
粘贴你从 Google Cloud Run 页面复制的 URL:
确保插件已找到且有效:
按照安装说明进行操作,直到你在列表中看到你的插件可用:
让我们测试一下我们的插件!
好的,现在是最好的部分! 请记住,当你的提示超出其知识范围时,ChatGPT 会决定委托。 为确保发生这种情况,只需提出类似于此示例的问题:
通过本博客中提供的步骤,你可以创建自己的插件并将其部署在云提供商或你自己的主机上。 这使你可以开始探索增强 ChatGPT 的知识和功能,用专业和专有知识增强本已令人惊叹的工具。
你今天可以尝试本博客中讨论的所有功能! 通过注册免费的 Elastic Cloud 试用版开始。
以下是你可能会感兴趣的其他一些博客:
- ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据
- 使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型
- 使用 ChatGPT 探索安全的未来
在这篇博文中,我们可能使用了由其各自所有者拥有和运营的第三方生成人工智能工具。 Elastic 对第三方工具没有任何控制权,我们对其内容、操作或使用不承担任何责任,也不对你使用此类工具可能造成的任何损失或损害承担任何责任。 使用带有个人、敏感或机密信息的 AI 工具时请谨慎行事。 你提交的任何数据都可能用于人工智能训练或其他目的。 无法保证你提供的信息将得到安全保护或保密。 在使用之前,你应该熟悉任何生成人工智能工具的隐私惯例和使用条款。
Elastic、Elasticsearch 和相关标记是 Elasticsearch N.V. 在美国和其他国家/地区的商标、徽标或注册商标。 所有其他公司和产品名称均为其各自所有者的商标、徽标或注册商标。