LLM之RAG实战(十六)| 使用Llama-2、PgVector和LlamaIndex构建LLM Rag Pipeline

       近年来,大型语言模型(LLM)取得了显著的进步,然而大模型缺点之一是幻觉问题,即“一本正经的胡说八道”。其中RAG(Retrieval Augmented Generation,检索增强生成)是解决幻觉比较有效的方法。本文,我们将深入研究使用transformer库Llama-2模型PgVector数据库LlamaIndex库来构建RAG Pipeline完整过程。

一、什么是RAG(检索增强生成)?

       检索增强生成(RAG)模型是传统语言模型与信息检索组件的融合。从本质上讲,RAG利用外部数据(通常来自大型语料库或数据库)来增强大语言模型生成过程,以产生更知情和上下文相关的响应。

二、RAG的工作原理

检索阶段:当查询输入到RAG系统时,首先从数据库中检索相关信息。

增强阶段:然后将检索到的数据输入到一个语言模型中,比如案例中的Llama-2,它会生成一个响应。这种响应不仅基于模型预先训练的知识,还基于在第一阶段检索到的特定信息。

三、Llama-2:大语言模型

       关于Llama-2模型的介绍,可以参考我之前的文章Meta发布升级大模型LLaMA 2:开源可商用

主要功能

多功能性:Llama-2可以处理各种NLP任务。

上下文理解:它擅长于掌握对话或文本的上下文。

语言生成:Llama-2可以生成连贯且符合上下文的反应。

为什么Llama-2用于RAG?:Llama-2在性能和计算效率方面的平衡使其成为RAG管道的理想候选者,尤其是在处理和生成基于大量检索数据的响应时。

四、PgVector:高效管理矢量数据

       PgVector是PostgreSQL的扩展,PostgreSQL是一个流行的开源关系数据库。它是为处理高维矢量数据而定制的,就像Llama-2等语言模型生成的数据一样。PgVector允许对矢量数据进行高效存储、索引和搜索,使其成为涉及大型数据集和复杂查询的项目的重要工具。

主要功能

效率:为快速检索高维数据而优化。

集成:与PostgreSQL数据库无缝集成。

可扩展性:适用于处理大规模矢量数据集。

RAG中的重要性:对于RAG,PgVector提供了一个优化的数据库环境来存储和检索矢量化形式的数据,这对检索阶段至关重要。

五、LlamaIndex:连接语言和数据库

       LlamaIndex可以使用Llama-2将文本数据转换为向量,然后将这些向量存储在由PgVector授权的PostgreSQL数据库中。这种转换对于实现基于语义相似性而不仅仅是关键字匹配的高效文本检索至关重要。

主要功能

语义索引:将文本转换为表示语义的向量。

数据库集成:存储和检索PostgreSQL中的矢量数据。

增强检索:方便高效、上下文感知的搜索功能。

RAG中的角色:LlamaIndex对于有效搜索存储在PgVector数据库中的嵌入至关重要,它便于根据查询输入快速检索相关数据。

六、代码实现

       在项目开发之前,确保正确设置环境以及安装好必要的库:

6.1 安装transformers库

       Hugging Face的transformer库是使用Llama-2等模型的基石,它为自然语言处理任务提供了对预先训练的模型和实用程序的轻松访问。

pip install transformers

       此命令安装transformer库的最新版本,其中包括加载和使用Llama-2模型所需的功能。

6.2 安装PgVector

       PgVector是PostgreSQL的扩展,有助于有效处理矢量数据。这对于管理LLM中使用的嵌入和实现快速检索操作尤为重要。

