agentic_huge_data_base / wiki
页面 Open WebUI · 7.2 内容抽取引擎·DeepWiki 中文全文译文

7.2 · 内容抽取引擎(Content Extraction Engines)

多模型对话工作台与知识应用入口 · 本章是 Open WebUI DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目Open WebUI 章节7.2 状态全文译文 模块检索、召回与知识系统、接口与服务契约、界面与交互、工具、记忆与模型调用
源码线索
  • backend/open_webui/models/memories.py
  • backend/open_webui/retrieval/loaders/datalab_marker.py
  • backend/open_webui/retrieval/loaders/main.py
  • backend/open_webui/retrieval/loaders/mineru.py
  • backend/open_webui/retrieval/loaders/paddleocr_vl.py
  • backend/open_webui/retrieval/utils.py
  • backend/open_webui/routers/memories.py
  • backend/open_webui/routers/retrieval.py
  • src/lib/apis/retrieval/index.ts
  • src/lib/components/admin/Settings/Documents.svelte
模块标签
  • 检索、召回与知识系统
  • 接口与服务契约
  • 界面与交互
  • 工具、记忆与模型调用
  • 系统架构

中文译文

内容抽取引擎(中文译文)

原始 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.py
  • backend/open_webui/retrieval/loaders/datalab_marker.py
  • backend/open_webui/retrieval/loaders/main.py
  • backend/open_webui/retrieval/loaders/mineru.py
  • backend/open_webui/retrieval/loaders/paddleocr_vl.py
  • backend/open_webui/retrieval/utils.py
  • backend/open_webui/routers/memories.py
  • backend/open_webui/routers/retrieval.py
  • src/lib/apis/retrieval/index.ts
  • src/lib/components/admin/Settings/Documents.svelte
  • src/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-356
  • backend/open_webui/retrieval/utils.py:86-124
  • backend/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 种源代码扩展名(例如 pyjstscppsvelte),确保无论使用何种提取引擎,这些文件都作为纯文本处理。backend/open_webui/retrieval/loaders/main.py:33-87

来源:

  • backend/open_webui/retrieval/loaders/main.py:187-356
  • backend/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 直到状态变为 completebackend/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_parsebackend/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_ENGINEbackend/open_webui/retrieval/utils.py:92
TikaTIKA_SERVER_URLbackend/open_webui/retrieval/utils.py:106
DoclingDOCLING_SERVER_URL, DOCLING_PARAMSbackend/open_webui/retrieval/utils.py:107-109
MarkerDATALAB_MARKER_API_KEY, DATALAB_MARKER_USE_LLMbackend/open_webui/retrieval/utils.py:93-103
MistralMISTRAL_OCR_API_KEY, MISTRAL_OCR_API_BASE_URLbackend/open_webui/retrieval/utils.py:115-116
MinerUMINERU_API_MODE, MINERU_API_URL, MINERU_PARAMSbackend/open_webui/retrieval/utils.py:119-123

来源:

  • src/lib/components/admin/Settings/Documents.svelte:144-228
  • backend/open_webui/retrieval/utils.py:86-124
  • src/lib/apis/retrieval/index.ts:63-91