第三章. 管理员完整配置指南

第三章. 管理员完整配置指南

在上一章中,我们成功在本地部署了 Open WebUI,并完成了基础的启动验证。现在,作为管理员,你需要对系统进行完整的配置,让它真正为你和你的团队服务。

本章将带你深入管理员面板,完成从模型连接、用户管理到高级功能的全部配置。在开始之前,请确保你已经以管理员身份登录 Open WebUI。


3.1. 管理员面板导航

进入管理员面板

登录 Open WebUI 后,点击左下角的用户名区域,在弹出菜单中选择 “管理员面板”(Admin Panel)。

如果你看不到这个选项,说明你的账号不是管理员。记住,只有第一个注册的账号才会自动成为管理员。

image-20260211090523992

管理员面板结构

管理员面板的顶部有 四个主标签页,每个标签页左侧有各自的子菜单:

image-20260211090544115

用户

管理所有用户和权限组。

子菜单功能
概述用户列表,显示角色、名称、邮箱、最后在线时间、创建时间。支持搜索和添加用户(右上角 + 按钮)
权限组创建权限组,将用户分组并批量分配权限。默认有一个"默认权限"组,用于所有"用户"角色的用户

竞技场评估

模型对比评估功能,让用户盲测不同模型的回答质量。

image-20260211090658945

子菜单功能
排行榜显示所有模型的排名(RK)、评价、获胜/落败次数
反馈查看用户对模型回答的反馈记录

函数

image-20260211090714357

管理 Open WebUI 的内置扩展函数(Functions),这是官方推荐的扩展方式。

  • 顶部有 导入+ 新函数 按钮
  • 支持按类型(全部)和标签筛选
  • 底部有 “由 Open WebUI 社区开发” 入口,可以发现和下载社区函数

设置

image-20260211090730293

系统全局配置,左侧子菜单最为丰富:

子菜单功能对应本章节
通用版本信息、身份验证(默认用户角色、注册开关)、管理员邮箱、待激活用户界面配置3.3
外部连接Ollama API 和 OpenAI API 的连接配置3.2
模型默认模型、任务模型、模型白名单等3.2
竞技场评估竞技场模式的全局设置
外部工具外部工具集成配置
DocumentsRAG 文档功能配置,包括向量数据库、Embedding 模型、检索参数3.4
联网搜索网络搜索引擎配置(SearXNG、Google PSE、Brave 等)3.7
Code Execution代码执行环境配置
界面UI 界面定制3.10
语音STT(语音转文字)和 TTS(文字转语音)配置3.6
Images图像生成引擎配置(DALL-E、ComfyUI 等)3.5
PipelinesPipelines 插件服务连接配置3.8
数据库数据导入导出、系统维护

配置优先级说明

Open WebUI 的配置有两个来源:

环境变量:在启动容器或 Python 程序时设置的变量(如 OLLAMA_BASE_URL)。

数据库配置:在管理员面板中设置的配置,保存在数据库中。

重要规则:对于标记为 PersistentConfig 的配置项,数据库中的配置优先级高于环境变量。这意味着:

  • 首次启动时,环境变量会被写入数据库
  • 之后修改环境变量不会生效,除非删除数据库中的配置
  • 如果要强制使用环境变量,需要在管理员面板中清除对应配置

这个设计是为了避免配置混乱,确保配置的一致性。


3.2. 模型连接与管理

模型连接是 Open WebUI 最核心的配置。没有模型,Open WebUI 就无法工作。

连接本地 Ollama

如果你在本地运行了 Ollama,需要在 Open WebUI 中配置连接。

步骤 1:进入连接设置

管理员面板 → 设置 → 外部连接(Connections)

image-20260211090849150

步骤 2:配置 Ollama API URL

在 “Ollama API URL” 字段中填入:

部署方式URL
Docker 部署(Ollama 在主机)http://host.docker.internal:11434
Docker Compose(Ollama 在容器)http://ollama:11434
Python 安装(Ollama 在主机)http://localhost:11434

步骤 3:验证连接

点击 URL 输入框右侧的刷新按钮(🔄)。

如果连接成功,下方会显示 “连接成功” 的提示,并且会自动拉取 Ollama 中的模型列表。

步骤 4:配置多个 Ollama 实例(可选)

如果你有多台服务器运行 Ollama,可以添加多个连接。Open WebUI 会自动进行负载均衡。

点击 “添加 Ollama 实例” 按钮,填入新的 URL,例如:

http://192.168.1.100:11434
http://192.168.1.101:11434

这样,当用户发起请求时,Open WebUI 会自动选择负载较低的实例。

连接 OpenAI API

如果你想使用 OpenAI 的 GPT 模型,需要配置 OpenAI API。

步骤 1:获取 API 密钥

访问 OpenAI 官网:https://platform.openai.com/api-keys

登录后,点击 “Create new secret key” 创建一个新的 API 密钥。

重要:API 密钥只会显示一次,请妥善保存。

步骤 2:在 Open WebUI 中配置

管理员面板 → 设置 → 外部连接 → OpenAI

字段说明
API Base URLhttps://api.openai.com/v1OpenAI 官方 API 地址
API Keysk-...你的 API 密钥

步骤 3:验证连接

点击刷新按钮,如果连接成功,会自动拉取可用的模型列表(如 gpt-4、gpt-3.5-turbo 等)。

步骤 4:配置代理(如果需要)

如果你的网络无法直接访问 OpenAI,可以配置代理:

在 Docker 部署中,添加环境变量:

1
2
3
environment:
- HTTP_PROXY=http://your-proxy:port
- HTTPS_PROXY=http://your-proxy:port

或者使用国内的 OpenAI API 中转服务(需要自行寻找可靠的服务商)。

连接其他兼容 API

Open WebUI 支持任何兼容 OpenAI API 格式的服务,包括:

服务商API Base URL 示例说明
Azure OpenAIhttps://your-resource.openai.azure.com/需要额外配置 API 版本
Anthropic Claudehttps://api.anthropic.com/v1需要 Claude API 密钥
Google Gemini通过兼容层需要使用 LiteLLM 等工具转换
DeepSeekhttps://api.deepseek.com/v1国内可直接访问
Groqhttps://api.groq.com/openai/v1速度极快的推理服务
本地 vLLMhttp://localhost:8000/v1自建推理服务

配置步骤

管理员面板 → 设置 → 外部连接 → OpenAI → 点击 “+” 添加新连接

填写:

  • 名称:给这个连接起个名字(如 “DeepSeek”)
  • API Base URL:服务商的 API 地址
  • API Key:对应的 API 密钥

Azure OpenAI 特殊配置

Azure OpenAI 需要额外配置 API 版本和部署名称。在 API Base URL 中包含这些信息:

1
https://your-resource.openai.azure.com/openai/deployments/your-deployment-name?api-version=2024-02-15-preview

模型可见性与权限控制

默认情况下,所有用户都能看到所有模型。但在团队使用场景中,你可能希望控制哪些用户能访问哪些模型。

image-20260211204338312

步骤 1:进入模型设置

管理员面板 → 设置 → 模型(Models)

步骤 2:编辑模型

找到你想要控制的模型,点击右侧的编辑按钮(✏️)。

步骤 3:设置可见性

在模型编辑页面,你会看到以下选项:

选项说明
公开(Public)所有用户都能看到和使用
私有(Private)只有管理员能看到
指定用户只有选中的用户能看到
指定权限组只有选中的权限组能看到

选择合适的可见性,然后点击保存。

实际应用场景

  • 将昂贵的 GPT-4 模型设为 “指定用户”,只给核心团队成员使用
  • 将实验性模型设为 “私有”,只有管理员测试
  • 将免费的本地模型设为 “公开”,所有人都能使用

模型白名单

如果你连接了多个 API,可能会拉取到很多模型。你可以使用白名单功能,只显示需要的模型。

步骤 1:进入设置

管理员面板 → 设置 → 模型(Models)

步骤 2:启用白名单

找到 “模型白名单” 选项,启用它。

步骤 3:添加模型

在白名单中添加你想要显示的模型 ID,每行一个:

1
2
3
4
gpt-4
gpt-3.5-turbo
qwen2.5:7b
deepseek-chat

保存后,只有白名单中的模型会显示给用户。

模型标签与排序

为了让用户更容易找到合适的模型,你可以给模型添加标签和自定义排序。

添加标签

在模型编辑页面,找到 “标签(Tags)” 字段,添加标签:

1
推荐, 快速, 免费

1
高级, 付费, GPT-4

用户在选择模型时,可以通过标签筛选。

自定义排序

在设置 → 模型页面,你可以拖动模型来调整顺序。排在前面的模型会优先显示给用户。

最佳实践

  • 将最常用的模型排在最前面
  • 将免费模型和付费模型用标签区分
  • 将不同能力的模型分类(如 “对话”、“编程”、“翻译”)

模型参数预设

你可以为每个模型设置默认参数,用户使用时会自动应用这些参数。

步骤 1:编辑模型

设置 → 模型 → 点击模型的编辑按钮

步骤 2:配置参数

在 “模型参数” 区域,设置以下参数:

参数说明推荐值
Temperature控制输出的随机性,0-20.7(平衡)
Top P核采样参数,0-10.9
Max Tokens最大输出长度2048
Context Length上下文窗口大小4096
Frequency Penalty降低重复内容,-2 到 20
Presence Penalty鼓励新话题,-2 到 20

