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

news2024/11/23 21:47:14

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.coloradmin.cn/o/1306236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十三、YARN资源分配调用

1、为什么要先学习YARN组件? 在Hadoop文件系统中,YARN作为Hadoop系统的第三大组件,其中,第二大组件MapReduce组件是基于YARN运行的,即没有YARN无法运行MapReduce程序,所以需要同时学习YARN。 2、YARN &…

机器人纯阻抗控制接触刚性环境(阻尼影响因素)

问题描述 在机器人学中,阻抗控制是一种常用的控制策略,用于管理机器人在与环境交互时的运动和力。阻抗控制背后的关键概念是将环境视为导纳,而将机器人视为阻抗。 纯阻抗控制接触刚性环境时,机器人的行为方式主要受其阻抗参数的…

Python 自动化之批量处理文件(一)

批量新建目录、文档Pro版本 文章目录 批量新建目录、文档Pro版本前言一、做成什么样子二、基本思路1.引入库2.基本架构 三、用户输入模块四、数据处理模块1.excel表格数据获取2.批量数据的生成 总结 前言 我来写一个不一样的批量新建吧。在工作中,有些同学应该会遇…

神秘学原理。

神秘学原理TOC 神秘通常是与未知相关联的概念。而神秘学包括:研究历史上的神秘现象(不符合常识的现象),超能力(与神秘现象有关),预言未来,算命占卜,辨别与解释神秘现象&a…

记录一次chatGPT人机协同实战辅助科研——根据词库自动进行情感分析

有一个Excel中的一列,读取文本判断文本包含积极情感词.txt和消极情感词.txt的个数,分别生成两列统计数据 请将 ‘your_file.xlsx’ 替换为你的Excel文件名,Your Text Column’替换为包含文本的列名。 这个程序首先读取了积极和消极情感词&…

如何解决PET材料难于粘接的问题?有效解决方案分享!

1.PET是什么材料?有哪些特点和用途? PET是聚对苯二甲酸乙二醇酯(Polyethylene Terephthalate)的缩写,是一种常见的塑料材料。它具有以下特点: 高强度和刚性:PET具有较高的拉伸强度和模量,使其…

计算机毕业设计 基于SpringBoot的乡村政务办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现BWO-CNN-B…

Unity中实现ShaderToy卡通火(原理实现篇)

文章目录 前言一、我们在片元着色器中,实现卡通火的大体框架1、使用 noise 和 _CUTOFF 判断作为显示火焰的区域2、_CUTOFF : 用于裁剪噪波范围的三角形3、noise getNoise(uv, t); : 噪波函数 二、顺着大体框架依次解析具体实现的功能1、 uv.x * 4.0; : …

基于深度学习的课堂举手人数统计系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着信息技术的快速发展,教育领域也逐渐开始应用新技术来改善教学质量和效果。在传统的课堂教学中,教师通常需要手动记录学生的举手情况&…

集合03 Collection (List) - Java

List ArrayListArrayList注意事项ArrayList底层操作机制-源码分析(重点) VectorVector基本介绍 ——Vector和ArrayList比较Vector底层结构和源码分析 LinkedList基本介绍LinkedList的底层结构和操作机制LinkedList的增删改查 ——LinkedList和ArrayList比…

用CHAT 写农业产品管理制度

问CHAT:茶叶种植基地农业投入品管理制度 CHAT回复:茶业种植基地农业投入品管理制度是规范茶叶种植管理、保证产品质量与安全,提升作物生产效益的重要环节。 以下是对于茶叶种植基地农业投入品管理制度的一些基本措施建议: 1. 投…

C# 使用异步委托获取线程返回值

写在前面 异步委托主要用于解决 ThreadPool.QueueUserWorkItem 没有提供获取线程执行完成后的返回值问题。异步委托只能在.Net Framework 框架下使用,.Net Core中会报平台错误,而且使用Task.Result来获取返回值,可以达成同样的目的&#xff…

Android--Jetpack--数据库Room详解一

人生何须万种愁,千里云烟一笑收 一,定义 Room也是一个ORM框架,它在SQLite上提供了一个抽象层,屏蔽了部分底层的细节,使用对象对数据库进行操作,进行CRUD就像对象调用方法一样的简单。 二,角色介…

靠谱的车- 华为OD统一考试(C卷)

靠谱的车- 华为OD统一考试(C卷) OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题&#xf…

HTML+CSS高频面试题

面试题目录 前言1.讲一下盒模型,普通盒模型和怪异盒模型有什么区别2.CSS如何实现居中3.讲一下flex弹性盒布局4.CSS常见的选择器有哪些?优先级5.长度单位px 、em、rem的区别6.position属性的值有哪些7.display属性的值有哪些,分别有什么作用8.…

TCP/IP详解——IP协议,IP选路

文章目录 1. IP 编址1.1 IP 报文头部1.2 进制之间的转换1.3 网络通信1.4 有类 IP 编制的缺陷1.5 变长子网掩码1.6 网关1.7 IP 包分片1.7.1 IP 包分片实例1.7.2 IP 分片注意事项1.7.3 Wireshark 抓取 IP 包分片1.7.4 OmniPeek 抓取 IP 包分片1.7.5 ICMP 不可达差错(需…

【生物信息学】scRNA-seq数据分析(一):质控~细胞筛选~高表达基因筛选

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 质控2. 细胞筛选3. 高表达基因筛选 一、实验介绍 质控~ 细胞筛选 ~高表达基因筛选 二、实验环境 1. 配置虚拟环境 可使用如下指令: conda create -n bio python3.…

bugku--社工-初步收集

打开是这么个东西 下面的刷钻软件可以下载 御剑扫一下目录,发现个登录界面 打开刷钻软件抓个包看一下 发现这么两条数据 user 和 pass base64 解码 user:Username: YnVna3VrdUAxNjMuY29t pass:Password: WFNMUk9DUE1OV1daUURaTA 解码发现是163的邮箱账号密码 登…

Vulnhub-DC-2 靶机复现完整过程

环境准备: kali: NAT模式 网段 :192.168.200.0 DC-2: NAT模式 网段 :192.168.200.0 保证靶机和攻击机在一个网段上 信息收集 收集同网段存货主机IP地址 nmap -sP ip地址 arp-scan -l显示错误页面,显然是重定向错误&#xff0c…