作者:来自 Elastic Ryan_Earle
本教程介绍如何设置 Elasticsearch 网络爬虫,将网站索引到 Elasticsearch 中,然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。
Python 脚本的 Github Repo:https://github.com/Gunnerva/elastic_chatgpt/
目标:
了解如何使用 Elasticsearch 作为 ChatGPT 的私有数据存储。
流程
1. 创建 ESS 部署
要开始本教程,我们将首先创建 ESS 部署。
在 ESS 上创建 Elasticsearch 集群 8.17 或更高版本。确保它至少包含 1 个机器学习节点。
建议的最小配置:
- 2 个 8GB 热节点
- 1 个 2GB 机器学习节点(确保未启用机器学习自动扩展,这有助于了解这些机器学习过程对你的资源的影响)。部署模型时,模型的分配越多,所需的内存就越多。
请注意此过程中机器学习节点的使用情况。根据你决定定位的网站,机器学习节点可能是你的瓶颈。这是因为必须对文档进行索引,然后机器学习节点将在提取文档时将下一步中引用的嵌入模型应用于文档。
布局示例:
你的 Elasticsearch 集群需要可供远程 AI 源使用。这不需要 ESS,但它是最容易快速实现的。一般来说,本地部署需要防火墙规则等...以允许远程 AI 连接到本地 Elasticsearch 集群。
2. 设置嵌入模型
在抓取我们的网站以创建与 ChatGPT 交互的私有索引之前,我们需要将嵌入模型加载到 Elasticsearch 中。
对于此示例,我们将使用由 SentenceTransformers 训练并托管在 Hugging Face 模型中心的 all-distilroberta-v1 (sentence-transformers/all-distilroberta-v1 · Hugging Face) 模型。可以使用其他模型,但此特定模型适合一般用途,并且是在涵盖各种主题的大型数据集上进行训练的。
此特定模型不是此设置工作所必需的。它适合一般用途,因为它是在涵盖广泛主题的非常大的数据集上进行训练的。但是,对于向量搜索用例,使用针对你的特定数据集进行微调的模型通常会提供最佳结果。例如,如果你正在搜索科学研究论文,此模型可能不是最好的。
为此,我们将使用 Elastic 创建的 Eland Python 库(
python3 -m pip install 'eland[pytorch]'
GitHub - elastic/eland:用于 Elasticsearch 中的 DataFrames、大数据、机器学习和 ETL 的 Python 客户端和工具包)。该库提供了广泛的数据科学功能,但我们将使用它作为桥梁,将模型从 Hugging Face 模型中心加载到 Elasticsearch 中,以便将其部署在机器学习节点上进行推理。
Eland 可以从命令行、docker 容器或作为 Python 脚本的一部分运行。
从命令行安装(使用 Ubuntu 20.04 的示例)。此处有其他 Docker 说明:导入训练后的模型和词汇表 | Elastic Stack 中的机器学习 [8.17] | Elastic
注:你可以参考我之前的的文章 “Elasticsearch:如何部署 NLP:文本嵌入和向量搜索” 来进行部署。
步骤 1:在你的机器上安装 eland 或使用 Docker(请参阅上面的链接了解 Docker 说明):
python3 -m pip install 'eland[pytorch]'
步骤 2 :复制你的 ESS 部署 URL
转到 https://cloud.elastic.co 并登录。选择目标部署旁边的 “Manage”。单击 Elasticsearch 旁边的 “Copy Endpoint”
步骤 3:将模型加载到 Elasticsearch
使用你从云控制面板(Cloud Control Panel)复制的 URL、Elastic 用户名和密码 —— 完成以下命令并执行。
以下命令将把 hub-model 加载到你的机器学习节点上并自动启动它。
eland_import_hub_model --url https://test-f22762.es.us-central1.gcp.cloud.es.io:9243 -u elastic -p YOURPASSWORD --hub-model-id sentence-transformers/all-distilroberta-v1 --task-type text_embedding
步骤 4 - 登录 Kibana 并验证模型是否已启动
- 登录 Kibana
- 导航至 Machine Learning
- 在模型管理下单击 “Trained Models”
3. 抓取你的数据
步骤 1:确定你想要抓取的网站。在此示例中,我们将抓取 NFL 名人堂(NFL's hall of fame)。
-- 我们不会设置排除项等...但应在生产中配置它们
步骤 2:登录 Kibana。
在 “Search” 下选择 Elasticsearch
步骤 3:单击 “ Web Crawlers”
步骤 4:单击 “New Web Crawler”
步骤 5:输入索引的名称。
它将以 “search” 作为前缀。例如:nfl-hof 将成为索引 search-nfl-hof
第 6 步:单击 “Create Index”
第 7 步:转到 “管理域” 添加要抓取的域。
单击 “Validate Domain”,然后单击 “Add Domain”。
示例:Players | Pro Football Hall of Fame | Pro Football Hall of Fame(球员 | 职业足球名人堂 | 职业足球名人堂)
第 8 步:转到管道
单击 “Unlock your custom pipelines” 下的 “Copy and Customize”
接下来查看 “Machine Learning Inference Pipelines” - 单击 “Add Inference Pipleine”
步骤 9:选择密集向量文本嵌入 sentence-transformers__all-distilroberta-v1 然后点击继续
步骤 10:在“Select Field Mappings” 下选择 “Title”,然后单击 “Add”
第 11 步:单击 “Continue”,直到看到 “Create Pipeline”,然后单击 “Create Pipeline”
步骤12:单击 “Crawl”
步骤 13:检查网络爬虫索引并确保文档被填充到搜索索引中
第 14 步:执行测试查询,确保你有兴趣发送到 ChatGPT 的文档已被提取到 Elasticsearch 中
示例查询,以确保 Walter Payton 文档已被提取到索引中。
GET search-nfl-hofx/_search
{"query": {"match": {"title" : "Walter Payton"}}
}
4. 安装 Streamlit
需要 Streamlit 来执行步骤 5 中引用的 python 脚本。这将创建界面。
pip install streamlit
通过从控制台发出以下命令来测试并确保 Streamlit 已成功安装:
streamlit hello
5. 下载 python 脚本。
链接:https://github.com/elastic/support/tree/master/chatgpt_demo
有两个选项:
- A. 将 ESS 连接到 OpenAI 脚本:
- hof_es_gpt_noBing.py
- B. 将 ESS 连接到 OpenAI 并将 Bing 连接到 OpenAI
- hof_es_gpt_withBing.py
在 Python 脚本中编辑索引名称以匹配你在设置网络爬虫时创建的索引的名称:hof_es_gpt_noBing.py 中的第 70 行
index = 'search-nfl-hofx'
6. 设置外部资源:
设置 OpenAI 的 ChatGPT:
要连接到 ChatGPT,你需要一个 OpenAI API 帐户和密钥。如果你还没有帐户,你可以创建一个免费帐户,你将获得初始免费积分。
转到 https://platform.openai.com 并单击注册。
创建帐户后,你需要创建一个 API 密钥:
- 单击 API Keys。
- 单击 Create new secret key。
- 复制新密钥并将其保存在安全的地方,因为你将无法再次查看该密钥。
可选设置 Bing API —— 这将允许应用程序首先搜索 ESS 数据存储,然后如果找不到数据,则允许它通过 Bing 搜索互联网。
Bing Custom Search API:Bing Custom Search API | Microsoft Bing
7. 设置脚本
- 步骤 1. 启动控制台
- 步骤 2. 导航到保存 Python 脚本的目录
- 步骤 3. 在控制台中定义脚本变量:
所需要的变量:
OpenAI API Key
ESS Cloud ID
ESS username
ESS password
可选(取决于脚本):
- Bing API 密钥
- Bing 端点
在运行 Python 脚本之前,我们需要在控制台中定义一些变量。如果你不使用 Bing 脚本,则可以跳过 Bing 变量 - 更改 API 密钥以匹配你的 API 密钥。以下密钥已被撤销(只是作为展示使用目的)。
export openai_api="sk-IduoyWxSoVRtGpJUiyY99QaGO70v8sf1agXvuuFrVUT3BlbkFJrUBcDHY-ervQgdun2Z7IkJa6YYXqCczk1NnrEzPSEA"
export cloud_id="814-test:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvOjQ0MyQ5ZDJiZDRlODc3YmM0YmQ0YWFhM2I4MjBlMzk2ZDhiYSQwYWM5YjRmMWEzZTg0ODdlOTlmZGM3OTVkZjg4YTUxNQ=="
export cloud_pass="aCu1A6hkhQAw6cso359o8IH5"
export cloud_user="elastic"
export bing_subkey="94b11de338384967a4ddb61b611d3c97"
export bing_endpoint="https://api.bing.microsoft.com/"
定义以下变量后执行脚本:
使用 streamlit 执行脚本:
streamlit run hof_es_gpt_noBing.py
示例
最终产品应该是什么样子或是什么样子的示例:
测试:
如何测试我们上传的模型:
POST _ml/trained_models/sentence-transformers__all-distilroberta-v1/_infer
{"docs": [{"text_field": "Halo is a military science fiction media franchise, originally developed and created by Bungie and currently managed and developed by 343 Industries, part of Microsofts Xbox Game Studios. The series launched in 2001 with the first-person shooter video game Halo: Combat Evolved and its tie-in novel, The Fall of Reach. The latest main game, Halo Infinite, was released in late 2021. Combat Evolved started life as a real-time strategy game for personal computers, turning into a first-person shooter exclusive to Microsoft's Xbox video game console after Bungie was acquired by the company. Bungie regained its independence in 2007, releasing additional Halo games through 2010 before moving on from the franchise. Microsoft established 343 Industries to oversee Halo going forward, producing games itself and in partnership with other studios."},{"text_field": "Sonic the Hedgehog[c] is a 1991 platform game developed by Sonic Team and published by Sega for the Genesis/Mega Drive. It was released in North America on June 23 and in PAL regions and Japan the following month. Players control Sonic the Hedgehog, who can run at near supersonic speeds; Sonic sets out on a quest to defeat Dr. Robotnik, a scientist who has imprisoned animals in robots and seeks the powerful Chaos Emeralds. The gameplay involves collecting rings as a form of health, and a simple control scheme, with jumping and attacking controlled by a single button. Development began in 1990 when Sega ordered its developers to create a game featuring a mascot for the company. The developers chose a blue hedgehog designed by Naoto Ohshima after he won an internal character design contest, and named themselves Sonic Team to match their character. It uses a novel technique that allows Sonic's sprite to roll along curved scenery which was based on a concept by Oshima from 1989.[2] Sonic the Hedgehog, designed for fast gameplay, was influenced by games by Super Mario series creator Shigeru Miyamoto. The music was composed by Masato Nakamura, bassist of the J-pop band Dreams Come True."}],"inference_config": {"text_embedding": {}}
}
获取我们上传的模型的统计信息:
GET _ml/trained_models/sentence-transformers__all-distilroberta-v1/_stats
测试查询:
传统查询:
POST search-nfl-hof/_search
{"size": 1,"query": {"bool": {"must": [{"match": {"title": {"query": "Walter Payton","boost": 1}}},{"knn": {"field": "ml.inference.title.predicted_value","num_candidates": 20,"query_vector_builder": {"text_embedding": {"model_id": "sentence-transformers__all-distilroberta-v1","model_text": "Walter Payton"}},"boost": 24}}],"filter": [{"exists": {"field": "ml.inference.title.predicted_value"}}]}}
}
KNN Query:
POST search-nfl-hof/_search
{"size" : 1,"query" : {"bool" : {"must" : {"knn": {"field": "ml.inference.title.predicted_value","num_candidates": 20,"query_vector_builder": {"text_embedding": {"model_id": "sentence-transformers__all-distilroberta-v1","model_text": "Tell me about Tom Brady"}},"boost": 24}}}}}
原文:Dec 16th, 2024: [EN] ChatGPT Summary with ESS as your Private Datastore - Advent Calendar - Discuss the Elastic Stack