书生大模型实战营——llamaindex+Internlm2 RAG实践
本文最后更新于256 天前,其中的信息可能已经过时,如有错误请发送邮件到mapleleaf2333@gmail.com

本文参考实战营提供的教程:camp3 · InternLM/Tutorial (github.com)

本文将记录RAG的具体实践过程,具体内容包含:

  • RAG原理介绍
  • 环境配置
  • LlamaIndex HuggingFaceLLM
  • LlamaIndex RAG

1 RAG原理介绍

给模型注入新知识的方式,可以简单分为两种方式,一种是内部的,即更新模型的权重,另一个就是外部的方式,给模型注入格外的上下文或者说外部信息,不改变它的的权重。 第一种方式,改变了模型的权重即进行模型训练,这是一件代价比较大的事情,大语言模型具体的训练过程,可以参考InternLM2技术报告。第二种方式,并不改变模型的权重,只是给模型引入格外的信息。

RAG正是属于第二种方式。RAG(Retrieval-Augmented Generation)是一种将信息检索和生成式模型结合的方法。它利用外部知识库或文档库进行信息检索,并将检索到的信息与生成模型结合起来,以生成更准确和信息丰富的回答。通常其完整流程包括:

  • 数据准备阶段:
    • 数据提取:从外部知识库、文档库或互联网等来源中提取相关数据。这些数据可以包括文章、论文、网页、书籍等多种形式。
    • 分块(Chunking):将提取到的大块数据分割成较小的段落或片段(chunk),以便更高效地进行后续处理和检索。
    • 向量化(embedding):使用预训练的嵌入模型(如BERT、Sentence-BERT等)将分块后的数据转换为向量表示。这些向量表示可以捕捉到数据的语义信息,便于后续的相似度计算。
    • 数据入库:将向量化后的数据存储到一个高效的检索系统中(如FAISS、Elasticsearch等),以便快速检索和匹配。
  • 检索生成阶段:
    • 问题向量化:用户提出问题后,使用与数据向量化相同的嵌入模型将问题转换为向量表示。
    • 根据问题匹配数据:使用问题的向量表示在数据向量库中进行相似度计算,找到与问题最相关的若干个数据片段(chunk)。
    • 获取索引数据:从检索系统中获取与问题匹配的高相似度数据片段。这些片段包含了可能回答用户问题的信息。
    • 将数据注入prompt:将检索到的数据片段与用户的问题结合,形成一个完整的Prompt。这通常包括将问题和相关数据片段拼接在一起,提供给生成模型。
    • LLM生成答案:生成模型(如GPT-4)接收包含用户问题和检索数据的Prompt,生成最终的答案。生成模型会基于提供的上下文信息,生成一个尽可能准确和信息丰富的回答。
image-20240730111930978

2 相关知识介绍

2.1 llamaindex

LlamaIndex 是一个开源的库,用于将大规模语言模型(LLM,如 GPT-3)与结构化数据(如表格、数据库、文档)相结合。LlamaIndex 允许用户更容易地使用语言模型来查询和处理这些数据源,以便生成有用的答案或执行复杂的任务。

LlamaIndex 的主要功能包括:

  1. 索引创建:LlamaIndex 可以创建数据的索引,使语言模型能够更高效地访问和查询这些数据。
  2. 查询优化:通过对查询进行优化,LlamaIndex 提供了更快和更准确的查询结果。
  3. 数据处理:LlamaIndex 支持多种数据格式,并且可以对这些数据进行预处理和转换,以便更好地适应语言模型的需求。
  4. 集成支持:LlamaIndex 可以与多种数据库和数据源集成,包括 SQL 数据库、NoSQL 数据库、文件系统等。

LlamaIndex提供以下工具:

  • 数据连接器:从原始来源和格式获取使用者现有的数据。这些来源可能是 API、PDF、SQL 等等。
  • 数据索引:将使用的数据结构化为中间表示,使 LLMs 更容易和高效地使用。
  • 引擎:提供自然语言访问你的数据。例如:
    • 查询引擎:用于问答的强大接口(例如,RAG 管道)。
    • 聊天引擎:用于多消息“来回”互动的对话接口。
  • 代理:由 LLM 驱动的知识工作者,增强了工具,从简单的辅助函数到 API 集成等。
  • 可观察性/评估集成:使使用者能够严格地实验、评估和监控你的应用程序,形成良性循环。

2.2 huggingface

Hugging Face 是一家致力于推进自然语言处理(NLP)和机器学习的公司,提供了广泛的工具和平台,帮助开发者和研究人员在这些领域中更高效地工作。其提供了以下实用工具:

Transformers 库

  • 一个流行的开源库,提供了大量预训练的语言模型,如 BERT、GPT、RoBERTa 等。
  • 用于各种 NLP 任务,如文本分类、问答、翻译和摘要。

Datasets 库

  • 提供了轻量级且易用的数据集加载和处理工具,支持数百个公开数据集。
  • 简化了数据加载、预处理和使用的过程。

Tokenizers 库

  • 一个快速且灵活的文本分词库,支持多种分词算法,如 BERT、GPT-2 等。
  • 高效处理大规模数据,使用简单。

Hugging Face Hub

  • 一个托管和共享机器学习模型和数据集的平台。
  • 用户可以上传和下载模型与数据集,并与社区共享资源。

Inference API

  • 允许用户轻松地将机器学习模型部署到生产环境中,通过简单的 API 调用在云端运行推理任务。

3 环境配置

3.1 基础配置

首先我们依然使用InterLM提供的开发机,采用的配置如下所示:

image-20240730155029943

然后我们在终端通过命令创建新的环境:

conda create -n llamaindex python=3.10

通过如下命令进入环境,并安装必要的包

conda activate llamaindex
conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.7 -c pytorch -c nvidia

再安装python依赖包

pip install einops
pip install  protobuf

3.2 安装llamaindex相关的包

conda activate llamaindex
pip install llama-index==0.10.38 llama-index-llms-huggingface==0.2.0 "transformers[torch]==4.41.1" "huggingface_hub[inference]==0.23.1" huggingface_hub==0.23.1 sentence-transformers==2.7.0 sentencepiece==0.2.0

3.3 下载Sentence Transformer 模型

这个模型是相对轻量、支持中文且效果较好的源词向量模型,先要新建一个python文件

cd ~
mkdir llamaindex_demo
mkdir model
cd ~/llamaindex_demo
touch download_hf.py

并将如下代码粘贴到文件中

import os

# 设置环境变量
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 下载模型
os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/model/sentence-transformer')

在llamaindex环境中运行该脚本

3.4 下载 NLTK 相关资源

NLTK,全称是Natural Language Toolkit,是一个用于处理和分析人类语言数据的Python库。它提供了一系列工具和库,用于文本处理、语法分析、语言建模、信息提取、机器学习等任务

我们在使用开源词向量模型构建开源词向量的时候,需要用到第三方库 nltk 的一些资源。正常情况下,其会自动从互联网上下载,但可能由于网络原因会导致下载中断,此处我们可以从国内仓库镜像地址下载相关资源,保存到服务器上。 我们用以下命令下载 nltk 资源并解压到服务器上:

cd /root
git clone https://gitee.com/yzy0612/nltk_data.git --branch gh-pages
cd nltk_data
mv packages/* ./
cd tokenizers
unzip punkt.zip
cd ../taggers
unzip averaged_perceptron_tagger.zip

4 LlamaIndex HuggingFaceLLM

运行以下指令,把 InternLM2 1.8B 软连接出来

这个命令会在当前目录(./)下创建一个符号链接,这个链接会指向指定目录。这样,在当前目录下,使用这个符号链接就可以访问实际存储在指定目录的内容

cd ~/model
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/ ./

我们创建一个python脚本,来试验直接向大模型提一个问题

from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core.llms import ChatMessage
llm = HuggingFaceLLM(
model_name="/root/model/internlm2-chat-1_8b",
tokenizer_name="/root/model/internlm2-chat-1_8b",
model_kwargs={"trust_remote_code":True},
tokenizer_kwargs={"trust_remote_code":True}
)

rsp = llm.chat(messages=[ChatMessage(content="LMDeploy是什么?")])
print(rsp)

运行结果如下所示:

image-20240730204153373

可以看到模型的效果很一般,并不能有效回答问题。

5 LlamaIndex RAG

我们将采用RAG技术来增强大模型的能力,首先需要安装LlamaIndex词嵌入向量依赖

pip install llama-index-embeddings-huggingface llama-index-embeddings-instructor

然后我们需要运行以下命令来获取新的知识库:

cd ~/llamaindex_demo
mkdir data
cd data
git clone https://github.com/InternLM/lmdeploy.git
mv lmdeploy/README_zh-CN.md ./

我们再创建一个新的脚本llamaindex_RAG.py,填入以下代码:

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings

from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM

#初始化一个HuggingFaceEmbedding对象,用于将文本转换为向量表示
embed_model = HuggingFaceEmbedding(
#指定了一个预训练的sentence-transformer模型的路径
model_name="/root/model/sentence-transformer"
)
#将创建的嵌入模型赋值给全局设置的embed_model属性,
#这样在后续的索引构建过程中就会使用这个模型。
Settings.embed_model = embed_model

llm = HuggingFaceLLM(
model_name="/root/model/internlm2-chat-1_8b",
tokenizer_name="/root/model/internlm2-chat-1_8b",
model_kwargs={"trust_remote_code":True},
tokenizer_kwargs={"trust_remote_code":True}
)
#设置全局的llm属性,这样在索引查询时会使用这个模型。
Settings.llm = llm

#从指定目录读取所有文档,并加载数据到内存中
documents = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()
#创建一个VectorStoreIndex,并使用之前加载的文档来构建索引。
# 此索引将文档转换为向量,并存储这些向量以便于快速检索。
index = VectorStoreIndex.from_documents(documents)
# 创建一个查询引擎,这个引擎可以接收查询并返回相关文档的响应。
query_engine = index.as_query_engine()
response = query_engine.query("LMDeploy是什么?")

print(response)

之后运行该文件,运行结果如下所示:

image-20240730210848551

可以看到模型能够回答我们的问题了,但是效果并没有非常好,这是因为我们提供的知识库对应的训练数据不足。

文章作者: 落尘Alko
链接: http://mapleleaf666.vip/?p=597
来源: 落尘Alko的小窝
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