用通俗易懂的方式讲解:使用Llama-2、PgVector和LlamaIndex,构建大模型 RAG 全流程

news2024/11/18 8:47:09

近年来,大型语言模型(LLM)取得了显著的进步,然而大模型缺点之一是幻觉问题,即“一本正经的胡说八道”。其中RAG(Retrieval Augmented Generation,检索增强生成)是解决幻觉比较有效的方法。

本文,我们将深入研究使用transformer库Llama-2模型PgVector数据库LlamaIndex库来构建RAG Pipeline完整过程。

文章目录

    • 技术交流&资料
    • 通俗易懂讲解大模型系列
    • 一、什么是RAG(检索增强生成)
    • 二、RAG的工作原理
    • 三、Llama-2:大语言模型
    • 四、PgVector:高效管理矢量数据
    • 五、LlamaIndex:连接语言和数据库
    • 六、代码实现
      • 6.1 安装transformers库
      • 6.2 安装PgVector
      • 6.3 安装LlamaIndex库
      • 6.4 初始化Llama-2
      • 6.5 设置PgVector
    • 七、结论

技术交流&资料

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

成立了大模型技术交流群,本文完整代码、相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

通俗易懂讲解大模型系列

  • 做大模型也有1年多了,聊聊这段时间的感悟!

  • 用通俗易懂的方式讲解:大模型算法工程师最全面试题汇总

  • 用通俗易懂的方式讲解:我的大模型岗位面试总结:共24家,9个offer

  • 用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

  • 用通俗易懂的方式讲解:一文讲清大模型 RAG 技术全流程

  • 用通俗易懂的方式讲解:如何提升大模型 Agent 的能力?

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解:一份保姆级的 Stable Diffusion 部署教程,开启你的炼丹之路

  • 用通俗易懂的方式讲解:对 embedding 模型进行微调,我的大模型召回效果提升了太多了

  • 用通俗易懂的方式讲解:LlamaIndex 官方发布高清大图,纵览高级 RAG技术

  • 用通俗易懂的方式讲解:使用 LlamaIndex 和 Eleasticsearch 进行大模型 RAG 检索增强生成

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

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

二、RAG的工作原理

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

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

三、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 ragdb
CREATE 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 model
tokenizer = 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 ragdb
CREATE EXTENSION pgvector;

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

import psycopg2

# Connect to the PostgreSQL database
conn = psycopg2.connect(dbname="ragdb", user="yourusername", password="yourpassword")

# Create a table for storing embeddings
cursor = 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, AutoModel
import torch

# Initialize the model and tokenizer
tokenizer = 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 abstract
embeddings = [generate_embeddings(abstract) for abstract in data]

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

6.8 使用LlamaIndex索引数据

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

import numpy as np
from llama_index import VectorStoreIndex


# Convert the list of embeddings to a NumPy array
embeddings_array = np.vstack(embeddings)

# Create an index for these embeddings
index = 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 database
conn = psycopg2.connect(dbname="ragdb", user="yourusername", password="yourpassword")
cursor = conn.cursor()

# Store each embedding in the database
for 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.coloradmin.cn/o/1396458.html

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

相关文章

Linux网络引导自动安装centos7

目录 一、部署PXE远程安装服务 1. 系统装机的三种引导方式 2. pxe概述 3. 实现过程 4. 搭建过程中服务介绍 4.1 TFTP服务 4.2 vsftp:安装系统镜像文件获取方式 4.3 syslinux 4.4 DHCP服务 5. 操作过程 二、实现Kickstart无人值守安装 1. 安装Kickstart图…

vue项目执行依赖安装(npm i或npm install )报ls-remote -h -t异常

从git拉取的vue项目执行依赖安装时一直报错, 报错如下图:首先,查看了node版本、npm配置的镜像地址均没找到解决办法。 在命令行中直接输入git发现提示于是从网上搜到了一个博文https://blog.csdn.net/weixin_49159364/article/details/118198…

ycsb压测mongodb

下载解压 https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-mongodb-binding-0.17.0.tar.gz tar -zxvf ycsb-mongodb-binding-0.17.0.tar.gzycsb提前已经在workload文件夹下准备好了几个压测场景分别对应workload[a:f] workloads/workloada 样例 …

【Linux】Linux系统编程——pwd命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 pwd(Print Working Directory)命令用于显示用户当前工作目录的完整路径。这是一个常用的命令,帮助用户确定他们目前所在的目录位置。 2.命令格式 基本的 pwd 命令…

CVer从0入门NLP(二)———LSTM、ELMO、Transformer模型

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊专栏推荐:深度学习网络原理与实战 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍🏼、…

恒创科技:云存储和网盘怎么区分出来?

随着互联网的发展,数据存储已成为人们日常生活中不可或缺的一部分。云存储和网盘是经常被人们提及的两种存储方式,均通过网络进行数据存储和访问的服务。但,它们在技术实现、数据安全性、访问方式和数据容量等方面存在一定的差异。要区分&…

DAY04_Spring—Aop案例引入代理机制