参数说明

Temperature

  • 0.1-0.3:输出非常确定,适合事实性任务(如翻译、总结)
  • 0.7-0.9:平衡创造性和准确性,适合日常对话
  • 1.0-2.0:输出更有创造性,适合创意写作

Top P

  • 0.9:推荐值,保持输出质量
  • 0.95:更多样化的输出
  • 1.0:完全随机(不推荐)

Context Length

  • 对于 Ollama 模型,默认是 2048,这太小了
  • 建议设置为 8192 或更高,特别是使用 RAG 功能时
  • 注意:更大的上下文会消耗更多内存

3.3. 用户与权限管理

Open WebUI 提供了完善的多用户管理功能,适合团队协作使用。

用户注册与审批流程

默认行为

  • 第一个注册的用户自动成为管理员
  • 后续注册的用户状态为 “待激活”
  • 管理员需要手动激活用户

配置注册开关

管理员面板 → 设置 → 通用 → 身份验证

找到 “允许新用户注册” 开关:

image-20260213092217799

状态说明适用场景
开启任何人都可以注册,新用户角色由"默认用户角色"决定小团队、内网环境
关闭禁止注册,只能由管理员手动添加用户严格控制的企业环境

配置默认用户角色

在同一页面,找到 “默认用户角色” 下拉选择:

角色说明
待激活注册后无法使用系统,需要管理员手动激活(默认值)
用户注册后直接可以使用系统
管理员注册后直接成为管理员(不推荐)

配置默认权限组

你还可以设置 “默认权限组”,新注册的用户会自动加入该权限组,继承组的权限配置。

如果你的团队成员都是可信的,可以将默认角色设为 “用户”,这样注册后就能直接使用,无需审批。

手动添加用户

如果你关闭了注册功能,或者想要批量添加用户,可以使用手动添加功能。

步骤 1:进入用户管理

管理员面板 → 用户(Users)

步骤 2:添加单个用户

点击右上角的 “添加用户” 按钮,填写信息:

image-20260213092242263

字段说明示例
邮箱用户登录邮箱user@example.com
用户名显示名称张三
密码初始密码建议生成随机密码
角色用户角色User

点击 “创建” 完成添加。

步骤 3:通知用户

将登录信息(邮箱和密码)发送给用户,建议用户首次登录后立即修改密码。

批量导入用户(CSV)

如果需要添加大量用户,可以使用 CSV 批量导入功能。

步骤 1:准备 CSV 文件

创建一个 CSV 文件,格式如下:

1
2
3
4
email,name,password,role
user1@example.com,用户1,password123,user
user2@example.com,用户2,password456,user
user3@example.com,用户3,password789,admin

注意

  • 第一行是表头,必须包含这四个字段
  • role 可以是 useradminpending
  • 密码建议使用随机生成的强密码

步骤 2:导入

管理员面板 → 用户 → 点击 “导入用户” 按钮

选择你准备好的 CSV 文件,点击上传。

系统会显示导入结果,包括成功和失败的记录。

用户角色体系

Open WebUI 有三种用户角色:

角色权限适用对象
管理员完全控制权限,可以管理所有设置、用户、模型系统管理员、技术负责人
用户可以使用系统,创建对话,上传文档,但不能修改系统设置普通团队成员
待激活无法使用系统,等待管理员激活新注册用户

修改用户角色

管理员面板 → 用户 → 找到目标用户 → 点击角色下拉菜单 → 选择新角色

权限组管理

权限组功能允许你将用户分组,然后批量分配权限。

创建权限组

管理员面板 → 用户 → 权限组 → 点击 “创建权限组”

填写信息:

image-20260213092335260

字段说明示例
组名权限组名称开发团队
描述组的说明负责产品开发的团队成员

添加成员到权限组

创建权限组后,点击 “添加成员” 按钮,选择要添加的用户。

为权限组分配权限

权限组创建后,你可以:

  • 将特定模型的访问权限分配给权限组
  • 将知识库的访问权限分配给权限组
  • 将工具和函数的使用权限分配给权限组

这样,当你添加新成员到权限组时,他们会自动获得组的所有权限,无需逐个配置。

💡 系统默认有一个"默认权限"组,用于所有具有"用户"角色的用户。你可以点击进入修改默认权限。

我的权限组设计

我接入了大量模型(100+ 个),来源包括 AWS Bedrock、OpenAI、Google Gemini、GitHub Copilot、iFlow 代理、Moonshot 等多个渠道。不同渠道的成本差异很大,不能让所有用户无差别地使用全部模型。

我借助大模型分析了数据库中的模型列表和权限表结构,设计了三级权限组:

权限组定位可用模型数说明
试用组新用户体验13 个仅提供轻量级免费/低成本模型,功能受限(不可多模型对话、不可创建频道等)
正式组日常使用77 个拥有所有自有渠道模型的访问权限,功能完整
管理组管理员102 个(全部)在正式组基础上额外拥有高成本第三方渠道模型(GitHub Copilot、SciHub 镜像)

试用组可用模型(13 个)

只开放成本最低的轻量模型,让新用户体验基本功能:

  • Claude Haiku 4.5 系列(AWS 直连 + Kiro 通道)
  • Gemini 2.5 Flash / Flash Lite
  • GPT-5 Codex Mini / GPT-5.1 Codex Mini
  • Qwen3 Coder Flash
  • Kiro GPT-3.5/4/4o(旧模型,成本极低)

正式组额外可用模型(+64 个)

在试用组基础上,解锁所有自有渠道的中高端模型:

  • Claude Sonnet 4/4.5、Opus 4.5/4.6 全系列(含 Thinking、Agentic 变体)
  • Gemini 2.5 Pro、3 Pro/Flash Preview
  • GPT-5/5.1/5.2/5.3 全系列
  • DeepSeek V3/V3.1/V3.2、R1(通过 iFlow)
  • Qwen3 Max/235B/Coder Plus(通过 iFlow)
  • Kimi K2/K2.5(Moonshot 直连 + iFlow)
  • GLM 4.6/4.7/5(通过 iFlow)
  • MiniMax M2/M2.1(通过 iFlow)

管理组专属模型(+25 个)

这些模型走 GitHub Copilot 和 SciHub 镜像渠道,成本较高或属于特殊用途,仅管理员可用:

  • gh-* 系列(21 个):GitHub Copilot 高级模型,包括 gh-gpt-5.2、gh-claude-opus-4.6、gh-gemini-3-pro-preview 等
  • scihub.* 系列(4 个):SciHub Claude 镜像,包括 scihub.claude-opus-4-6、scihub.claude-sonnet-4-5-20250929 等

权限组的功能差异

除了模型访问权限,三个组在系统功能上也有区别:

功能试用组正式组管理组
多模型对话
创建频道/文件夹
知识库管理
工具/函数管理
图片生成
笔记功能
导入/导出模型
界面设置
临时对话强制✅(强制)

模型图标规范

为了让用户在模型列表中快速识别来源,我为每个模型统一配置了图标:

模型来源图标
Claude 系列claude-color.svg
OpenAI GPT 系列openai.svg
Gemini 系列gemini-color.svg
Qwen 系列qwen-color.svg
DeepSeek 系列deepseek-color.svg
Kimi 系列moonshot.svg
MiniMax 系列minimax-color.svg
GLM 系列zhipu-color.svg
Grok 系列grok.svg
Kiro(AWS 通道)aws-color.svg

图标统一使用 cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.79.0/icons/ 的 SVG 资源。

批量配置方法

手动逐个配置 100+ 个模型的权限和图标不现实。我的做法是:

  1. 在 Open WebUI 管理面板导出模型列表(JSON 格式)
  2. 用大模型编写 Python 脚本,根据模型 ID 前缀和名称自动推断图标和权限组
  3. 脚本批量写入 access_grants(新版格式)和 meta.profile_image_url
  4. 将修正后的 JSON 重新导入 Open WebUI

这样每次上游新增模型或系统升级后,只需重新导出 → 跑脚本 → 导入,几分钟就能完成全部配置。

⚠️ 注意:Open WebUI 升级后数据库结构可能变化。例如从旧版升级到新版时,模型权限从 model 表的 access_control 字段迁移到了独立的 access_grant 表,导出格式也从 access_control 对象变成了 access_grants 数组。升级后建议先导出一份检查格式再操作。

用户活动监控

Open WebUI 提供了用户活动监控功能,帮助你了解系统使用情况。

查看活跃用户

管理员面板 → 设置 → 通用 → 找到 “显示活跃用户数” 选项

启用后,在主界面底部会显示当前活跃用户数和正在使用的模型。

查看用户详情

管理员面板 → 用户 → 点击用户名

你可以看到:

  • 创建的对话数量
  • 使用的模型统计

注意:Open WebUI 不会记录用户的具体对话内容,只记录统计信息,保护用户隐私。

image-20260213092922828


3.4. RAG 文档功能配置

RAG(检索增强生成)是 Open WebUI 的核心功能之一,允许用户基于自己的文档进行问答。本节将从上到下逐一解析 Admin Panel → Settings → Documents 页面的每个配置项,帮助你根据实际场景做出最优选择。

配置入口:管理员面板 → 设置 → Documents


内容提取引擎(Content Extraction Engine)

内容提取引擎决定了 Open WebUI 如何从上传的文件中提取文本。通过环境变量 CONTENT_EXTRACTION_ENGINE 选择,共支持 8 种引擎。

引擎横向对比

引擎部署方式费用支持格式OCR 能力表格/公式适用场景
默认(Default)本地,零依赖免费PDF、TXT、CSV、DOCX、代码文件❌ 不支持❌ 弱简单文档,纯文本 PDF
Apache Tika需部署 Java 服务免费(开源)1400+ 种格式❌ 弱❌ 弱格式种类多的企业环境
Docling(IBM)需部署服务或用 API免费(开源)PDF、DOCX、PPTX、HTML✅ 支持✅ 优秀复杂排版、表格、公式
Datalab Marker云 API 或自部署~$6/千页(高精度)PDF、图片✅ LLM 增强 OCR✅ 优秀复杂排版 PDF,可自部署
Mistral OCR云 API$1-2/千页PDF、图片✅ 99%+ 准确率✅ 优秀扫描件、多语言(25+ 语言)
Document IntelligenceAzure 云服务~$10/千页PDF、图片、表单✅ 支持✅ 支持Azure 生态企业用户
MinerU自部署或云 API免费(开源)PDF、图片✅ 支持✅ 最佳学术论文、金融报告、公式密集
External自定义 HTTP 服务取决于实现自定义取决于实现取决于实现对接私有解析服务

各引擎详细说明

使用 Python 原生加载器(PyPDFLoader、Docx2txtLoader、CSVLoader、TextLoader),零依赖开箱即用。但不支持 OCR,无法处理扫描件,对复杂表格和公式无能为力。

适合:纯文本 PDF 和简单文档,快速上手无需任何额外配置。

老牌 Java 文档解析框架,格式覆盖最广(1400+),但对 PDF 排版理解较弱,不擅长表格结构保留和公式识别。适合已有 Tika 基础设施的组织。

1
2
3
environment:
- CONTENT_EXTRACTION_ENGINE=tika
- TIKA_SERVER_URL=http://tika:9998

Python 原生,对 PDF 排版理解好,表格提取准确,支持公式,输出干净的 Markdown/JSON。在多个评测中与 MinerU 并列 top 2。

1
2
3
4
environment:
- CONTENT_EXTRACTION_ENGINE=docling
- DOCLING_SERVER_URL=http://docling:5000
- DOCLING_API_KEY=your-api-key # 如需认证

基于开源 Marker 和 Surya 模型,LLM 增强 OCR。其 Chandra OCR 模型在 olmOCR benchmark 上得分 83.1%,超过 GPT-4o。支持云 API 和自部署两种方式。

1
2
3
environment:
- CONTENT_EXTRACTION_ENGINE=datalab_marker
- DATALAB_MARKER_API_KEY=your-api-key

号称 99%+ 准确率,支持表格/公式/图表转表格/签名检测,覆盖 25+ 语言。性价比高($1/千页起),但只能通过 API 调用,无法自部署。

1
2
3
environment:
- CONTENT_EXTRACTION_ENGINE=mistral_ocr
- MISTRAL_OCR_API_KEY=your-api-key

微软企业级服务,预置发票/收据/身份证等模型,支持自定义模型训练。价格较高但有企业合规保障。

1
2
3
environment:
- CONTENT_EXTRACTION_ENGINE=document_intelligence
- DOCUMENT_INTELLIGENCE_ENDPOINT=https://your-resource.cognitiveservices.azure.com/

基于 PDF-Extract-Kit 微调模型,在复杂文档(学术论文、教材、金融报告)上表现最佳,表格/公式/图片提取精度高。推荐 GPU 环境运行。

1
2
3
4
environment:
- CONTENT_EXTRACTION_ENGINE=mineru
- MINERU_API_URL=http://mineru:8000
- MINERU_API_MODE=local # cloud 或 local

万能逃生舱,指向任意 HTTP 服务,适合对接企业内部的私有文档解析服务。

1
2
3
environment:
- CONTENT_EXTRACTION_ENGINE=external
- EXTERNAL_DOCUMENT_LOADER_URL=http://your-service:8080/extract

引擎选择建议

场景推荐引擎理由
简单文档、快速上手默认零配置,开箱即用
扫描件、多语言文档Mistral OCR性价比最高,准确率高
学术论文、公式密集MinerU 或 Docling表格/公式提取精度最佳
企业 Azure 环境Document Intelligence合规保障,预置模型丰富
想自部署 + 高精度Datalab Marker 或 MinerU开源可控,精度优秀
格式种类极多Apache Tika1400+ 格式覆盖

PDF 提取图片(PDF Extract Images)

配置项环境变量默认值说明
PDF Extract ImagesPDF_EXTRACT_IMAGESfalse是否从 PDF 中提取嵌入的图片

启用后会增加处理时间和存储空间,仅在文档中的图片内容对问答有价值时开启。


PDF 加载模式

Open WebUI 提供两种 PDF 处理模式,决定了文档在进入切分器之前的预处理方式:

模式行为优点缺点适用场景
Page(页模式)每页作为独立文档单元,保留页边界检索时能精确定位到具体页码跨页内容会被截断PPT 转 PDF、每页独立主题
Single Document(单文档模式)整个 PDF 合并为一个文本块,再统一切分跨页内容不会丢失,语义连贯失去页码定位能力论文、书籍、报告等连续叙述型文档

最佳实践:大多数 RAG 场景推荐 Single Document 模式,因为语义连贯性比页码定位更重要。如果文档每页内容相对独立(如幻灯片),则用 Page 模式。


文本切分(Text Splitting)

文本切分决定了文档被拆分成多大的片段(chunk)存入向量数据库。切分质量直接影响检索精度。

切分器类型

切分器计量方式特点适用场景
默认(Character)按字符数使用递归分隔符(\n\n\n → 空格 → 字符)逐级切分,简单高效,无依赖英文文档、通用场景
Token按 token 数按模型 tokenizer 计算,切分大小与模型上下文窗口精确对齐中文文档(1 个汉字 ≈ 2-3 个 token)、需要精确控制 token 用量

核心参数

配置项环境变量默认值推荐值说明
Chunk SizeCHUNK_SIZE15001000-2000每个 chunk 的最大大小。太小丢失上下文,太大降低检索精度
Chunk OverlapCHUNK_OVERLAP100Chunk Size 的 5%-15%相邻 chunk 的重叠量,保证边界处语义连贯

参数调优指南

  • Chunk Size 太小(<500):上下文不完整,模型难以理解片段含义
  • Chunk Size 太大(>2000):包含过多无关信息,检索精度下降
  • Chunk Overlap 太小:重要信息可能被切断在两个 chunk 之间
  • Chunk Overlap 太大:存储冗余增加,检索效率降低

Markdown 标题文本分割器

配置项默认值说明
Markdown Header Text Splitter关闭按 Markdown 标题(H1-H6)进行结构化预切分
Chunk Min Size Target合并过小片段的阈值,建议设为 Chunk Size 的 50%

启用后,文档会先按 Markdown 标题进行结构化预切分,然后再交给标准切分器处理。好处:

  • 保留文档的逻辑结构,每个 chunk 属于明确的章节
  • 避免跨章节切分导致语义混乱
  • 配合 Chunk Min Size Target 参数,可以将过小的片段向前合并(单向合并算法,不跨文档),官方测试显示阈值设为 1000(chunk size 2000 时)可减少 90%+ 的碎片 chunk

最佳实践:如果文档是 Markdown 格式,或提取引擎输出 Markdown(Docling、MinerU、Marker 都输出 Markdown),强烈建议开启此选项


嵌入模型(Embedding Model)

嵌入模型将文本转换为向量表示,是 RAG 检索的基础。模型质量直接决定检索准确性。

引擎横向对比

引擎配置值费用延迟隐私推荐模型
SentenceTransformers(默认)""免费,本地运行中等(取决于硬件)完全本地all-MiniLM-L6-v2(轻量)、BAAI/bge-m3(多语言)
Ollamaollama免费,本地运行快(已有 Ollama 实例)完全本地nomic-embed-text(推荐首选)、mxbai-embed-large
OpenAIopenai按 token 计费低(云端)数据发送到云端text-embedding-3-small(性价比)、text-embedding-3-large(高精度)
Azure OpenAIazure按 token 计费低(云端)Azure 合规保障同 OpenAI 模型,通过 Azure 部署

各引擎详细说明

使用 Python sentence-transformers 库在本地运行,模型自动从 HuggingFace 下载缓存。零成本、完全隐私,但首次加载模型较慢,且占用服务器内存/显存。默认模型 all-MiniLM-L6-v2 较轻量但精度一般。

⚠️ 网络提示:如果服务器无法访问 huggingface.co,启动时会出现 SSL 重连错误,RAG 功能将不可用。可添加镜像站环境变量解决:

1
2
environment:
- HF_ENDPOINT=https://hf-mirror.com

如果你已经在用 Ollama 跑 LLM,这是最方便的选择。nomic-embed-text 是社区最推荐的模型:8192 token 上下文、完全开源、在 MTEB 和 LoCo 基准上表现优异。

先下载模型:

1
2
3
ollama pull nomic-embed-text
# 或中文场景
ollama pull bge-m3

然后配置环境变量:

1
2
3
4
environment:
- RAG_EMBEDDING_ENGINE=ollama
- RAG_EMBEDDING_MODEL=nomic-embed-text
- RAG_OLLAMA_BASE_URL=http://ollama:11434

