内容抽取引擎(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/7.2-content-extraction-engines
翻译时间:2026-06-09T16:09:10.937Z
翻译模型:deepseek-chat
原文字符数:10052
项目:Open WebUI (open-webui)
---
内容提取引擎
相关源文件
以下文件为本 wiki 页面的生成提供了上下文:
backend/open_webui/models/memories.pybackend/open_webui/retrieval/loaders/datalab_marker.pybackend/open_webui/retrieval/loaders/main.pybackend/open_webui/retrieval/loaders/mineru.pybackend/open_webui/retrieval/loaders/paddleocr_vl.pybackend/open_webui/retrieval/utils.pybackend/open_webui/routers/memories.pybackend/open_webui/routers/retrieval.pysrc/lib/apis/retrieval/index.tssrc/lib/components/admin/Settings/Documents.sveltesrc/lib/components/admin/Settings/WebSearch.svelte
目的与范围
内容提取引擎是 Open WebUI 的 RAG(检索增强生成)流程中可插拔的文档解析子系统。这些引擎将上传的文件——从 PDF、Office 文档到图片和源代码——转换为适合嵌入和向量存储的结构化文本内容。本文档详细介绍了 Loader 工厂的实现、Tika、Docling、Marker、MinerU 和 Mistral OCR 等专用引擎的集成,以及管理这些引擎的配置管理系统。
---
系统架构
内容提取系统构建在一个灵活的引擎抽象之上,同时支持本地(原生)解析器和基于外部 API 的提取服务。Loader 类充当编排器,根据 CONTENT_EXTRACTION_ENGINE 设置将文档路由到相应的引擎。
图示:内容提取系统架构
graph TB
subgraph "配置层"
ConfigTable["ConfigTable (id, data: JSON)"]
PersistentConfig["PersistentConfig 对象<br/>CONTENT_EXTRACTION_ENGINE<br/>TIKA_SERVER_URL<br/>DOCLING_SERVER_URL"]
end
subgraph "文档上传流程"
UploadRoute["POST /api/v1/files/<br/>(UploadFile)"]
ValidateExt["检查 ALLOWED_FILE_EXTENSIONS"]
StorageWrite["Storage.save_file()"]
end
subgraph "Loader 实例化"
LoaderClass["Loader(engine, **kwargs)"]
LoadMethod["Loader.load(filename, content_type, path)"]
GetLoaderMethod["Loader._get_loader()"]
end
subgraph "引擎选择逻辑"
CheckExternal{"engine == 'external'?"}
CheckTika{"engine == 'tika'?"}
CheckMarker{"engine == 'datalab_marker'?"}
CheckDocling{"engine == 'docling'?"}
CheckMistral{"engine == 'mistral_ocr'?"}
CheckMinerU{"engine == 'mineru'?"}
end
subgraph "Loader 实现"
ExternalLoader["ExternalDocumentLoader"]
TikaLoader["TikaLoader"]
MarkerLoader["DatalabMarkerLoader"]
DoclingLoader["DoclingLoader"]
MistralLoader["MistralLoader"]
MinerULoader["MinerULoader"]
NativeLoaders["原生 Loader<br/>(PyPDF, Docx2txt, CSV 等)"]
end
subgraph "输出处理"
DocumentList["List[Document]<br/>(page_content, metadata)"]
FtfyFix["ftfy.fix_text()"]
end
ConfigTable --> PersistentConfig
PersistentConfig --> LoaderClass
UploadRoute --> ValidateExt
ValidateExt --> StorageWrite
StorageWrite --> LoaderClass
LoaderClass --> LoadMethod
LoadMethod --> GetLoaderMethod
GetLoaderMethod --> CheckExternal
CheckExternal -- "是" --> ExternalLoader
CheckExternal -- "否" --> CheckTika
CheckTika -- "是" --> TikaLoader
CheckTika -- "否" --> CheckMarker
CheckMarker -- "是" --> MarkerLoader
CheckMarker -- "否" --> CheckDocling
CheckDocling -- "是" --> DoclingLoader
CheckDocling -- "否" --> CheckMistral
CheckMistral -- "是" --> MistralLoader
CheckMistral -- "否" --> CheckMinerU
CheckMinerU -- "是" --> MinerULoader
CheckMinerU -- "否" --> NativeLoaders
NativeLoaders --> DocumentList
ExternalLoader --> DocumentList
TikaLoader --> DocumentList
MarkerLoader --> DocumentList
DoclingLoader --> DocumentList
MistralLoader --> DocumentList
MinerULoader --> DocumentList
DocumentList --> FtfyFix
来源:
backend/open_webui/retrieval/loaders/main.py:231-356backend/open_webui/retrieval/utils.py:86-124backend/open_webui/routers/retrieval.py:1020-1065
---
Loader 类与引擎选择
backend/open_webui/retrieval/loaders/main.py 中的 Loader 类为文档内容提取提供了统一接口。_get_loader 方法根据系统配置和文件类型决定实例化哪个专用加载器。
图示:Loader 选择与逻辑流程
graph TB
subgraph "代码实体空间"
LoaderClass["class Loader"]
LoadMethod["Loader.load()"]
GetLoader["Loader._get_loader()"]
IsTextFile["Loader._is_text_file()"]
end
subgraph "决策树"
CheckEngine{"self.engine"}
CheckText{"是否为文本/代码?"}
MatchExt["匹配扩展名"]
end
LoaderClass --> LoadMethod
LoadMethod --> GetLoader
GetLoader --> CheckEngine
CheckEngine -- "tika" --> CheckText
CheckEngine -- "datalab_marker" --> DatalabMarkerLoader
CheckEngine -- "docling" --> DoclingLoader
CheckEngine -- "mistral_ocr" --> MistralLoader
CheckEngine -- "mineru" --> MinerULoader
CheckEngine -- "external" --> ExternalDocumentLoader
CheckEngine -- "" --> MatchExt
CheckText -- "是" --> TextLoader
CheckText -- "否" --> TikaLoader
MatchExt -- ".pdf" --> PyPDFLoader
MatchExt -- ".docx" --> Docx2txtLoader
MatchExt -- ".csv" --> CSVLoader
MatchExt -- "源代码" --> TextLoader
系统通过 known_source_ext 列表识别超过 50 种源代码扩展名(例如 py、js、ts、cpp、svelte),确保无论使用何种提取引擎,这些文件都作为纯文本处理。backend/open_webui/retrieval/loaders/main.py:33-87
来源:
backend/open_webui/retrieval/loaders/main.py:187-356backend/open_webui/retrieval/utils.py:86-124
---
专用提取引擎
Apache Tika
tika 引擎使用外部 Tika 服务器。它通过 PUT 请求将文件发送到 /tika/text 端点。如果启用了图像提取,则支持 X-Tika-PDFextractInlineImages 头。backend/open_webui/retrieval/loaders/main.py:138-177
DataLab Marker
datalab_marker 引擎提供高保真 PDF 转换。它支持异步轮询模式:初始 POST 返回一个 request_check_url,加载器轮询该 URL 直到状态变为 complete。backend/open_webui/retrieval/loaders/datalab_marker.py:13-170
Docling
docling 引擎将文档转换为 Markdown 格式。它与 Docling 服务器的 /v1/convert/file 端点交互,并支持通过 DOCLING_PARAMS 传递自定义参数。backend/open_webui/retrieval/loaders/main.py:179-228
Mistral OCR
mistral_ocr 引擎使用 Mistral 的视觉模型进行 OCR。它具有针对网络超时和速率限制(429)的健壮重试逻辑,并支持流式文件上传以最小化内存使用。backend/open_webui/retrieval/loaders/mistral.py:63-164
MinerU
mineru 引擎支持 local(本地)和 cloud(云端)两种模式。
- 本地模式:同步
POST到/file_parse。backend/open_webui/retrieval/loaders/mineru.py:69-173 - 云端模式:异步流程,涉及预签名上传 URL 和 ZIP 结果提取。
backend/open_webui/retrieval/loaders/mineru.py:175-230
---
配置与前端集成
提取引擎通过管理设置 UI(特别是“文档”选项卡)进行配置。src/lib/components/admin/Settings/Documents.svelte 中的 submitHandler 在持久化配置之前,会验证 Docling 和 MinerU 等引擎的 JSON 参数。
图示:配置持久化流程
graph LR
subgraph "前端 UI"
SettingsUI["Settings/Documents.svelte"]
Submit["submitHandler()"]
end
subgraph "API 层"
UpdateRAG["updateRAGConfig()"]
RetrievalRouter["routers/retrieval.py<br/>POST /config/update"]
end
subgraph "后端持久化"
AppConfig["app.state.config"]
DB["SQL 数据库<br/>Config 表"]
end
SettingsUI --> Submit
Submit --> UpdateRAG
UpdateRAG -- "JSON 负载" --> RetrievalRouter
RetrievalRouter --> AppConfig
AppConfig --> DB
关键配置变量
| 引擎 | 参数 | 来源 |
|---|---|---|
| 通用 | CONTENT_EXTRACTION_ENGINE | backend/open_webui/retrieval/utils.py:92 |
| Tika | TIKA_SERVER_URL | backend/open_webui/retrieval/utils.py:106 |
| Docling | DOCLING_SERVER_URL, DOCLING_PARAMS | backend/open_webui/retrieval/utils.py:107-109 |
| Marker | DATALAB_MARKER_API_KEY, DATALAB_MARKER_USE_LLM | backend/open_webui/retrieval/utils.py:93-103 |
| Mistral | MISTRAL_OCR_API_KEY, MISTRAL_OCR_API_BASE_URL | backend/open_webui/retrieval/utils.py:115-116 |
| MinerU | MINERU_API_MODE, MINERU_API_URL, MINERU_PARAMS | backend/open_webui/retrieval/utils.py:119-123 |
来源:
src/lib/components/admin/Settings/Documents.svelte:144-228backend/open_webui/retrieval/utils.py:86-124src/lib/apis/retrieval/index.ts:63-91