第三次作业复现过程

本文详细介绍了如何在虚拟机中通过Conda管理环境,安装必要的依赖,如pip升级和模型部署,重点讲解了如何使用LangChain框架搭建RAG应用,包括词向量模型下载、NLP资源准备、文本向量化和LLM集成的过程。
摘要由CSDN通过智能技术生成

首先创建虚拟机,进入终端,copy一下环境

conda create --name internlm-demo --clone=/root/share/conda_envs/internlm-base

然后激活环境

conda activate internlm-demo

在环境中安装运行demo所需要的依赖。

# 升级pip

python -m pip install --upgrade pip

pip install modelscope==1.9.5

pip install transformers==4.35.2

pip install streamlit==1.24.0

pip install sentencepiece==0.1.99

pip install accelerate==0.24.1

下载模型

可以在本地直接拷贝到个人目录:

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

模型下载完成后,进行LangChain相关环境部署

LangChain框架是一个开源工具,通过为各种LLM提供通用接口来简化应用程序的开发流程帮助开发者自由构建LLM应用。

以下是LangChain搭建RAG应用的流程:

首先安装以下依赖包:
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来的,所以要使用官方提供的huggingface-cli依赖

pip install -U huggingface_hub

然后再开始下载词向量模型

然后在 /root/data 目录下新建python文件 download_hf.py,填入以下代码:

resume-download:断点续下

local-dir:本地存储路径。(linux环境下需要填写绝对路径)

import os

# 下载模型

os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/data/model/sentence-transformer')

可能需要镜像下载

# 设置环境变量os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

添加这句话在download-hf.py文件中,再运行(python download_hf.py)

我们在使用开源词向量模型构建开源词向量的时候,需要用到第三方库 nltk 的一些资源。正常情况下,其会自动从互联网上下载,但可能由于网络原因会导致下载中断,此处我们可以从国内仓库镜像地址下载相关资源,保存到服务器上。

回到根目录下,新建nltk data文件夹,新建两个文件夹

进入tokenizers   cd /root/nltk data/tokeniers

输入wget -O punkt.zip https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/to

kenizers/punkt.zip

下载完成后 解压

unzip punk.zip

再进入taggers的目录:cd /root/nltk data/taggers

输入wget -O averaged_perceptron_tagger.zip https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/taggers/averaged_perceptron_tagger.zip

下载完成后再解压

弄好词向量转化工具以及依赖的库

我们接着导入知识库

进行知识库的搭建

这一步就是把这些网站上所有的东西进行筛选,目的是提取出对训练文本有用的信息

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


 

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

把文本切块之后进行文本向量化

chroma的功能就是把文本向量转化为一个数据库

# 首先导入所需第三方库

from langchain.document_loaders import UnstructuredFileLoader

from langchain.document_loaders import UnstructuredMarkdownLoader

from langchain.text_splitter import RecursiveCharacterTextSplitter

from langchain.vectorstores import Chroma

from langchain.embeddings.huggingface import HuggingFaceEmbeddings

from tqdm import tqdm

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

# 加载文件函数

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

# 目标文件夹

tar_dir = [

    "/root/data/InternLM",

    "/root/data/InternLM-XComposer",

    "/root/data/lagent",

    "/root/data/lmdeploy",

    "/root/data/opencompass",

    "/root/data/xtuner"

]

# 加载目标文件

docs = []

for dir_path in tar_dir:

    docs.extend(get_text(dir_path))

# 对文本进行分块

text_splitter = RecursiveCharacterTextSplitter(

    chunk_size=500, chunk_overlap=150)

split_docs = text_splitter.split_documents(docs)

# 加载开源词向量模型

embeddings = HuggingFaceEmbeddings(model_name="/root/data/model/sentence-transformer")

# 构建向量数据库

# 定义持久化路径

persist_directory = 'data_base/vector_db/chroma'

# 加载数据库

vectordb = Chroma.from_documents(

    documents=split_docs,

    embedding=embeddings,

    persist_directory=persist_directory  # 允许我们将persist_directory目录保存到磁盘上

)

# 将加载的向量数据库持久化到磁盘上

vectordb.persist()

然后运行这个文件,之后就生成了data-base这个文件,这个文件里面存放了我们所构建的向量数据库的文件

之后,我们需要将internLM接入LangChain中

为方便构建LLM应用,我们需要基于本地部署的internLM,继承LangChain的LLM类,自定义一个internLM LLM子类,从而实现将internLM接入到LangChain框架中。完成LangChain的自定义子类之后,可以使用完全一致的方式调用LangChain的接口。

到这里向量数据库和LLM重写好嘞

之后开始构建检索问答链

LangChain 通过提供检索问答链对象来实现对于 RAG 全流程的封装。所谓检索问答链,即通过一个对象完成检索增强问答(即RAG)的全流程,我们可以调用一个 LangChain 提供的 RetrievalQA 对象,通过初始化时填入已构建的数据库和自定义 LLM 作为参数,来简便地完成检索增强问答的全流程,LangChain 会自动完成基于用户提问进行检索、获取相关文档、拼接为合适的 Prompt 并交给 LLM 问答的全部流程。

from langchain.chains import RetrievalQA

qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectordb.as_retriever(),return_source_documents=True,chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})

下面是完整构建检索问答链的脚本

from langchain.vectorstores import Chroma

from langchain.embeddings.huggingface import HuggingFaceEmbeddings

import os

from LLM import InternLM_LLM

from langchain.prompts import PromptTemplate

from langchain.chains import RetrievalQA

def load_chain():

    # 加载问答链

    # 定义 Embeddings

    embeddings = HuggingFaceEmbeddings(model_name="/root/data/model/sentence-transformer")

    # 向量数据库持久化路径

    persist_directory = 'data_base/vector_db/chroma'

    # 加载数据库

    vectordb = Chroma(

        persist_directory=persist_directory,  # 允许我们将persist_directory目录保存到磁盘上

        embedding_function=embeddings

    )

    # 加载自定义 LLM

    llm = InternLM_LLM(model_path = "/root/data/model/Shanghai_AI_Laboratory/internlm-chat-7b")

    # 定义一个 Prompt Template

    template = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答

    案。尽量使答案简明扼要。总是在回答的最后说“谢谢你的提问!”。

    {context}

    问题: {question}

    有用的回答:"""

    QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],template=template)

    # 运行 chain

    qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectordb.as_retriever(),return_source_documents=True,chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})

    

    return qa_chain

然后,再配置端口等东西,可以完成网页访问。

windows powershell中
ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p 33090(要更改虚拟机号)

参考文档:

https://github.com/InternLM/tutorial/tree/main/langchain

最终实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值