支持任何 OpenAI 兼容端点(包括第三方)。text-embedding-3-small(1536 维)性价比高,text-embedding-3-large(3072 维)精度更好。缺点是有 API 费用、网络延迟、数据隐私风险。

1
2
3
4
5
environment:
- RAG_EMBEDDING_ENGINE=openai
- RAG_EMBEDDING_MODEL=text-embedding-3-small
- RAG_OPENAI_API_BASE_URL=https://api.openai.com/v1
- RAG_OPENAI_API_KEY=sk-...

本质上是 OpenAI 模型通过 Azure 托管,适合有 Azure 合规要求的企业。

1
2
3
environment:
- RAG_EMBEDDING_ENGINE=azure
- RAG_AZURE_OPENAI_BASE_URL=https://your-resource.openai.azure.com/

嵌入模型选择建议

场景推荐方案理由
本地优先、已有 OllamaOllama + nomic-embed-text最佳平衡,免费、快速、质量好
资源受限、轻量部署SentenceTransformers + all-MiniLM-L6-v2零依赖,内存占用小
中文文档为主Ollama + bge-m3 或 SentenceTransformers + BAAI/bge-m3多语言支持优秀
追求精度且不介意费用OpenAI + text-embedding-3-large精度最高
企业合规要求Azure OpenAI合规保障

其他嵌入参数

配置项环境变量默认值说明
Embedding Batch SizeRAG_EMBEDDING_BATCH_SIZE100批量嵌入大小,显存不足时调小

⚠️ 重要:更换嵌入模型后,所有已有文档必须重新嵌入(re-embed),因为不同模型的向量空间不兼容。确定模型后不要轻易更换。


检索与排序(Retrieval & Ranking)

检索参数决定了从向量数据库中召回多少结果、如何过滤和排序。这是影响 RAG 最终效果的关键环节。

核心检索参数

配置项环境变量默认值推荐值说明
Top KTOP_K55-10返回的最相关 chunk 数量。太少可能遗漏信息,太多会稀释上下文
Relevance ThresholdRELEVANCE_THRESHOLD0.00.2-0.5最低相关性分数阈值,低于此分数的 chunk 被过滤。设为 0 表示不过滤

参数调优指南

  • Top K 太少(❤️):可能遗漏重要信息,回答不完整
  • Top K 太多(>10):包含过多噪音,模型可能被无关内容干扰
  • Relevance Threshold 太低(0):不过滤,噪音多
  • Relevance Threshold 太高(>0.7):过滤过严,可能丢失有用信息

混合搜索(Hybrid Search)

配置项环境变量默认值推荐说明
Hybrid SearchENABLE_RAG_HYBRID_SEARCHfalse开启结合向量搜索 + BM25 关键词匹配

混合搜索使用 EnsembleRetriever,同时执行:

  • 向量搜索:基于语义相似度,擅长理解同义词和语义关联
  • BM25 关键词匹配:基于词频统计,擅长精确匹配专有名词、代码、ID 等

两者互补,显著提升召回率,推荐开启。

重排序(Reranking)

配置项环境变量默认值说明
Reranking ModelRAG_RERANKING_MODEL使用 CrossEncoder/ColBERT 对检索结果重排序
Top K RerankerTOP_K_RERANKER重排序后保留的结果数

重排序的工作流程:

  1. 先通过向量搜索(+ BM25)召回较多候选结果
  2. 再用 CrossEncoder 模型对每个候选结果与查询进行精细打分
  3. 按新分数重新排序,保留 Top K Reranker 个最相关结果

推荐配合 Hybrid Search 使用,这是提升 RAG 质量最有效的组合。

检索策略建议

文档规模推荐配置
小文档集(<100 个文档)Top K=5,不需要混合搜索和重排序
中等文档集(100-1000)Top K=5-8,开启 Hybrid Search
大文档集(>1000)Top K=8-10,开启 Hybrid Search + Reranking,Relevance Threshold=0.2+

高级设置

RAG 模板与上下文

配置项环境变量默认值说明
RAG TemplateRAG_TEMPLATE内置模板自定义 RAG 提示词模板,控制检索内容如何注入到 LLM prompt
RAG System ContextRAG_SYSTEM_CONTEXTfalse设为 true 将 RAG 上下文放入 system message 而非 user message

RAG System Context 的作用:将检索到的文档内容放入 system message,而非 user message。好处是在多轮对话中可以优化 KV cache 复用(因为 system message 不变),推荐 Ollama/llama.cpp 用户开启。

异步与性能

配置项环境变量默认值说明
Async EmbeddingENABLE_ASYNC_EMBEDDINGfalse后台线程池处理嵌入,上传大量文档时建议开启

文件与工具

配置项默认值说明
File Context启用控制是否对附件执行 RAG 并预注入内容
Builtin Tools启用给模型提供 query_knowledge_basessearch_chats 等函数调用工具

网页加载

配置项环境变量默认值说明
Web Loader SSL VerificationENABLE_WEB_LOADER_SSL_VERIFICATIONtrue网页加载时是否验证 SSL 证书
Google Drive IntegrationGOOGLE_DRIVE_API_KEYGoogle Drive 文件直接导入

向量数据库(Vector Database)

向量数据库用于存储文档的向量表示,是 RAG 检索的底层存储。

配置项环境变量默认值说明
Vector DBVECTOR_DBchromadb向量数据库类型
Vector DB URLVECTOR_DB_URL外部向量数据库连接地址

支持的向量数据库

数据库部署方式适用场景特点
ChromaDB内置,无需额外配置个人使用、小团队默认选择,开箱即用
Qdrant需部署独立服务大规模部署高性能,支持过滤
Milvus需部署独立服务企业环境分布式,支持十亿级向量
Weaviate需部署独立服务需要混合搜索内置向量+关键词搜索
OpenSearch需部署独立服务已有 OpenSearch 集群Elasticsearch 开源替代
PGVectorPostgreSQL 扩展已有 PostgreSQL 环境复用现有数据库
Pinecone云端托管云端部署,免运维全托管,按用量计费
S3 VectorAWS S3AWS 生态低成本存储

内置数据库,无需任何额外配置,开箱即用。适合个人和小团队。

1
2
3
environment:
- VECTOR_DB=qdrant
- QDRANT_URL=http://qdrant:6333
1
2
3
environment:
- VECTOR_DB=milvus
- MILVUS_URI=http://milvus:19530
1
2
3
environment:
- VECTOR_DB=pgvector
- PGVECTOR_DB_URL=postgresql://user:pass@postgres:5432/vectors
1
2
3
4
environment:
- VECTOR_DB=pinecone
- PINECONE_API_KEY=your-api-key
- PINECONE_ENVIRONMENT=us-east-1

对于大多数用户,ChromaDB 已经足够使用,无需额外配置。


整体最佳实践总结

根据以上所有配置项的分析,以下是推荐的最佳实践组合:

配置项推荐值理由
提取引擎根据文档类型选择(见引擎选择建议表)复杂 PDF 用 Docling/MinerU/Mistral OCR,简单文档用默认
PDF 加载模式Single Document语义连贯性优先
文本切分器中文用 Token,英文用 Character中文字符数 ≠ token 数
Chunk Size1000-2000平衡上下文完整性和检索精度
Chunk OverlapChunk Size 的 10%保证边界语义连贯
Markdown 标题切分开启(如果文档是 Markdown)保留文档结构,减少碎片
嵌入模型本地:Ollama + nomic-embed-text免费、快速、质量好
Hybrid Search开启向量 + 关键词互补,显著提升召回率
Reranking配合 Hybrid Search 开启提升精度最有效的组合
Top K5-10平衡召回和噪音
Relevance Threshold0.2-0.5过滤低质量结果
RAG System Contexttrue(Ollama 用户)优化多轮对话 KV cache
向量数据库ChromaDB(默认)小团队足够,零配置

💡 核心原则:先确定嵌入模型(确定后不要轻易更换),再开启 Hybrid Search + Reranking,最后根据文档类型选择提取引擎。这三步是提升 RAG 质量投入产出比最高的操作。


3.5. 图像生成功能配置

Open WebUI 支持集成多种图像生成工具,让 AI 能够根据文字描述生成图片。

DALL-E 集成

DALL-E 是 OpenAI 的图像生成模型,质量高但需要付费。

配置步骤

管理员面板 → 设置 → Images

找到 “图像生成引擎” 选项,选择 “OpenAI DALL-E”。

填写配置:

字段
API Key你的 OpenAI API 密钥
模型dall-e-3(推荐)或 dall-e-2
图像尺寸1024x1024(标准)、1792x1024(宽屏)、1024x1792(竖屏)
图像质量standard(标准)或 hd(高清,更贵)

费用说明

  • DALL-E 3 标准质量:$0.040 / 张
  • DALL-E 3 高清质量:$0.080 / 张
  • DALL-E 2:$0.020 / 张

ComfyUI 集成

ComfyUI 是一个开源的图像生成工作流工具,支持 Stable Diffusion 等模型。

前置要求

你需要先部署 ComfyUI 服务。ComfyUI 的部署超出本教程范围,请参考 ComfyUI 官方文档。

配置步骤

管理员面板 → 设置 → Images → 选择 “ComfyUI”

填写配置:

字段说明
ComfyUI Base URLComfyUI 服务地址,如 http://localhost:8188
工作流 JSONComfyUI 的工作流配置文件

