Chinese-LangChain 拆解 讲解

2,967 阅读10分钟

中文LangChain项目的实现开源工作

github.com/yanqiangmif…

中文langchain项目,基于ChatGLM-6b+langchain实现本地化知识库检索与智能答案生成

LangChain的资料准备

海量的知识库,知识库是由一段一段的文本构成的。

LangChain中用到的功能性语言模型

基于问题搜索知识库中的文本的问题搜索知识文本功能性语言模型

基于问题与问题相关的知识库文本进行问答的对话式语言模型

对话式大参数量语言模型有

1、chatglm

2、LLama

3、Bloom

基于中文预训练、问答训练、文档问答训练、多轮问答训练、人工强化反馈学习的对话式大参数语言模型有

1、chatglm

github.com/THUDM/ChatG…

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于General Language Model (GLM)架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考ChatGLM-6B博客

为了方便下游开发者针对自己的应用场景定制模型,THUDM同时实现了基于P-Tuning v2的高效参数微调方法(使用指南),INT4 量化级别下最低只需 7GB 显存即可启动微调。

2、LLama

github.com/SCIR-HI/Hua…

SCIR-HI训练的医疗领域Llama对话式大参数语言模型

开源了经过中文医学指令精调/指令微调(Instruct-tuning) 的LLaMA-7B模型。SCIR-HI通过医学知识图谱和GPT3.5 API构建了中文医学指令数据集,并在此基础上对LLaMA进行了指令微调,提高了LLaMA在医疗领域的问答效果。

github.com/ymcui/Chine…

为了促进大模型在中文NLP社区的开放研究,Chinese-LLaMA-Alpaca开源了中文LLaMA模型和指令精调的Alpaca大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,中文Alpaca模型进一步使用了中文指令数据进行精调,显著提升了模型对指令的理解和执行能力。详细内容请参考技术报告(Cui, Yang, and Yao, 2023)

Chinese-LLaMA-Alpaca主要内容:

  • 🚀 针对原版LLaMA模型扩充了中文词表,提升了中文编解码效率
  • 🚀 Chinese-LLaMA-Alpaca开源了使用中文文本数据预训练的中文LLaMA以及经过指令精调的中文Alpaca(7B、13B)
  • 🚀 快速使用笔记本电脑(个人PC)的CPU/GPU本地量化和部署体验大模型
对比项中文LLaMA中文Alpaca
训练方式传统CLM (在通用语料上训练)指令精调 (在指令数据上训练)
输入模板不需要需要符合模板要求(llama.cpp/LlamaChat/HF推理代码等已内嵌)
适用场景 ✔️文本续写:给定上文内容,让模型继续写下去,生成下文1、指令理解(问答、写作、建议等)2、多轮上下文理解(聊天等)
不适用场景 ❌指令理解 、多轮聊天等文本无限制自由生成
llama.cpp使用-p参数指定上文使用-ins参数启动指令理解+聊天模式
text-generation-webui不适合chat模式使用--cpu可在无显卡形式下运行,若生成内容不满意,建议修改prompt
LlamaChat加载模型时选择"LLaMA"加载模型时选择"Alpaca"
HF推理代码无需添加额外启动参数启动时添加参数 --with_prompt
已知问题如果不控制终止,则会一直写下去,直到达到输出长度上限。目前版本模型生成的文本长度相对短一些,比较惜字如金。

HF推理代码

对比项中文LLaMA中文Alpaca
训练方式传统CLM (在通用语料上训练)指令精调 (在指令数据上训练)
输入模板不需要需要符合模板要求(llama.cpp/LlamaChat/HF推理代码等已内嵌)
适用场景 ✔️文本续写:给定上文内容,让模型继续写下去,生成下文1、指令理解(问答、写作、建议等)2、多轮上下文理解(聊天等)
不适用场景 ❌指令理解 、多轮聊天等文本无限制自由生成
llama.cpp使用-p参数指定上文使用-ins参数启动指令理解+聊天模式
text-generation-webui不适合chat模式使用--cpu可在无显卡形式下运行,若生成内容不满意,建议修改prompt
LlamaChat加载模型时选择"LLaMA"加载模型时选择"Alpaca"
HF推理代码无需添加额外启动参数启动时添加参数 --with_prompt
已知问题如果不控制终止,则会一直写下去,直到达到输出长度上限。目前版本模型生成的文本长度相对短一些,比较惜字如金。

