使用 Elastic ELSER 和 Llama3 的 RAG(使用 Langchain)

在之前的文章 “使用 Llama 3 开源和 Elastic 构建 RAG”,我们讲到了如何使用 Liama3 来结合 Elastic ELSER 来进行 RAG。在今天的文章里,我们来详细使用一个 notebook 来展示如何在本地 Elasticsearch 部署中进行实现。

此交互式 notebook 使用 Langchain 处理虚构的工作场所文档,并使用在 Elasticsearch 中运行的 ELSER v2 将这些文档转换为嵌入并将它们存储到 Elasticsearch 中。然后我们提出一个问题,从 Elasticsearch 中检索相关文档,并使用在本地运行的 Llama3 使用 Ollama 提供响应。

注意:预计 Llama3 将在你运行此笔记本的同一台机器上使用 Ollama 运行。

 安装

 Elasticsearch 及 Kibana

 如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装:

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

在安装的时候,我们选择 Elastic Stack 8.x 来进行安装。特别值得指出的是:ES|QL 只在 Elastic Stack 8.11 及以后得版本中才有。你需要下载 Elastic Stack 8.11 及以后得版本来进行安装。

在首次启动 Elasticsearch 的时候,我们可以看到如下的输出:

在上面,我们可以看到 elastic 超级用户的密码。我们记下它,并将在下面的代码中进行使用。

我们还可以在安装 Elasticsearch 目录中找到 Elasticsearch 的访问证书:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.14.1/config/certs
$ ls
http.p12      http_ca.crt   transport.p12

在上面,http_ca.crt 是我们需要用来访问 Elasticsearch 的证书。

 我们首先克隆已经写好的代码:

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

我们然后进入到该项目的根目录下:

$ pwd
/Users/liuxg/python/elasticsearch-labs/notebooks/integrations/llama3
$ ls
README.md                      rag-elastic-llama3-elser.ipynb rag-elastic-llama3.ipynb

如上所示,rag-elastic-llama3-elser.ipynb 就是我们今天想要工作的 notebook。

我们通过如下的命令来拷贝所需要的证书:

$ pwd
/Users/liuxg/python/elasticsearch-labs/notebooks/integrations/llama3
$ cp ~/elastic/elasticsearch-8.14.1/config/certs/http_ca.crt .
$ ls
README.md                      rag-elastic-llama3-elser.ipynb
http_ca.crt                    rag-elastic-llama3.ipynb

安装所需要的 python 依赖包

pip3 install langchain langchain-elasticsearch langchain-community tiktoken python-dotenv

我们可以通过如下的命令来查看 elasticsearch 安装包的版本:

$ pip3 list | grep elasticsearch
elasticsearch                           8.14.0
langchain-elasticsearch                 0.2.2
llama-index-embeddings-elasticsearch    0.1.2
llama-index-readers-elasticsearch       0.1.4
llama-index-vector-stores-elasticsearch 0.2.0

创建环境变量

为了能够使得下面的应用顺利执行,在项目当前的目录下运行如下的命令:

export ES_ENDPOINT="localhost"
export ES_USER="elastic"
export ES_PASSWORD="uK+7WbkeXMzwk9YvP-H3"

配置 Ollama 和 Llama3

由于我们使用 Llama 3 8B 参数大小模型,我们将使用 Ollama 运行该模型。按照以下步骤安装 Ollama。

  • 浏览到 URL https://ollama.com/download 以根据你的平台下载 Ollama 安装程序。

        在我的电脑上,我使用 macOS 来进行安装。你也可以仿照文章 “Elasticsearch:使用在本地计算机上运行的 LLM 以及 Ollama 和 Langchain 构建 RAG 应用程序” 在 docker 里进行安装。

  • 按照说明为你的操作系统安装和运行 Ollama。
  • 安装后,按照以下命令下载 Llama3 模型。

点击上面的 “Finish” 按钮,并按照上面的提示在 terminal 中运行:

这可能需要一些时间,具体取决于你的网络带宽。运行完成后,你将看到如上的界面。

要测试 Llama3,请从新终端运行以下命令或在提示符下输入文本。

    curl -X POST http://localhost:11434/api/generate -d '{ "model": "llama3", "prompt":"Why is the sky blue?" }'

在提示符下,输出如下所示。

