后端处理管线(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/6-backend-processing-pipeline
翻译时间:2026-06-09T16:08:41.834Z
翻译模型:deepseek-chat
原文字符数:9540
项目:Open WebUI (open-webui)
---
后端处理流水线
相关源文件
以下文件被用作生成此 wiki 页面的上下文:
backend/open_webui/config.pybackend/open_webui/env.pybackend/open_webui/main.pybackend/open_webui/routers/auths.pybackend/open_webui/tools/builtin.pybackend/open_webui/utils/auth.pybackend/open_webui/utils/middleware.pybackend/open_webui/utils/oauth.pybackend/open_webui/utils/tools.pysrc/lib/components/workspace/Models/BuiltinTools.svelte
目的与范围
本文档记录了处理 AI 聊天请求的后端中间件和请求处理流水线,涵盖从初始接收到响应流式传输的完整流程。该流水线协调工具执行、RAG 上下文注入、过滤器处理和响应格式化。
- 关于应用结构,请参见 FastAPI 应用核心。
- 关于请求流程和中间件详情,请参见 聊天中间件与请求流程。
- 关于具体工具实现,请参见 工具执行系统。
- 关于 RAG 特定处理,请参见 RAG 与知识系统。
---
请求流程概览
后端处理流水线通过多阶段中间件流水线将用户聊天请求转换为 AI 响应。请求通过 FastAPI 路由器进入,经过过滤器和预处理,按需执行工具,集成 RAG 上下文,并将响应流式传输回客户端。
高层请求流程
graph TD
Client["客户端请求"]
Router["FastAPI 路由器<br/>(routers/openai.py, routers/ollama.py)"]
ChatGen["generate_chat_completion<br/>(utils/chat.py)"]
Middleware["中间件流水线<br/>(utils/middleware.py)"]
InletFilter["入口过滤器<br/>(utils/filter.py)"]
RAG["RAG 处理<br/>(apply_source_context_to_messages)"]
ToolExec["工具执行<br/>(get_tools, execute tools)"]
Provider["AI 提供商<br/>(OpenAI/Ollama API)"]
OutletFilter["出口过滤器"]
Response["流式响应"]
Client --> Router
Router --> ChatGen
ChatGen --> Middleware
Middleware --> InletFilter
InletFilter --> RAG
RAG --> ToolExec
ToolExec --> Provider
Provider --> OutletFilter
OutletFilter --> Response
Response --> Client
ToolExec -.->|"工具调用需要<br/>多次迭代"| Provider
来源: backend/open_webui/utils/middleware.py:1-141, backend/open_webui/utils/chat.py:78-78
---
核心中间件组件
中间件流水线主要在 utils/middleware.py 中实现,负责编排整个请求处理流程。主要入口点是路由器的聊天补全端点,该端点将工作委托给 generate_chat_completion。
中间件入口点
| 入口点 | 位置 | 用途 |
|---|---|---|
/v1/chat/completions | routers/openai.py | OpenAI 兼容的聊天端点 |
/api/chat | routers/ollama.py | Ollama 兼容的聊天端点 |
generate_chat_completion | utils/chat.py | 主要中间件编排器 |
来源: backend/open_webui/utils/chat.py:78-78, backend/open_webui/main.py:82-83
---
请求预处理流水线
在到达 AI 提供商之前,请求会经过多个预处理阶段,这些阶段应用转换、注入上下文并执行过滤器。
预处理阶段
graph LR
Request["原始请求"]
ModelSelect["模型选择<br/>(Models.get_model_by_id)"]
InletPipe["流水线入口过滤器<br/>(process_pipeline_inlet_filter)"]
InletFunc["函数过滤器<br/>(process_filter_functions)"]
SysPrompt["系统提示应用<br/>(apply_system_prompt_to_body)"]
VarSub["变量替换<br/>(prompt_template)"]
Params["模型参数应用<br/>(apply_model_params_to_body)"]
Request --> ModelSelect
ModelSelect --> InletPipe
InletPipe --> InletFunc
InletFunc --> SysPrompt
SysPrompt --> VarSub
VarSub --> Params
关键预处理函数
| 函数 | 位置 | 用途 |
|---|---|---|
apply_system_prompt_to_body | utils/middleware.py:115 | 将系统提示注入消息 |
process_filter_functions | utils/filter.py:112 | 按优先级顺序应用过滤器函数 |
process_pipeline_inlet_filter | utils/middleware.py:56 | 处理自定义流水线的入口过滤器 |
来源: backend/open_webui/utils/middleware.py:115, backend/open_webui/utils/filter.py:110-113
---
工具执行流水线
中间件实现了一个复杂的工具调用系统,支持原生函数调用、工具重试和结果处理。工具被发现、验证、执行,其结果被注入回对话中。
工具发现与加载
graph TD
ToolRequest["来自请求的工具 ID"]
GetTools["get_tools<br/>(utils/tools.py)"]
BuiltinTools["get_builtin_tools<br/>(utils/tools.py)"]
LoadLocal["加载本地工具<br/>(utils/plugin.py)"]
LoadServer["加载工具服务器规范<br/>(utils/plugin.py)"]
ToolDict["tools_dict<br/>{name: {callable, spec, metadata}}"]
ToolRequest --> GetTools
GetTools --> LoadLocal
GetTools --> LoadServer
GetTools --> BuiltinTools
LoadLocal --> ToolDict
LoadServer --> ToolDict
BuiltinTools --> ToolDict
来源: backend/open_webui/utils/tools.py:164-210, backend/open_webui/utils/middleware.py:48, backend/open_webui/utils/plugin.py:109
工具执行流程
中间件通过一个重试循环执行工具,该循环处理流式响应、工具调用和错误恢复。
sequenceDiagram
participant MW as 中间件
participant Provider as AI 提供商
participant ToolExec as 工具执行器
MW->>Provider: 发送带工具的请求
Provider-->>MW: 带 tool_calls 的响应
loop 对于每个 tool_call
MW->>ToolExec: 执行工具(name, params)
ToolExec-->>MW: 格式化结果
MW->>MW: 构建工具消息
end
MW->>MW: 检查重试次数<br/>(最大: CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES)
alt 需要更多工具调用
MW->>Provider: 发送带工具结果的请求
else 最终响应
MW-->>MW: 返回给客户端
end
来源: backend/open_webui/utils/middleware.py:132, backend/open_webui/env.py:132
---
响应流式传输架构
中间件处理增量更新,并在流式传输过程中识别特定标签(用于推理和代码执行),以正确分类输出部分。
推理与内容标签
系统使用 DEFAULT_REASONING_TAGS 来识别模型输出中的思考过程。
| 标签类型 | 标签 | ||||
|---|---|---|---|---|---|
| 推理 | <think>, <thinking>, <reason>, <thought>, `< | begin_of_thought | >` | ||
| 解决方案 | `< | begin_of_solution | >, < | end_of_solution | >` |
| 代码解释器 | <code_interpreter>, </code_interpreter> |
来源: backend/open_webui/utils/middleware.py:153-165
---
RAG 上下文注入
当启用 RAG 时,中间件会查询知识库,并使用 retrieval/utils.py 中的工具函数将相关上下文注入到消息列表中。
RAG 处理流程
graph LR
UserMsg["用户消息"]
Query["查询知识库<br/>(query_memory/query_knowledge_bases)"]
Extract["提取来源<br/>(get_sources_from_items)"]
Inject["注入到消息中<br/>(rag_template)"]
UserMsg --> Query
Query --> Extract
Extract --> Inject
来源: backend/open_webui/retrieval/utils.py:74-74, backend/open_webui/utils/middleware.py:74, backend/open_webui/utils/task.py:81-81
---
工具结果处理
工具结果需要针对不同的返回类型进行特殊处理。系统将这些格式规范化,为 LLM 提供一致的接口。
| 结果类型 | 处理方式 |
|---|---|
| JSON 对象 | _split_tool_calls 展开来自模型的拼接 JSON 参数 |
| 引用 | get_citation_source_from_tool_result 解析结果以供显示 |
| MCP 内容 | 通过 MCPClient 集成处理 |
来源: backend/open_webui/utils/middleware.py:172-218, backend/open_webui/utils/middleware.py:221-223, backend/open_webui/utils/middleware.py:117
---
配置参考
关键环境变量和 PersistentConfig 设置控制中间件行为。
| 变量 | 默认值 | 用途 |
|---|---|---|
CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES | 30 | 最大工具调用迭代次数 |
CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE | 1 | 流式传输的块大小 |
ENABLE_CHAT_RESPONSE_BASE64_IMAGE_URL_CONVERSION | False | 将 base64 图片转换为 URL |
RAG_SYSTEM_CONTEXT | False | 将 RAG 上下文作为系统消息还是用户消息注入 |
ENABLE_RESPONSES_API_STATEFUL | False | 启用响应对象的有状态跟踪 |
来源: backend/open_webui/env.py:130-141, backend/open_webui/config.py:214-231