近日,GitHub上开源了privateGPT,声称能够断网的情况下,借助GPT和文档进行交互。这一场景对于大语言模型来说,意义重大。因为很多公司或者个人的资料,无论是出于数据安全还是隐私的考量,是不方便联网的。为此,我也进行了些许体验,跑完了整个流程,希望给读者朋友一些有用信息。

原作仓库地址:https://github.com/imartinez/privateGPT

先说结论:可用,但还有进步空间。特别是对于简单询问语句,该模型不像ChatGPT回答有来有回,而是提供若干可能性进行回答。而数据预处理环节的容错性、embedding向量的生成方法以及大语言模型的基底模型,每一个环节的质量都会影响最终的使用体验。可期待的是,每一个环节都有可能逐步改善,并最终带来质的飞跃。

原理解析

这套方法使用了 LangChain, GPT4All, LlamaCpp, Chroma and SentenceTransformers.

LangChain 用来生成文本向量,Chroma 存储向量。GPT4All、LlamaCpp用来理解问题,匹配答案。基本原理是:问题到来,向量化。检索语料中的向量,给到最相似的原始语料。语料塞给大语言模型,模型回答问题。基本原理和chatpdf没大差别。

环境配置复现

首先是环境,后文采用的是ubuntu环境。mac环境也能支持,不过在安装过程中需要调整部分参数。家里有ubuntu系统,图省事就用它了。

conda create -n gpt python=3.10  # 其他python版本不行,后续有个3.10的语法糖
conda activate gpt
pip install -r requirements.txt

配置环境

cp example.env .env
vi .env

具体配置如下

PERSIST_DIRECTORY=db
MODEL_TYPE=GPT4All
MODEL_PATH=models/ggml-gpt4all-j-v1.3-groovy.bin
EMBEDDINGS_MODEL_NAME=all-MiniLM-L6-v2
MODEL_N_CTX=1000

下载资料与模型权重

我们以《Generative Agents: Interactive Simulacra of Human Behavior》AI小镇这篇论文为例:

cd source_documents
curl -o x.pdf https://arxiv.org/pdf/2304.03442.pdf

cd ..
mkdir models
cd models
curl -o ggml-gpt4all-j-v1.3-groovy.bin https://gpt4all.io/models/ggml-gpt4all-j-v1.3-groovy.bin

向量化数据

python ingest.py

如果502失败,可以尝试shell中直接调起python,输入下面的代码。下载完成后退出。

> from langchain.embeddings import HuggingFaceEmbeddings
> HuggingFaceEmbeddings(model_name='all-MiniLM-L6-v2')

中文处理

中文的处理主要在embedding方式的变更上:

.env 配置如下

PERSIST_DIRECTORY=db
MODEL_TYPE=GPT4All
MODEL_PATH=models/ggml-gpt4all-j-v1.3-groovy.bin
EMBEDDINGS_MODEL_NAME=shibing624/text2vec-base-chinese
MODEL_N_CTX=1000

塞了两篇个人网站的文章进去,一个是about me,一个是讲xgboost特征重要的。

向量化数据前删除旧的db文件夹,然后执行

python ingest.py

如果502失败,可以尝试shell中直接调起python,输入下面的代码。下载完成后退出。

> from langchain.embeddings import HuggingFaceEmbeddings
> HuggingFaceEmbeddings(model_name='shibing624/text2vec-base-chinese')

效果比对

python privateGPT.py

英文测试

丰富度上优于chatgpt,因为它检索了多处内容。

中文测试

能解析,但是理解程度一般,可能和语料也有关系。对于GPT有把握的,即使它是瞎编,并且相关性也检索到了,也不给出文档里的内容。

总之,可用,但还有进步空间。其中的坑和tricks也蛮多的,比如python版本要选对,还会存在unknown token。不同硬件可能会有不同的性能上限,我的ubuntu性能一般,需要就参数做减小调整。

更多的参数调试,也许会带来更好的效果。更换pdf和html的解析工具,也许会让数据质量更高。但由于时间限制,就只有后面再测试啦。如果读者朋友已经有过测试,欢迎下方进行交流。

关于作者