Open WebUI + Ollama:搭建企业私有 AI 助手平台
完整讲解如何用 Open WebUI 在 Ollama 之上构建功能完备的私有 AI 平台,包括 Docker 部署、用户管理、多模型切换、文档 RAG、知识库、API Key 管理,以及 Kubernetes 生产级部署方案。
Ollama 提供了模型运行能力,但它的默认界面只有命令行。Open WebUI 是目前功能最完善的 Ollama 前端,提供 ChatGPT 风格的对话界面、多用户管理、文档 RAG(检索增强生成)、知识库、图像生成等功能,是构建企业私有 AI 助手平台的首选组合。
Open WebUI 功能速览
- 多模型切换:同时连接 Ollama 和 OpenAI/Anthropic API,一个界面统一管理
- 多用户管理:注册审批、角色权限(管理员/用户)、用量统计
- 文档 RAG:上传 PDF/Word/TXT,AI 基于文档回答问题
- 知识库:团队共享文档集合,多人共用同一知识库
- 模型微调:对话历史标注、Prompt 模板管理
- API Key:生成 OpenAI 兼容 API Key,供其他应用调用
- 图像生成:集成 Stable Diffusion(ComfyUI/Automatic1111)
- 语音输入/输出:浏览器语音识别 + TTS 朗读
快速部署:Docker Compose
前提条件
# Ollama 已安装并运行(参考上一篇文章)
systemctl status ollama
# Docker 和 Docker Compose 已安装
docker --version && docker compose version
基础部署(单机)
# docker-compose.yml
version: '3.8'
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- open-webui-data:/app/backend/data
environment:
# 连接到宿主机上的 Ollama
- OLLAMA_BASE_URL=http://host.docker.internal:11434
# 启用注册用户审批(第一个注册用户自动成为管理员)
- ENABLE_SIGNUP=true
# 关闭公开访问(需要登录)
- DEFAULT_USER_ROLE=pending # 新用户需要管理员审批
# 设置默认模型
- DEFAULT_MODELS=qwen3:7b
extra_hosts:
- "host.docker.internal:host-gateway" # Linux 访问宿主机
volumes:
open-webui-data:
# 启动
docker compose up -d
# 查看日志
docker compose logs -f open-webui
# 访问 http://localhost:3000
# 第一个注册账号自动获得管理员权限
同时连接 Ollama + OpenAI
# docker-compose.yml(多后端版本)
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
environment:
# Ollama(本地模型)
- OLLAMA_BASE_URL=http://host.docker.internal:11434
# OpenAI(可选,填真实 Key)
- OPENAI_API_KEY=sk-xxxxxxxx
- OPENAI_API_BASE_URL=https://api.openai.com/v1
# 或者接入国内 API(硅基流动、DeepSeek 官方 API 等)
# - OPENAI_API_KEY=sk-xxx
# - OPENAI_API_BASE_URL=https://api.deepseek.com/v1
界面中会同时显示 Ollama 本地模型(如 qwen3:7b)和 OpenAI 模型(如 gpt-4o),用户可在对话中随时切换。
核心功能配置
用户管理
以管理员身份登录后,在 Admin Panel → Users 中:
用户角色:
- Admin:完整权限,可管理所有用户和设置
- User:正常使用聊天功能
- Pending:注册后等待审批(当 DEFAULT_USER_ROLE=pending 时)
审批流程:
新用户注册 → 状态 Pending → 管理员在 Admin Panel 激活 → 用户获得 User 角色
批量邀请(通过邀请链接):
# Admin Panel → Users → Invite Users
# 生成邀请链接,发给团队成员
# 通过邀请链接注册的用户直接成为 User(跳过审批)
文档 RAG(检索增强生成)
RAG 让 AI 能基于你上传的文档回答问题,而不依赖训练数据:
上传文档流程:
1. 对话框中点击 "+" 按钮 → Upload Files
2. 上传 PDF/Word/TXT/网页 URL
3. 文档自动切片 + 向量化存储
4. 对话时 AI 自动检索相关片段 + 生成回答
效果示例:
用户上传:公司内部运维手册.pdf
问:我们公司的 Kubernetes 集群密码策略是什么?
AI:根据您上传的文档,第 23 页"安全规范"章节中规定:
kubectl 访问凭证需每 90 天轮换一次...
配置向量数据库(Chroma,内置):
# docker-compose.yml(含向量数据库)
services:
open-webui:
environment:
# RAG 配置
- RAG_EMBEDDING_ENGINE=ollama # 使用 Ollama 的 embedding 模型
- RAG_EMBEDDING_MODEL=nomic-embed-text # embedding 模型名
- CHUNK_SIZE=1500 # 文档切片大小(字符)
- CHUNK_OVERLAP=100 # 切片重叠
- TOP_K=5 # 每次检索返回最相关的 5 个片段
# Chroma 向量数据库(Open WebUI 默认内置 SQLite,大规模时换 Chroma)
# 默认情况下 Open WebUI 使用内置 chromadb,无需额外服务
先下载 embedding 模型:
# Ollama 拉取 embedding 模型
ollama pull nomic-embed-text # 通用 embedding,274MB
# 或
ollama pull bge-m3 # 中英文效果更好
知识库(Knowledge Base)
知识库是团队级别的文档集合,所有用户共享:
Admin Panel → Knowledge → Create Knowledge
示例知识库配置:
名称:运维手册
描述:包含公司所有运维规范、操作手册、故障处理流程
文档:
- k8s-ops-manual.pdf
- incident-response-guide.pdf
- network-topology.pdf
启用:在对话中点击 "+" → Knowledge → 选择"运维手册"
之后的对话会自动在这批文档中检索
模型 Prompt 模板
为不同业务场景创建 Prompt 模板:
Admin Panel → Models → 选择模型 → 编辑
示例:创建"代码审查助手"模型变体
Base Model: qwen3:14b
System Prompt:
你是一名资深后端工程师,专注代码审查和安全评估。
代码审查时请关注:
1. 潜在的安全漏洞(SQL注入、XSS、权限越权)
2. 性能问题(N+1查询、内存泄漏)
3. 错误处理是否完善
4. 代码可读性和可维护性
用中文给出具体、可操作的改进建议。
用户只需选择"代码审查助手",就能得到针对性的代码审查输出
生产级 Kubernetes 部署
# open-webui-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: open-webui
namespace: ai-platform
spec:
replicas: 2
selector:
matchLabels:
app: open-webui
template:
metadata:
labels:
app: open-webui
spec:
containers:
- name: open-webui
image: ghcr.io/open-webui/open-webui:main
ports:
- containerPort: 8080
env:
- name: OLLAMA_BASE_URL
value: "http://ollama-service:11434"
- name: DEFAULT_USER_ROLE
value: "pending"
- name: ENABLE_SIGNUP
value: "true"
- name: WEBUI_SECRET_KEY
valueFrom:
secretKeyRef:
name: open-webui-secrets
key: secret-key
- name: DATABASE_URL
value: "postgresql://openwebui:password@postgres-service:5432/openwebui"
volumeMounts:
- name: data
mountPath: /app/backend/data
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2000m"
memory: "4Gi"
volumes:
- name: data
persistentVolumeClaim:
claimName: open-webui-pvc
---
apiVersion: v1
kind: Service
metadata:
name: open-webui-service
namespace: ai-platform
spec:
selector:
app: open-webui
ports:
- port: 8080
targetPort: 8080
---
# Ollama 部署(GPU 节点)
apiVersion: apps/v1
kind: Deployment
metadata:
name: ollama
namespace: ai-platform
spec:
replicas: 1
selector:
matchLabels:
app: ollama
template:
metadata:
labels:
app: ollama
spec:
nodeSelector:
accelerator: nvidia-gpu # 调度到 GPU 节点
containers:
- name: ollama
image: ollama/ollama:latest
ports:
- containerPort: 11434
env:
- name: OLLAMA_NUM_PARALLEL
value: "4"
- name: OLLAMA_KEEP_ALIVE
value: "30m"
resources:
limits:
nvidia.com/gpu: "1" # 使用 1 块 GPU
volumeMounts:
- name: ollama-models
mountPath: /root/.ollama
volumes:
- name: ollama-models
persistentVolumeClaim:
claimName: ollama-models-pvc
---
apiVersion: v1
kind: Service
metadata:
name: ollama-service
namespace: ai-platform
spec:
selector:
app: ollama
ports:
- port: 11434
targetPort: 11434
---
# Ingress(通过域名访问)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: open-webui-ingress
namespace: ai-platform
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "100m" # 支持大文件上传
nginx.ingress.kubernetes.io/proxy-read-timeout: "300" # 长请求超时
spec:
ingressClassName: nginx
rules:
- host: ai.company.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: open-webui-service
port:
number: 8080
tls:
- hosts:
- ai.company.com
secretName: ai-company-tls
API Key 使用(供其他系统集成)
Open WebUI 可以生成 API Key,让其他应用通过 OpenAI 兼容接口调用私有模型:
# 在 Open WebUI 中:Settings → Account → API Keys → Generate Key
# 获得类似:sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 的 Key
# 其他系统调用示例(Langchain、自定义脚本等)
curl http://ai.company.com/ollama/v1/chat/completions \
-H "Authorization: Bearer sk-xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3:14b",
"messages": [{"role": "user", "content": "帮我写一个 K8s 健康检查脚本"}]
}'
常见问题
# 问题1:Open WebUI 无法连接 Ollama
docker logs open-webui | grep -i "ollama\|error"
# 检查 OLLAMA_BASE_URL 是否正确
# Linux 上宿主机 IP 用 host.docker.internal(需要 extra_hosts)
# 问题2:RAG 检索效果差
# 检查 embedding 模型是否已下载
ollama list | grep embed
# 增大 CHUNK_SIZE 或调整 TOP_K
# 尝试换更好的 embedding 模型(bge-m3)
# 问题3:上传大 PDF 失败
# 增加 Nginx proxy-body-size
# 检查容器内 /app/backend/data 磁盘空间
docker exec open-webui df -h /app/backend/data
# 问题4:模型响应太慢
# 检查是否在用 GPU
docker exec open-webui nvidia-smi 2>/dev/null || echo "容器内无 GPU"
# Ollama 端检查
ollama ps
小结
Open WebUI + Ollama 的组合能在 1 小时内搭建一个功能完备的企业私有 AI 平台:本地运行大模型(数据不出局域网)、多用户管理、文档 RAG 知识库、多模型切换。对于对数据安全有要求的企业(金融、医疗、政府),这套组合是公有云 AI 服务的可行替代方案。下一篇将讲解如何根据显存大小选择合适的模型和量化精度,最大化现有 GPU 的利用效率。
