使用 Llama 3 开源和 Elastic 构建 RAG

news2024/11/26 18:53:33

作者:Rishikesh Radhakrishnan

使用开源的 Llama 3 和 Elastic 构建 RAG

Llama 3 是 Meta 最近推出的开源大型语言模型。这是 Llama 2 的后继者,根据已发布的指标,这是一个重大改进。与 Gemma 7B Instruct、Mistral 7B Instruct 等最近发布的一些模型相比,它具有良好的评估指标。该模型有两个变体,分别是 80 亿和 700 亿参数。值得注意的是,在撰写这篇博客时,Meta 仍在训练 400B+ 版本的 Llama 3。

Meta Llama 3 Instruct 模型性能。(来自 https://ai.meta.com/blog/meta-llama-3/)

上图显示了与其他模型相比,Llama3 在不同数据集上的性能数据。为了针对现实世界场景进行性能优化,Llama3 还在高质量的人工评估集上进行了评估。

跨多个类别和提示的人工评估的汇总结果(来自 https://ai.meta.com/blog/meta-llama-3/)

本博客将介绍使用两种方法实现的 RAG。

  • Elastic、Llamaindex、Llama 3 (8B) 版本使用 Ollama 在本地运行。
  • Elastic、Langchain、ELSER v2、Llama 3 (8B) 版本使用 Ollama 在本地运行。

Notebook 可在此 GitHub 位置获取。

数据集

对于数据集,我们将使用 json 格式的虚构组织政策文档,可在此处获取。

配置 Ollama 和 Llama3

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

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

注意:Windows 版本目前处于预览阶段。

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

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

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

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

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

    ❯ ollama run llama3
    >>> Why is the sky blue?
    The color of the sky appears blue to our eyes because of a fascinating combination of scientific factors. Here's the short answer:

    **Scattering of Light**: When sunlight enters Earth's atmosphere, it encounters tiny molecules of gases like nitrogen (N2) and oxygen (O2).
    These molecules scatter the light in all directions, but they do so more efficiently for shorter wavelengths (like blue and violet light) than
    longer wavelengths (like red and orange light).

    **Rayleigh Scattering**: This scattering effect is known as Rayleigh scattering, named after the British physicist Lord Rayleigh, who first
    described it in the late 19th century. It's responsible for the blue color we see in the sky.

    **Atmospheric Composition**: The Earth's atmosphere is composed of approximately 78% nitrogen, 21% oxygen, and small amounts of other gases.
    These gases are more abundant at lower altitudes, where they scatter shorter wavelengths (like blue light) more effectively than longer
    wavelengths (like red light).

    **Sunlight's Wavelengths**: When sunlight enters the Earth's atmosphere, it contains a broad spectrum of wavelengths, including visible light
    with colors like red, orange, yellow, green, blue, indigo, and violet. The shorter wavelengths (blue and violet) are scattered more than the
    longer wavelengths (red and orange), due to Rayleigh scattering.

    **What We See**: As our eyes look up at the sky, we see the combined effect of these factors: the shorter wavelengths (blue light) being
    scattered in all directions by the atmospheric gases, while the longer wavelengths (red and orange light) continue to travel in a more direct
    path to our eyes. This results in the blue color we perceive as the sky.

    So, to summarize: the sky appears blue because of the scattering of sunlight's shorter wavelengths (blue light) by the tiny molecules in the
    Earth's atmosphere, combined with the atmospheric composition and the original wavelengths present in sunlight.

    Now, go enjoy that blue sky!

    >>> Send a message (/? for help)

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

Elasticsearch 设置

我们将为此使用 Elastic 云设置。请按照此处的说明进行操作。成功部署后,请记下 API 密钥和云 ID,我们将需要它们作为设置的一部分。

应用程序设置

有两个 notebooks,一个用于使用 Llamaindex 和 Llama3 实现的 RAG,另一个用于 Langchain、ELSER v2 和 Llama3。在第一个 notebook 中,我们使用 Llama3 作为本地 LLM 并提供嵌入。对于第二个 notebook,我们使用 ELSER v2 作为嵌入,使用 Llama3 作为本地 LLM。

方法 1:使用 Ollama 在本地运行 Elastic、Llamaindex、Llama 3 (8B) 版本。

步骤 1:安装所需的依赖项。
    !pip install llama-index
    !pip install llama-index-cli
    !pip install llama-index-core
    !pip install llama-index-embeddings-elasticsearch
    !pip install llama-index-embeddings-ollama
    !pip install llama-index-legacy
    !pip install llama-index-llms-ollama
    !pip install llama-index-readers-elasticsearch
    !pip install llama-index-readers-file
    !pip install llama-index-vector-stores-elasticsearch
    !pip install llamaindex-py-client

以上部分安装了所需的 llamaindex 包。

第 2 步:导入所需的依赖项

我们首先导入应用程序所需的包和类。

    from llama_index.core.node_parser import SentenceSplitter
    from llama_index.core.ingestion import IngestionPipeline
    from llama_index.embeddings.ollama import OllamaEmbedding
    from llama_index.vector_stores.elasticsearch import ElasticsearchStore
    from llama_index.core import VectorStoreIndex, QueryBundle
    from llama_index.llms.ollama import Ollama
    from llama_index.core import Document, Settings
    from getpass import getpass
    from urllib.request import urlopen
    import json

我们首先向用户提供提示,以捕获云 ID 和 API 密钥值。

    #https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id
    ELASTIC_CLOUD_ID = getpass("Elastic Cloud ID: ")

    #https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key
    ELASTIC_API_KEY = getpass("Elastic Api Key: ")

如果你不熟悉如何获取云 ID 和 API 密钥,请按照上面代码片段中的链接来指导你完成该过程。

步骤 3:文档处理

我们首先下载 json 文档,然后使用有效负载构建 Document 对象。

    url = "https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/datasets/workplace-documents.json"
    response = urlopen(url)
    workplace_docs = json.loads(response.read())
    documents = [Document(text=doc['content'],
                              metadata={"name": doc['name'],"summary": doc['summary'],"rolePermissions": doc['rolePermissions']})
                     for doc in workplace_docs]

我们现在定义 Elasticsearch 向量存储 (ElasticsearchStore)、使用 Llama3 创建的嵌入和 pipeline,以帮助处理上面构建的有效负载并提取到 Elasticsearch 中。

提取管道允许我们使用不同的组件组成管道,其中一个组件允许我们使用 Llama3 生成嵌入。

    es_vector_store = ElasticsearchStore(index_name="workplace_index",
                                         vector_field='content_vector',
                                         text_field='content',
                                         es_cloud_id=ELASTIC_CLOUD_ID,
                                         es_api_key=ELASTIC_API_KEY)

    # Embedding Model to do local embedding using Ollama.
    ollama_embedding = OllamaEmbedding("llama3")
    # LlamaIndex Pipeline configured to take care of chunking, embedding
    # and storing the embeddings in the vector store.
    pipeline = IngestionPipeline(
        transformations=[
            SentenceSplitter(chunk_size=512, chunk_overlap=100),
            ollama_embedding
        ], vector_store=es_vector_store
    )

ElasticsearchStore 定义了要创建的索引的名称、向量字段和内容字段。并且这个索引是在运行管道时创建的。

创建的索引映射如下:

管道使用以下步骤执行。管道运行完成后,索引 workplace_index 现在可供查询。请注意,向量字段 content_vector 被创建为维度为 4096 的密集向量。维度大小来自从 Llama3 生成的嵌入的大小。

    pipeline.run(show_progress=True,documents=documents)

步骤 4:LLM 配置

我们现在设置 Llamaindex 以使用 Llama3 作为 LLM。正如我们之前介绍的那样,这是在 Ollama 的帮助下完成的。

    Settings.embed_model = ollama_embedding
    local_llm = Ollama(model="llama3")

第 5 步:语义搜索

我们现在将 Elasticsearch 配置为 Llamaindex 查询引擎的向量存储。然后,查询引擎将使用来自 Elasticsearch 的上下文相关数据来回答你的问题。

    index = VectorStoreIndex.from_vector_store(es_vector_store)
    query_engine = index.as_query_engine(local_llm, similarity_top_k=10)

    # Customer Query
    query = "What are the organizations sales goals?"
    bundle = QueryBundle(query_str=query,
    embedding=Settings.embed_model.get_query_embedding(query=query))

    response = query_engine.query(bundle)

    print(response.response)

以下是我以 Llama3 作为 LLM 并以 Elasticsearch 作为向量数据库收到的回复。

    According to the "Fy2024 Company Sales Strategy" document, the organization's primary goal is to:

    * Increase revenue by 20% compared to fiscal year 2023.
    * Expand market share in key segments by 15%.
    * Retain 95% of existing customers and increase customer satisfaction ratings.
    * Launch at least two new products or services in high-demand market segments.

至此,基于使用 Llama3 作为本地 LLM 并生成嵌入的 RAG 设置就结束了。

现在让我们转到第二种方法,该方法使用 Llama3 作为本地 LLM,但我们使用 Elastic 的 ELSER v2 来生成嵌入并进行语义搜索。

方法 2:使用 Ollama 在本地运行 Elastic、Langchain、ELSER v2、Llama 3 (8B) 版本。

步骤 1:安装所需的依赖项。
    !pip install langchain
    !pip install langchain-elasticsearch
    !pip install langchain-community
    !pip install tiktoken

以上部分安装了所需的 langchain 包。

第 2 步:导入所需的依赖项

我们首先导入应用程序所需的包和类。此步骤与上述方法 1 中的第 2 步类似。

    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from langchain_elasticsearch import ElasticsearchStore
    from langchain_community.llms import Ollama
    from langchain.prompts import ChatPromptTemplate
    from langchain.schema.output_parser import StrOutputParser
    from langchain.schema.runnable import RunnablePassthrough
    from langchain_elasticsearch import ElasticsearchStore
    from langchain_elasticsearch import SparseVectorStrategy
    from getpass import getpass
    from urllib.request import urlopen
    import json

接下来,向用户提供提示以捕获云 ID 和 API 密钥值。

    #https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id
    ELASTIC_CLOUD_ID = getpass("Elastic Cloud ID: ")

    #https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key
    ELASTIC_API_KEY = getpass("Elastic Api Key: ")

步骤 3:文档处理

接下来,我们下载 json 文档并构建有效负载。

    url = "https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/datasets/workplace-documents.json"

    response = urlopen(url)
    workplace_docs = json.loads(response.read())
    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)

此步骤与方法 1 不同,因为我们使用 LlamaIndex 提供的管道来处理文档。这里我们使用 RecursiveCharacterTextSplitter 来生成块。

我们现在定义 Elasticsearch 向量存储 ElasticsearchStore。

    es_vector_store = ElasticsearchStore(
        es_cloud_id=ELASTIC_CLOUD_ID,
        es_api_key=ELASTIC_API_KEY,
        index_name="workplace_index_elser",
        strategy=SparseVectorStrategy(
            model_id=".elser_model_2_linux-x86_64"
        )
    )

向量存储定义了要创建的索引以及用于嵌入和检索的模型。你可以通过导航到机器学习下的训练模型来检索 model_id。

这还会导致在 Elastic 中创建一个摄取管道,该管道在将文档摄取到 Elastic 时生成并存储嵌入。

我们现在添加上面处理过的文档。

    es_vector_store.add_documents(documents=docs)

步骤 4:LLM 配置

我们设置要使用的 LLM,如下所示。这又不同于方法 1,在方法 1 中我们也使用 Llama3 进行嵌入。

    llm = Ollama(model="llama3")

第 5 步:语义搜索

现在,所有必要的构建块都已准备就绪。我们将它们组合在一起,使用 ELSER v2 和 Llama3 作为 LLM 执行语义搜索。本质上,Elasticsearch ELSER v2 使用其语义搜索功能为用户问题提供上下文相关的响应。然后,用户的问题将通过 ELSER 的响应得到丰富,并使用模板进行结构化。然后,使用 Llama3 对其进行处理以生成相关响应。

    def 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()
    )

    chain.invoke("What are the organizations sales goals?")

使用 Llama3 作为 LLM 并使用 ELSER v2 进行语义搜索的响应如下:

    According to the provided context, the organization's sales goals for Fiscal Year 2024 are:

    1. Increase revenue by 20% compared to fiscal year 2023.
    2. Expand market share in key segments by 15%.
    3. Retain 95% of existing customers and increase customer satisfaction ratings.

    These goals are outlined under "Objectives for Fiscal Year 2024" in the provided document.

这结束了基于使用 Llama3 作为本地 LLM 和使用 ELSER v2 进行语义搜索的 RAG 设置。

结论

在这篇博客中,我们研究了使用 Llama3 和 Elastic 实现 RAG 的两种方法。我们探索了 Llama3 作为 LLM 并生成嵌入。接下来,我们使用 Llama3 作为本地 LLM,并使用 ELSER 进行嵌入和语义搜索。我们使用了两个不同的框架,LlamaIndex 和 Langchain。你可以使用其中任何一个框架实现这两种方法。Notebook 使用 Llama3 8B 参数版本进行了测试。这两个 notebooks 都可以在这个 GitHub 位置找到。

准备好自己尝试一下了吗?开始免费试用。
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的高级语义搜索网络研讨会,构建你的下一个 GenAI 应用程序!

原文:Elasticsearch RAG: How to build RAG with Llama 3 open-source and Elastic — Elastic Search Labs

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

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

