Elasticsearch:使用 Elasticsearch 向量搜索及 RAG 来实现 Chatbot

news/2024/11/20 23:25:17/

Elasticsearch 的向量搜索为我们的语义搜索提供了可能。而在人工智能的动态格局中,检索增强生成(Retrieval Augmented Generation - RAG)已经成为游戏规则的改变者,彻底改变了我们生成文本和与文本交互的方式。 RAG 使用大型语言模型 (LLMs) 等工具将信息检索的能力与自然语言生成无缝结合起来,为内容创建提供了一种变革性的方法。在本文中,我们将使用 Elasticsearch 的向量搜索并结合 OpenAI 大模型来实现 RAG。有关更多关于 RAG 的描述,请参阅文章 “Elasticsearch:什么是检索增强生成 - RAG?”。

安装 Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么请参考一下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,请选择 Elastic Stack 8.11 进行安装。这个也是在 Github 中代码的要求。你可以在如下的地址下载源码:

git clone https://github.com/liu-xiao-guo/elasticsearch-labs

运行应用

在进行之前,我们选择 OpenAI 来进行展示。本演示的代码是下面的这个项目:

$ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps
$ ls 
README.md                 openai-embeddings         workplace-search
chatbot-rag-app           relevance-workbench
internal-knowledge-search search-tutorial

如上所示,chatbot-rag-app 目录含有我们所需要运行的代码。在运行代码之前,我们需要在 terminal 中打入如下的命令:

export ELASTICSEARCH_URL=https://elastic:o6G_pvRL=8P*7on+o6XH@192.168.0.3:9200
export ES_INDEX=workplace-app-docs
export ES_INDEX_CHAT_HISTORY=workplace-app-docs-chat-history
export LLM_TYPE=openai
export OPENAI_API_KEY=YourOpenAiKey

在我的设置中,我使用自签名证书的 Elasticsearch 集群。在上面,你需要根据自己的 Elasticsearch 超级用户及密码进行配置。你也需要在 OpenAI 的网站中申请开发者 key。你可以在地址 https://platform.openai.com/api-keys 进行申请。

构建 docker 镜像

我们使用如下的命令来构建镜像:

docker run --rm --env-file .env chatbot-rag-app flask create-index

摄入数据

我们把 Elasticsearch 的证书拷贝到 chatbot-rag-app 的根目录下:

$ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app
$ cp ~/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt .

我们在当前的目录下创建 .env 文件,它的内容如下:

.env

ELASTICSEARCH_URL=https://elastic:o6G_pvRL=8P*7on+o6XH@192.168.0.3:9200
ES_INDEX=workplace-app-docs
ES_INDEX_CHAT_HISTORY=workplace-app-docs-chat-history
LLM_TYPE=openai
OPENAI_API_KEY=YourOpenAiKey
$ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app
$ ls -al
total 960
drwxr-xr-x  17 liuxg  staff     544 Dec 11 21:43 .
drwxr-xr-x  10 liuxg  staff     320 Dec 11 21:42 ..
-rw-r--r--@  1 liuxg  staff    8196 Dec 11 21:44 .DS_Store
-rw-r--r--   1 liuxg  staff     237 Dec 11 21:10 .env
-rw-r--r--   1 liuxg  staff      55 Dec  8 17:09 .flaskenv
-rw-r--r--   1 liuxg  staff      82 Dec  8 17:09 .gitignore
-rw-r--r--   1 liuxg  staff     807 Dec  8 17:09 Dockerfile
-rw-r--r--   1 liuxg  staff    6085 Dec  8 17:09 README.md
drwxr-xr-x   7 liuxg  staff     224 Dec  8 17:09 api
-rw-r--r--   1 liuxg  staff  430277 Dec  8 17:09 app-demo.gif
drwxr-xr-x   4 liuxg  staff     128 Dec  8 17:09 data
-rw-r--r--   1 liuxg  staff     860 Dec  8 17:09 env.example
drwxr-xr-x   2 liuxg  staff      64 Dec 11 21:38 filebeat.yml
drwxr-xr-x   9 liuxg  staff     288 Dec  8 17:09 frontend
-rw-r-----   1 liuxg  staff    1915 Dec 11 21:47 http_ca.crt
-rw-r--r--   1 liuxg  staff     315 Dec  8 17:09 requirements.in
-rw-r--r--   1 liuxg  staff    5259 Dec  8 17:09 requirements.txt

我们使用如下的命令来摄入数据:

docker run \--volume="$PWD/http_ca.crt:/usr/share/certs/http_ca.crt:ro" \--rm --env-file .env chatbot-rag-app flask create-index
$ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app
$ docker run \
>   --volume="$PWD/http_ca.crt:/usr/share/certs/http_ca.crt:ro" \
>   --rm --env-file .env chatbot-rag-app flask create-index
".elser_model_2" model is available
Loading data from $/app/api/../data/data.json
Loaded 15 documents
Split 15 documents into 26 chunks
Creating Elasticsearch sparse vector store in Elastic Cloud: None

从上面的显示中,我们可以看出来,我们已经写入了15个文档。这些文档的内容,你可以在 data 目录下的 data.json 中看到。我们在 Kibana 中可以使用如下的命令来进行查看:

从上面的输出中,我们可以看到它使用了 ELSER 来实现向量搜索。这个在代码中我们可以查看到。

