ftp 上传网站,海珠区,公司网站运营维护单位,网站建设要做哪些工作基础任务 (完成此任务即完成闯关)
任务要求#xff1a;基于 LlamaIndex 构建自己的 RAG 知识库#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力#xff0c;截…基础任务 (完成此任务即完成闯关)
任务要求基于 LlamaIndex 构建自己的 RAG 知识库寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力截图保存。 llamaindexInternlm2 RAG实践 本文将分为以下几个部分来介绍如何使用 LlamaIndex 来部署 InternLM2 1.8B以 InternStudio 的环境为例
前置知识环境、模型准备LlamaIndex HuggingFaceLLMLlamaIndex RAG
1. 前置知识 正式介绍检索增强生成Retrieval Augmented GenerationRAG技术以前大家不妨想想为什么会出现这样一个技术。 给模型注入新知识的方式可以简单分为两种方式一种是内部的即更新模型的权重另一个就是外部的方式给模型注入格外的上下文或者说外部信息不改变它的的权重。 第一种方式改变了模型的权重即进行模型训练这是一件代价比较大的事情大语言模型具体的训练过程可以参考InternLM2技术报告。第二种方式并不改变模型的权重只是给模型引入格外的信息。类比人类编程的过程第一种方式相当于你记住了某个函数的用法第二种方式相当于你阅读函数文档然后短暂的记住了某个函数的用法。
RAG 效果比对 如图所示由于xtuner是一款比较新的框架 InternLM2-Chat-1.8B 训练数据库中并没有收录到它的相关信息。左图中问答均未给出准确的答案。右图未对 InternLM2-Chat-1.8B 进行任何增训的情况下通过 RAG 技术实现的新增知识问答。
进入开发机后创建新的conda环境命名为 llamaindex在命令行模式下运行
conda create -n llamaindex python3.10
复制完成后在本地查看环境。
conda env list
结果如下所示。
# conda environments:
#
base * /root/.conda
llamaindex /root/.conda/envs/llamaindex
运行 conda 命令激活 llamaindex 然后安装相关基础依赖 python 虚拟环境:
conda activate llamaindex
conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia
安装python 依赖包
pip install einops0.7.0 protobuf5.26.1
环境激活后命令行左边会显示当前也就是 llamaindex 的环境名称如下图所示: 2.2 安装 Llamaindex 安装 Llamaindex和相关的包
conda activate llamaindex
pip install llama-index0.10.38 llama-index-llms-huggingface0.2.0 transformers[torch]4.41.1 huggingface_hub[inference]0.23.1 huggingface_hub0.23.1 sentence-transformers2.7.0 sentencepiece0.2.0
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)
然后在 /root/llamaindex_demo 目录下执行该脚本即可自动开始下载
cd /root/llamaindex_demo
conda activate llamaindex
python download_hf.py
更多关于镜像使用可以移步至 HF Mirror 查看。
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 HuggingFaceLLM 运行以下指令把 InternLM2 1.8B 软连接出来
cd ~/model
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/ ./
运行以下指令新建一个python文件
cd ~/llamaindex_demo
touch llamaindex_internlm.py
打开llamaindex_internlm.py 贴入以下代码 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(contentxtuner是什么)])
print(rsp) 之后运行
conda activate llamaindex
cd ~/llamaindex_demo/
python llamaindex_internlm.py
结果为 回答的效果并不好并不是我们想要的xtuner。
4. LlamaIndex RAG 安装 LlamaIndex 词嵌入向量依赖 conda activate llamaindex
pip install llama-index-embeddings-huggingface0.2.0 llama-index-embeddings-instructor0.1.3 运行以下命令获取知识库 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贴入以下代码 from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settingsfrom 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_modelllm 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(xtuner是什么?)print(response) 之后运行 conda activate llamaindex
cd ~/llamaindex_demo/
python llamaindex_RAG.py 结果为 借助RAG技术后就能获得我们想要的答案了。
5. LlamaIndex web 运行之前首先安装依赖
pip install streamlit1.36.0
运行以下指令新建一个python文件 cd ~/llamaindex_demo
touch app.py 打开app.py贴入以下代码 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 HuggingFaceLLMst.set_page_config(page_titlellama_index_demo, page_icon)
st.title(llama_index_demo)# 初始化模型
st.cache_resource
def init_models():embed_model HuggingFaceEmbedding(model_name/root/model/sentence-transformer)Settings.embed_model embed_modelllm 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})Settings.llm llmdocuments 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_clickclear_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) 之后运行 streamlit run app.py 然后在命令行点击红框里的url。 即可进入以下网页然后就可以开始尝试问问题了。
询问结果为