工作流配置

ComfyUI 使用 JSON 格式的工作流文件来定义图像生成流程。你需要:

  1. 在 ComfyUI 中设计好工作流
  2. 导出为 JSON 文件
  3. 将 JSON 内容粘贴到 Open WebUI 的配置中

优势

  • 完全免费(使用本地模型)

  • 完全可控,可以自定义各种参数

  • 支持多种 Stable Diffusion 模型

劣势

  • 配置复杂,需要一定的技术能力
  • 需要额外的硬件资源(特别是 GPU)

AUTOMATIC1111 集成

AUTOMATIC1111 (Stable Diffusion WebUI) 是另一个流行的开源图像生成工具。

配置步骤

管理员面板 → 设置 → Images → 选择 “AUTOMATIC1111”

填写配置:

字段
API Base URLhttp://localhost:7860
API Key如果设置了认证,填入密钥

启用 API

AUTOMATIC1111 默认不开启 API,需要在启动时添加参数:

1
python launch.py --api --listen

测试连接

配置完成后,点击 “测试连接” 按钮,如果成功会显示可用的模型列表。

图像生成参数设置

无论使用哪种引擎,都可以配置默认的生成参数:

参数说明推荐值
Steps生成步数,越多质量越好但越慢20-30
CFG Scale提示词引导强度7-9
Sampler采样器类型Euler a 或 DPM++ 2M
负面提示词不想出现的元素ugly, blurry, low quality

这些参数主要用于 Stable Diffusion 类模型,DALL-E 不需要配置。

通过 CLIProxyAPI Plus 对接图像生成/编辑

如果你使用的是 CLIProxyAPI Plus(CPA)作为 OpenAI 兼容代理,它原生只提供 /v1/chat/completions 端点,不支持 /v1/images/generations/v1/images/edits。但 Open WebUI 的 OpenAI 图像引擎恰恰需要这两个端点。

我们对 CPA 源码进行了 Fork 修改,新增了这两个端点,原理是将图像 API 请求转换为 Chat Completions 调用:

端点请求格式转换逻辑
POST /v1/images/generationsJSON(prompt + model)构建纯文本 chat completions 请求,从响应中提取 data:image/xxx;base64,...
POST /v1/images/editsmultipart/form-data(image 文件 + prompt + model)将上传图片转为 base64 data URI,构建多模态 chat completions 请求(image_url + text)

两个端点都返回标准 OpenAI Images API 格式:{"created": ..., "data": [{"b64_json": "..."}]}

涉及的 CPA 源码文件

  • sdk/api/handlers/openai/openai_images_handler.go — 新增文件,包含 ImageGenerationsImageEdits 两个 handler
  • internal/api/server.go — 在 setupRoutes() 的 v1 group 中注册路由(3 行改动)

Open WebUI 配置

图像生成(管理员面板 → 设置 → Images):

字段
引擎OpenAI
API Base URLhttp://host.docker.internal:8317/v1
API Key你的 CPA api-key
模型手动输入模型 ID,如 prorise/gemini-3-pro-image-preview

图像编辑配置同理,引擎选 OpenAI,URL 和 Key 相同,模型填支持图像编辑的模型 ID。

触发机制

  • 聊天中纯文字描述 → 触发 /images/generations(图像生成)
  • 聊天中上传图片 + 文字描述 → 触发 /images/edits(图像编辑,需开启 ENABLE_IMAGE_EDIT

注意事项

  • 图像模型建议在 Open WebUI 的模型高级设置中关闭流式输出(stream_response: false),避免 chunk 过大导致前端显示异常
  • CPA 源码 Fork 详见项目根目录的 FORK_README.md,同步上游更新时注意冲突风险

3.6. 语音功能配置

Open WebUI 的语音交互由两部分组成:听(STT,语音转文字)说(TTS,文字转语音)。合理的配置需要在“响应速度、拟真体验、实际花销”三者之间找到平衡。

语音转文字(STT)配置

STT 决定了系统“听得有多准”和“听得有多快”,以及你聊天的成本消耗,由于语音转文字本质拉不开很大差距,一般来说都会使用网页API 或选择 Whisper 作为使用

1. 核心引擎横向对比与实际计费

引擎选型成本梯队实际计费标准 (预估)核心优势
网页 API免费$0 (利用浏览器原生能力)服务器零负载,响应极快,零成本
Whisper (本地)免费$0 (仅消耗本机/服务器电费)隐私最强,完全离线,不按时长收费
Deepgram低成本约 $0.0043 / 分钟专为实时语音设计,延迟极低,性价比极高
OpenAI适中$0.006 / 分钟业界标杆,多语言混合识别极准,无需额外注册
Azure AI 语音偏高约 $1.00 / 小时 ($0.016/分)微软企业级稳定服务,带口音的方言识别优秀

2. 深度选型与成本解析

  • 完全免费且省心:网页 API (Web API)

  • 计费逻辑:绝对免费。它调用的是你当前所用浏览器(如 Chrome)内置的语音识别接口。

  • 适用场景:预算为零,服务器没有显卡(GPU)跑不动本地模型,且能保证全程使用 HTTPS 访问的用户。

  • 免费但吃硬件:Whisper (本地)

  • 计费逻辑:软件层面免费,但隐性成本在硬件。它会占用你服务器的 CPU 和显存。如果租用云服务器,为了跑顺畅可能需要升级高配实例。

  • 选型建议:如果你的服务器本身配置就高(如拥有 8GB 以上显存的独立显卡),强烈建议选这个。数据不出局域网,隐私绝对安全。

  • 云端高性价比方案:Deepgram

  • 计费逻辑:按秒计费,极其便宜。折算下来一小时一直说话也才两毛多美元。

  • 选型建议:如果你需要高频使用语音对话,Deepgram 的 Nova-2 模型是首选。它的转录速度远快于 OpenAI,能大幅降低你等 AI 回复的“空窗期”。

  • 高质量兜底方案:OpenAI Whisper

  • 计费逻辑:按分钟计费。如果你每天和 AI 聊 10 分钟语音,一个月大约花费 $1.8。

  • 选型建议:如果你平时说话中英文夹杂,或者专业术语多,OpenAI 的容错和纠错能力是目前云端 API 里最好的。


文字转语音(TTS)配置

TTS 决定了 AI 的“音色”和“情感”,这项功能由于需要生成音频文件,通常比 STT 更贵。

1. 核心引擎横向对比与实际计费

引擎选型成本梯队实际计费标准 (预估)拟真度
网页 API免费$0 (调用系统内置 TTS)⭐⭐ (明显机械音)
openai-edge-tts 🏆免费$0 (微软 Edge 在线语音,中间件伪装)⭐⭐⭐⭐⭐ (中文场景极佳,接近 OpenAI)
Transformers免费$0 (消耗本地算力生成)⭐⭐⭐ (略带顿挫感)
OpenAI低成本$0.015 / 千字符⭐⭐⭐⭐ (非常自然流畅)
Azure AI 语音适中约 $0.016 / 千字符⭐⭐⭐⭐ (专业播音腔,可选多)
ElevenLabs昂贵约 $0.22 / 千字符 (按标准套餐折算)⭐⭐⭐⭐⭐ (情感天花板)

2. 深度选型与成本解析

  • 零成本测试首选:网页 API

  • 计费逻辑:免费。直接让你的 Windows 或 macOS 系统里的"讲述人"来读出文字。

  • 体验:毫无感情,适合用来排查语音链路通不通,不适合长期对话。

  • 🏆 中文场景版本答案:openai-edge-tts(强烈推荐)

  • 计费逻辑:完全免费。它通过一个开源中间件(travisvn/openai-edge-tts,GitHub 1.6k+ Stars),将微软 Edge 浏览器内置的高质量在线语音接口伪装成 OpenAI TTS 接口给 Open WebUI 使用。你在抖音/TikTok 上听到的那些非常自然的 AI 解说音,用的就是同一套微软语音引擎。

  • 选型建议面向国内中文用户的最佳选择。音质接近 OpenAI TTS,远超本地机械音,且完全免费、无需 GPU。Open WebUI 官方文档已有专门的集成页面。唯一注意点:它本质是微软云服务的代理,需要联网才能使用,不是真正的离线方案。

  • 部署步骤

    第一步:启动 Docker 容器

    1
    docker run -d -p 5050:5050 -e API_KEY=your_password travisvn/openai-edge-tts:latest

    第二步:在 Open WebUI 管理面板中配置

    进入 管理员面板 → 设置 → 语音,在 TTS 部分填写:

    配置项填写内容说明
    TTS 引擎OpenAI注意:选 OpenAI,不是 Edge,因为中间件伪装成了 OpenAI 接口
    API 基础 URLhttp://host.docker.internal:5050/v1如果 Open WebUI 也在 Docker 中运行;否则填 http://localhost:5050/v1
    API 密钥your_password与 Docker 启动时的 API_KEY 保持一致
    TTS 模型tts-1固定值
    TTS 语音zh-CN-XiaoxiaoNeural最受欢迎的中文女声;男声可选 zh-CN-YunxiNeural

    💡 更多语音选择:Edge TTS 支持大量中文语音,如 zh-CN-XiaoyiNeural(年轻女声)、zh-CN-YunjianNeural(新闻播报男声)等,完整列表可在容器启动后访问 http://localhost:5050/v1/voices 查看。

    ⚠️ 注意:此方案依赖微软在线服务,断网时无法使用。如果你需要完全离线的 TTS,请考虑 Transformers 本地方案或下方的 Kokoro-FastAPI。

  • 补充:英文场景的替代方案 —— Kokoro-FastAPI

  • 如果你的用户主要使用英文对话,社区中另一个高口碑项目是 Kokoro-FastAPI。它完全本地运行,英文语音质量被社区评为当前最佳,同样提供 OpenAI 兼容 API。但中文支持较弱,因此面向国内用户时 openai-edge-tts 仍是首选。

  • 极致性价比:OpenAI TTS

  • 计费逻辑:按生成的字符数收费。1000 个英文字符或中文字大概只要 1 分多钱(美元)。即使重度使用,每个月也就几美元。

  • 选型建议90% 用户的最佳选择。模型选 tts-1 即可(tts-1-hd 贵一倍且速度慢,对话时完全没必要)。声音推荐 Alloy(中性)或 Nova(活力)。

  • 如果你需要更高质量的选型(听觉享受):ElevenLabs

  • 计费逻辑:非常贵。采用订阅+额度制(如 $22/月 给 10 万字符),折算下来单价比 OpenAI 贵了 15 倍左右

  • 为什么选它:物有所值。它是目前唯一能做到“根据上下文叹气、呼吸、调整情绪甚至哭腔”的 API。如果你把 AI 当作情感树洞,或者需要克隆特定人的声音,这笔钱花得值。


3.7. 网络搜索功能配置

网络搜索功能让 AI 能够获取最新的网络信息,突破模型训练数据的时效性限制。用户在对话中开启"联网搜索"开关后,Open WebUI 会先调用搜索引擎获取实时结果,再注入到 LLM 上下文中辅助回答。

配置入口:管理员面板 → 设置 → 联网搜索


配置项说明

配置项说明推荐值
启用联网搜索总开关,关闭时所有用户均无法使用按需开启
搜索引擎下拉选择提供商,选择后下方动态显示该引擎所需字段(Key、URL 等)见下方选型
搜索结果数量每次返回的结果条数,太少信息不足,太多增加 token 消耗5-8
并发数同时抓取结果页面的并发数,过高可能触发速率限制默认即可
旁路 SSL 验证跳过 SSL 证书验证,仅自部署引擎用自签名证书时开启关闭

全部搜索引擎一览

🟢 完全免费(自部署或无需 Key)

  • DuckDuckGoduckduckgo)— 零配置开箱即用,无需 API Key,通过 Python 库直接调用。缺点:可能被速率限制,国内需代理
  • SearXNGsearxng)— 🏆 社区最推荐。开源元搜索引擎,聚合 Google、Bing 等 70+ 引擎结果,需 Docker 自部署,完全免费、无限次数、隐私安全
  • YaCyyacy)— 去中心化 P2P 搜索引擎,完全自托管,搜索质量远不如 SearXNG
  • Ollama Cloudollama_cloud)— 用本地 Ollama 模型生成搜索,完全离线但质量有限

🔵 有免费额度(白嫖友好,需注册获取 Key)

  • Serperserper)— 🏆 性价比之王。基于 Google SERP,注册送 2,500 次(一次性),付费 $0.30/千次起,速度极快
  • Bravebrave)— 每月 2,000 次免费(每月刷新),独立搜索索引,隐私友好,超出后 $3/千次
  • Tavilytavily)— 每月 1,000 次免费,专为 AI/RAG 设计,返回干净文本,超出后 $0.008/次
  • Exaexa)— 注册送 $10 额度(约 2,000 次),AI 原生语义搜索,超出后 $5/千次
  • Google PSEgoogle_pse)— 每天 100 次免费(约 3,000 次/月),搜索质量就是 Google 本身,超出后 $5/千次
  • Firecrawlfirecrawl)— 一次性 500 次免费,搜索 + 深度抓取网页内容,超出后 $16/月起
  • SearchApisearchapi)— 注册送 100 次,支持 Google/Bing/Baidu/Scholar 多引擎切换,超出后 $50/月起
  • Serpstackserpstack)— 每月 100 次免费,基于 Google SERP,超出后 $30/月起
  • SerpApiserpapi)— 每月 100 次免费,功能最全但价格偏高 $25/月起
  • Jinajina)— 注册送积分,支持语义搜索和网页内容提取,适合 RAG 场景

🟡 纯付费(无免费额度或需订阅)

  • Bingbing)— ⚠️ 微软已于 2025 年 8 月宣布退役,不推荐新用户
  • Kagikagi)— $10/月起订阅制,高质量无广告搜索
  • Mojeekmojeek)— 英国独立搜索引擎,有自己的爬虫索引,需联系定价
  • Serplyserply)— $49/月起,性价比不高
  • Bochabocha)— 🇨🇳 国产博查搜索,国内可直连,需联系定价
  • Sogousougou)— 🇨🇳 搜狗搜索,国内可直连,需联系定价
  • Yandexyandex)— 俄罗斯搜索引擎,俄语搜索质量好

🟣 AI 增强搜索

  • Perplexityperplexity)— Sonar API,搜索 + AI 总结,Pro 订阅每月附赠 $5 额度
  • Perplexity Searchperplexity_search)— 同上,纯搜索不含 AI 总结
  • Externalexternal)— 万能逃生舱,指向任意自定义 HTTP 搜索服务

💡 以上除 Bocha、Sogou 外,其余引擎均需代理才能在国内访问。


选型推荐与部署

🏆 最优解:SearXNG 自部署

适合有服务器的个人/团队,零成本、无限次数、隐私安全。社区公认的最佳方案。

部署步骤:

  1. 克隆仓库并进入目录:
1
2
git clone https://github.com/searxng/searxng-docker.git
cd searxng-docker
  1. 修改 settings.yml(最关键一步,必须启用 JSON 格式,否则 Open WebUI 报 403):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use_default_settings: true

server:
secret_key: "your-random-secret-key" # 必须修改
limiter: false # 关闭速率限制,避免被限流
image_proxy: true

search:
safe_search: 0
autocomplete: ""
default_lang: "zh-CN"
formats:
- html
- json # ⚠️ 必须添加,否则 Open WebUI 无法调用
  1. 启动:docker compose up -d,或在 Open WebUI 的 docker-compose.local.yaml 中添加:
1
2
3
4
5
6
7
8
9
services:
searxng:
image: searxng/searxng:latest
container_name: searxng
ports:
- "8080:8080"
volumes:
- ./searxng:/etc/searxng
restart: unless-stopped
  1. 在 Open WebUI 中配置:搜索引擎选 searxng,查询 URL 填 http://searxng:8080/search?q=<query>(Docker 同网络)或 http://localhost:8080/search?q=<query>

⚠️ 常见问题:

  • 403 错误:99% 是 settings.yml 没加 json 格式
  • 结果为空:SearXNG 容器需能访问外网,国内服务器需为 SearXNG 容器配代理
  • 超时:检查 limiter 是否为 false,上游搜索引擎是否可达

💰 零成本懒人方案:DuckDuckGo

不想部署任何服务的用户,搜索引擎选 duckduckgo 即可,无需填写任何 Key。缺点是可能被限流、国内需代理、搜索质量不如 Google。

🎯 付费性价比之选:Serper

需要 Google 级搜索质量但预算有限的用户。访问 https://serper.dev 注册,复制 API Key,搜索引擎选 serper 填入即可。注册送 2,500 次,付费后 $0.30/千次起。

🇨🇳 国内直连方案:Bocha / Sogou

服务器在国内、无法配代理的用户。Bocha(博查)和 Sogou(搜狗)国内可直连,中文搜索质量较好,需联系服务商获取 Key 和定价。


成本速算

假设日均搜索 20 次(月均 600 次):

方案月成本说明
SearXNG 自部署$0仅消耗服务器资源
DuckDuckGo$0可能被限流
Brave 免费额度$0每月 2,000 次,完全够用
Google PSE 免费额度$0每天 100 次,完全够用
Tavily 免费额度$0每月 1,000 次,勉强够用
Serper 免费额度$02,500 次一次性,约可用 4 个月
Serper 付费~$0.18超出免费额度后
Brave 付费~$1.80超出免费额度后
Kagi$10+订阅制

💡 个人使用(日均 <30 次),Brave(2,000 次/月)或 Google PSE(100 次/天)的免费额度完全够用。团队或高频搜索,SearXNG 自部署是唯一真正无限制的方案。


3.8. Pipelines 与 Functions 扩展系统

Open WebUI 提供了两种扩展机制:Functions(函数)和 Pipelines(管道)。理解它们的区别非常重要,选错了会让简单的事情变复杂。

⚠️ 官方明确建议:对于大多数扩展需求(如添加新的 API 提供商、基础过滤器、简单工具),请使用 Functions,不要使用 Pipelines。Pipelines 仅适用于需要将计算密集型任务卸载到独立进程的场景。

Functions vs Pipelines:如何选择

对比项Functions(推荐优先)Pipelines
部署方式内置于 Open WebUI,无需额外服务需要独立部署 Pipelines 服务
适用场景添加 API 提供商、过滤器、工具、按钮动作计算密集型任务(如大规模数据处理、自定义 ML 推理)
管理方式管理员面板 → 函数管理员面板 → 设置 → Pipelines
开发难度简单,直接在 Web 界面编写较复杂,需要独立服务和 Docker 部署
性能影响在主进程中运行独立进程,不影响主服务

简单判断规则:如果你不确定该用哪个,用 Functions。只有当你明确需要在独立进程中运行计算密集型任务时,才考虑 Pipelines。

Functions(函数)

Functions 是 Open WebUI 内置的扩展机制,直接在管理员面板中管理,无需额外部署。

Functions 的四种类型

类型说明使用场景
Filter在消息发送到模型前/后进行处理内容过滤、格式转换、日志记录
Action在消息气泡上添加自定义按钮一键翻译、一键总结、复制格式化内容
Tool为模型提供可调用的工具网络搜索、数据库查询、API 调用
Pipe添加新的模型端点或 API 提供商接入自定义 API、代理转发

管理 Functions

管理员面板 → 函数(Functions)

在这里你可以:

  • 创建新函数(直接在 Web 编辑器中编写 Python 代码)
  • 从社区导入函数
  • 启用/禁用函数
  • 配置函数参数(Valves)

社区函数库

Open WebUI 社区提供了大量现成的函数,访问 https://openwebui.com/functions/ 浏览和导入。

💡 Functions 的详细开发将在后续章节中介绍。本节重点是让管理员了解如何管理和配置。

Pipelines(仅限计算密集型场景)

如果你确实需要将计算密集型任务卸载到独立进程,才需要部署 Pipelines。

部署 Pipelines 服务

在你的 docker-compose.local.yaml 中添加 Pipelines 服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
pipelines:
image: ghcr.io/open-webui/pipelines:main
container_name: pipelines
ports:
- "9099:9099"
extra_hosts:
- host.docker.internal:host-gateway
volumes:
- pipelines-data:/app/pipelines
restart: unless-stopped

open-webui:
# ... 你的现有配置
environment:
- PIPELINES_URLS=http://pipelines:9099

volumes:
pipelines-data:

启动后访问 http://localhost:9099/docs 验证 Pipelines API 是否正常。

在 Open WebUI 中连接

管理员面板 → 设置 → Pipelines → 填入 http://pipelines:9099 → 点击刷新

管理插件

连接成功后,你可以:

  • 上传 Python 插件文件(.py
  • 启用/禁用插件
  • 配置插件参数(Valves)

Pipelines 插件示例

官方示例仓库:https://github.com/open-webui/pipelines/tree/main/examples

插件名称功能使用场景
Langfuse集成 Langfuse 监控平台大规模使用量监控
LLM Guard防止提示词注入攻击安全防护(计算密集)
Detoxify基于 ML 模型的有害内容过滤内容安全(需要 GPU)

💡 像 Rate Limit(限流)、LibreTranslate(翻译)这类轻量级功能,现在推荐使用 Functions 实现,不再需要部署 Pipelines。


3.9. 安全与认证配置

这一章讲的是“谁能登录、谁能调用 API、用户身份如何同步、会话如何保活”。

如果你是个人用户,这部分很多配置可以先不动;但只要进入团队协作、公司内网、对接脚本或自动化系统,这一章就会变成必修课。

在开始之前,先解释几个经常会混在一起的术语:

  • 认证(Authentication):证明“你是谁”。例如账号密码登录、LDAP 登录、Google 登录。
  • 授权(Authorization):决定“你能做什么”。例如能不能看某个模型、能不能导出模型、能不能管理工具。
  • API Key:发给程序用的密钥,适合脚本、集成平台、外部服务调用 Open WebUI API。
  • LDAP:企业常见的目录服务协议,很多公司的 AD(Active Directory)也兼容这套方式。
  • OAuth / OIDC:第三方登录体系。OAuth 偏“授权”,OIDC 是建立在 OAuth 之上的“身份登录”标准。
  • SCIM:自动开通和回收账号的标准,不负责“登录”,而负责“账号生命周期同步”。

API 密钥认证

这是什么

Open WebUI 支持为用户生成 API Key,让外部脚本、自动化流程、内部平台、工作流引擎通过 HTTP API 访问它。

典型场景包括:

  • 用 Python、Node.js 或 Shell 脚本调用聊天接口
  • 用企业内部系统转发请求到 Open WebUI
  • 给工作流平台、Bot、自动化任务提供一个稳定认证方式

它和“浏览器登录 Cookie”不是一回事:

  • 浏览器登录主要给人用
  • API Key 主要给程序用

如何启用

管理员面板 → 设置 → 通用 → 启用 API Key

启用后,用户就可以在自己的账号设置中创建 API Key。

当前版本除了总开关外,还支持 API Key Endpoint Restrictions,也就是“限制 API Key 只能访问哪些接口”。这个能力很重要,因为它可以避免把一把过大的密钥发给外部系统。

用户如何生成密钥

点击头像 → 设置 → 账号 → API 密钥 → 点击“创建新密钥”

创建后要立即保存,因为这类密钥通常不会反复明文展示。

调用示例

1
2
3
4
curl -X POST http://localhost:3000/api/chat \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d '{"message": "Hello"}'

官方建议理解

官网当前的方向不是“默认把所有接口都敞开”,而是:

  • 可以启用 API Key
  • 可以进一步启用接口级限制
  • 在可信内网环境里可以更宽松,在生产环境则建议更严格

我的管理方式

在我的环境里,API Key 主要给“程序”而不是“人”使用,所以我通常这样管理:

  1. 浏览器用户走正常登录,不给所有人默认要求 API Key。
  2. 只有确实需要脚本调用的账号,才生成 API Key。
  3. 给外部系统时,优先启用接口限制,不给过大的权限面。
  4. 定期清理不再使用的密钥,避免历史脚本长期持有可用凭证。
  5. 如果只是临时测试,我会单独创建测试用密钥,不和正式环境长期复用。

LDAP 集成

这是什么

LDAP 可以理解为“公司统一通讯录 / 账号目录”的标准接口。

如果你所在的组织已经有 AD、OpenLDAP 或其他企业目录系统,那么 Open WebUI 可以直接对接这个目录,让员工使用公司账号登录,而不是在 Open WebUI 里重复创建本地账号。

适合谁

  • 公司内网部署
  • 已有统一身份管理
  • 希望账号、邮箱、用户名来自企业目录

个人部署、小团队、临时测试环境,通常不需要上 LDAP。

官方配置思路

LDAP 推荐先通过环境变量初始化,然后在管理员面板里继续维护。官网特别强调一件事:

如果启用了持久化配置(默认就是),很多环境变量只在第一次启动时读入;后续修改通常要在管理后台里改,而不是只改 docker-compose

这点非常重要,也是很多人“明明改了环境变量,怎么界面没变”的根源。

当前版本常见环境变量

1
2
3
4
5
6
7
8
9
10
11
12
environment:
- ENABLE_LDAP=true
- LDAP_SERVER_LABEL=OpenLDAP
- LDAP_SERVER_HOST=ldap.example.com
- LDAP_SERVER_PORT=389
- LDAP_ATTRIBUTE_FOR_MAIL=mail
- LDAP_ATTRIBUTE_FOR_USERNAME=uid
- LDAP_APP_DN=cn=admin,dc=example,dc=org
- LDAP_APP_PASSWORD=your_password
- LDAP_SEARCH_BASE=dc=example,dc=org
- LDAP_SEARCH_FILTER=(uid=%(user)s)
- LDAP_USE_TLS=true

你会发现,这一版和很多旧博客里写的 LDAP_SERVER_URLLDAP_BIND_DN 之类名字不完全一样。写文档时一定要以当前版本为准。

参数解释

参数说明
ENABLE_LDAP是否启用 LDAP 登录
LDAP_SERVER_LABEL在界面里显示的 LDAP 名称
LDAP_SERVER_HOST / LDAP_SERVER_PORTLDAP 服务器地址和端口
LDAP_ATTRIBUTE_FOR_MAIL从 LDAP 条目里取邮箱的字段
LDAP_ATTRIBUTE_FOR_USERNAME从 LDAP 条目里取用户名的字段
LDAP_APP_DN / LDAP_APP_PASSWORD用于查询目录的服务账号
LDAP_SEARCH_BASE搜索用户的根 DN
LDAP_SEARCH_FILTER登录时查找用户的过滤器
LDAP_USE_TLS是否启用 TLS / StartTLS

正确的排错顺序

不要一上来就怀疑 Open WebUI。

官网推荐的思路是:

  1. 先验证 LDAP 服务器本身通不通
  2. 再验证用户条目能不能查到
  3. 最后才看 Open WebUI 配置

例如:

1
2
3
ldapsearch -x -H ldap://ldap.example.com:389 \
-D "cn=admin,dc=example,dc=org" -w your_password \
-b "dc=example,dc=org" "(uid=jdoe)"

如果这一步都查不到用户,就不要继续在 WebUI 里盲改了。

我的管理方式

我自己的判断规则很简单:

  • 如果是企业内部正式使用,并且员工已经有统一账号体系,我会优先接 LDAP。
  • 如果只是个人站点、朋友共用、测试环境,我不会为了“看起来企业化”硬上 LDAP。
  • 上 LDAP 后,我会尽量让用户名、邮箱、显示名都来自目录系统,避免 Open WebUI 自己成为第二套主数据来源。

OAuth / OIDC / SSO 集成

这是什么

这一组就是“第三方登录”。

最常见的使用方式是:

  • 用 Google 账号登录
  • 用 Microsoft / Entra ID 账号登录
  • 用 GitHub 账号登录
  • 用企业自己的 OIDC 服务登录

如果说 LDAP 更像“公司内网目录登录”,那 OAuth / OIDC 更像“现代网站统一登录”。

先说结论:本地开发完全可以配

而且你现在这个仓库已经改成了:

  • docker-compose.local.yaml 自动读取 .env.local
  • 本地端口由 OPEN_WEBUI_PORT 控制
  • Google、Microsoft、GitHub 三家都可以直接写在 .env.local

所以对读者来说,最容易跟做的方式就是:

  1. 去各自官网创建 OAuth 应用
  2. 把回调地址填成 Open WebUI 本地回调
  3. 把拿到的密钥填进 .env.local
  4. 重启本地容器

本地统一配置模板

如果你的本地端口是 3000,那么 .env.local 先这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
OPEN_WEBUI_PORT=3000
WEBUI_URL=http://localhost:3000
ENABLE_OAUTH_SIGNUP=true
OAUTH_MERGE_ACCOUNTS_BY_EMAIL=true

GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=http://localhost:3000/oauth/google/login/callback

MICROSOFT_CLIENT_ID=
MICROSOFT_CLIENT_SECRET=
MICROSOFT_CLIENT_TENANT_ID=common
MICROSOFT_REDIRECT_URI=http://localhost:3000/oauth/microsoft/login/callback

GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GITHUB_CLIENT_REDIRECT_URI=http://localhost:3000/oauth/github/login/callback

写完后执行:

1
docker compose -f docker-compose.local.yaml up -d --build

如果你的端口不是 3000,例如 5050,那上面所有 localhost:3000 都要统一改成 localhost:5050

适用场景

如果你想直接使用 Google 账号登录,这是最常见的一种配置。

第 1 步:去 Google 官方后台创建应用

访问:

https://console.cloud.google.com/apis/credentials

进入后:

  1. 创建或选择一个 Project
  2. 打开 APIs & Services
  3. 进入 Credentials(凭证)
  4. 点击 Create Credentials
  5. 选择 OAuth client ID
  6. Application type 选择 Web application

第 2 步:登记回调地址

Authorized redirect URIs 中填写:

1
http://localhost:3000/oauth/google/login/callback

第 3 步:把拿到的密钥填入 .env.local

1
2
3
GOOGLE_CLIENT_ID=你的 Google Client ID
GOOGLE_CLIENT_SECRET=你的 Google Client Secret
GOOGLE_REDIRECT_URI=http://localhost:3000/oauth/google/login/callback

第 4 步:重启本地 Open WebUI

1
docker compose -f docker-compose.local.yaml up -d --build

注意事项

  • Google 开发环境允许 http://localhost
  • 回调地址必须和后台里登记的 URI 完全一致
  • 如果你改了端口,Google 后台也要一起改

适用场景

如果用户本身就在 Microsoft 365、Entra ID、企业账号体系里,这一项非常常见。

第 1 步:去 Microsoft Entra 后台注册应用

访问:

https://portal.azure.com/

进入后:

  1. 打开 Microsoft Entra ID
  2. 进入 App registrations
  3. 点击 New registration
  4. 创建一个应用

第 2 步:配置回调地址

Authentication 页面里添加:

1
http://localhost:3000/oauth/microsoft/login/callback

第 3 步:生成 Secret 并写入 .env.local

Certificates & secrets 中生成一个 Client secret,然后填入:

1
2
3
4
MICROSOFT_CLIENT_ID=你的 Microsoft Client ID
MICROSOFT_CLIENT_SECRET=你的 Microsoft Client Secret
MICROSOFT_CLIENT_TENANT_ID=common
MICROSOFT_REDIRECT_URI=http://localhost:3000/oauth/microsoft/login/callback

如果你只允许某一个租户登录,把 common 改成你的实际 Tenant ID 即可。

第 4 步:重启本地 Open WebUI

1
docker compose -f docker-compose.local.yaml up -d --build

注意事项

  • Microsoft 也支持本地 localhost 回调
  • 本地开发可以先用 common
  • 正式环境建议单独使用正式域名和正式应用注册

适用场景

如果你的用户本身大量使用 GitHub,这是最容易理解、也最容易测试的一项。

第 1 步:去 GitHub Developer Settings 创建 OAuth App

访问:

https://github.com/settings/developers

进入后:

  1. 打开 OAuth Apps
  2. 点击 New OAuth App

第 2 步:填写回调地址

最关键的是 Authorization callback URL

1
http://localhost:3000/oauth/github/login/callback

第 3 步:把密钥填入 .env.local

1
2
3
GITHUB_CLIENT_ID=你的 GitHub Client ID
GITHUB_CLIENT_SECRET=你的 GitHub Client Secret
GITHUB_CLIENT_REDIRECT_URI=http://localhost:3000/oauth/github/login/callback

第 4 步:重启本地 Open WebUI

1
docker compose -f docker-compose.local.yaml up -d --build

注意事项

  • GitHub 对 callback URL 也是精确匹配
  • 如果后台填的是 127.0.0.1,本地配置也要统一成 127.0.0.1
  • 不要后台填 127.0.0.1,本地却写 localhost

为了更容易排错,我建议不要一上来三个一起配,而是按这个顺序:

  1. 先配一个,例如 GitHub
  2. 测通之后,再加 Google
  3. 最后再加 Microsoft

这样如果出现问题,最容易定位。

最常见的报错就是:

  • redirect_uri_mismatch
  • 端口改了,但开放平台后台没改
  • .env.local 改了,但容器没重启
  • 后台写的是 127.0.0.1,本地写的是 localhost

SCIM 自动开通与回收

这是什么

SCIM 不是登录协议,而是“账号生命周期同步协议”。

它解决的问题是:

  • 新员工入职时,自动在 Open WebUI 创建账号
  • 员工信息变化时,自动同步更新
  • 员工离职时,自动停用账号
  • 用户组成员关系自动同步

所以可以把它理解成“自动开账号、改账号、停账号”的标准接口。

和 OAuth / LDAP 的关系

  • LDAP / OAuth / OIDC:解决“怎么登录”
  • SCIM:解决“账号怎么自动创建和同步”

很多企业会同时使用:

  • 用 OIDC 登录
  • 用 SCIM 做账号与组同步

当前版本配置

1
2
3
4
environment:
- SCIM_ENABLED=true
- SCIM_TOKEN=your-secure-random-token
- SCIM_AUTH_PROVIDER=oidc

参数解释

参数说明
SCIM_ENABLED是否启用 SCIM
SCIM_TOKEN调用 SCIM API 的 Bearer Token
SCIM_AUTH_PROVIDER用于把 SCIM externalId 和对应认证提供商关联起来,例如 microsoftoidc

这里的 SCIM_AUTH_PROVIDER 很容易被漏掉,但当前版本里它是重要配置,尤其是在账户关联和 externalId 保存上。

对接端点

SCIM Base URL:

1
https://your-domain.com/api/v1/scim/v2/

常见资源端点:

资源端点
用户/api/v1/scim/v2/Users
/api/v1/scim/v2/Groups

我的管理方式

我把 SCIM 视为“企业级增强项”:

  • 小规模自用:完全不需要
  • 团队规模不大,但已有统一登录:先上 OAuth / LDAP,SCIM 可以以后再说
  • 企业正式上生产:如果人事变动频繁、合规要求高,就值得上 SCIM

它的价值不在“让用户多一个登录按钮”,而在于减少人工维护账号、降低离职账号遗留风险。

这是什么

用户在浏览器里登录后,Open WebUI 需要一种机制记住登录状态,这通常会涉及:

  • JWT:登录令牌
  • Session Cookie:浏览器保存的登录凭证
  • Secret Key:服务器用来签名和加密敏感数据的密钥

当前版本重点配置

1
2
3
4
5
environment:
- WEBUI_SECRET_KEY=your-persistent-secret-key
- JWT_EXPIRES_IN=4w
- WEBUI_SESSION_COOKIE_SAME_SITE=Lax
- WEBUI_SESSION_COOKIE_SECURE=true

参数解释

参数说明
WEBUI_SECRET_KEY最关键的持久化密钥,用于会话签名和敏感数据解密
JWT_EXPIRES_IN登录令牌过期时间,例如 4w7d
WEBUI_SESSION_COOKIE_SAME_SITECookie 的跨站策略
WEBUI_SESSION_COOKIE_SECURE是否只通过 HTTPS 发送 Cookie

为什么 WEBUI_SECRET_KEY 非常重要

官网 FAQ 专门提到,如果你每次重建容器都不保留同一个 WEBUI_SECRET_KEY,会出现两类典型问题:

  • 用户升级或重启后被全部强制退出
  • 一些已经加密保存的令牌、API Key、OAuth 凭证无法解密

所以这个值一定要固定,不要让容器每次随机生成。

我的管理方式

这一点我会非常保守:

  1. 生产环境固定设置 WEBUI_SECRET_KEY
  2. HTTPS 环境强制 WEBUI_SESSION_COOKIE_SECURE=true
  3. 不把 JWT_EXPIRES_IN 设成无限期
  4. 升级容器前先确认密钥仍然通过同样方式注入

这是最容易被忽略、但一出问题就会直接影响所有用户登录体验的一块。