LazyLLM教程 | 第2讲:10分钟上手一个最小可用RAG系统

贴心小梗概

本文将介绍使用LazyLLM搭建最基础的RAG的流程。首先介绍使用LazyLLM搭建RAG系统的必要环境配置,然后简单回顾RAG的基本流程,接下来分别介绍RAG中文档加载、检索组件、生成组件三个关键部分的参数和基本使用方法,最后利用LazyLLM实现最简单的RAG,并展示相关效果。

环境准备

在使用LazyLLM搭建RAG系统之前,我们需要配置好相关的环境,包括“开发环境搭建”和“环境变量配置”两个步骤。

1.开发环境搭建

您可以用以下任一方式搭建 LazyLLM 开发环境。

📌手动配置

LazyLLM 基于 Python 开发,我们需要保证系统中已经安装好了 Python, Pip 和 Git。在Macbook上安装这些比较复杂,安装方式见附录。

首先准备一个名为 lazyllm-venv 的虚拟环境并激活:

python -m venv lazyllm-venv
source lazyllm-venv/bin/activate

如果运行正常,你可以在命令行的开头看到 (lazyllm-venv) 的提示。接下来我们的操作都在这个虚拟环境中进行。

从 GitHub 下载 LazyLLM 的代码:

git clone https://github.com/LazyAGI/LazyLLM.git

并切换到下载后的代码目录:

cd LazyLLM

安装基础依赖:

pip3 install -r requirements.txt

把 LazyLLM 加入到模块搜索路径中:

export PYTHONPATH=$PWD:$PYTHONPATH

这样我们在任意目录下都可以找到它。

📌拉取镜像

我们提供了包含最新版本的 LazyLLM 的 docker 镜像,开箱即用:

docker pull lazyllm/lazyllm

也可以从 https://hub.docker.com/r/lazyllm/lazyllm/tags 查看并拉取需要的版本。

📌从Pip安装

LazyLLM 支持用 pip 直接安装,下面三种安装方式分别对应不同功能的使用。

安装 LazyLLM 基础功能的最小依赖包。可以支持线上各类模型的微调和推理。

pip3 install lazyllm

安装 LazyLLM 的所有功能最小依赖包。不仅支持线上模型的微调和推理,而且支持离线模型的微调(主要依赖 LLaMA-Factory)和推理(大模型主要依赖 vLLM,多模态模型依赖LMDeploy,Embedding模型依赖Infinity)。

pip3 install lazyllm
lazyllm install standard

安装 LazyLLM 的所有依赖包,所有功能以及高级功能都支持,比如自动框架选择(AutoFinetune、AutoDeploy 等)、更多的离线推理工具(如增加 LightLLM 等工具)、更多的离线训练工具(如增加 AlpacaloraFinetune、CollieFinetune 等工具)。

pip3 install lazyllm
lazyllm install full

2.API Key配置

调用大模型主要分为线上调用和本地调用两种方式。对于线上调用,您需要提供相应平台的API Key。如果您还没有对应平台的账号,首先需要在平台上注册一个账号。LazyLLM框架提供了自动调用平台API Key的功能,只需将您的API Key设置为环境变量,并在调用时指定平台和模型名称,即可实现线上模型的调用。

LazyLLM目前支持以下平台(api key链接见附件):

图片

要配置平台的API Key为环境变量,请按照以下步骤操作:

1️⃣根据您使用的平台,获取相应的API Key(注意:SenseNova平台需要获取两个Key)。

2️⃣使用以下命令设置对应的环境变量:

export LAZYLLM_<使用的平台环境变量名称,大写>_API_KEY=<申请到的api key>

例如,如果您需要访问SenseNova平台,如果您通过方法一获得密钥,您需要设置以下环境变量:

export LAZYLLM_SENSENOVA_API_KEY="您的Access Key ID"
export LAZYLLM_SENSENOVA_SECRET_KEY="您的Access Key Secret"

如果您通过方法二获得密钥,您需要设置以下环境变量:

export LAZYLLM_SENSENOVA_API_KEY="您的API-Key"