目录 1 AOP1.1 AOP案例引入1.1.1 数据库事务说明 1.2 Spring实现事务控制1.2.1 代码结构如下1.2.2 编辑User1.2.3 编辑UserMapper/UserMapperImpl1.2.4 编辑UserService/UserServiceImpl1.2.5 编辑配置类1.2.6 编辑测试类 1.3 代码问题分析1.4 代理模式1.4.1 生活中代理案例1.4…

赋能客户不停歇,卓翼飞思职业院校无人智能装备师资培训圆满落幕

1月10日-15日,卓翼飞思在北京研发中心成功举办职业院校无人智能装备高级师资培训。来自湖南汽车工程职业学院(以下简称:湖南汽车职院)的10名师生&技术人员参与此次培训,针对无人智能集群应用开发进行系统性的培训及…

图卷积GCN实战基于网络结构图的网络表示学习实战

下面的是数据: from,to,cost 73,5,352.6 5,154,347.2 154,263,392.9 263,56,440.8 56,96,374.6 96,42,378.1 42,58,364.6 58,95,476.8 95,72,480.1 72,271,419.5 271,68,251.1 134,107,344.0 107,130,862.1 130,129,482.5 227,167,1425.7 167,298,415.7 298,209,42…

(vue)键值对结构数据展示

(vue)键值对结构数据展示 效果: 数据结构: this.formInline.algorithmText [{algorithmParameters: {参数名1: "111",参数名2: "121,122",},algorithmName: "算法1",algorithmId: 9,},{algorithmParameters: {参数名1:…

Android安卓读写低频EM4469卡源码

本示例使用的发卡器&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.…

Qt通用属性工具:随心定义,随时可见(三)

传送门: 《Qt通用属性工具:随心定义,随时可见(一)》 《Qt通用属性工具:随心定义,随时可见(二)》 《Qt通用属性工具:随心定义,随时可见(三)》 一、效果展示 本文将展示的是一个源于Qt但是却有些年头的Qt属性浏览工具。支持交互式编辑和查阅对象属性。 这可不就是妥…

机器学习--人工智能概述

人工智能概述 入门人工智能&#xff0c;了解人工智能是什么。为啥发展起来&#xff0c;用途是什么&#xff0c;是最重要也是最关键的事情。大致有以下思路。 人工智能发展历程机器学习定义以及应用场景监督学习&#xff0c;无监督学习监督学习中的分类、回归特点知道机器学习…

产品经理学习-产品运营《用户运营策略》

⽤户画像与⽤户运营策略 什么是用户画像 对产品运营而言&#xff0c;用户画像就是对用户的各种特征贴上标签通过这些标签将用户分成不同的用户群体 为用户提供有针对性的服务。 制作用户画像是为了专注和精准 使产品的服务对象更加聚焦&#xff0c;更加专注&#xff1b;根据产…

NIFI 2.0.0版本HTTPS访问部署

1. 相关环境 服务器&#xff1a;centos JDK&#xff1a;jdk21 NIFI: nifi-2.0.0-M1 2. 下载NIFI 下载NIFI https://nifi.apache.org/download/ 将文件上传至服务器指定目录&#xff0c;解压缩 修改 bin 目录下的脚本文件 ​ 注意: nifi 2.0.0 版本需要jdk21&#xff0c;所…

C++ 二叉树OJ题

目录 1、606. 根据二叉树创建字符串 2、102. 二叉树的层序遍历 3、107. 二叉树的层序遍历 II 4、236. 二叉树的最近公共祖先 5、JZ36 二叉搜索树与双向链表 6、105. 从前序与中序遍历序列构造二叉树 7、106. 从中序与后序遍历序列构造二叉树 8、144. 二叉树的前序遍历…

pdf怎么查看?6个不能错过的软件!

PDF&#xff0c;作为一种常用的文件格式&#xff0c;已经成为了我们工作、学习中的必备工具。然而&#xff0c;对于许多新手来说&#xff0c;如何查看和编辑PDF文件却是一个不小的挑战。今天&#xff0c;我们就来为大家详细介绍一下如何查看和编辑PDF文件&#xff0c;以及一些必…

从法律的角度看待项目前期可行性研究的必要性

前言 在司法实践中&#xff0c;很多纠纷展现出来的问题是项目提供方没有按照合同约定履行发生违约的情况&#xff0c;例如逾期交付、项目不符合约定标准等等&#xff0c;但是这些情况发生的原因是各不相同的&#xff0c;其中有一类纠纷的发生却是从一开始就埋下了风险的种子&a…

2.0-学成在线内容管理

内容管理模块 1.需求 1.1 业务流程 内容管理的业务由教学机构人员和平台的运营人员共同完成。 教学机构人员的业务流程如下&#xff1a; 1、登录教学机构。 2、维护课程信息&#xff0c;添加一门课程需要编辑课程的基本信息、上传课程图片、课程营销信息、课程计划、上传课程…

深入详解使用 RabbitMQ 过程中涉及到的多个细节问题(面试可用)

目录 1、基础类问题 2、cluster 相关问题 3、综合性问题 4、参考资料 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/125529931C/C基础与进阶&…