下载PostgreSQL

        访问PostgreSQL官方网站(https://www.postgresql.org/download/)并为您的操作系统选择适当的版本。PostgreSQL兼容各种平台,包括Windows、macOS和Linux。

      首先,确保PostgreSQL已安装并在您的系统上运行。然后,安装PgVector扩展:

pip install pgvector

       安装后,您需要创建一个PostgreSQL数据库,并在其中启用PgVector扩展:

CREATE DATABASE ragdb;\c ragdbCREATE EXTENSION pgvector;

      此SQL命令序列创建一个名为ragdb的新数据库,并激活其中的PgVector扩展。

6.3 安装LlamaIndex库

       LlamaIndex是专门为索引和检索矢量数据而设计的,使其成为RAG管道的重要组成部分。

pip install llama-index

       此命令安装LlamaIndex库,使您能够为矢量数据创建和管理索引。

RAG Pipeline如下图所示:

       构建LLM RAG管道包括几个步骤:初始化Llama-2进行语言处理,使用PgVector建立PostgreSQL数据库进行矢量数据管理,以及创建集成LlamaIndex的函数以将文本转换和存储为矢量。

6.4 初始化Llama-2

      构建RAG管道的第一步包括使用Transformers库初始化Llama-2模型。这个过程包括建立模型及其标记器,这对编码和解码文本至关重要。

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM# Load the tokenizer and modeltokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")model = AutoModelForSeq2SeqLM.from_pretrained("meta-llama/Llama-2-7b-hf")

       在这个片段中,我们从llama-2包中导入LlamaModel,并使用特定的模型变体(例如“llama2-large”)对其进行初始化,该模型将用于文本生成和矢量化。

6.5 设置PgVector

       一旦模型准备就绪,下一步就是建立PgVector数据库,用于存储和检索矢量化数据。

PostgreSQL数据库设置:

安装PostgreSQL:确保PostgreSQL已安装并正在运行。

创建数据库并启用PgVector:

CREATE DATABASE ragdb;\c ragdbCREATE EXTENSION pgvector;

用于数据库交互的Python代码:

import psycopg2# Connect to the PostgreSQL databaseconn = psycopg2.connect(dbname="ragdb", user="yourusername", password="yourpassword")# Create a table for storing embeddingscursor = conn.cursor()cursor.execute("CREATE TABLE embeddings (id serial PRIMARY KEY, vector vector(512));")conn.commit()

       这段代码创建了一个到PostgreSQL数据库的连接,并设置了一个用于存储嵌入的表。矢量(512)数据类型是一个例子;可以根据模型的输出调整大小。

6.6 数据准备

       对于这个例子,让我们使用一个与可再生能源相关的科学摘要的简单数据集。数据集由摘要列表组成,每个摘要都是一个字符串。

data = [    "Advances in solar panel efficiency have led to a significant reduction in cost.",    "Wind turbines have become a major source of renewable energy in the past decade.",    "The development of safer nuclear reactors opens new possibilities for clean energy.",    # Add more abstracts as needed]

6.7 生成嵌入

       要从这些数据生成嵌入,我们首先需要加载Llama-2模型,并通过它处理每个抽象。

安装要求:

pip install torch

安装完torch后,执行以下代码。

from transformers import AutoTokenizer, AutoModelimport torch# Initialize the model and tokenizertokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")model = AutoModel.from_pretrained("meta-llama/Llama-2-7b-hf")def generate_embeddings(text):    inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)    with torch.no_grad():        outputs = model(**inputs)    return outputs.last_hidden_state.mean(dim=1).numpy()# Generate embeddings for each abstractembeddings = [generate_embeddings(abstract) for abstract in data]

       此函数通过Llama-2模型处理每个抽象,以生成嵌入,然后将嵌入存储在列表中。

6.8 使用LlamaIndex索引数据

      嵌入准备好后,我们现在可以使用LlamaIndex对它们进行索引。这一步骤对于以后实现高效检索至关重要。

import numpy as npfrom llama_index import VectorStoreIndex# Convert the list of embeddings to a NumPy arrayembeddings_array = np.vstack(embeddings)# Create an index for these embeddingsindex = VectorStoreIndex.from_documents(    documents, service_context=embeddings_array)

       此代码块将嵌入列表转换为NumPy数组,然后使用LlamaIndex创建一个名为“energy_abstracts_index”的索引。

6.9 与PostgreSQL集成

       最后,为了将其与PostgreSQL数据库集成(假设您已经如前所述使用PgVector进行了设置),您可以将这些嵌入存储在数据库中。

安装要求:

pip install psycopg2

          安装“psycopg2”后,实现以下代码以将嵌入存储在数据库中。

import psycopg2# Connect to your PostgreSQL databaseconn = psycopg2.connect(dbname="ragdb", user="yourusername", password="yourpassword")cursor = conn.cursor()# Store each embedding in the databasefor i, embedding in enumerate(embeddings_array):    cursor.execute("INSERT INTO embeddings (id, vector) VALUES (%s, %s)", (i, embedding))conn.commit()

      在这个片段中,我们有一个示例文本的列表。我们循环遍历每个文本,index_document函数将文本转换为向量并将其存储在数据库中。

6.10 集成RAG管道

      设置好各个组件后,将它们集成到检索增强生成(RAG)管道中是最后一步。这包括创建一个系统来处理查询,从数据库中检索相关信息,使用Llama-2模型生成响应。

创建RAG查询函数

       RAG Pipeline的核心是一个函数,它接受用户查询,从数据库中检索相关上下文,并基于查询和检索到的上下文生成响应。

def your_retrieval_condition(query_embedding, threshold=0.7):      # Convert query embedding to a string format for SQL query    query_embedding_str = ','.join(map(str, query_embedding.tolist()))    # SQL condition for cosine similarity    condition = f"cosine_similarity(vector, ARRAY[{query_embedding_str}]) > {threshold}"    return condition

       现在,让我们将这个自定义检索逻辑集成到我们的RAG管道中:

def rag_query(query):    # Tokenize and encode the query    input_ids = tokenizer.encode(query, return_tensors='pt')    # Generate query embedding    query_embedding = generate_embeddings(query)    # Retrieve relevant embeddings from the database    retrieval_condition = your_retrieval_condition(query_embedding)    cursor.execute(f"SELECT vector FROM embeddings WHERE {retrieval_condition}")    retrieved_embeddings = cursor.fetchall()     # Convert the retrieved embeddings into a tensor    retrieved_embeddings_tensor = torch.tensor([emb[0] for emb in retrieved_embeddings])    # Combine the retrieved embeddings with the input_ids for the model    # (This step may vary based on your model's requirements)    combined_input = torch.cat((input_ids, retrieved_embeddings_tensor), dim=0)    # Generate the response    generated_response = model.generate(combined_input, max_length=512)    return tokenizer.decode(generated_response[0], skip_special_tokens=True)

      让我们看看我们的RAG管道将如何与示例查询一起工作:

query = "What are the latest advancements in renewable energy?"response = rag_query(query)print("Response:", response)

       在这种情况下,管道检索与“可再生能源”进步相关的上下文,将其与查询相结合,并生成全面的响应。

七、结论

       利用Llama-2、PgVector和LlamaIndex构建LLM-RAG管道,为NLP领域开辟了一个可能性领域。这个管道不仅可以理解和生成文本,而且还利用庞大的信息数据库来增强其响应,使其在聊天机器人、推荐系统等各种应用程序中具有难以置信的强大功能。

       然而,旅程并没有就此结束。NLP的世界正在迅速发展,保持最新趋势和技术的更新至关重要。这里讨论的实现是进入更广泛、更复杂的语言理解和生成世界的垫脚石。不断试验,不断学习,最重要的是不断创新。

参考文献:

[1] https://medium.com/@shaikhrayyan123/how-to-build-an-llm-rag-pipeline-with-llama-2-pgvector-and-llamaindex-4494b54eb17d

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS第 6 课 编写简单的订阅器 Subscriber

文章目录 第 6 课 编写简单的订阅器 Subscriber1. 编写订阅者节点2. 测试发布者和订阅者 第 6 课 编写简单的订阅器 Subscriber 订阅器是基于编辑了发布器的基础上创建的,只有发布了消息,才有可能订阅。若未编辑发布器,可前往"ROS第5课 …

C语言练习day7

数包含9的数 包含数字9的数_牛客题霸_牛客网 题目: 思路:首先,我们得生成1~2019之间的数字,其次再通过各个位数来比较是否等于9,若等于,则记录一次,反之,不记录。 代码演示&…

MATLAB - 加载预定义的机器人模型

系列文章目录 前言 一、 要快速访问常见的机器人模型,可使用 loadrobot 功能,该功能可加载市售的机器人模型,如 Universal Robots™ UR10 cobot、Boston Dynamics™ Atlas 人形机器人和 KINOVA™ Gen 3 机械手。探索如何生成关节配置并与机器…

SAP银企直联报错排查方法与步骤-F110

银企直联的报错排查经常需要利用F110来查询。方法步骤如下: 1、首先要确定报错是哪天的,并且当天那一次跑的付款建议。需要通过表 REGUH来确认(跟据供应商编码、日期) 2、通过REGUH表的信息知道了是2024年1月16号第5个标识(也就是第五次跑付…

【QML COOK】- 010-动态创建组件

上节介绍了Component的概念,本节介绍一下如何使用javascript动态创建对象。 1. 创建工程,新建一个MyComponent.qml的qml import QtQuickRectangle {color: "red" }它很简单就是一个红色框 2. 编辑main.qml import QtQuickWindow {id: root…

刘知远LLM入门到实战——自然语言基础

文章目录 自然语言处理基础词表示语言模型N-gram ModelNeural Language Model: 为什么NLP等领域的模型越来越大? 大模型会带来哪些新的范式和挑战? 自然语言处理基础 让计算机理解人类语言,图灵测试就是基于对话的方式。 研究历史&#xff…

SpringBoot:详解依赖注入和使用配置文件

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、&#x1f3…

django后台手机号加密存储

需求: 1 :员工在填写用户的手机号时,直接填写,在django后台中输入 2:当员工在后台确认要存储到数据库时,后台将会把手机号进行加密存储,当数据库被黑之后,手机号字段为加密字符 3&am…

青少年的敏感心理

这几天的某个闲暇时刻,突然想起一个有意思的话题。关于青少年的心理,尤其是青春期的心理,这是敏感的一种心理状态。 依稀记得那大概是初一或者是更低年级的样子,当时父母外出务工,高中以前都是和奶奶一起长大。具体事…

数据科学与大数据导论期末复习笔记(大数据)

来自于深圳技术大学,此笔记涵盖了期末老师画的重点知识,分享给大家。 等深分箱和等宽分箱的区别:等宽分箱基于数据的范围来划分箱子,每个箱子的宽度相等。等深分箱基于数据的观测值数量来划分箱子,每个箱子包含相同数量…

跟着cherno手搓游戏引擎【8】按键和鼠标的KeyCode

自定义KeyCode 先把glfw3.h里的KeyCode的定义抄到咱这里来。 在YOTO下创建KeyCode.h: #pragma once#ifdef YT_PLATFORM_WINDOWS///从glfw3中拿的 #define YT_KEY_SPACE 32 #define YT_KEY_APOSTROPHE 39 /* */ #define YT_KEY_COMMA 44…

Video 不支持微信小程序的show-bottom-progress属性

原文地址:Video 不支持微信小程序的show-bottom-progress属性-鹭娃网络 相关平台 微信小程序 小程序基础库: 2.20.1使用框架: React 复现步骤 import { Video} from tarojs/components; 渲染一个Video播放视频,无法隐藏手机屏幕最底部的进度条&#…

springcloud Alibaba中gateway和sentinel联合使用

看到这个文章相信你有一定的sentinel和gateway基础了吧。 官网的gateway和sentinel联合使用有些过时了,于是有了这个哈哈,给你看看官网的: 才sentinel1.6,现在都几了啊,所以有些过时。 下面开始讲解: 首先…

day02_计算机常识丶第一个程序丶注释丶关键字丶标识符

计算机常识 计算机如何存储数据 计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。 进制 进制也就是进位计数制,是人为定义的带进位的计数方法 实例: // 在java 中 可以使用不同…

Linux实操学习

Linux常用操作 一、帮助命令1. man1.1 基本语法1.2 快捷键1.3 注意事项 2. help2.1 基本语法2.2 注意事项 3. 常用快捷键 二、文件目录类1. 常规操作1.1 pwd1.2 cd1.3 ls 2. 文件夹操作2.1 mkdir2.2 rmdir 3. 文件操作3.1 touch3.2 cp3.3 rm3.4 mv 4. 文件查看4.1 cat4.2 more4…

【视觉SLAM十四讲学习笔记】第五讲——相机模型

专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角 【视觉SLAM十四讲学习笔记】第三讲——四元…

部署本地GPT

在现实生活中,很多公司或个人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的本地专属GPT变得非常重要。 先看效果: 查资料不用愁 家教不…

CF1178F2 Long Colorful Strip 题解 搜索

Long Colorful Strip 传送门 题面翻译 题目描述 这是 F 题的第二个子任务。F1 和 F2 的区别仅在对于 m m m 和时间的限制上 有 n 1 n1 n1 种颜色标号从 0 0 0 到 n n n,我们有一条全部染成颜色 0 0 0 的长为 m m m 的纸带。 Alice 拿着刷子通过以下的过…

3种ffmpeg-web端视频直播推流方案

ffmpeg-web端视频直播推流方案 记录了三种 ffmpeg 工具进行推流的方法,并在web端实现直播效果。 一. node-media-server ffmpeg 推流rtmp 安装node-media-server依赖,新建app.js运行 npm install node-media-server -g const NodeMediaServer require(node-…

flash-attn库安装记录

flash-attn库安装记录 第一步: 安装好cuda11.7 第二步: 使用代码export CUDA_HOME/usr/local/cuda-11.7让库找到cuda路径 第三步: 使用pip install flash-attn --no-build-isolation安装 安装成功显示
最新文章