HF推理代码node="block" data-draft-type="table" data-size="normal" data-row-style="normal">

对比项中文LLaMA中文Alpaca
训练方式传统CLM (在通用语料上训练)指令精调 (在指令数据上训练)
输入模板不需要需要符合模板要求(llama.cpp/LlamaChat/HF推理代码等已内嵌)
适用场景 ✔️文本续写:给定上文内容,让模型继续写下去,生成下文1、指令理解(问答、写作、建议等)2、多轮上下文理解(聊天等)
不适用场景 ❌指令理解 、多轮聊天等文本无限制自由生成
llama.cpp使用-p参数指定上文使用-ins参数启动指令理解+聊天模式
text-generation-webui不适合chat模式使用--cpu可在无显卡形式下运行,若生成内容不满意,建议修改prompt
LlamaChat加载模型时选择"LLaMA"加载模型时选择"Alpaca"
HF推理代码无需添加额外启动参数启动时添加参数 --with_prompt
已知问题如果不控制终止,则会一直写下去,直到达到输出长度上限。目前版本模型生成的文本长度相对短一些,比较惜字如金。

LangChain的工作流程

在没有知识库的情况下:直接将问题输入对话式大语言模型作为当前问题的答案。

在有知识库的情况下:首先用输入的问题,基于文本相似度表征模型获取到输入的表征。依靠表征寻找到相似的知识段落文本。第二讲相似知识段落文本拼接上问题输入对话式语言模型获取当前问题的文档问答结果。

LangChain的问答实现路径

基于纯粹的大语言模型的对话能力

基于相似度检索相关文档以及基于对话大参数预训练语言模型的阅读理解能力

LangChain的资料库向量化

如何提升LangChain的性能:

1、训练垂直领域问题与文档相似度模型,提升问题寻找知识文档的精度。

2、训练垂直领域问题+知识文档的对话式大语言模型,优化返回结果。

在不同的环境中安装LangChain环境

安装pytorch1.13.1

# ROCM 5.2 (Linux only)
pip3 install torch torchvision torchaudio --extra-index-url
pip install torch==1.13.1+rocm5.2 torchvision==0.14.1+rocm5.2 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/rocm5.2
# CUDA 11.6
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
# CUDA 11.7
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117
# CPU only
pip install torch==1.13.1+cpu torchvision==0.14.1+cpu torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cpu

安装pytorch2.0.0 cuda11.7

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

安装pytorch2.0.0 cuda11.8

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

LangChain 项目地址,很多中文的LangChain都是基于这个项目进行二次开发的。

github.com/hwchase17/l…

安装LangChain的两次尝试

LangChain可在PyPi上使用,因此可以轻松安装:

pip install langchain

这将安装LangChain的最低要求。当LangChain与各种模型提供程序、数据存储等集成时,它的很多价值就来了。默认情况下,不安装执行此操作所需的依赖项。然而,还有另外两种安装LangChain的方法确实引入了这些依赖关系。

要安装通用LLM提供程序所需的模块,请运行:

pip install langchain[llms]

要安装所有集成所需的所有模块,请运行:

pip install langchain[all]

请注意,如果您使用的是zsh,则在将方括号作为参数传递给命令时需要引用方括号,例如:

pip install 'langchain[all]'

基于源码安装LangChain

git clone https://github.com/hwchase17/langchain.git
cd langchain
pip install -e .

Chinese-LangChain 安装部署过程

   24  pip install -r requirements.txt
   26  pip install 'httpx[socks]'
   27  python main.py
   44  发现导入pdf失败,提示缺失一下的包 以下异常并没有引起程序中断。
   45* pip install 'unstructured[local-inference]'

Chinese-LangChain 构建自己知识库的文档与问题相似度表征,这一步一定要准备好足够的内存。

import os

from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.schema import Document
from langchain.vectorstores import FAISS
from tqdm import tqdm

# 中文Wikipedia数据导入示例:
embedding_model_name = 'GanymedeNil/text2vec-large-chinese'
docs_path = '/root/work/Chinese-LangChain/docs'
embeddings = HuggingFaceEmbeddings(model_name=embedding_model_name)

docs = []
d = []
doc_files = os.listdir("./docs")
for doc_one in doc_files:
    if not "txt" in doc_one:
        continue
    with open(os.path.join("./docs",doc_one), 'r', encoding='utf-8') as f:
        for idx, line in tqdm(enumerate(f.read().split("。"))):
            d.append(line)
d = list(set(d))
for idx, d_one in tqdm(enumerate(d)): 
            metadata = {"source": f'doc_id_{idx}'}
            docs.append(Document(page_content=line.strip()+"。", metadata=metadata))

vector_store = FAISS.from_documents(docs, embeddings)
vector_store.save_local('cache/annoy/')

相对有限的内存资源来说,可以尝试把知识库文本段向量化做成一个批式处理流程

import os
import pandas as pd
from langchain.schema import Document
from langchain.document_loaders import UnstructuredFileLoader
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from tqdm import tqdm
# 中文Wikipedia数据导入示例:
embedding_model_name = 'GanymedeNil/text2vec-large-chinese'
embeddings = HuggingFaceEmbeddings(model_name=embedding_model_name)

d = []
doc_files = os.listdir("./2012")
for doc_one in doc_files:
    if not "txt" in doc_one:
        continue
    with open(os.path.join("./2012",doc_one), 'r', encoding='utf-8') as f:
        for idx, line in tqdm(enumerate(f.read().split("。"))):
            d.append(line)
d = list(set(d))
for i in range(len(d)//100000):
    docs = []

    for idx, d_one in tqdm(enumerate(d[100000*i:100000*(i+1)])): 
        metadata = {"source": f'doc_id_{idx}'}
        docs.append(Document(page_content=line.strip()+"。", metadata=metadata))

    vector_store = FAISS.from_documents(docs, embeddings)
    vector_store.save_local('cache/annoy'+str(i)+'/')

100万句子分成了10批次10万次句子生成了10个faiss向量数据文件。获取向量的过程也是需要显卡参与计算的。

编辑切换为居中

添加图片注释,不超过 140 字(可选)限制知识库的长度对知识库的向量过程有提升效果

从0到3是我生成的faiss 向量数据文件。据说还可以合并成一个大的向量文件。

在Chinese-LangChain中加入自己的知识库的文档与问题相似度表征

class LangChainCFG:
    llm_model_name = 'THUDM/chatglm-6b-int4-qe'  # 本地模型文件 or huggingface远程仓库
    embedding_model_name = 'GanymedeNil/text2vec-large-chinese'  # 检索模型文件 or huggingface远程仓库
    vector_store_path = './cache'
    docs_path = './docs'
    kg_vector_stores = {
        '2010年企业年报': './cache/annoy/',
    }  # 可以替换成自己的知识库,如果没有需要设置为None
    # kg_vector_stores=None
    patterns = ['模型问答', '知识库问答']  #

训练垂直领域问题+知识文档的对话式大语言模型的几种方式,(按照资源由小到大的排序方式)

1、ptuning v2

2、lora

3、finetune

全参数量finetune目前看起来效果是非常不错的。

下列云资源希望大家可以多多支持,大家支持的越多,小编能跑的工作越多。

注册 - OpenBayes

注册 featurize

注册地址:OpenI - 启智AI开源社区提供普惠算力!

注册 揽睿星舟-GPU算力平台

思腾合力|思腾云 注册这个平台的小伙伴加我的vx:15246115202 客服会赠送100元的代金券。

没注册的小伙伴注册一下。