1. 企业内网也能用的“ChatGPT”:从部署到源码一次讲清 2. 手把手搭一套企业私有 AI 助手:架构、RAG 与源码实战 3. 不把数据交出去:企业级 ChatGPT 私有化部署完整方案 4. 从 0 到 1 搭建私有化 ChatGPT:模型、知识库、权限与源码 5. 企业私有 AI 助手落地指南:可部署、可接入、可管控 6. 内网版 ChatGPT 怎么做?一套可运行的私有化部署方案 7. 把大模型装进企业内网:私有化 ChatGPT 实战方案 8. 企业知识库问答系
ChatGPT 私有化部署方案|附源码
说明:严格来说,OpenAI 官方 ChatGPT 本体并不支持私有化部署。我们日常所说的“ChatGPT 私有化部署”,通常指的是在企业内网或私有云中部署一套类似 ChatGPT 的智能问答系统,包括:大语言模型、对话服务、知识库检索、权限控制、审计日志、前端聊天界面等能力。
本文将从架构设计、模型选型、部署方案、接口服务、前端页面、知识库增强以及安全治理等方面,完整介绍一套可落地的 ChatGPT 私有化部署方案,并附上可运行的核心源码示例。
一、为什么需要 ChatGPT 私有化部署?
随着大语言模型在企业办公、研发、客服、知识管理、数据分析等场景中的广泛应用,越来越多的企业开始关注私有化部署方案。相比直接使用公有云 AI 服务,私有化部署主要有以下优势:
1. 数据安全可控
企业内部文档、合同、代码、客户资料、财务数据往往具有较高敏感性。如果直接上传到第三方平台,可能存在数据泄露、合规审计困难等问题。
私有化部署后,数据可以保留在企业内网或专属私有云环境中,访问链路、日志存储、权限控制都由企业自主掌握。
2. 满足合规要求
金融、政务、医疗、能源、军工等行业对数据合规要求较高,很多场景不允许业务数据流出专有网络。私有化部署可以更好地满足等保、数据安全法、个人信息保护法以及行业监管要求。
3. 成本可控
如果企业内部有大量员工频繁使用 AI 能力,长期按量调用公有云模型接口,成本可能较高。通过本地部署开源大模型,可以在硬件投入之后,将单位调用成本控制在更低水平。
4. 支持深度定制
私有化部署不仅可以替换模型,还可以结合企业知识库、业务系统、内部 API、权限体系、审计系统进行深度集成。例如:
- 企业内部智能客服;
- 研发代码助手;
- 合同审核助手;
- 运维问答机器人;
- 内部制度查询助手;
- 数据报表分析助手;
- OA、CRM、ERP 智能助手。
二、整体架构设计
一套较完整的 ChatGPT 私有化部署系统,通常由以下几部分组成:
用户浏览器
│
▼
前端聊天界面 Web UI
│
▼
后端 API 服务
│
├── 用户认证与权限控制
├── 会话管理
├── Prompt 编排
├── 模型调用网关
├── 知识库检索 RAG
├── 敏感词与安全审计
└── 日志与监控
│
▼
大语言模型推理服务
│
├── Qwen
├── DeepSeek
├── Llama
├── Baichuan
└── ChatGLM
│
▼
向量数据库 / 文档库 / 业务系统
推荐技术选型
| 模块 | 推荐方案 |
|---|---|
| 前端 | Vue、React、Next.js |
| 后端 | FastAPI、Spring Boot、Node.js |
| 模型服务 | vLLM、Ollama、Text Generation WebUI、LMDeploy |
| 模型协议 | OpenAI-Compatible API |
| 向量数据库 | Milvus、Qdrant、Chroma、pgvector |
| 文档解析 | unstructured、pdfplumber、python-docx |
| 权限认证 | JWT、OAuth2、LDAP、企业微信、飞书 |
| 部署方式 | Docker Compose、Kubernetes |
| 监控 | Prometheus、Grafana、ELK |
| 网关 | Nginx、Kong、Traefik |
三、模型选型建议
私有化部署的核心是大语言模型。当前可选的开源或开放权重模型较多,常见选择如下:
1. Qwen 系列
通义千问 Qwen 系列中文能力较强,生态完善,适合中文企业知识问答、办公助手、代码辅助等场景。
适合场景:
- 中文问答;
- 企业知识库;
- 办公助手;
- 多语言任务;
- 代码生成。
2. DeepSeek 系列
DeepSeek 在代码、数学、推理方面表现较好,适合研发团队、数据分析、逻辑推理类应用。
适合场景:
- 代码助手;
- SQL 生成;
- 数学推理;
- 技术文档问答;
- 智能研发平台。
3. Llama 系列
Llama 生态成熟,英文能力强,社区资源丰富。如果企业有较多英文资料或海外业务,可以考虑使用。
4. ChatGLM 系列
ChatGLM 中文对话能力较好,部署资料较多,对国内用户比较友好。
5. 模型规模选择
| 模型规模 | 显存需求 | 适用场景 |
|---|---|---|
| 7B / 8B | 8GB - 16GB | 轻量问答、测试、个人助手 |
| 14B | 24GB - 48GB | 中小企业知识库、办公助手 |
| 32B | 64GB - 80GB | 复杂问答、代码、推理 |
| 70B+ | 160GB+ | 高质量生成、复杂推理、大规模企业应用 |
如果是企业正式使用,建议至少选择 14B 以上模型。如果预算有限,可以先使用 7B/8B 版本做验证,再根据效果逐步升级。
四、部署方式选择
方案一:Ollama 快速部署
Ollama 适合快速体验和中小规模使用,安装简单,命令清晰,非常适合内部 Demo 或轻量级私有助手。
安装 Ollama
Linux 环境下执行:
curl -fsSL https://ollama.com/install.sh | sh
拉取模型
以 Qwen 为例:
ollama pull qwen2.5:7b
启动模型服务
ollama serve
默认服务地址:
http://localhost:11434
测试调用
curl http://localhost:11434/api/chat -d '{
"model": "qwen2.5:7b",
"messages": [
{
"role": "user",
"content": "请介绍一下私有化部署大模型的优势"
}
]
}'
方案二:vLLM 高性能部署
如果企业用户较多,需要支持并发访问,推荐使用 vLLM。vLLM 支持连续批处理、PagedAttention、OpenAI API 兼容接口,适合生产环境。
安装 vLLM
pip install vllm
启动 OpenAI 兼容服务
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-14B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--served-model-name private-chatgpt
启动后,服务接口与 OpenAI Chat Completions 接口基本兼容。
测试接口
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer EMPTY" \
-d '{
"model": "private-chatgpt",
"messages": [
{
"role": "user",
"content": "请用三句话解释 RAG 是什么"
}
],
"temperature": 0.7
}'
五、Docker Compose 一键部署方案
下面给出一个简化版的私有化 ChatGPT 部署方案,包括:
- 前端 Web UI;
- 后端 FastAPI 服务;
- Ollama 模型服务;
- Chroma 向量数据库;
- Nginx 反向代理。
项目目录结构
private-chatgpt/
├── docker-compose.yml
├── nginx/
│ └── default.conf
├── backend/
│ ├── Dockerfile
│ ├── main.py
│ ├── rag.py
│ ├── requirements.txt
│ └── config.py
└── frontend/
├── Dockerfile
├── package.json
└── src/
└── App.vue
六、核心源码
1. docker-compose.yml
version: "3.9"
services:
ollama:
image: ollama/ollama:latest
container_name: private-ollama
ports:
- "11434:11434"
volumes:
- ./data/ollama:/root/.ollama
restart: always
chroma:
image: chromadb/chroma:latest
container_name: private-chroma
ports:
- "8001:8000"
volumes:
- ./data/chroma:/chroma/chroma
restart: always
backend:
build:
context: ./backend
container_name: private-chatgpt-backend
ports:
- "9000:9000"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- OLLAMA_MODEL=qwen2.5:7b
- CHROMA_HOST=chroma
- CHROMA_PORT=8000
depends_on:
- ollama
- chroma
restart: always
frontend:
build:
context: ./frontend
container_name: private-chatgpt-frontend
ports:
- "8080:80"
depends_on:
- backend
restart: always
2. backend/requirements.txt
fastapi==0.115.0
uvicorn==0.30.6
requests==2.32.3
pydantic==2.8.2
chromadb==0.5.5
sentence-transformers==3.0.1
python-multipart==0.0.9
3. backend/config.py
import os
OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434")
OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", "qwen2.5:7b")
CHROMA_HOST = os.getenv("CHROMA_HOST", "localhost")
CHROMA_PORT = int(os.getenv("CHROMA_PORT", "8000"))
SYSTEM_PROMPT = """
你是企业内部私有化部署的智能助手。
你需要遵守以下规则:
1. 回答必须准确、清晰、专业;
2. 如果知识库中没有相关信息,请明确说明不知道;
3. 不要编造企业制度、合同条款或业务数据;
4. 对敏感数据保持谨慎,不输出未授权信息;
5. 优先使用用户提供的上下文和企业知识库内容。
"""
4. backend/main.py
from fastapi import FastAPI, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import requests
from config import OLLAMA_BASE_URL, OLLAMA_MODEL, SYSTEM_PROMPT
from rag import add_document, search_documents
app = FastAPI(title="Private ChatGPT API")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class ChatRequest(BaseModel):
message: str
use_rag: bool = True
class ChatResponse(BaseModel):
answer: str
@app.get("/health")
def health():
return {"status": "ok"}
@app.post("/chat", response_model=ChatResponse)
def chat(req: ChatRequest):
context = ""
if req.use_rag:
docs = search_documents(req.message, top_k=3)
if docs:
context = "\n\n".join(docs)
prompt = f"""
{SYSTEM_PROMPT}
以下是企业知识库中检索到的相关内容:
{context if context else "未检索到相关知识库内容。"}
用户问题:
{req.message}
请基于以上信息进行回答。
"""
payload = {
"model": OLLAMA_MODEL,
"messages": [
{
"role": "system",
"content": SYSTEM_PROMPT
},
{
"role": "user",
"content": prompt
}
],
"stream": False
}
resp = requests.post(
f"{OLLAMA_BASE_URL}/api/chat",
json=payload,
timeout=120
)
resp.raise_for_status()
data = resp.json()
return ChatResponse(answer=data["message"]["content"])
@app.post("/upload")
async def upload(file: UploadFile = File(...)):
content = await file.read()
try:
text = content.decode("utf-8")
except UnicodeDecodeError:
return {
"success": False,
"message": "当前示例仅支持 UTF-8 文本文档,请扩展 PDF、Word 解析能力。"
}
add_document(file.filename, text)
return {
"success": True,
"filename": file.filename,
"message": "文档已写入知识库"
}
5. backend/rag.py
import chromadb
from chromadb.config import Settings
from sentence_transformers import SentenceTransformer
from config import CHROMA_HOST, CHROMA_PORT
client = chromadb.HttpClient(
host=CHROMA_HOST,
port=CHROMA_PORT,
settings=Settings(allow_reset=False)
)
collection = client.get_or_create_collection(name="enterprise_docs")
embedding_model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
def split_text(text: str, chunk_size: int = 500, overlap: int = 80):
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunk = text[start:end]
chunks.append(chunk)
start = end - overlap
return chunks
def embed(texts):
return embedding_model.encode(texts).tolist()
def add_document(filename: str, text: str):
chunks = split_text(text)
ids = []
metadatas = []
for index, chunk in enumerate(chunks):
ids.append(f"{filename}-{index}")
metadatas.append({
"filename": filename,
"chunk_index": index
})
vectors = embed(chunks)
collection.add(
ids=ids,
documents=chunks,
embeddings=vectors,
metadatas=metadatas
)
def search_documents(query: str, top_k: int = 3):
query_vector = embed([query])[0]
result = collection.query(
query_embeddings=[query_vector],
n_results=top_k
)
documents = result.get("documents", [[]])[0]
return documents
6. backend/Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
EXPOSE 9000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "9000"]
7. frontend/src/App.vue
企业私有化 ChatGPT
8. frontend/package.json
{
"scripts": {
"dev": "vite --host 0.0.0.0",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"@vitejs/plugin-vue": "^5.1.2",
"vite": "^5.4.0",
"vue": "^3.4.38"
},
"devDependencies": {}
}
9. frontend/Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
七、启动部署
进入项目根目录:
docker compose up -d --build
首次启动后,需要进入 Ollama 容器拉取模型:
docker exec -it private-ollama ollama pull qwen2.5:7b
访问前端页面:
http://服务器IP:8080
后端接口地址:
http://服务器IP:9000
健康检查:
curl http://服务器IP:9000/health
八、知识库增强:RAG 方案说明
仅仅部署大模型,并不能让模型自动理解企业内部资料。模型本身只具备训练阶段学到的通用知识,不知道企业内部最新制度、项目文档、产品手册、客户案例等内容。
因此,企业私有化 ChatGPT 通常需要引入 RAG,即检索增强生成。
RAG 基本流程
上传企业文档
│
▼
文档解析
│
▼
文本切分
│
▼
向量化 Embedding
│
▼
写入向量数据库
│
▼
用户提问
│
▼
问题向量化
│
▼
相似内容检索
│
▼
拼接 Prompt
│
▼
大模型生成答案
RAG 的优势
-
降低幻觉
模型可以基于检索到的真实文档回答,而不是完全依赖自身参数记忆。 -
支持知识更新
企业文档变化后,只需要重新入库,不必重新训练大模型。 -
成本更低
相比模型微调,RAG 的实现成本和维护成本更低。 -
可追溯性更强
可以在回答中附带引用来源,方便用户验证答案。
生产环境优化建议
上文代码只是最小可运行示例,真实生产环境中建议继续增强:
- 支持 PDF、Word、Excel、PPT、Markdown、HTML 等格式解析;
- 按标题、章节、表格、段落进行结构化切分;
- 增加重排序模型,例如 bge-reranker;
- 检索结果返回来源文件和页码;
- 对不同部门知识库做权限隔离;
- 增加文档版本管理;
- 支持增量更新和删除;
- 支持混合检索,即关键词检索加向量检索。
九、安全与权限设计
私有化部署并不代表天然安全。如果没有完善的权限控制和审计机制,内部系统同样可能发生数据泄露。
1. 用户认证
建议接入企业统一身份认证系统,例如:
- LDAP;
- OAuth2;
- SSO;
- 企业微信;
- 飞书;
- 钉钉;
- Keycloak。
2. 权限隔离
知识库需要根据组织架构、角色、项目组进行隔离。例如:
- HR 文档仅 HR 和管理层可访问;
- 财务制度仅财务部门可访问;
- 项目资料仅项目成员可访问;
- 源代码知识库仅研发团队可访问。
3. 敏感信息保护
可以在用户输入和模型输出两个阶段增加敏感信息识别:
- 身份证号;
- 手机号;
- 银行卡号;
- 客户名称;
- 合同金额;
- 密码、密钥、Token;
- 内部 IP、数据库连接串。
一旦识别到敏感内容,可以进行脱敏、拦截或记录审计。
4. 审计日志
建议记录以下信息:
- 用户 ID;
- 用户 IP;
- 提问时间;
- 输入内容;
- 检索文档;
- 模型回答;
- Token 消耗;
- 响应耗时;
- 是否触发安全策略。
审计日志不只是为了追责,也可以用于后续优化知识库质量、Prompt 质量和模型效果。
十、硬件配置建议
不同规模的模型对硬件要求差异很大,下面给出参考配置。
测试环境
适合个人验证、功能 Demo:
CPU:8 核
内存:32GB
GPU:NVIDIA RTX 3060 / 4060 12GB
磁盘:500GB SSD
模型:7B / 8B
中小企业环境
适合几十到几百人内部使用:
CPU:16 核以上
内存:64GB - 128GB
GPU:NVIDIA RTX 4090 24GB 或 A5000 / A6000
磁盘:1TB - 4TB SSD
模型:14B / 32B 量化版本
生产高并发环境
适合大规模企业、多部门、多业务系统调用:
CPU:32 核以上
内存:256GB 以上
GPU:A800 / H800 / A100 / H100 多卡
磁盘:NVMe SSD
模型:32B / 70B+
部署:Kubernetes + vLLM + 多副本负载均衡
十一、常见问题
1. 私有化部署后效果一定比 ChatGPT 好吗?
不一定。OpenAI 官方 ChatGPT 背后有非常强大的模型、训练数据、推理优化和产品体验。私有化部署的优势在于数据可控、可定制、可接入内部知识,而不是天然效果更强。
如果选择的开源模型较小,回答质量可能明显弱于 GPT-4 级别模型。
2. RAG 可以完全解决幻觉问题吗?
不能。RAG 可以显著降低幻觉,但无法完全消除。原因包括:
- 检索结果不准确;
- 文档切分不合理;
- Prompt 约束不够;
- 模型没有严格基于上下文回答;
- 用户问题本身模糊。
生产环境中应结合引用来源、答案置信度、人工反馈和审计机制一起优化。
3. 是否必须微调模型?
多数企业知识库问答场景不需要一开始就微调。建议优先使用 RAG。只有在以下场景中再考虑微调:
- 需要固定回答风格;
- 特定行业术语特别多;
- 模型对业务流程理解不足;
- 需要执行结构化任务;
- 有大量高质量标注数据。
4. 能不能直接兼容 OpenAI SDK?
可以。推荐使用 vLLM、FastChat、LocalAI 等 OpenAI-Compatible 服务,这样前端、后端和业务系统只需要把 base_url 改成内网模型服务地址即可。
十二、生产环境落地建议
如果要将本文示例升级为企业级系统,建议按以下路线演进:
第一阶段:最小可用版本
- 部署开源大模型;
- 提供 Web 聊天页面;
- 支持基础问答;
- 支持文本文档上传;
- 实现简单 RAG。
第二阶段:企业知识库版本
- 支持 PDF、Word、Excel 等文档;
- 支持知识库分类;
- 支持文档权限;
- 支持引用来源;
- 增加重排序模型;
- 增加后台管理界面。
第三阶段:企业集成版本
- 接入统一登录;
- 接入 OA、CRM、ERP;
- 支持插件和函数调用;
- 支持审批流、工单、数据查询;
- 增加操作审计;
- 增加敏感信息脱敏。
第四阶段:智能体平台版本
- 支持多 Agent;
- 支持工具调用;
- 支持工作流编排;
- 支持定时任务;
- 支持多模型路由;
- 支持模型效果评测;
- 支持多租户管理。
十三、总结
ChatGPT 私有化部署的本质,不是把 OpenAI 官方 ChatGPT 原封不动搬到本地,而是基于开源或开放权重大模型,在企业内网构建一套可控、可管、可扩展的智能问答与知识服务平台。
一个成熟的私有化方案至少需要考虑:
- 模型选型;
- 推理服务;
- API 网关;
- 前端交互;
- 知识库 RAG;
- 权限隔离;
- 安全审计;
- 日志监控;
- 成本控制;
- 持续优化。
本文提供的源码示例可以作为最小可运行版本,用于快速搭建企业内部 AI 助手。如果用于生产环境,还需要进一步完善用户体系、权限控制、文档解析、向量检索、安全策略和高可用部署。
对于大多数企业来说,建议采用“小步快跑”的方式:先搭建内部 Demo,验证核心场景,再逐步接入知识库和业务系统,最后发展成企业级 AI 平台。这样既能控制成本,也能降低项目失败风险。