diff --git a/README.md b/README.md index aea3a7a..ada5bc3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # AI Stack -这个项目用 Docker Compose 组合了三个服务: +这个项目用 Docker Compose 组合了以下主要服务: - LiteLLM:作为统一的模型代理层,对外提供 OpenAI 兼容接口 - Open WebUI:作为 Web 端聊天界面,直接连接 LiteLLM - Jupyter:作为 Open WebUI Code Interpreter 的 Python 执行环境,用于生成 Excel 等文件 +- Docling Serve:作为 Open WebUI 的内容提取引擎,负责文档 OCR、版面和表格解析 当前仓库的核心目标,是基于 Gemini 系列模型快速搭一套可本地运行的 AI 网关与聊天界面。 @@ -60,6 +61,24 @@ Jupyter 只在 Docker 内网中提供给 Open WebUI 使用,不暴露到宿主 请使用 Code Interpreter 生成一个 Excel 文件,包含以下字段:姓名、部门、金额,并提供下载链接。 ``` +### 4. Docling Serve + +Docling Serve 使用 CPU 镜像运行,只在宿主机回环地址暴露 5001 端口,Open WebUI 通过 Docker 内部地址 +`http://docling-serve:5001` 调用它。默认启用 OCR、`dlparse_v4` PDF 后端和准确表格解析,模型文件保存在 +`docling-data` 卷中,避免容器重建后重复下载。 + +本地编排启动后可访问 ,线上编排使用 。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 模型别名: diff --git a/docker-compose-online.yml b/docker-compose-online.yml index 118a688..c0bfe46 100644 --- a/docker-compose-online.yml +++ b/docker-compose-online.yml @@ -36,6 +36,23 @@ services: --port 4000 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: image: quay.io/jupyter/datascience-notebook:latest 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_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 - WEB_SEARCH_ENGINE=ddgs @@ -109,10 +131,12 @@ services: depends_on: - litellm - cli-proxy-api + - docling-serve - jupyter restart: unless-stopped volumes: open-webui: + docling-data: jupyter-work: open-terminal: diff --git a/docker-compose.yml b/docker-compose.yml index 8777bcb..fe2e224 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -50,6 +50,23 @@ services: --port 4000 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: image: quay.io/jupyter/datascience-notebook:latest container_name: ai-chat-jupyter @@ -105,14 +122,20 @@ services: - CODE_EXECUTION_JUPYTER_AUTH=token - CODE_EXECUTION_JUPYTER_AUTH_TOKEN=${JUPYTER_TOKEN} - 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: - open-webui:/app/backend/data depends_on: - litellm - cli-proxy-api + - docling-serve - jupyter restart: unless-stopped volumes: open-webui: + docling-data: jupyter-work: