前言
对于很多企业或者个人来说,训练和部署自己私有的大模型,在本地运行,这将是未来的大趋势。随着数据隐私法规的日益严格以及企业对知识产权保护的重视,将大语言模型(LLM)部署在本地基础设施中已成为关键需求。
PrivateGPT 是一款支持本地私有化部署的大语言模型应用,适用于企业敏感数据处理场景。本文详细介绍了两种部署方式:一是利用 Railway 平台进行快速远程部署,适合快速体验 Demo;二是基于本地服务器的生产级部署,涵盖 Python 环境配置、虚拟环境创建、依赖安装、模型下载及后端启动流程。文章重点讲解了 RAG 架构原理,包括文档解析、向量化、向量数据库存储及检索生成过程。此外,还提供了详细的故障排查指南,如编译错误、SQLite 缺失等问题解决方案,以及 API 接口调用示例。最后补充了网络安全配置、性能调优建议和监控维护策略,帮助用户构建稳定安全的私有化 AI 系统。

对于很多企业或者个人来说,训练和部署自己私有的大模型,在本地运行,这将是未来的大趋势。随着数据隐私法规的日益严格以及企业对知识产权保护的重视,将大语言模型(LLM)部署在本地基础设施中已成为关键需求。
本文旨在介绍如何以简单高效的方式快速部署 PrivateGPT 应用程序。我们将逐步指导您使用后端 API 和 Streamlit 前端应用程序部署您自己的 PrivateGPT 应用。令人惊喜的是,任何前端解决方案都可以轻松连接到 PrivateGPT 后端 API。如果您是企业或以隐私为中心的数据组织,这对您来说非常合适。PrivateGPT 通过优先考虑用户隐私和数据安全,使自己与其他公共聊天应用程序区分开来。
在决定采用 PrivateGPT 之前,请确认您的场景是否符合以下特征:
PrivateGPT 是一个具有完整数据控制权的聊天 GPT 应用。当面临上述情况时——例如数据比较敏感不适合暴露在互联网或者共享出来,对于企业涉密且拥有知识产权的数据,一些地方对于数据隐私保护的要求,包括我们个人涉及隐私比较敏感的数据需要有这么一个 APP 支持在本地传输数据给我们的大模型,然后快速响应给我响应的结果——这种情况下 PrivateGPT 应运而生。
在这些应用场景下,任何像 ChatGPT 这样的聊天应用都可以从 PrivateGPT 中受益。比较典型的场景是企业,企业拥有大量内部数据,不能对外公开,因为涉及知识产权的问题。
对于传统文档类 GPT 聊天应用的工作原理和流程图,基本上都是按照如下的步骤进行:
[图片:传统 RAG 架构流程图]
要理解系统背后的工作原理,我们可以把它解耦,将文档数据采集系统和数据检索系统视为两个独立的流程。
[图片:解耦后的 RAG 架构流程图]
对于 PrivateGPT,我们采集上传的文档数据是保存在公司本地私有化服务器上的,然后在服务器上本地调用这些开源的大语言文本模型,用于存储向量的数据库也是本地的,因此没有任何数据会向外部发送。所以使用 PrivateGPT,涉及到以上两个流程的请求和数据都在本地服务器或者电脑上,完全私有化。
我们在 GitHub 上可以看到目前 PrivateGPT 已经拥有超过 2 万的 Star,说明 PrivateGPT 现在已经非常流行且受欢迎了。同时对于大语言模型的爆发,一些企业或者个人私有化应用场景的需求也明显爆发出来。
接下来我们将介绍两种部署 PrivateGPT 的方法,一种是非常简单的方法,直接部署在 Railway 远程环境;第二种是在我们自己的本地服务器上部署。
PrivateGPT 原生仓库目前只提供了 CLI 接口,只能在终端窗口中去使用它,部署完成后没有可以方便使用的 UI 界面。这里我们介绍一个基于原生 PrivateGPT 做了一定友好性封装的应用 privateGPT-app。我们可以在 GitHub 上很方便的找到它,它通过使用 FastAPI 将与原生的 GPT 封装成了后端的 API 接口服务,前端基于 Streamlit 模板实现了一个方便交互的 UI 聊天界面。
Railway 这种部署方式快速方便,比较适合我们希望快速体验一下产品 demo 的场景。如果需要完整稳定的使用其功能,建议还是选择在本地服务器上进行部署。
在部署之前需要先将 privateGPT-app 项目 fork 一份到我们个人的 GitHub 仓库里来,后面需要用到。
温馨提示:这里我们 Railway 使用的免费实例,本身提供的内存和 CPU 资源都是非常有限的,所以使用过程中可能会出现一些故障。如果你希望在公有云的环境中去部署应用正式作为生产去使用,建议还是选择付费实例。Railway 是按使用时长来收费的,新用户可以免费使用 500 小时,如果不打算使用付费服务,记得在到期前去关闭它。
[图片:Railway 部署成功后的界面]
本地部署能够提供更强的性能控制和更高的安全性,适合生产环境。
构建 Python 3.11 需要 openssl 1.1.1 或更新版本。系统存储库中可用的版本通常是旧的。
按照以下指南中的步骤在 CentOS 7 / RHEL 7 上安装和配置 OpenSSL 1.1.1:
openssl 升级完成之后,可以根据以下指南中的步骤安装 Python 3.11。
确认您已经安装了 Python 3.11,可以在终端或命令行中输入 python3.11 -V 来检查。
pip install virtualenv 进行安装。virtualenv -p python3.11 myenv。其中 myenv 是您为该虚拟环境取的名字,可以根据需要自行更改。source myenv/bin/activate(Mac/Linux)或 myenv\Scripts\activate.bat(Windows)激活虚拟环境。pip install numpy。deactivate 命令退出虚拟环境。注意:为了不影响全局的 Python 环境,建议后续所有的操作都在 Python 的虚拟环境中执行,终端中显示 (myenv) 你的虚拟环境名称就代表你当前切入的虚拟环境。
从 GitHub 克隆 privateGPT-app 项目到服务器,进入项目 privateGPT-app 主目录中:
git clone [email protected]:menloparklab/privateGPT-app.git
cd privateGPT-app/
将环境变量从 example.env 复制到一个名为 .env 的文件。修改文件中的值 .env 以匹配所需的配置。
主要配置项说明:
PERSIST_DIRECTORY:应用程序将保存数据的目录,默认为 ./db。MODEL_TYPE:要使用的语言模型的类型(例如,"GPT4All"、"LlamaCpp")。MODEL_PATH:语言模型文件的路径,需指向下载的模型文件。EMBEDDINGS_MODEL_NAME:要使用的嵌入模型的名称,如 "all-MiniLM-L6-v2"。MODEL_N_CTX:模型生成期间要考虑的上下文数量,根据显存大小调整。API_BASE_URL:FastAPI 应用程序的基本 API url,通常部署到端口:8000。下载模型后并将其放在 models 文件夹中。推荐使用 GGUF 格式的量化模型以节省资源。
wget https://gpt4all.io/models/ggml-gpt4all-j-v1.3-groovy.bin
mv ggml-gpt4all-j-v1.3-groovy.bin models/
*注:实际生产中建议使用更先进的 Llama 2 或 Mistral 模型,可通过 HuggingFace 下载。
pip install -r requirements.txt
这里因为安装的依赖较多,由于有些依赖的镜像源下载很慢,安装过程会需要一点时间,请耐心等待。由于每个人使用的环境不太一样,安装过程可能不一定会非常顺利,针对我在 CentOS 7.6 上出现的一些问题解决过程可以参考一下,遇到错误仔细分析解决即可。
[图片:依赖安装成功截图]
当你看到整个执行过程如下图所示,没有出现任何错误,完整结束的时候,恭喜你,安装成功了。
如果下载依赖的过程中,出现某些依赖下载超时(Read Timeout)失败的情况,可以试试配置以下 pip 镜像源。通过国内阿里的镜像源下载。建议多尝试几次,因为网络波动会导致失败。
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
建议将 pip install -r requirements.txt 直接换成上面的命令,使用阿里云的镜像去下载,速度非常快,用默认的镜像速度基本上保持在 50kb 的速度,很容易超时失败。
具体错误信息如下所示:
ERROR: Failed building wheel for llama-cpp-python
...
An error occurred while building with CMake.
解决方案:升级 gcc-11 即可解决。安装 gcc-11 需要先安装 SCL 开发工具集(devtoolset-11 软件集)。
yum list installed | grep devtoolset-11
如果看到 devtoolset-11 的条目,则表示已安装。否则,请安装它:
sudo yum install -y devtoolset-11
确认您的 CentOS 版本支持 SCL。SCL 要求 CentOS 6 或更高版本。如果您的版本过旧,则可能需要升级为最新版本。
确保您执行了正确的命令。要启用 SCL,应使用以下方式运行 scl enable 命令,该命令会启动一个新的 Shell 会话,并将当前终端 shell 环境转换为 devtoolset-11 版本的环境。在此环境中,您可以使用最新版本的编译器、调试器和其他构建工具。
scl enable devtoolset-11 bash
scl enable devtoolset-11 -
如果还是无法使用 scl 命令,请尝试更新您的操作系统,并重新安装 devtoolset-11。
要运行 FastAPI 后端,请执行以下命令:
# 控制台启动,便于查看日志
gunicorn app:app -k uvicorn.workers.UvicornWorker --timeout 1500
# 后台进程启动,正式部署
nohup gunicorn app:app -k uvicorn.workers.UvicornWorker --timeout 1500 --bind=0.0.0.0:14800 > privateGPT-backend.log 2>&1 &
此命令启动后端服务器并自动处理语言模型和嵌入模型的必要下载。该 --timeout 500 选项可确保为正确的模型下载留出足够的时间。看到如下界面表示已经成功启动,如启动有错误请参考后面的问题进行排查。
[图片:后端启动日志]
File "ingest.py", line 52
def load_single_document(file_path: str) -> Document:
^
SyntaxError: invalid syntax
解决方案:原因是代码基于 Python3.x 实现,但可能执行的是默认的 Python2.x 解释器,导致出现语法兼容问题。很大概率是你不在虚拟环境中安装依赖或者重新编译完 Python 未更新到虚拟环境。
gunicorn app:app -k uvicorn.workers.UvicornWorker --timeout 1500 --bind=0.0.0.0:8000 --pythonpath=/opt/gptlabs/privateGPT/myenv/bin/python3.11
ModuleNotFoundError: No module named '_sqlite3'
解决方案:由于 Python 编译时未包括对 SQLite3 的支持而导致的。不确定 Python 源码是否已编译为支持 SQLite3,可以使用以下命令来检查当前 Python 解释器中是否启用了 SQLite3 扩展:
python -c "import sqlite3; print(sqlite3.sqlite_version)"
如果输出了 SQLite3 库的版本号,则表示 Python 已经编译好了对 SQLite3 的支持。如果这个命令引发了 ImportError 或其他错误,则表示 Python 可能未编译为支持 SQLite3。此时您需要重新编译 Python 并确保在编译选项中启用了对 SQLite3 的支持(例如 --enable-loadable-sqlite-extensions)。
注意:请确保在重新编译并安装 Python 之前备份现有的 Python 安装(如果您不是在虚拟环境中操作)。
tar -czvf python_backup.tar.gz /usr/local/bin/python3.11
如果您使用的是源代码或已经下载了 Python 源码,请按照以下步骤进入 Python 源码目录编译并安装 Python:
LDFLAGS="${LDFLAGS} -Wl,-rpath=/usr/local/openssl/lib" ./configure --with-openssl=/usr/local/openssl --prefix=/usr/local/python3.11 --enable-loadable-sqlite-extensions
make
make install
请更新 API_BASE_URL 为适当的 FastAPI 网址。
要运行 Streamlit 应用程序,请使用以下命令:
# 控制台启动,便于查看日志
streamlit run streamlit_app.py --server.address 0.0.0.0 --logger.level=debug
# 后台进程启动,正式部署
nohup streamlit run streamlit_app.py --server.address 0.0.0.0 > privateGPT-frontend.log 2>&1 &
此命令启动 Streamlit 应用程序并将其连接到正在运行的后端服务器 localhost。
前后端部署完成后,我们可以正式访问 PrivateGPT 了。浏览器直接输入前端 Streamlit 的端口接口,启动前端应用在控制台会打印出来,也可以在配置文件中设置端口号。
点击 [Browse files] 选择本地文档上传,上传文件大小限制 200M 以内,支持的文件格式在 5.1 中有说明。
[图片:文档上传界面]
只需点击 [Embed] 按钮即可,将文件进行分割并计算向量存储,PrivateGPT 采用的 Chroma 向量数据库存储,默认在项目根目录下的 db 文件夹。
[图片:向量计算进度]
只有文档正确上传并 Embedding 之后,才可以选择文档进行对话。如果下拉框没有刚才上传的文件,基本上 load 失败了,可以去查看日志。注意:这里文件名不能有空格。
[图片:对话检索界面]
嵌入文档是一个快速的过程,但由于语言模型生成步骤,检索可能需要很长时间。需要进行优化以提高检索性能。
FastAPI 后端可以与您选择的任何前端框架一起使用。随意将其与您喜欢的用户界面集成。
.csv: 文档格式.docx: Word 文档.enex: 印象笔记.eml: 电子邮件.epub: 电子书.html: HTML 文件.md: Markdown 文件.msg: Outlook 消息.odt: 打开文档文本.pdf: 便携式文档格式 (PDF).pptx: PowerPoint 文档.txt: 文本文件 (UTF-8)curl -X GET http://localhost:8000/
import requests
response = requests.get("http://localhost:8000/")
print(response.json())
curl -X POST -F "[email protected]" -F "[email protected]" -F "collection_name=my_collection" http://localhost:8000/embed
import requests
files = [("files", open("file1.txt", "rb")), ("files", open("file2.txt", "rb"))]
data = {"collection_name": "my_collection"}
response = requests.post("http://localhost:8000/embed", files=files, data=data)
print(response.json())
curl -X POST -H "Content-Type: application/json" -d '{"query": "sample query", "collection_name": "my_collection"}' http://localhost:8000/retrieve
import requests
data = {"query": "sample query", "collection_name": "my_collection"}
response = requests.post("http://localhost:8000/retrieve", json=data)
print(response.json())
请注意,实际 URL (http://localhost:8000/) 和请求负载应根据您的特定设置和要求进行调整。
privateGPT-backend.log 和 privateGPT-frontend.log,防止磁盘占满。PrivateGPT 为企业和个人提供了一个强大的私有化大语言模型解决方案。通过本地部署,您可以完全掌控数据流向,确保敏感信息不外泄。无论是通过 Railway 快速体验,还是在本地服务器进行生产级部署,本文提供的步骤都能帮助您顺利完成搭建。随着技术的不断演进,未来可能会有更多优化的模型和工具加入生态,建议持续关注官方动态以获取最新功能。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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