同笔记二完成基础环境的配置,然后开始下载模型。
在左侧的/root/share/temp/model_repos/internlm-chat-7b目录下已存储有所需的模型文件参数,可以直接拷贝。
mkdir -p /root/data/model/Shanghai_AI_Laboratory cp -r /root/share/temp/model_repos/internlm-chat-7b /root/data/model/Shanghai_AI_Laboratory/internlm-chat-7b
然后我们就完成了InternLM 的部署,下面开始LangChain 相关环境配置
首先要进行安装相关的包
pip install langchain==0.0.292 pip install gradio==4.4.0 pip install chromadb==0.4.15 pip install sentence-transformers==2.2.2 pip install unstructured==0.10.30 pip install markdown==3.3.7
然后我们要使用开源词向量模型Sentence Transformer,首先需要使用huggingface-cli命令行工具
pip install -U huggingface_hub
然后在/root/data
目录下新建python文件 download_hf.py
,填入以下代码:
import os os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/data/model/sentence-transformer')
之后,将 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/data/model/sentence-transformer')
在/root/data
目录下执行该脚本即可自动开始下载:
python download_hf.py
下载完成之后,开始下载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
完成以上步骤,我们就可以开始下载本项目代码
cd /root/data
git clone https://github.com/InternLM/tutorial
通过上述命令,可以将本仓库 clone 到本地 root/data/tutorial
目录下,在之后的过程中可以对照仓库中的脚本来完成自己的代码,也可以直接使用仓库中的脚本。
我们选择开源仓库 Clone 到本地,通过以下命令:
cd /root/data # clone 上述开源仓库 git clone https://gitee.com/open-compass/opencompass.git git clone https://gitee.com/InternLM/lmdeploy.git git clone https://gitee.com/InternLM/xtuner.git git clone https://gitee.com/InternLM/InternLM-XComposer.git git clone https://gitee.com/InternLM/lagent.git git clone https://gitee.com/InternLM/InternLM.git
我们定义一个函数,该函数将递归指定文件夹路径,返回其中所有满足条件的文件路径
import os def get_files(dir_path): # args:dir_path,目标文件夹路径 file_list = [] for filepath, dirnames, filenames in os.walk(dir_path): # os.walk 函数将递归遍历指定文件夹 for filename in filenames: # 通过后缀名判断文件类型是否满足要求 if filename.endswith(".md"): # 如果满足要求,将其绝对路径加入到结果列表 file_list.append(os.path.join(filepath, filename)) elif filename.endswith(".txt"): file_list.append(os.path.join(filepath, filename)) return file_list
为了加载数据,我们可以使用 LangChain 提供的 FileLoader 对象来加载目标文件,得到由目标文件解析出的纯文本内容。由于不同类型的文件需要对应不同的 FileLoader,我们判断目标文件类型,并针对性调用对应类型的 FileLoader,同时,调用 FileLoader 对象的 load 方法来得到加载之后的纯文本对象:
from tqdm import tqdm from langchain.document_loaders import UnstructuredFileLoader from langchain.document_loaders import UnstructuredMarkdownLoader def get_text(dir_path): # args:dir_path,目标文件夹路径 # 首先调用上文定义的函数得到目标文件路径列表 file_lst = get_files(dir_path) # docs 存放加载之后的纯文本对象 docs = [] # 遍历所有目标文件 for one_file in tqdm(file_lst): file_type = one_file.split('.')[-1] if file_type == 'md': loader = UnstructuredMarkdownLoader(one_file) elif file_type == 'txt': loader = UnstructuredFileLoader(one_file) else: # 如果是不符合条件的文件,直接跳过 continue docs.extend(loader.load()) return docs
可以得到一个纯文本对象对应的列表。最后我们开始构建向量数据库
from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=150) split_docs = text_splitter.split_documents(docs)
并且文本向量化:
from langchain.embeddings.huggingface import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings(model_name="/root/data/model/sentence-transformer")
基于上文分块后的文档以及加载的开源向量化模型,将语料加载到指定路径下的向量数据库:
from langchain.vectorstores import Chroma # 定义持久化路径 persist_directory = 'data_base/vector_db/chroma' # 加载数据库 vectordb = Chroma.from_documents( documents=split_docs, embedding=embeddings, persist_directory=persist_directory # 允许我们将persist_directory目录保存到磁盘上 ) # 将加载的向量数据库持久化到磁盘上 vectordb.persist()
于是完成了知识库的搭建,运行上述脚本,即可在本地构建已持久化的向量数据库,后续直接导入该数据库即可,无需重复构建。
最终效果如下图,可以实现读入问题并且分析问题,连接语料库之后可以实现正常对话。