之前树先生教过我们如何利用微调打造一个垂直范畴的 LLM 专属模型。但是微调一方面需要专业知识,一般需要很多核算资源和时刻,以便在不同的超参数设置上训练多个模型并挑选最佳的一个,另一方面动态扩展比较差,新增和修正原有的数据都要重新微调一次。总得来说对非专业人员不友好。

ChatGLM-6B 布置与 P-Tuning 微调实战

今日树先生教我们无需微调就能完成垂直范畴的专业问答,利用 ChatGLM-6B + langchain 完成个人专属知识库,十分简略易上手。

技能原理

项目完成原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本切割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最类似的top k个 -> 匹配出的文本作为上下文和问题一同增加到 prompt 中 -> 提交给 LLM 生成答复。

基于 ChatGLM-6B 搭建个人专属知识库

基于 ChatGLM-6B 搭建个人专属知识库

从上面就能看出,其核心技能就是向量 embedding,将用户知识库内容通过 embedding 存入向量知识库,然后用户每一次发问也会通过 embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一同作为 promt 提交给 LLM 答复,很好了解吧。一个典型的 prompt 模板如下:

"""
已知信息:
{context} 
依据上述已知信息,简练和专业的来答复用户的问题。如果无法从中得到答案,请说 “依据已知信息无法答复该问题” 或 “没有供给满足的相关信息”,不允许在答案中增加假造成分,答案请运用中文。 
问题是:{question}
"""

更多关于向量 embedding 的内容能够参阅我之前写的一篇文章。

ChatGPT 引爆向量数据库赛道

运用场景

能够调整 prompt,匹配不同的知识库,让 LLM 扮演不同的人物

  • 上传公司财报,充任财务分析师
  • 上传客服聊天记录,充任智能客服
  • 上传经典Case,充任律师助手
  • 上传医院百科全书,充任在线问诊医生

等等等等。。。。

实战

这儿咱们选用 langchain-ChatGLM 项目示例,其他的 LLM 模型对接知识库也是一个道理。

准备工作

咱们还是白嫖阿里云的机器学习 PAI 渠道,运用 A10 显卡,这部分内容之前文章中有介绍。

免费布置一个开源大模型 MOSS

项目布置

环境准备好了今后,就能够开端准备布置工作了。

下载源码

git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git

安装依赖

cd langchain-ChatGLM
pip install -r requirements.txt

下载模型

# 安装 git lfs
git lfs install
# 下载 LLM 模型
git clone https://huggingface.co/THUDM/chatglm-6b /your_path/chatglm-6b
# 下载 Embedding 模型
git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese /your_path/text2vec
# 模型需要更新时,可打开模型所在文件夹后拉取最新模型文件/代码
git pull

参数调整

模型下载完成后,请在 configs/model_config.py 文件中,对embedding_model_dictllm_model_dict参数进行修正。

embedding_model_dict = {
    "ernie-tiny": "nghuyong/ernie-3.0-nano-zh",
    "ernie-base": "nghuyong/ernie-3.0-base-zh",
    "text2vec": "/your_path/text2vec"
}
llm_model_dict = {
    "chatyuan": "ClueAI/ChatYuan-large-v2",
    "chatglm-6b-int4-qe": "THUDM/chatglm-6b-int4-qe",
    "chatglm-6b-int4": "THUDM/chatglm-6b-int4",
    "chatglm-6b-int8": "THUDM/chatglm-6b-int8",
    "chatglm-6b": "/your_path/chatglm-6b",
}

项目发动

Web 形式发动

pip install gradio
python webui.py

基于 ChatGLM-6B 搭建个人专属知识库

模型配置

基于 ChatGLM-6B 搭建个人专属知识库

上传知识库

基于 ChatGLM-6B 搭建个人专属知识库

知识库问答

基于 ChatGLM-6B 搭建个人专属知识库

API 形式发动

python api.py

命令行形式发动

python cli_demo.py

改善

Gradio 页面太过于粗陋,可作为后台管理员操作页面,如果要开放给用户运用就不适宜了,树先生在 Chatgpt-Next-Web 项目基础上进行了适配修正,打造了一款面向用户运用的本地知识库前端。

授权码操控

基于 ChatGLM-6B 搭建个人专属知识库

挑选知识库

基于 ChatGLM-6B 搭建个人专属知识库

基于知识库问答

基于 ChatGLM-6B 搭建个人专属知识库

显示答案来历

基于 ChatGLM-6B 搭建个人专属知识库

基于 ChatGLM-6B 搭建个人专属知识库

PS:这个知识库是我上传的原始知识库,所以来历这块数据展现作用不好,更好的做法是通过一遍 数据治理 再上传。

感兴趣的朋友能够私信我,我会免费给我们供给知识库体验地址。