构建 Elasticsearch 聊天机器人
目标
本教程展示了如何利用从网站内容中搜索到的知识来增强 IBM watsonx.ai 模型,从而生成一个能够回答与知识库相关问题的聊天机器人。 这种技术被称为检索增强生成(RAG)。 预先训练的大型语言模型具有良好的_通用知识_,因为它们是通过大量公共内容语料库训练出来的,但它们缺乏与您的业务相关的_特定领域知识_,例如
- “如果盒子被打开了,我可以退款吗?”
- “等待治疗的人有多少?”
- “你们周六送外卖吗?”
我们可以使用以下 IBM Cloud 服务构建聊天机器人:
- Databases for Elasticsearch运行 ELSER 自然语言处理(NLP)模型来增强输入数据,然后将其存储到 Elasticsearch 索引中。 _检测管道_用于在存储增强数据之前将数据输入 ELSER。
- Elastic Enterprise Search 部署在 IBM Cloud® Code Engine 上,用于对网站进行蜘蛛搜索,以收集特定域的数据,并将其输入 Elasticsearch 的摄取管道。
- Kibana 部署在 IBM Cloud Code Engine 上,并成为 Elasticsearch 和 Elastic Enterprise Search 的 Web UI。 它用于指定和启动网络爬虫。
- IBM watsonx.ai 运行预先训练好的机器学习模型来回答聊天机器人的请求。 该模型的应用程序接口用于根据用户提示和根据 Elasticsearch中经过筛选和增强的数据运行提示所收集的上下文数据生成聊天机器人回复。
- 在 IBM Cloud Code Engine 上部署了一个简单的 Python 应用程序,以提供聊天机器人网络界面。 它收集用户的提示,查询 Elasticsearch 数据,然后使用 IBM watsonx.ai 生成响应。
Databases for Elasticsearch, IBM Cloud Code Engine,和 IBM watsonx 都是付费产品,因此本教程需要付费。
先决条件
- 一个 IBM Cloud 帐户。
- Terraform- 用于部署基础架构。
- 一个包含面向公众的文本内容的网站,我们将通过“蜘蛛”来加强聊天机器人的专业知识。
- Docker 在本地计算机上运行。
按照 这些步骤创建 IBM Cloud API 密钥,使 Terraform 能够将基础架构配置到您的账户中。 您最多可以创建 20 个 API 密钥。
出于安全原因,API 密钥仅在创建时才可复制或下载。 如果 API 密钥丢失,必须创建新的 API 密钥。
设置 IBM watsonx.ai 项目
大部分基础架构是通过 Terraform 部署的,但 IBM watsonx.ai 必须手动设置。
IBM watsonx.ai是一个集成工具工作室,用于使用生成式人工智能功能,它由用于构建机器学习应用的基础模型提供支持。 IBM watsonx.ai 组件提供了一个安全的协作环境,您可以在此环境中访问组织的可信数据,自动执行 AI 流程,并在应用程序中交付 AI。
请按照以下步骤设置 IBM watsonx.ai:
- 注册 IBM watsonx.ai服务,然后单击watsonx.ai的开始链接。 选择一个地区并登录。
- 在 watsonx.ai 中创建一个项目。 在 Projects 框中,单击 + 和 Create Project。 为项目命名,并提供用于存储项目状态的 IBM Cloud® Object Storage 实例。 (如果您没有 Object Storage 实例,请 创建一个。
- 在项目的 Manage 标签的常规页面中,记下“项目 ID”。
- 在项目的管理选项卡中,在服务和集成页面中,单击关联服务。 然后,单击 新服务,并选择 Watson Machine Learning 选项。 您将使用精简版计划,因此只需单击 创建。
使用 Terraform 配置基础架构
克隆 repo:
git clone https://github.com/IBM/icd-elastic-bot.git
cd icd-elastic-bot
cd terraform
在该目录下创建一个名为 terraform.tfvars
的文件,其中包含以下数据,但要用自己的数据替换占位符(MY_*
值):
ibmcloud_api_key="MY_IBM_CLOUD_API_KEY"
region="eu-gb"
es_username="admin"
es_password="MY_ELASTICSEARCH_PASSWORD"
es_version="8.12"
wx_project_id="MY_WATSONX_PROJECT_ID"
选择一个安全的 Elasticsearch 密码,该密码与 Elasticsearch 用户名一起将成为访问 Elasticsearch 和 Kibana Web 用户界面所需的凭证。
现在部署基础架构:
terraform init
terraform apply --auto-approve
Terraform 将输出
- Kibana 实例的 URL。
- URL of the Python app.
记下这些值,以便下一步操作。
提供数据
此步骤将网站数据送入 Databases for Elasticsearch 实例。 您将使用 Elastic 网络爬虫。 该功能可通过 Kibana 访问,用于从任何网站提取数据。
执行以下步骤以添加数据:
- 导航至 Kibana URL- Terraform 输出上一节中的 URL。 使用您选择的 Elasticsearch 用户名和密码登录。
- 在 Kibana UI 的“搜索”部分,选择 Overview 选项。 单击 Crawl URL。
- 为索引命名 search-bot (
search-
前缀已经存在)。 单击创建索引。 - 在索引的“管理域”部分添加网站 URL。 单击 验证域,然后单击 添加域。
- 单击Machine Learning推理管道部分中的添加推理管道,然后按照步骤操作。 为训练好的 ML 模型选择 .elser_model_1 并确保模型处于 Started 状态。 在“选择字段映射”步骤中选择标题字段,然后单击 添加,然后单击 继续和 创建管道。
- 点击 Crawl all domains,然后点击 Crawl all domains on this index。 然后,等待数据收集完毕。
查询数据
在 Web 浏览器中导航到 Python 应用程序的 URL- 这可以在前面步骤的 Terraform 输出中找到 python_endpoint
。
通过提问开始与模型互动,您将收到由 IBM watsonx.ai 生成的答案。 Python应用程序会接收您的提示,并搜索Elasticsearch索引,该索引由网络抓取的经过编辑和增强的数据填充。 然后,它使用 IBM watsonx.ai API 根据 Elasticsearch 结果提供的上下文生成响应。
结论
在本教程中,您创建了一个 Databases for Elasticsearch 实例,该实例与托管在 IBM Cloud Code Engine 上的 Kibana 和 Elastic Enterprise Search 配对。 然后,您将 Elasticsearch 配置为在管道中使用其 Elser 模型,这样当您搜索网站内容时,其 JSON 文档就会增加 sparse vector 数据。 您还部署了一个 Python 应用程序,该应用程序接收用户提示,在 Elasticsearch 中查询搜索到的数据,以收集特定领域的上下文,然后将提示和上下文发送到 watsonx.ai 大型语言模型,以制定对提示的响应。
现在,您可以使用 watsonx.ai创建自己的聊天应用程序,并通过对 Databases for Elasticsearch 中的域名特定数据建模来增强功能。
您的 Databases for Elasticsearch 会产生费用。 完成本教程后,您可以进入项目的 terraform
目录,使用命令删除所有基础结构:
terraform destroy