相关文章

用于快速充电站的 AC/DC 转换器概述

电动汽车构成了未来实现可持续交通部门的有前途技术的主要部分。AC/DC 转换器是扩展和改进 EV 功能的骨干组件。本文概述了 AC/DC 转换器、充电站类型、传统两电平 (2L) AC/DC 转换器面临的问题以及使用多电平转换器 (MLC) 的重要性。 AC/DC 充电器示意图(&#xff…

01 Shell编程规范与变量

1、Shell脚本概述 在一些复杂的Linux维护工作中,大量的重复性的输入和交互操作不仅费力费时,而且容易出错,而编写一个恰到好处的Shell脚本程序,可以批量处理、自动化地完成一系列维护任务,大大减轻管理员的负担。 Sh…

我在淄博,给唐朝古树办“身份证” | 《社区开放麦》首期预告

(预约直播) 或许每一个男孩都曾向往成为英雄,时常在内心预演用魔法拯救世界的场景。而回到没有超能力的现实生活,平凡人即便只有一技之长,也能拥有属于自己的“高光时刻”。 在开源社区,有这样一位青年对…

【机器学习 复习】第2章 线性回归及最大熵模型

一、概念 1.回归就是用一条曲线对数据点进行拟合,该曲线称为最佳拟合曲线,这个拟合过程称为回归。 2.一个自变量 叫 一元线性回归,大于一个自变量 叫 多元线性回归。 (1)多元回归:两个x,一个…

idea解决git代码冲突,提交代码冲突如何有效解决

当在提交代码的时候遇到问题冲突,是已经进行git commit , 但是在 git push 的时候,出现提交代码问题冲突 处理方式: 在IDEA 左下角,找到git 比如在git commint 之前忘记了 git pull ,那么很容易在git push 的时候出现问题&…

简单了解MyBatis

MyBatis 1、快速入门 MyBatis中文手册官网MyBatis中文网 1.1、创建数据表添加数据 create table user(id int auto_increment primary key comment 主键id,name varchar(20) comment 姓名,age int comment 年龄,gender char(1) comment 性别(1:男, 2…

AI写论文:如何结合AI工具和传统教学方法?

Sora——这个让人在24年初引爆AI圈的新产品,它究竟会如何改变我们的教育领域呢? 从gpt到Sora,从对话型的ai到游戏和短剧制作的新风口,我们从23年到24年一个接一个地被震惊! Sora能够根据文本提示生成高质量的视频内容…

Java实现自动定时任务配置并判断当天是否需要执行示例

最近接到一个需求,用户要能配置一个定时循环的任务,就是和手机闹钟循环差不多,设置好比如周一、周二、周三,那么在这几天内这个任务就需要自动执行 需求不复杂,首先我需要判断当前是周几,当然用户说了让我…

北航数据结构与程序设计图部分选填题

一、 抓两个关键信息:无向图,邻接表。无向图中,边(vi,vj)要在vi的链表中记录一次,再以(vj,vi)的形式在vj的链表中记录一次。 每个边都要记录两次&#xff0c…

大创项目推荐 酒店评价的情感倾向分析

前言 🔥 优质竞赛项目系列,今天要分享的是 酒店评价的情感倾向分析 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/post…

qemu 安装ubuntu22.04虚拟机 -纯命令行-可ssh-带网络-编译安装 linux kernel-编译安装 kernel module

1,预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount ubuntu-22.04.4-live-ser…

采用java+B/S架构开发的工业级UWB(Ultra-Wideband)室内定系统源码UWB定位系统技术接口及技术特点

采用javaB/S架构开发的工业级UWB(Ultra-Wideband)室内定系统源码UWB定位系统技术接口及技术特点 UWB(Ultra-Wideband)定位技术本身并不直接连接蓝牙或其他无线通信技术进行定位。然而,在实际应用中,UWB定位…

RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper

XML文件 ItemView的XML文件R.layout.shape_item_view <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"100dp"android:layout_heig…

Ubuntu 安装 CloudCompare

步骤&#xff1a; sudo apt install flatpakflatpak install flathub org.cloudcompare.CloudCompare此时会有报错&#xff1a; error: No remote refs found similar to ‘flathub’执行 flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.fla…

【大模型驯化-gradio】成功解决gradio出现httpcore.ReadTimeout: timed out问题

【大模型驯化-gradio】成功解决gradio出现httpcore.ReadTimeout: timed out问题 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取…

LeetCode刷题之HOT100之LRU缓存

2024/6/21 酷暑难耐&#xff0c;离开空调我将不知道能否《活着》&#xff0c;昨天跑步感觉全身的热无法排出去&#xff0c;出门那种热浪一阵一阵打过来&#xff0c;一点风都舍不得给我。早早的来到实验室&#xff0c;也没多早&#xff0c;九点哈哈&#xff0c;做题啦&#xff0…

Linux【实操篇-文件目录类命令】

05【实操篇-文件目录类命令】 1.pwd 显示当前工作目录的绝对路径 pwd:print working directory 打印工作目录 到现在为止&#xff0c;我们还不知道自己在系统的什么地方。在浏览器上&#xff0c;我们能够通过导航栏上的url&#xff0c;了解到自己在互联网上的具体坐标。相似的…

GNSS是什么意思?探索全球导航卫星系统的应用与发展

GNSS是什么意思&#xff1f;GNSS是全球导航卫星系统&#xff08;Global Navigation Satellite System&#xff09;的缩写&#xff0c;它借助于多颗位于地球轨道上的卫星&#xff0c;通过接收和处理卫星信号来实现高精度的全球定位和导航。GNSS系统不仅包括美国的GPS&#xff08…

C# 语言在AGI 赛道上能做什么

自从2022年11月OpenAI正式对外发布ChatGPT依赖&#xff0c;AGI 这条赛道上就挤满了重量级的选手&#xff0c;各大头部公司纷纷下场布局。原本就在机器学习、深度学习领域占据No.1的Python语言更是继续稳固了自己AI一哥的位置。凭借着Microsoft 和 OpenAI 长期以来一直是紧密相连…

CVPR 2024 以物体为中心的多感知具身大语言模型

CVPR 2024发表了关于多感知以对象为中心的具身大型语言模型&#xff08;MultiPLY&#xff09;的研究论文&#xff0c;该模型在3D环境中进行编码和交互。 提出MultiPLY是一个多感知的具身大型语言模型&#xff08;LLM&#xff09;&#xff0c;能够将视觉、听觉、触觉和温度等多…