Intern大模型训练营(八):Llamaindex RAG 实践

1. 基于 LlamaIndex 构建自己的 RAG 知识库

首先在Intern Studio中申请30% A100的开发机。

进入开发机后,创建新的conda环境,命名为 llamaindex,在命令行模式下运行:

bash 复制代码
conda create -n llamaindex python=3.10

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

bash 复制代码
conda env list

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

bash 复制代码
conda activate llamaindex

安装python 依赖包

bash 复制代码
pip install einops==0.7.0 protobuf==5.26.1

安装 Llamaindex和相关的包

bash 复制代码
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

下载 Sentence Transformer 模型,运行以下指令,新建一个python文件

bash 复制代码
cd ~
mkdir llamaindex_demo
mkdir model
cd ~/llamaindex_demo
touch download_hf.py

打开download_hf.py 贴入以下代码:

python 复制代码
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')

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

bash 复制代码
cd /root/llamaindex_demo
conda activate llamaindex
python download_hf.py

之后下载 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

下面进行不使用LlamaIndex RAG进行对话。

在~/llamaindex_demo下创建test_internlm.py,贴入以下代码:

python 复制代码
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)

其中api-key在书生·浦语API里免费获取。

运行该文件, 结果如下:

可以看出回答效果较差 。

下面我们使用API+LLamaIndex来进行对话。

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

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

新建一个python文件llamaindex_RAG.py,贴入以下代码:

python 复制代码
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)

运行该文件,结果如下:

可见,使用RAG技术,模型成功回答了我们的问题。

2. LlamaIndex web

在上面的基础上,继续安装依赖:

bash 复制代码
pip install streamlit==1.36.0
pip install llama-index-llms-huggingface

新建一个 python 文件app.py

在app.py中写入以下代码:

python 复制代码
import streamlit as st
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.llms.openai_like import OpenAILike
from llama_index.legacy.callbacks import CallbackManager

st.set_page_config(page_title="llama_index_demo", page_icon="🦜🔗")
st.title("llama_index_demo")

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

# Create an instance of CallbackManager
callback_manager = CallbackManager()

# 初始化模型
@st.cache_resource
def init_models():
    embed_model = HuggingFaceEmbedding(
        model_name="/root/model/sentence-transformer"
    )
    Settings.embed_model = embed_model

    

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

    documents = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine()

    return query_engine

# 检查是否需要初始化模型
if 'query_engine' not in st.session_state:
    st.session_state['query_engine'] = init_models()

def greet2(question):
    response = st.session_state['query_engine'].query(question)
    return response


# Store LLM generated responses
if "messages" not in st.session_state.keys():
    st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]

    # Display or clear chat messages
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.write(message["content"])

def clear_chat_history():
    st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]

st.sidebar.button('Clear Chat History', on_click=clear_chat_history)

# Function for generating LLaMA2 response
def generate_llama_index_response(prompt_input):
    return greet2(prompt_input)

# User-provided prompt
if prompt := st.chat_input():
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.write(prompt)

# Gegenerate_llama_index_response last message is not from assistant
if st.session_state.messages[-1]["role"] != "assistant":
    with st.chat_message("assistant"):
        with st.spinner("Thinking..."):
            response = generate_llama_index_response(prompt)
            placeholder = st.empty()
            placeholder.markdown(response)
    message = {"role": "assistant", "content": response}
    st.session_state.messages.append(message)

相对教程文档中给出的代码,有一些改动,具体改动如下:

  1. 报错'ModuleNotFoundError: No module named 'llama_index.llms.huggingface',主要原因是llama_index.llms.huggingface模块在LlamaIndex库的新版本中已经不再包含在核心包中。因此需要单独安装HuggingFace LLMs集成包:

    pip install llama-index-llms-huggingface

  2. 报错Incorrect path_or_model_id: '/root/model/internlm2-chat-1_8b'.主要原因在于教程文档的代码是基于现有的大模型,而我们的目标是调用Intern的API,因此需要将原来的model初始化改成 llm =OpenAILike(model=model, api_base=api_base_url, api_key=api_key, is_chat_model=True,callback_manager=callback_manager),同时导入相关依赖。

上面的代码运行成功后,可以看到正常的ui界面(记得提前进行端口映射):

3. 将上述环境部署到Hugging Face的space

由于Huggingface访问的限制,这里最好在github的codespaces上进行部署,按照前面所学的,首先在Huggingface上创建space,然后克隆到codespaces上。

之后将开发机里的几个文件夹压缩后下载到本地,再从本地上传到codespaces中。

之后运行以下命令上传文件:

bash 复制代码
git add .
git commit -m "upload model"
git push

最后可以在Huggingface上看到成功部署了上述环境。

相关推荐
迅易科技3 小时前
当数控编程“联姻”AI:制造工厂的“智能大脑”如何炼成?
人工智能·ai·知识图谱·ai编程·deepseek
森哥的歌4 小时前
AI背景下,如何重构你的产品?
人工智能·ai·数字化转型·用户体验·产品设计
Funny_AI_LAB4 小时前
首个专业AI设计Agent发布-Lovart
人工智能·科技·ai
ONLYOFFICE5 小时前
集成 ONLYOFFICE 与 AI 插件,为您的服务带来智能文档编辑器
人工智能·ai·编辑器·onlyoffice·文档编辑器·文档预览·文档协作
带刺的坐椅5 小时前
SpringBoot2 可以使用 SolonMCP 开发 MCP(江湖救急)
java·spring·ai·solon·mcp
feilieren5 小时前
Windows 安装 Milvus
数据库·ai·milvus
阿部多瑞 ABU6 小时前
小说所有设定(v3.0 preview)
ai·ai写作
小白跃升坊6 小时前
【网站推荐】推荐几个MCP(Model Context Protocol,模型上下文协议)的网站
ai·mcp
水煮蛋不加蛋8 小时前
RAG 赋能客服机器人:多轮对话与精准回复
人工智能·ai·机器人·大模型·llm·rag
倔强的石头10610 小时前
大模型微调实战:基于GpuGeek平台的低成本高效训练方案
ai·大模型·gpu