书生大模型闯关L1G4000

147 阅读4分钟

Llamaindex RAG 实践

基础任务 (完成此任务即完成闯关)

  • 任务要求1(必做,参考readme_api.md) :基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前 浦语 API 不会回答,借助 LlamaIndex 后 浦语 API 具备回答 A 的能力,截图保存。注意:写博客提交作业时切记不要泄漏自己 api_key!
  • 任务要求2(可选,参考readme.md) :基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前 InternLM2-Chat-1.8B 模型不会回答,借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力,截图保存。
  • 任务要求3(优秀学员必做)  :将 Streamlit+LlamaIndex+浦语API的 Space 部署到 Hugging Face。

首先,RAG 是什么? 答:检索增强生成(Retrieval Augmented Generation,RAG)技术,就是提供外部信息,让模型回答时提前检索,以提高回答的质量 这是RAG 和Fine-Tunning的区别: 截屏2025-01-30 08.36.59.png 再来一个直观图: 截屏2025-01-30 08.39.52.png

任务一:LlamaIndex+InternLM API 实践

1,在开发机上创建新的conda环境,llamaindex,可以理解成新建一个文件夹,所有的相关内容都放在里面;

2, 激活环境并安装python依赖包;

3, 安装Llamaindex和相关的包;

4, 下载Sentence Transformer模型

源词向量模型 Sentence Transformer:(也可以选用别的开源词向量模型来进行 Embedding,目前选用这个模型是相对轻量、支持中文且效果较好的),通过一个python文件来下载的

5, 下载NLTK相关资源

我们在使用开源词向量模型构建开源词向量的时候,需要用到第三方库 nltk 的一些资源。我们通过国内镜像地址下载,保存在服务器上并解压缩

6, 终于到了对比时刻

首先是,不使用 LlamaIndex RAG(仅API) 运行以下指令,新建一个python文件

cd ~/llamaindex_demo
touch test_internlm.py

打开test_internlm.py 贴入以下代码

from openai import OpenAI

base_url = "https://internlm-chat.intern-ai.org.cn/puyu/api/v1/"
api_key = "***"
model="internlm2.5-latest"

# base_url = "https://api.siliconflow.cn/v1"
# api_key = "***"
# model="internlm/internlm2_5-7b-chat"

client = OpenAI(
    api_key=api_key , 
    base_url=base_url,
)

chat_rsp = client.chat.completions.create(
    model=model,
    messages=[{"role": "user", "content": "xtuner是什么?"}],
)

for choice in chat_rsp.choices:
    print(choice.message.content)

之后运行

conda activate llamaindex
cd ~/llamaindex_demo/
python test_internlm.py

效果是这样的 截屏2025-01-31 01.36.42.png

然后是,使用了获取了关于xtuner知识库之后,将其向量化处理,回答前先检索

conda activate llamaindex

运行以下命令,获取知识库

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

运行以下指令,新建一个python文件

cd ~/llamaindex_demo
touch llamaindex_RAG.py

打开llamaindex_RAG.py贴入以下代码

import os 
os.environ['NLTK_DATA'] = '/root/nltk_data'

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.settings import Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.legacy.callbacks import CallbackManager
from llama_index.llms.openai_like import OpenAILike


# Create an instance of CallbackManager
callback_manager = CallbackManager()

api_base_url =  "https://internlm-chat.intern-ai.org.cn/puyu/api/v1/"
model = "internlm2.5-latest"
api_key = "请填写 API Key"

# api_base_url =  "https://api.siliconflow.cn/v1"
# model = "internlm/internlm2_5-7b-chat"
# api_key = "请填写 API Key"



llm =OpenAILike(model=model, api_base=api_base_url, api_key=api_key, is_chat_model=True,callback_manager=callback_manager)


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

#初始化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("xtuner是什么?")

print(response)

之后运行

conda activate llamaindex
cd ~/llamaindex_demo/
python llamaindex_RAG.py

借助RAG技术,得到的输出,确实是更加精确了· 截屏2025-01-31 01.36.52.png 如果将来要修改检索内容,可以参见这里

#从指定目录读取所有文档,并加载数据到内存中
documents = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()

7, LlamaIndex web,网页版 第一次尝试总是提示找不到llama_index找不到module,重新尝试一次成功了,还修改了对话模型的名字,哈哈~ 截屏2025-01-31 08.26.38.png

任务二:LlamaIndex+本地部署InternLM实践

1, 配置基础环境

a,创建开发机 配置开发机系统。

b,进入开发机后,创建新的 conda 环境,命名为 llamaindex

c, 复制完成后,在本地查看环境。

d, 运行 conda 命令,激活 llamaindex 

e, 然后安装 python 相关基础依赖包

2, 安装 Llamaindex 与 Pytorch

a, 安装 Llamaindex 和相关的包

b, 安装 LlamaIndex 词嵌入向量依赖

c, 最后再安装 Pytorch

d, 安装完成后,验证 Pytorch 是否正确安装并使用了指定的 CUDA 版本

3, 下载 Sentence Transformer 模型

4, 下载 NLTK 相关资源

  1. LlamaIndex HuggingFaceLLM

我理解这一步是安装和调用 local 的模型了,它的代码和之前的区别是不用输入 API 了.

起初:设置的开发机模型只有 10%,提示 GPU 不符合要求:which seems does not fit any GPU's remaining memory,于是后面的步骤就进行不了了

后来:使用了 30% 的开发机,就神奇般的可以拉~ 截屏2025-02-04 00.28.02.png

6, LlamaIndex RAG 截屏2025-02-04 00.35.20.png 7, LlamaIndex web 截屏2025-02-04 00.41.43.png 任务三: zhuanlan.zhihu.com/p/154855065…