在配置好环境变量后,当您实例化OnelineChatModule并指定模型来源时,LazyLLM会自动根据配置的环境变量调用相应的API Key。

通过这种方式,您可以轻松管理和调用不同平台的API Key,简化了模型调用的流程。

RAG 实践剖析

1.原理回顾

在准备好LazyLLM的环境和配置后,让我们快速回顾一下RAG(Retrieval-augmented Generation,RAG,检索增强生成)的基本原理。RAG的工作原理是当模型需要生成文本或回答问题时,首先会从一个庞大的文档集合中检索出相关的信息,这些检索到的信息随后会被用于指导生成过程,从而显著提高生成文本的质量和准确性。RAG 的整体结构可以用下图标识,系统接收一个用户 Query, 首先通过检索器(Retriever)从外部文档中检索出与给定 Query 相似的内容,然后将其与 Query 一同输入到 LLM ,LLM 给出最终答案:

图片

RAG的离线工作流程可以归纳成以下三步:

1️⃣文档读取和解析(Reader)

把各种格式的文档加载到系统中,可以借助开源工具(如MinerU)来提高解析的准确率。

2️⃣分块和向量化(Transform and Vectorize)

对收集到的原始数据进行清洗、去重、分块等预处理工作,然后进行向量化。

3️⃣索引和存储(Indexing and Store)

利用向量数据库或其他高效的向量检索工具,将处理后的文本数据进行高效的存储和索引。

### 构建RAG系统初学者指南 #### 定义RAG系统 检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了密集向量索引和自然语言处理模型的技术,用于提高文本生成的质量和准确性。通过利用外部知识库中的信息来补充训练数据集的信息不足之处。 #### 准备工作环境 为了从头开始创建一个简单的RAG系统,首先需要安装必要的软件包并设置开发环境。对于Python用户来说,可以依赖Hugging Face Transformers库以及Faiss或其他相似的矢量化搜索引擎来进行实现[^2]。 ```bash pip install transformers faiss-cpu datasets torch ``` #### 数据收集与预处理 构建有效的RAG应用之前,获取高质量的数据源至关重要。这些资源可能包括但不限于网页抓取的内容、百科全书条目或是特定领域内的文档集合。接着要对原始素材执行清洗操作去除噪声,并将其转换成适合后续使用的格式。 #### 创建语料库索引 一旦拥有了经过清理后的文本片段列表,则可以通过编码器将它们映射到高维空间里的稠密表示形式——即所谓的嵌入(embeddings),之后再把这些嵌入存储在一个高效的近似最近邻(Near Neighbor Search,NNS)结构里以便快速查找最相关的项。 ```python from sentence_transformers import SentenceTransformer import numpy as np import faiss # 使用预训练的语言模型作为编码器 encoder = SentenceTransformer('all-MiniLM-L6-v2') # 假设有如下一些句子组成的语料库 corpus_sentences = ["Example document one.", "Another example text."] # 获取每篇文档对应的embedding embeddings = encoder.encode(corpus_sentences) # 初始化FAISS索引并向其中添加所有的embeddings dimensionality = embeddings.shape[1] index = faiss.IndexFlatL2(dimensionality) index.add(np.array([emb.tolist() for emb in embeddings])) ``` #### 集成查询接口 最后一步就是设计能够接收输入问题并将之转化为潜在匹配答案的过程。这通常涉及到先计算询问字符串相对于整个数据库内各个项目的相似度得分;随后挑选出排名靠前的结果返回给调用方。 ```python def retrieve_top_k(query: str, k=5): query_embedding = encoder.encode([query]) distances, indices = index.search( np.array(query_embedding).astype("float32"), k=k ) top_results = [(distances[0][i], corpus_sentences[idx]) for i, idx in enumerate(indices[0])] return sorted(top_results, key=lambda x:x[0]) print(retrieve_top_k("Find me something interesting")) ``` 以上代码展示了如何基于已有的工具链搭建起基本框架,在此基础上还可以进一步探索优化策略比如微调编码组件或者引入更复杂的评分机制等方法提升性能表现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值