技术博客

Open WebUI + Ollama:搭建企业私有 AI 助手平台

完整讲解如何用 Open WebUI 在 Ollama 之上构建功能完备的私有 AI 平台,包括 Docker 部署、用户管理、多模型切换、文档 RAG、知识库、API Key 管理,以及 Kubernetes 生产级部署方案。

Open WebUIOllama私有AIRAG知识库企业部署

Ollama 提供了模型运行能力,但它的默认界面只有命令行。Open WebUI 是目前功能最完善的 Ollama 前端,提供 ChatGPT 风格的对话界面、多用户管理、文档 RAG(检索增强生成)、知识库、图像生成等功能,是构建企业私有 AI 助手平台的首选组合。

Open WebUI 功能速览

快速部署: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 的利用效率。