基于 LangChain-Chatchat 和 ChatGLM3 搭建私有化知识库实战
外挂知识库(RAG)利用向量数据库检索相关内容辅助大模型回答。本文介绍基于 LangChain-Chatchat 框架结合 ChatGLM3 开源模型的私有化知识库搭建方案。流程涵盖环境准备、模型下载、配置文件修改及部署运行。测试显示该方案适合本地文档检索整合,在代码生成推理方面存在局限,但数据安全性高,适合企业内部资料管理。

外挂知识库(RAG)利用向量数据库检索相关内容辅助大模型回答。本文介绍基于 LangChain-Chatchat 框架结合 ChatGLM3 开源模型的私有化知识库搭建方案。流程涵盖环境准备、模型下载、配置文件修改及部署运行。测试显示该方案适合本地文档检索整合,在代码生成推理方面存在局限,但数据安全性高,适合企业内部资料管理。

在介绍外挂知识库前,我们先来看看大语言模型的特点:
我们希望模型的回答能根据自己本地的文档,或者其他的一些数据源来回答,但模型回答的数据来自于训练时的数据(比如现在是截止到 2022 年的数据),不能使用其他的数据。那我们可以将数据和问题一起输入,比如给出这样的 prompt:
【这里是某些数据源...】
请根据上面的信息,回答我的问题,如果上面的信息得不出答案,请回答:'没有足够的信息',那么我的问题是:xxxxx
这样的方案是可行的,但前提是数据源的数据不能太多,模型携带的上下文有限。假设我们希望将一本书的内容作为上下文,然后让其根据书中的内容来回答是不行的,模型一次能支持输入的长度有限。而且每次提问将一大段内容贴进去,也不现实。
那么是否可以只将和问题相关的内容提取出来作为上下文输入呢?这样既可以减少数据源,还能让模型根据这些内容去分析总结出想要的回答。
那么问题就变成了如何根据想要问的问题,从书中检索出相关的内容,这其实就是搜索引擎做的事情。具体的做法就是将这本书的内容通过某些格式保存到数据库中,然后每次提问的时候,先取数据库检索相关的内容,然后将内容和问题按照类似上面的 prompt 提交给模型,经过模型来生成高质量的回答。而这个保存了书内容的数据库就是外挂知识库。
其中保存到数据库的过程是对原文本进行 Tokenizer(分词) + Embedding(向量化),数据库则称为 Vector Store(向量数据库)。
整个过程如下:

名词解释:
目前已经有许多开源的方案,也有许多商业化的方案,基本上可以分为:
上面几种方案,2、4 都是比较简单的方案,区别就是模型的问题和数据是否私有化,这里我选择方案 4,不依赖 OpenAI,可以少处理点坑。最终选择的方案是 LangChain + 开源 LLM。
一种利用 RAG 思想实现的基于本地知识库的问答应用,而 LangChain 则是一个 AI 开发框架,方便调用各类 AI 工具。
LangChain-chatchat 的处理过程与上面介绍的类似,包括 加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的 top k 个 -> 匹配出的文本作为上下文和问题一起添加到 prompt 中 -> 提交给 LLM 生成回答。
不过其提供了完整的解决方案,可以做到开箱即用,私有化部署,极大的简化了本地知识库的搭建。

ChatGLM3 是智谱 AI 和清华大学 KEG 实验室联合发布的新一代对话预训练模型,和 ChatGPT 类似的大语言模型,对中文的支持更好,同时对硬件的支持更小(16G 的消费级显卡就可以),部署门槛比较低。当然训练的数据相对 ChatGPT 来说也小很多,能力上也会有所不足。这里在我部署了 ChatGLM3 针对其和 ChatGPT 做了一些测试,还是 ChatGPT 的回答更出色些。
ChatGLM3 的回答

ChatGPT 的回答

这里建议找一些环境可以的云服务,不然对于不熟悉的同学安装各种环境依赖都可能搞很久。注意,镜像的选择要选最新的镜像,比如下面这个,这个刚刚好可以满足所有的环境需求:

先下载 ChatGLM3 的 LLM 模型,由于 huggingface 上一直下载不下来,所以我们选择到 modelscope 下载。
# /mnt/workspace/
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
我们选择这个向量模型,当然也还有其他的模型,可以参考。
# /mnt/workspace/
git clone https://www.modelscope.cn/Jerry0/text2vec-bge-large-chinese.git
# /mnt/workspace/
git clone https://github.com/chatchat-space/Langchain-Chatchat.git
cd Langchain-Chatchat
# 需要将分支切换到 v0.2.2 版本,最新的 master 分支需要 python 3.10 以上,且不太容易运行起来
git checkout origin v0.2.2
# 初始化依赖,在这之前需要锁定 2 个依赖版本,不然运行起来会报错
# streamlit-chatbox==1.1.7,分别修改 requirements.txt、requirements_webui.txt
# openai==0.28.1,分别修改 requirements.txt、requirements_api.txt
pip install -r requirements.txt
pip install -r requirements_api.txt
pip install -r requirements_webui.txt
# 初始化配置文件
cp configs/model_config.py.example configs/model_config.py
cp configs/server_config.py.example configs/server_config.py
接着,需要修改 model_config.py 中的配置。
embedding_model_dict = {
# ...
# 替换成刚刚下载向量库路径
"text2vec-base": "/mnt/workspace/text2vec-bge-large-chinese",
# ...
}
llm_model_dict = {
# ...
# 增加如下配置
"chatglm3-6b": {
"local_model_path": "/mnt/workspace/chatglm3-6b", # 刚刚下载的模型库路径
"api_base_url": "", # 与其他的保持一起
"api_key": "" # 与其他的保持一起
},
# ...
}
# 默认向量模型改成 text2vec-base
EMBEDDING_MODEL = "text2vec-base"
# 默认 LLM 模型改成 chatglm3-6b
LLM_MODEL = "chatglm3-6b"
接着运行:python startup.py -a,当看到下面的提示时,则运行起来了,打开链接就可以使用了。

首先可以直接使用其对话能力,也就是不带知识库的模式。

首先可以导入文档,创建相关的知识库,然后选择知识库问答模式。

以之前写的文章做一下测试,确实能基于我的文档做一些检索,但还是有一些问题,也和模型有关。


也能结合已有的资料和本地知识库做整合,下面的回答不完全来源于我的文章。

整体验证下来,用于检索本地文档并且做总结归纳这方面还是挺不错的。但需要做一些推理生成一些代码之类的,就不一定能够准确,所以还是适合于针对已有文档的检索整合问答。
这次简单的尝试了本地部署 LLM + 外挂知识库的方式来搭建一个私有化的知识库,整体来看还有一些提升空间,比如模型的选择上,ChatGLM3 适合于小型的系统,如果有更多的资源,则可以考虑其他更大的模型,如 ChatGLM-130B。
知识库也是目前 LLM 的一个实践方向,特别是这种私有化的部署方式,每个企业内部都有大量资料、文档,过去内部可能依靠人工词典,但资料的使用率其实不高,随着人员变动出现了很多重复的资料,而这种基于 LLM 的私有化知识库,则提供了一种很好的解决方案,可以检索过去的资料,给出资料来源,如果资料有问题就可以到源地址去修改,更好的提高资料的使用率。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online