在代码中,它是通过程序来进行安装的,所以我们不必要使用手动来安装 ELSER 模型。如果你之前没有安装过,那么第一次运行时速度会比较慢,因为有个安装的过程。另外,安装 ELSER 需要你具有白金版的授权,你需要启动试用:

更多关于 ELSER 的部署,请参阅文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR”。

启动 API 前端

我们可以使用如下的命令来启动前端应用。请注意在启动之前,我们设置好 .env。有关 .env 的写法,请参考 env.example 文件。我们使用如下的命令来进行启动:

docker run \--volume="$PWD/http_ca.crt:/usr/share/certs/http_ca.crt:ro" \--rm -p 4000:4000 --env-file .env -d chatbot-rag-app
$ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app
$ docker run \
>   --volume="$PWD/http_ca.crt:/usr/share/certs/http_ca.crt:ro" \
>   --rm -p 4000:4000 --env-file .env -d chatbot-rag-app
5955d1ec4b931f4a562330b682367b2c9a511bad20dd4a4033c7c3cac2c505f7

如上所示,我们在端口 4000 启动一个 web 应用:

太好了,我们成功地启动了这个 chatbot 应用。

查询展示

在下面,我们来针对我们的数据进行一些查询:

What is our work from home policy?

从上面的结果中,我们可以看出来:我们首先使用想要查询的问题让 Elasticsearch 在自己的向量数据库中(稀疏向量)进行搜索,并查到如上所示的几个最相近的文档。很显然查询到的结果非常冗长,而且不易被我们所理解。当然这些结果是从我们的私有数据里查询到的,也是和我们的公司的制度最相关的结果。为了得到更为简洁而精确的回答,我们可以把得到的结果变成为提示,再把原来的问题提交给 OpenAI 大模型,并进行总结。最终我们得到了如上所示的结果。

我们再做一个练习:

What's the NASA sales team?

同样地,我们得到三个相关的文档。我们知道 NASA 的真正意思是:

如上所示,在互联网上的 NASA 定义式美国航空航天局。如果我们想搜索和我们自己公司相关的关于 NASA 的内容,那么它就是如上所示的答案:

The NASA sales team is the North America South America region sales team. It is divided into two areas, with Laura Martinez as the Area Vice-President of North America and Gary Johnson as the Area Vice-President of South America.

它是指的一个北美南美的销售团队代名词。很显然它和互联网上的数据是不一样的。如果我们只是简单地从 Elasticsearch 来展示结果,那么我们的几个文档堆积在一起,需要更多地阅读。很显然,我们使用 OpenAI 的总结,我们得到一个更为简单明了的结果。

在我们的实例中,有更多的例子。请大家自己尝试。


http://www.ppmy.cn/news/1271451.html

相关文章

LetNet、AlexNet、ResNet网络模型实现手写数字识别

本篇文章是博主在AI、强化学习等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习&#…

4、APScheduler: 详解Scheduler种类用法、常见错误与解决方法【Python3测试任务管理总结】

调度器(Scheduler)是将其他组件绑在一起的关键。通常在应用程序中只运行一个调度器。应用程序开发者通常不直接处理作业存储(job stores)、执行器(executors)或触发器(triggers)。相反,调度器提供了适当的接口来处理所有这些。通过调度器配置作业存储和执行器,以及添…

Vue2面试题:说一下对vuex的理解?

五种状态: state: 存储公共数据 this.$store.state mutations:同步操作,改变store的数据 this.$store.commit() actions: 异步操作,让mutations中的方法能在异步操作中起作用 this.$store.dispatch() getters: 计算属性 th…

【Pytorch】Transposed Convolution

文章目录 1 卷积2 反/逆卷积3 MaxUnpool / ConvTranspose4 encoder-decoder5 可视化 学习参考来自: 详解逆卷积操作–Up-sampling with Transposed Convolution PyTorch使用记录 https://github.com/naokishibuya/deep-learning/blob/master/python/transposed_co…

飞天使-docker知识点1-安装docker以及手动制作镜像

文章目录 docker 的好处安装dockerdocker imagesimages 导出与导出删除镜像,指定端口启用容器启停批量关闭正在运行的容器 docker 的镜像制作之下载并安装好nginxdocker 的镜像制作之提交镜像 docker 的好处 快速部署:短时间内可以部署成百上千个应用,更…

LSTM 双向 Bi-LSTM

目录 一.Bi-LSTM介绍 二.Bi-LSTM结构 Bi-LSTM 代码实例 一.Bi-LSTM介绍 由于LSTM只能从序列里由前往后预测,为了既能够从前往后预测,也能从后往前预测,Bi-LSTM便被发明了出来。简单来说,BiLSTM就是由前向LSTM与后向LSTM组合而成。 二.Bi-LSTM结构 转自:

elementui el-pagination分页组件查询的时候当前页不更新

elementui el-pagination分页组件查询的时候当前页不更新 <mypagination v-if"pageshow" :currentPage.sync"pageNum" :pagesize"pageSize" :pagetotal"pageTotal" pagefunc"pageFunc"></mypagination>1.在加的…

冯丹教授:近数据处理新型盘框等技术创新,加速IDC向Diskless架构演进

日前&#xff0c;在中国深圳举办的第20届华为全球分析师大会&#xff0c;长江学者特聘教授、华中科技大学计算机科学与技术学院院长冯丹对数据中心Diskless架构及近数据处理发展趋势做出了权威解读&#xff0c;为传统云存储、大数据等计算域和存储域不完全分离造成的资源浪费&a…