我们现在使用 Ollama 在本地运行 Llama3。

安装所需要的 python 依赖包

pip3 install langchain langchain-elasticsearch langchain-community tiktoken python-dotenv

我们可以通过如下的命令来查看 elasticsearch 安装包的版本:

$ pip3 list | grep elasticsearch
elasticsearch                           8.14.0
llama-index-embeddings-elasticsearch    0.1.2
llama-index-readers-elasticsearch       0.1.4
llama-index-vector-stores-elasticsearch 0.2.0

下载数据集文档

我们可以使用如下的命令来下载文档:

wget https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/datasets/workplace-documents.json
$ pwd
/Users/liuxg/python/elasticsearch-labs/notebooks/integrations/llama3
$ ls
README.md                      rag-elastic-llama3-elser.ipynb
http_ca.crt                    rag-elastic-llama3.ipynb
$ wget https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/datasets/workplace-documents.json
--2024-06-25 10:54:01--  https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/datasets/workplace-documents.json
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 52136 (51K) [text/plain]
Saving to: ‘workplace-documents.json’workplace-documents.jso 100%[=============================>]  50.91K   260KB/s    in 0.2s    2024-06-25 10:54:02 (260 KB/s) - ‘workplace-documents.json’ saved [52136/52136]$ ls
README.md                      rag-elastic-llama3-elser.ipynb workplace-documents.json
http_ca.crt                    rag-elastic-llama3.ipynb

安装 ELSER

如果你还没有安装过 ELSER,那么请阅读文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR”。

展示

我们在项目当前的目录下打入如下的命令:

jupyter notebook rag-elastic-llama3-elser.ipynb

读入变量并连接到 Elasticsearch

from elasticsearch import Elasticsearch, AsyncElasticsearch, helpers
from dotenv import load_dotenv
import osload_dotenv()ES_USER = os.getenv("ES_USER")
ES_PASSWORD = os.getenv("ES_PASSWORD")
ES_ENDPOINT = os.getenv("ES_ENDPOINT")
COHERE_API_KEY = os.getenv("COHERE_API_KEY")url = f"https://{ES_USER}:{ES_PASSWORD}@{ES_ENDPOINT}:9200"
print(url)client = Elasticsearch(url, ca_certs = "./http_ca.crt", verify_certs = True)
# info = await client.info()
print(client.info())

准备要分块和提取的文档

现在我们准备要提取到 Elasticsearch 中的数据。我们使用 LangChain 的 RecursiveCharacterTextSplitter,将文档的文本拆分为 512 个字符,重叠部分为 256 个字符。

# from urllib.request import urlopen
import json
from langchain.text_splitter import RecursiveCharacterTextSplitter# url = "https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/datasets/workplace-documents.json"# response = urlopen(url)# workplace_docs = json.loads(response.read())# Load data into a JSON object
with open('workplace-documents.json') as f:workplace_docs = json.load(f)metadata = []
content = []
for doc in workplace_docs:content.append(doc["content"])metadata.append({"name": doc["name"],"summary": doc["summary"],"rolePermissions": doc["rolePermissions"],})text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=512, chunk_overlap=256
)
docs = text_splitter.create_documents(content, metadatas=metadata)

定义 Elasticsearch 向量存储

我们将 ElasticsearchStore 定义为具有 SparseVectorStrategy 的向量存储。SparseVectorStrategy 将每个文档转换为标记,并将其存储在数据类型为 rank_features 的向量字段中。我们将使用来自 ELSER v2 模型的文本嵌入 .elser_model_2_linux

注意:在开始索引之前,请确保您已在部署中下载并部署了 ELSER v2 模型,并且该模型正在 ml 节点中运行。

from langchain_elasticsearch import ElasticsearchStore
from langchain_elasticsearch import SparseVectorStrategyindex_name = "workplace_index_elser"# Delete the index if it exists
if client.indices.exists(index=index_name):client.indices.delete(index=index_name)es_vector_store = ElasticsearchStore(es_user = ES_USER,es_password = ES_PASSWORD,es_url = url,es_connection = client, index_name=index_name,strategy=SparseVectorStrategy(model_id=".elser_model_2"),
)

添加上面处理的文档。

文档已被分块。我们在这里不使用任何特定的嵌入函数,因为标记是在索引时和在 Elasticsearch 内查询时推断出来的。这要求在 Elasticsearch 中加载并运行 ELSER v2 模型。

es_vector_store.add_documents(documents=docs)

LLM 配置

这将连接到你的本地 LLM。请参阅 https://ollama.com/library/llama3 了解在本地运行 Llama3 的步骤详情。

如果你有足够的资源(至少 >64 GB 的 RAM 和 GPU 可用),那么你可以尝试 70B 参数版本的 Llama3

from langchain_community.llms import Ollamallm = Ollama(model="llama3")

使用 Elasticsearch ELSER v2 和 Llama3 进行语义搜索

我们将使用 ELSER v2 作为模型对查询进行语义搜索。然后将上下文相关的答案与用户原始查询一起组合成模板。

然后我们使用 Llama3 回答你的问题,并使用检索器从 Elasticsearch 中获取的上下文相关数据。

from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthroughdef format_docs(docs):return "\n\n".join(doc.page_content for doc in docs)retriever = es_vector_store.as_retriever()
template = """Answer the question based only on the following context:\n{context}Question: {question}"""
prompt = ChatPromptTemplate.from_template(template)
chain = ({"context": retriever | format_docs, "question": RunnablePassthrough()}| prompt| llm| StrOutputParser()
)a = chain.invoke("What are the organizations sales goals?")print(a)

最终的所有代码可以在地址进行下载:elasticsearch-labs/notebooks/integrations/llama3/rag-elastic-llama3-elser.ipynb at main · liu-xiao-guo/elasticsearch-labs · GitHub

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

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

相关文章

人工智能在医学图像分割中的最新研究进展|顶刊速递·24-06-26

小罗碎碎念 今日推文主题——人工智能在医学图像分割领域中的最新研究进展。 今天的推文都来自同一个期刊——《Med Image Anal 》,最新的IF是10.7。 小罗观点 今天的六篇文献都是直接面向实际应用场景的,可以针对你自己的研究课题选择合适的文章进行阅读…

【学习】科大睿智解读ITSS通过后仍需关注和改进IT服务的原因

为了确保IT服务的质量和效率,很多企业拿到ITSS资质证书后,仍然需要持续关注和改进IT服务,科大睿智总结主要原因有以下几点: 1、随着企业发展业务和市场行情的变化,可能涉及到运维服务中新的业务流程、技术需求或者用户…

机器学习算法(三):支持向量机(SVM)的sklearn调用

文章目录 前言一 理论1 sklearn中的核函数形式二、sklearn调用1 svm.SVC() 接口说明三 、具体示例1、简单的线性SVM例子 --- 不同C值的影响(1) 数据集(2) svm sklearn调用2、高斯核函数的SVM --- 非线性分类(1) 数据集(2) 高斯核函数的SVM3、sklearn调参技术--网格搜索…

华为云x86架构下部署mysql

华为云x86架构下部署mysql 1. 配置X86架构ESC2. 查看本系统中有没有安装mariadb相关的组件,有则卸载3. 安装mysql4. 启动mysql5. 登录MySQL,修改密码,开放访问权限 1. 配置X86架构ESC 2. 查看本系统中有没有安装mariadb相关的组件&#xff0c…

从理论到实践:工业工厂室外可燃气体报警器的校准方法

随着工业工厂对安全生产要求的不断提高,可燃气体报警器作为防范火灾、爆炸事故的重要设备,其准确性和可靠性显得尤为重要。 特别是在室外环境中,由于气候条件多变、设备老化等因素的影响,可燃气体报警器的性能可能会发生变化。因…

grpc学习golang版( 二、入门示例)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 文章目录 一、环境二、编写protobuf文件三、编写server服务端四、编写服务端五、测试 一、环境 确保环境已经配置完成,效果如下。不同环境可能导致后续生成的效果不一。 go version protoc --version…

深度解析:ChatGPT是如何理解和生成自然语言文章的?

引言 随着人工智能的发展,ChatGPT作为一种先进的自然语言处理工具,正逐渐改变人们与技术交互的方式。那么,ChatGPT是如何理解和生成自然语言文章的?本文将从其技术原理、训练过程、实际应用等多个角度,深入解析这一过…

49、基于归一化感知器的输入向量分类(matlab)

1、基于归一化感知器的输入向量分类的原理及流程 归一化感知器是一种分类算法,其原理基于感知器算法,但是在输入向量上进行了归一化处理,以提高算法的性能和稳定性。 流程如下: 输入向量归一化:对每个输入向量进行归…

手机远程控制另一台手机的全新使用教程(安卓版)

看完这篇文章,你可以了解到安卓手机如何远程控制安卓手机,以及苹果手机如何远程控制安卓手机。 如果想要用安卓手机远程管控苹果手机,或者苹果手机远程管控另一台苹果手机,请点击查看视频《手机远程管控另一台手机的全新使用教程…

如何提高搜索点击率:五个利用ChatGPT创造吸引眼球标题的小技巧

在当今信息爆炸的时代,如何让自己的文章在海量信息中脱颖而出,是每个内容创作者都在思考的问题。尤其是当读者面对无数个搜索结果时,标题成为吸引他们点击的第一步。那么,如何才能写出吸引眼球的标题,从而提高搜索点击…

数字化工厂生产管理看板系统如何优化生产流程

在当今高度数字化的时代,制造业正经历着深刻的变革,数字化工厂生产管理看板系统作为一种创新的工具,正在为优化生产流程发挥着关键作用。 数字化工厂生产管理看板系统是一个集数据采集、分析、展示和决策支持于一体的综合性平台。生产管理看板…

SaaS行业的发展与前景

随着互联网技术的飞速发展,云计算逐渐成为新一代信息技术的重要方向。作为云计算的一种服务模式,SaaS(Software as a Service,软件即服务)已经深入到企业级应用和个人消费市场,成为全球软件产业的新趋势。在…

Linux上搭建邮件服务

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 Linux上搭建邮件服务 前言电子邮件的工作原理和基本组成部分1. 电子邮件的工作原理2. 电子邮件的…

【软件测试】概念篇

🎃🎃🎃个人主页🎃🎃🎃 🎃🎃🎃【软件测试专栏】🎃🎃🎃 🎃🎃🎃上一篇文章:认识测试&…

音乐创作与制作软件:Studio One 6.6.1中文版安装激活使用指南

音乐创作与制作软件:Studio One 6.6.1 简介 StudioOne 的设计核心是易于使用。十年来,它已将久经考验的录音棚模型与当今以节拍和循环为导向的制作过程无缝地结合在一起,因此您可以比以往更快地将音乐创意带入声音现实。高效的单屏幕界面可…

PointCloudLib-特征(Features)-基于转动惯量和偏心率的描述符

基于转动惯量和偏心率的描述符 在本教程中,我们将学习如何使用 pcl::MomentOfInertiaEstimation 类来获取基于 偏心率和转动惯量。此类还允许提取云的轴对齐和定向边界框。 但请记住,提取的 OBB 不是最小可能的边界框. 理论入门 特征提取方法的思路如下。 首先计算点云的…

GNU、Unix、Linux、Makefile、GCC、GDB 之间的关系

1.1 Makefile Makefile 是一个用于自动化编译和构建过程的文本文件,尤其在软件开发项目中被广泛使用。它定义了一系列规则,说明了如何将源代码文件编译成可执行文件、库或者其他目标文件。Makefile 的核心作用在于它能够管理源代码文件之间的依赖关系&am…

Python多线程技巧心得详解

概要 多线程是一种能够并发执行代码的方法,可以提高程序的执行效率和响应速度。本文将详细介绍 Python 中多线程的概念、使用场景、基本用法以及实际应用,可以更好地掌握多线程编程。 什么是多线程? 多线程是一种在单个进程内并发执行多个线程的技术。每个线程共享相同的内…

笔记101:OSQP求解器的底层算法 -- ADMM算法

前言1:这篇博客仅限于介绍拉格朗日乘子法,KKT条件,ALM算法,ADMM算法等最优化方法的使用以及简版代码实现,但不会涉及具体的数学推导;不过在下面我会给出具体数学推导的相关文章和截图,供学有余力…

图书馆书籍管理系统

项目名称与项目简介 图书馆书籍管理系统 本项目是一个计算机管理系统,也就是将传统手工的管理方式转变为智能化、标准化、规范化的管理管理模式,对图书馆中所有的图书、文献资料、音像资料、报刊、期刊等各种类型的资料实现采编、收集图书信息、检索、归…