书生大模型实战营 | L1G4000 InternLM + LlamaIndex RAG 实践

182 阅读7分钟

参考知识

github.com/InternLM/Tu…

任务

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

  • 任务要求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。

过程

在 Intern Studio 服务器上部署LlamaIndex

2.1 配置基础环境

填写 开发机名称 后,点击 选择镜像 使用 Cuda12.0-conda 镜像,然后在资源配置中,使用 30% A100 * 1 的选项,然后立即创建开发机器。 image.png 点击 进入开发机 选项。 创建新的conda环境,命名为 llamaindex,在命令行模式下运行:

conda create -n llamaindex python=3.10

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

conda env list

image.png 运行 conda 命令,激活 llamaindex 然后安装相关基础依赖 python 虚拟环境:

conda activate llamaindex

安装python 依赖包

pip install einops==0.7.0 protobuf==5.26.1

2.2 安装 Llamaindex

安装 Llamaindex和相关的包

conda activate llamaindex
pip install llama-index==0.11.20
pip install llama-index-llms-replicate==0.3.0
pip install llama-index-llms-openai-like==0.2.0
pip install llama-index-embeddings-huggingface==0.3.1
pip install llama-index-embeddings-instructor==0.2.1
pip install torch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 --index-url https://download.pytorch.org/whl/cu121

2.3 下载 Sentence Transformer 模型

源词向量模型 Sentence Transformer:(我们也可以选用别的开源词向量模型来进行 Embedding,目前选用这个模型是相对轻量、支持中文且效果较好的,同学们可以自由尝试别的开源词向量模型) 运行以下指令,新建一个python文件

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

打开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')

image.png

然后,在 /root/llamaindex_demo 目录下执行该脚本即可自动开始下载:

cd /root/llamaindex_demo
conda activate llamaindex
python download_hf.py

image.png

更多关于镜像使用可以移步至 HF Mirror 查看。

推荐用户从modelscope下载

modelscope.cn/models/Cece…

git lfs install

cd /root/model/

git clone https://www.modelscope.cn/Ceceliachenen/paraphrase-multilingual-MiniLM-L12-v2.git

mv paraphrase-multilingual-MiniLM-L12-v2 sentence-transformer

2.4 下载 NLTK 相关资源

我们在使用开源词向量模型构建开源词向量的时候,需要用到第三方库 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

之后使用时服务器即会自动使用已有资源,无需再次下载

3. 是否使用 LlamaIndex 前后对比

3.1 不使用 LlamaIndex RAG(仅API)

浦语官网和硅基流动都提供了InternLM的类OpenAI接口格式的免费的 API,可以访问以下两个了解两个 API 的使用方法和 Key。

浦语官方 API:internlm.intern-ai.org.cn/api/documen…
硅基流动:cloud.siliconflow.cn/models?mfs=…

运行以下指令,新建一个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 = "sk-请填写准确的 token!"
model="internlm2.5-latest"

# base_url = "https://api.siliconflow.cn/v1"
# api_key = "sk-请填写准确的 token!"
# 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

image.png

  • 使用自己DIY的问题,浦语 API 回答的不对
  • messages=[{"role": "user", "content": "本周主打怪这个TRPG规则中猎魔人有哪些基本动作?"}],

回答

TRPG(桌面角色扮演游戏)中,猎魔人通常被设定为擅长使用各种武器和魔法对抗邪恶生物的角色。具体的基本动作会因不同的游戏系统和设定而有所不同,但一般来说,猎魔人的基本动作可以包括以下几个方面:

1. **攻击**:
   - 猎魔人可以使用各种武器进行物理攻击,如剑、弓箭、长鞭等。
   - 攻击动作通常包括“攻击”、“刺击”、“挥击”等,具体取决于所使用的武器。
   - 攻击动作可能包括白刃攻击和远程攻击。

2. **防御**:
   - 猎魔人可以使用盾牌或特定的防御技能来减少受到的伤害。
   - 防御动作可能包括“格挡”、“闪避”、“躲闪”等,帮助猎魔人在战斗中保持生存能力。

3. **移动**:
   - 猎魔人可以在战场上移动,以接近敌人或远离危险。
   - 移动动作可能包括“前进”、“后退”、“侧移”等,帮助猎魔人调整战斗位置。
   - 某些系统中,移动还可能与潜行或隐蔽相关。

4. **技能使用**:
   - 猎魔人可能拥有特定的技能,如追踪、隐秘行动、治疗等。
   - 这些技能通常在特定的条件下可以使用,如在隐蔽状态时使用技能“隐秘行动”,或在战斗中使用技能“治疗”来恢复自己的生命值。

5. **魔法/法术**:
   - 在一些设定中,猎魔人可能能够使用魔法或法术,如祝福、诅咒、召唤生物等。
   - 这些法术可能用于增强自身或削弱敌人,是战斗中不可或缺的一部分。

6. **探索与调查**:
   - 虽然这可能不被视为“基本动作”,但在许多TRPG中,探索和调查环境是猎魔人任务的重要组成部分。
   - 这可能包括寻找线索、解开谜题、与NPC互动等。

需要注意的是,不同的TRPG系统对猎魔人的设定可能会有所不同,上述动作只是基于一般TRPG设定中猎魔人可能具备的基本动作。具体到某个特定的游戏系统,猎魔人的能力和动作可能会有所差异。如果你是在玩某个特定的TRPG,最好参考该游戏的官方规则书或指南,以获取最准确的信息。

image.png

3.2 使用 API+LlamaIndex

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

运行很慢 导入自己的word后运行报错

c4435b9cc534694d0856bea31b55b02.jpg image.png

pip install docx2txt

询问自己的问题

image.png

image.png