feat: 添加 Docling Serve 服务,更新 docker-compose 配置以支持内容提取功能

This commit is contained in:
alook
2026-08-24 10:51:32 +08:00
parent dcbbd9b98d
commit edd0e7b1ac
3 changed files with 67 additions and 1 deletions
+20 -1
View File
@@ -1,10 +1,11 @@
# AI Stack # AI Stack
这个项目用 Docker Compose 组合了三个服务: 这个项目用 Docker Compose 组合了以下主要服务:
- LiteLLM:作为统一的模型代理层,对外提供 OpenAI 兼容接口 - LiteLLM:作为统一的模型代理层,对外提供 OpenAI 兼容接口
- Open WebUI:作为 Web 端聊天界面,直接连接 LiteLLM - Open WebUI:作为 Web 端聊天界面,直接连接 LiteLLM
- Jupyter:作为 Open WebUI Code Interpreter 的 Python 执行环境,用于生成 Excel 等文件 - Jupyter:作为 Open WebUI Code Interpreter 的 Python 执行环境,用于生成 Excel 等文件
- Docling Serve:作为 Open WebUI 的内容提取引擎,负责文档 OCR、版面和表格解析
当前仓库的核心目标,是基于 Gemini 系列模型快速搭一套可本地运行的 AI 网关与聊天界面。 当前仓库的核心目标,是基于 Gemini 系列模型快速搭一套可本地运行的 AI 网关与聊天界面。
@@ -60,6 +61,24 @@ Jupyter 只在 Docker 内网中提供给 Open WebUI 使用,不暴露到宿主
请使用 Code Interpreter 生成一个 Excel 文件,包含以下字段:姓名、部门、金额,并提供下载链接。 请使用 Code Interpreter 生成一个 Excel 文件,包含以下字段:姓名、部门、金额,并提供下载链接。
``` ```
### 4. Docling Serve
Docling Serve 使用 CPU 镜像运行,只在宿主机回环地址暴露 5001 端口,Open WebUI 通过 Docker 内部地址
`http://docling-serve:5001` 调用它。默认启用 OCR、`dlparse_v4` PDF 后端和准确表格解析,模型文件保存在
`docling-data` 卷中,避免容器重建后重复下载。
本地编排启动后可访问 <http://127.0.0.1:5001/ui>,线上编排使用 <http://127.0.0.1:18014/ui>。Open WebUI
与 Docling 位于同一 Docker 网络,服务间调用始终使用 `http://docling-serve:5001`,不能填写宿主机映射端口。
上传测试文档并确认能够返回 Markdown。首次处理文档时可能需要下载模型,耗时和内存占用会明显高于后续请求。
Open WebUI 的文档设置属于持久化配置。全新数据卷会读取 Compose 中的 Docling 环境变量;如果实例已经运行过,
数据库里的旧设置可能覆盖环境变量。此时进入 `设置 → 管理员设置 → 工具 → 文档`,将内容提取引擎设为
`Docling`,服务地址设为 `http://docling-serve:5001`,参数设为:
```json
{"do_ocr": true, "pdf_backend": "dlparse_v4", "table_mode": "accurate"}
```
## 已配置模型 ## 已配置模型
LiteLLM 当前已配置以下 Gemini 模型别名: LiteLLM 当前已配置以下 Gemini 模型别名:
+24
View File
@@ -36,6 +36,23 @@ services:
--port 4000 --port 4000
restart: unless-stopped restart: unless-stopped
docling-serve:
image: quay.io/docling-project/docling-serve:latest
container_name: docling-serve
pull_policy: always
ports:
- '127.0.0.1:18014:5001'
environment:
- DOCLING_SERVE_ENABLE_UI=true
- DOCLING_SERVE_MAX_SYNC_WAIT=600
- DOCLING_SERVE_ENG_LOC_NUM_WORKERS=2
- UVICORN_WORKERS=1
- OMP_NUM_THREADS=4
- MKL_NUM_THREADS=4
volumes:
- docling-data:/app/data
restart: unless-stopped
jupyter: jupyter:
image: quay.io/jupyter/datascience-notebook:latest image: quay.io/jupyter/datascience-notebook:latest
container_name: ai-chat-jupyter container_name: ai-chat-jupyter
@@ -98,6 +115,11 @@ services:
- IMAGES_EDIT_OPENAI_API_BASE_URL=http://cli-proxy-api:8317/v1 - IMAGES_EDIT_OPENAI_API_BASE_URL=http://cli-proxy-api:8317/v1
- IMAGES_EDIT_OPENAI_API_KEY=${CLIPROXY_API_KEY} - IMAGES_EDIT_OPENAI_API_KEY=${CLIPROXY_API_KEY}
- CONTENT_EXTRACTION_ENGINE=docling
- DOCLING_SERVER_URL=http://docling-serve:5001
- >-
DOCLING_PARAMS={"do_ocr":true,"pdf_backend":"dlparse_v4","table_mode":"accurate"}
# --- 以下是新增的网页搜索相关环境变量 --- # --- 以下是新增的网页搜索相关环境变量 ---
- ENABLE_WEB_SEARCH=true - ENABLE_WEB_SEARCH=true
- WEB_SEARCH_ENGINE=ddgs - WEB_SEARCH_ENGINE=ddgs
@@ -109,10 +131,12 @@ services:
depends_on: depends_on:
- litellm - litellm
- cli-proxy-api - cli-proxy-api
- docling-serve
- jupyter - jupyter
restart: unless-stopped restart: unless-stopped
volumes: volumes:
open-webui: open-webui:
docling-data:
jupyter-work: jupyter-work:
open-terminal: open-terminal:
+23
View File
@@ -50,6 +50,23 @@ services:
--port 4000 --port 4000
restart: unless-stopped restart: unless-stopped
docling-serve:
image: quay.io/docling-project/docling-serve:latest
container_name: docling-serve
pull_policy: always
ports:
- '127.0.0.1:5001:5001'
environment:
- DOCLING_SERVE_ENABLE_UI=true
- DOCLING_SERVE_MAX_SYNC_WAIT=600
- DOCLING_SERVE_ENG_LOC_NUM_WORKERS=2
- UVICORN_WORKERS=1
- OMP_NUM_THREADS=4
- MKL_NUM_THREADS=4
volumes:
- docling-data:/app/data
restart: unless-stopped
jupyter: jupyter:
image: quay.io/jupyter/datascience-notebook:latest image: quay.io/jupyter/datascience-notebook:latest
container_name: ai-chat-jupyter container_name: ai-chat-jupyter
@@ -105,14 +122,20 @@ services:
- CODE_EXECUTION_JUPYTER_AUTH=token - CODE_EXECUTION_JUPYTER_AUTH=token
- CODE_EXECUTION_JUPYTER_AUTH_TOKEN=${JUPYTER_TOKEN} - CODE_EXECUTION_JUPYTER_AUTH_TOKEN=${JUPYTER_TOKEN}
- CODE_EXECUTION_JUPYTER_TIMEOUT=120 - CODE_EXECUTION_JUPYTER_TIMEOUT=120
- CONTENT_EXTRACTION_ENGINE=docling
- DOCLING_SERVER_URL=http://docling-serve:5001
- >-
DOCLING_PARAMS={"do_ocr":true,"pdf_backend":"dlparse_v4","table_mode":"accurate"}
volumes: volumes:
- open-webui:/app/backend/data - open-webui:/app/backend/data
depends_on: depends_on:
- litellm - litellm
- cli-proxy-api - cli-proxy-api
- docling-serve
- jupyter - jupyter
restart: unless-stopped restart: unless-stopped
volumes: volumes:
open-webui: open-webui:
docling-data:
jupyter-work: jupyter-work: