Elasticsearch:聊天机器人教程(一)

在本教程中,你将构建一个大型语言模型 (LLM) 聊天机器人,该机器人使用称为检索增强生成 (RAG) 的模式。

使用 RAG 构建的聊天机器人可以克服 ChatGPT 等通用会话模型所具有的一些限制。 特别是,他们能够讨论和回答以下问题:

  • 你的组织私有的信息
  • 不属于训练数据集的事件,或者 LLM 完成训练后发生的事件

作为一个额外的好处,RAG 可以帮助 LLM 以事实为 “基础”,使他们不太可能做出回应或 “产生幻觉”。

实现这一目标的秘诀是使用两步过程从 LLM 获得答案:

  • 首先在检索阶段,针对用户的查询搜索一个或多个数据源。 检索在此搜索中找到的相关文档。 为此,使用 Elasticsearch 索引是一个很好的选择,使你能够在关键字、密集和稀疏向量搜索方法,甚至它们的混合组合之间进行选择。
  • 然后在生成阶段,用户的提示被扩展为包括第一阶段检索到的文档,并添加了对 LLM 的指令,以在检索到的信息中找到用户问题的答案。 扩展提示(包括问题的添加上下文)将代替原始查询发送到 LLM。

教程结构

本教程分为两个主要部分。

  1. 在第一部分中,您将学习如何运行 Chatbot RAG 应用程序示例,这是一个具有 Python 后端和 React 前端的完整应用程序。
  2. 一旦你启动并运行了示例应用程序,本教程的第二部分将解释 RAG 实现的不同组件,以便你可以根据自己的需要调整示例代码。

要求

要学习本教程,你需要安装以下组件:

 1)Elasticsearch 及 Kibana

有关安装说明,请参阅如下的文章:

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

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

在安装的时候,请选择 Elastic Stack 8.x 进行安装。在安装的时候,我们可以看到如下的安装信息:

在下面的展示中,我将使用 Elastic Stack 8.11 来进行展示。


2)OpenAI 的 API 密钥。 实际上,你可以使用你喜欢的任何其他 LLM,只要它受到 Langchain 项目的支持即可。

3)Python 解释器。 确保它是最新版本,例如 Python 3.8 或更高版本。

4)Node.js 和 Yarn

本教程重点介绍 RAG 主题。 为了能够修改示例应用程序,你将需要以下技术的基本知识:

  • 使用 Flask 进行 Python 后端开发。
  • 使用 React 进行 TypeScript 前端开发。

整个项目的完整代码在如下地址可以进行下载:

git clone https://github.com/liu-xiao-guo/elasticsearch-labs
cd elasticsearch-labs/example-apps/chatbot-rag-app

聊天机器人示例位于 example-apps/chatbot-rag-app 子目录中。

$ pwd
/Users/liuxg/python/elasticsearch-labs
$ ls
CONTRIBUTING.md         bin                     supporting-blog-content
LICENSE                 datasets                test
Makefile                example-apps
README.md               notebooks
$ cd example-apps
$ ls
README.md                 openai-embeddings         workplace-search
chatbot-rag-app           relevance-workbench
internal-knowledge-search search-tutorial
$ cd chatbot-rag-app/
$ ls
Dockerfile       api              data             frontend         requirements.txt
README.md        app-demo.gif     env.example      requirements.in

Python 后端

在本节中,我们将设置和配置项目的后端部分。

安装 Python 依赖项

为了遵循 Python 最佳实践,你现在将创建一个虚拟环境,这是专用于该项目的私有 Python 安装,可以在其中安装所有依赖项。 使用以下命令执行此操作:

python3 -m venv .venv
$ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app
$ python3 -m venv .venv

此命令在 .venv (dot-venv) 目录中创建 Python 虚拟环境。 你可以将此命令中的 .venv 替换为你喜欢的任何其他名称。 请注意,在某些 Python 安装中,你可能需要使用 python 而不是 python3 来调用 Python 解释器。

下一步是激活虚拟环境,这是使该虚拟环境成为你所在终端会话的活动 Python 环境的一种方法。如果你使用的是基于 UNIX 的操作系统(例如 Linux 或 macOS),请激活 虚拟环境如下:

source .venv/bin/activate
$ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app
$ python3 -m venv .venv
$ source .venv/bin/activate
(.venv) $ 

如果你在 Microsoft Windows 计算机上的 WSL 环境中工作,上述激活命令也适用。 但如果你使用的是 Windows 命令提示符或 PowerShell,激活命令会有所不同:

.venv\Scripts\activate

激活虚拟环境后,命令行提示符将更改为显示环境名称:

(.venv) $ _

配置 Python 环境的最后一步是安装入门应用程序所需的一些包。 确保上一步中已激活虚拟环境,然后运行以下命令安装这些依赖项:

pip install -r requirements.txt

  

编写配置文件

在上一节中下载的代码的主目录中有一个名为 env.example 的文件。 该文件包含应用程序支持的所有配置变量。

复制该文件,并将其命名为 .env:

cp env.example .env
(.venv) $ ls -al
total 920
drwxr-xr-x  14 liuxg  staff     448 Jan 15 09:25 .
drwxr-xr-x   9 liuxg  staff     288 Jan 15 09:21 ..
-rw-r--r--   1 liuxg  staff      55 Jan 15 09:21 .flaskenv
-rw-r--r--   1 liuxg  staff      82 Jan 15 09:21 .gitignore
drwxr-xr-x   6 liuxg  staff     192 Jan 15 09:25 .venv
-rw-r--r--   1 liuxg  staff     807 Jan 15 09:21 Dockerfile
-rw-r--r--   1 liuxg  staff    6085 Jan 15 09:21 README.md
drwxr-xr-x   7 liuxg  staff     224 Jan 15 09:21 api
-rw-r--r--   1 liuxg  staff  430277 Jan 15 09:21 app-demo.gif
drwxr-xr-x   4 liuxg  staff     128 Jan 15 09:21 data
-rw-r--r--   1 liuxg  staff     860 Jan 15 09:21 env.example
drwxr-xr-x   9 liuxg  staff     288 Jan 15 09:21 frontend
-rw-r--r--   1 liuxg  staff     315 Jan 15 09:21 requirements.in
-rw-r--r--   1 liuxg  staff    5259 Jan 15 09:21 requirements.txt
(.venv) $ cp env.example .env
(.venv) $ ls .env
.env

如果您在 Windows 上学习本教程,请在上面的命令中使用 copy 而不是 cp。

在你喜欢的文本编辑器中打开 .env 以查看应用程序配置,并查看以下小节以获取有关如何配置应用程序的指导。

Elasticsearch 设置

我们在 .env 中设置如下的变量:

.env

ELASTICSEARCH_URL=https://elastic:yarOjyX5CLqTsKVE3v*d@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

  

在上面,你必须根据自己的 Elasticsearch 安装修改上面的 ELASTICSEARCH_URL 值。你还需要修改上面的 OPENAI_API_KEY 值。你需要在 OpenAI 的网站中申请开发者 key。你可以在地址 https://platform.openai.com/api-keys 进行申请。

为了能够让 Python 连接到 Elasticsearch,我们必须把 Elasticsearch 的证书拷贝到当前的目录下:

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

另外,在 github 上的代码是为在 docker 的环境下运行二准备的,我们必须修改其中的一个部分以使得它正常运行:

api/elasticsearch_client.py

if ELASTICSEARCH_URL:elasticsearch_client = Elasticsearch(hosts=[ELASTICSEARCH_URL], ca_certs = ./http_ca.crt, verify_certs = True)

data/index_data.py

if ELASTICSEARCH_URL:elasticsearch_client = Elasticsearch(hosts=[ELASTICSEARCH_URL], ca_certs = "./http_ca.crt", verify_certs = True)

写入示例数据集

该应用程序附带一个示例数据集,存储在 data/data.json 文件中。 请随意在文本编辑器中打开此文件,以熟悉其中包含的文档。

使用以下命令将数据集导入应用程序:

flask create-index
(.venv) $ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app
(.venv) $ flask create-index
".elser_model_2" model is available
Loading data from $/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app/api/../data/data.json
Loaded 15 documents
Split 15 documents into 26 chunks
Creating Elasticsearch sparse vector store in Elastic Cloud: 

等上面的命令运行完毕后,我们到 Kibana 中进行查看:

启动后端

完成上述所有步骤后,你应该能够使用以下命令启动 Python 后端:

flask run

保持后端运行并打开一个新的终端会话以继续本教程的其余部分。

React 前端

在本部分中,你将启动聊天机器人的前端。

安装依赖项

前端位于项目的 frontend 子目录中,因此请继续更改为:

cd frontend
$ pwd
/Users/liuxg/python/elasticsearch-labs/example-apps/chatbot-rag-app
$ cd frontend/

运行 yarn 命令安装所有前端依赖项:

yarn

运行前端

使用以下命令启动前端:

yarn start

几秒钟后,你的浏览器应该打开该应用程序。

使用应用程序

现在,你可以通过单击 common questions 中的一个或输入你自己的问题来向聊天机器人询问任何问题。

聊天机器人的响应将来自导入的数据集,每个响应将引用检索到的文档以及使用特定文档的文档。

一定要尝试提出后续问题,这些问题应该 “记住” 会话之前讨论的内容。

本教程的其余部分将讨论该应用程序的一些实现细节,以便你可以根据需要进行更改、试验和调整代码。请关注我们的下一个部分!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623996.shtml

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

相关文章

构建基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)的支持63个常见模块的PHP8.1.20的RPM包

本文适用:rhel9系列,或同类系统(CentOS9,AlmaLinux9,RockyLinux9等) 文档形成时期:2023年 因系统版本不同,构建部署应略有差异,但本文未做细分,对稍有经验者应不存在明显障碍。 因软件世界之复杂和个人能力…

测试学习——答疑

1、什么是软件测试? 一个产品质量好,用户的使用感受佳,用户才愿意为此付费,这样企业才会获取收益,如果一个产品bug太多的话,那用户就不会买账。所以软件测试就是对产品进行测试,提高测试质量&am…

LLM之RAG理论(五)| 使用知识图谱增强RAG

知识图谱(KG)或任何图都包括节点和边,其中每个节点表示一个概念,每个边表示一对概念之间的关系。本文介绍一种将任何文本语料库转换为知识图谱的技术,本文演示的知识图谱可以替换其他专业知识图谱。 一、知识图谱 知识…

Go中更安全的枚举

iota Go让你用iota来使用枚举。 const (Guest iotaMemberModeratorAdmin )虽然Go是明确的,但iota似乎相对模糊。如果你以任何其他方式对const组进行排序,你会引入副作用。在上面的例子中,你仅仅对第一个参数Guest赋值了。你可以显式地给每…

2719. 统计整数数目

给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2min_sum < digit_sum(x) < max_sum. 请你返回好整数的数目。答案可能很大&#xff…

【LeetCode:76. 最小覆盖子串 | 滑动窗口】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【Element】el-input 限定输入是 只能是数字和符号 -

<template><div><el-input v-model"inputValue" input"handleInput"></el-input></div> </template><script> export default {data() {return {inputValue: };},methods: {handleInput(value) {// 使用正则表达…

LeetCode刷题--- 粉刷房子

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

Julia系列16:Julia与python/c互调

1 Julia调用python 通过PyCall包&#xff0c;Julia可以直接调用Python包。例如&#xff1a; using PyCall np pyimport("numpy") x np.linspace(1, 10, 10)数值、布尔、字符串、IO stream、函数、元组、数组或列表、以及包含这些类型的字典等&#xff0c;它们都会…

LeetCode.82 删除排序链表中的重复元素 二

LeetCode.82 删除排序链表中的重复元素 二 题目 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* deleteDuplicates(struct ListNode* head) {if(head NULL) return head;struct ListNode* _…

Gradle 安装及源替换详解

在软件开发的过程中&#xff0c;Gradle 是一个强大且灵活的构建工具&#xff0c;被广泛应用于 Java、Android、Kotlin 等项目。本文将为您提供 Gradle 的安装步骤以及如何更换源的详细说明和代码示例。 一. Gradle 安装步骤 以下是在 Windows 操作系统上安装 Gradle 的步骤&am…

帆软报表11.0.19增加postgres数据源方案

项目使用postgres数据库&#xff0c;帆软报表集成开发时需要手工增加该数据源。 https://help.fanruan.com/finereport/doc-view-2563.html 但增加数据源后测试报告无此驱动&#xff0c;经查看文档&#xff0c;现在是通过驱动管理来上传&#xff0c; 但新版又不允许上传驱动JAR…

「HDLBits题解」Always casez

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Always casez - HDLBits // synthesis verilog_input_version verilog_2001 module top_module (input [7:0] in,output reg [2:0]…

ai智能语音机器人系统的话术怎样设置效果比较好

设置一个AI智能语音机器人的话术&#xff0c;以实现最佳效果&#xff0c;涉及以下几个关键方面&#xff1a; 1. 自然语言处理&#xff08;NLP&#xff09;&#xff1a;AI机器人的话术需要能够理解和处理用户的自然语言输入。使用NLP技术来识别语义、意图和实体&#xff0c;并针…

Pointnet++改进注意力机制系列:全网首发SE通道注意力机制 |即插即用,实现有效涨点!

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入SE注意力机制,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤

走迷宫(c语言)

前言&#xff1a; 制作一个迷宫游戏是一个有趣的编程挑战。首先&#xff0c;我们需要设计一个二维数组来表示迷宫的布局&#xff0c;其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来&#xff0c;我们需生成迷宫。在生成迷宫的过程…

C# Guid生成唯一值用例

GUID&#xff08;全局唯一标识符&#xff09;是一个128位的数字&#xff0c;通常用来唯一标识信息。GUID 的生成算法保证了在相同的时空条件下&#xff0c;基本上不会生成重复的值。这是因为GUID的生成算法结合了多种不同的信息&#xff0c;包括时间戳、计算机的 MAC 地址、随机…

2024年【上海市安全员C3证】模拟考试题及上海市安全员C3证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年上海市安全员C3证模拟考试题为正在备考上海市安全员C3证操作证的学员准备的理论考试专题&#xff0c;每个月更新的上海市安全员C3证模拟考试题库祝您顺利通过上海市安全员C3证考试。 1、【多选题】《上海市建设…

STC15系列单片机:定时器/计数器16位自动重装载模式

一、定时器与计数器的理解 STC15系列单片机内部有5个16位定时器/计数器&#xff0c;分别是T0、T1、T2、T3、T4。 定时器与计数器&#xff0c;东西还是同一个东西&#xff0c;只是用法和功效不一样&#xff0c;就好比黄瓜&#xff0c;既可以内服也可以外敷&#xff0c;黄瓜还是…

深入理解 go chan

go 里面&#xff0c;在实际程序运行的过程中&#xff0c;往往会有很多协程在执行&#xff0c;通过启动多个协程的方式&#xff0c;我们可以更高效地利用系统资源。 而不同协程之间往往需要进行通信&#xff0c;不同于以往多线程程序的那种通信方式&#xff0c;在 go 里面是通过…