踩坑实录离线内网服务器 Docker 部署 PaddleOCR-VL 1.5 完全指南目标在公司完全离线的内网服务器上部署 OCR 识别服务供内部人员通过 API 调用。难点本地电脑不能访问 GitHub、服务器不能访问外网、公司网络有各种限制、部署者是新手。整个过程历时 3 天跨越环境准备、离线传输、配置修正、API 联调四个阶段最终成功交付。一、背景与目标公司有一批维保合同的扫描件需要自动识别其中的统一社会信用代码、公司名称、登记机关印章、日期等关键字段。这些文件通常带有印章遮挡、排版错位传统 OCR 很难处理。我们选择的方案是百度的 PaddleOCR VL 1.5——这是一个多模态大模型支持版面分析和文字识别对复杂排版有很好的鲁棒性。参考的部署案例来自博客园iamkun2005 的部署文章。二、环境与前置准备2.1 硬件配置项目配置服务器 GPU单张 NVIDIA L2046GB 显存本地电脑Windows Docker Desktop操作系统Ubuntu 24.04 (WSL 2)虽然不是原作者的双卡 4090但 46GB 显存完全够用。2.2 关键限制本地电脑公司网络屏蔽了 GitHub但可以访问国内镜像站如 Gitee、百度镜像仓库服务器完全无法访问外网只能通过 U 盘或者内网文件共享传输文件连接方式堡垒机登录无法直接使用 SSH 隧道2.3 服务器环境验证部署前需要先确认服务器的基础环境是否就绪# GPU 信息nvidia-smi# 输出NVIDIA L2046GB 显存CUDA 12.6 ✅# Docker 版本docker--version# 输出27.3.1 ✅# NVIDIA Container Toolkitnvidia-ctk--version# 输出1.16.2 ✅# 检查 daemon.json 中的 nvidia runtime 配置cat/etc/docker/daemon.json# 输出runtimes.nvidia 已配置 ✅三、第一阶段本地电脑准备离线包因为服务器不能联网所有镜像和配置文件必须在能联网的电脑上准备好再拿到服务器上部署。3.1 拉取 Docker 镜像两个镜像都来自百度的容器镜像仓库国内地址不受 GitHub 限制# 镜像 1推理引擎vLLM 加速docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest-nvidia-gpu-offline# 镜像 2API 服务Web 服务器 版面分析docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:latest-nvidia-gpu-offline两个镜像总共约 25GB压缩后下载需要 1-2 小时。3.2 保存镜像为 tar 文件下载完成后保存为离线文件docker save ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest-nvidia-gpu-offline-o D:\paddleocr-vlm-server.tar docker save ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:latest-nvidia-gpu-offline-o D:\paddleocr-vl-api.tar最终两个文件大小paddleocr-vlm-server.tar6.84 GBpaddleocr-vl-api.tar5.91 GB3.3 获取配置文件因为 GitHub 打不开我从Gitee国内代码托管平台获取了官方配置文件https://gitee.com/paddlepaddle/PaddleOCR/tree/main/deploy/paddleocr_vl_docker/accelerators/nvidia-gpu核心需要的 3 个文件.env定义镜像版本号和环境变量compose.yamlDocker Compose 编排文件pipeline_config_vllm.yamlOCR 流水线配置版面分析、文字识别的具体参数⚠️关键教训一开始我手写了一个docker-compose.yml但缺少启动命令和环境变量导致服务起不来。务必使用官方配置文件。四、第二阶段文件传输与服务器加载4.1 文件传输把本地准备好的 3 个文件传到服务器上paddleocr-vlm-server.tarpaddleocr-vl-api.tarcompose.yaml、.env、pipeline_config_vllm.yaml我放在了/root/hjl/paddleocr-deploy/目录下。4.2 加载镜像cd/root/hjl/paddleocr-deploy/dockerload-i/root/hjl/paddleocr-vlm-server.tardockerload-i/root/hjl/paddleocr-vl-api.tar验证dockerimages|greppaddleocr# 看到两个镜像大小分别为 14.4GB 和 10.5GB ✅4.3 端口冲突修正官方配置文件默认两个服务都用8080端口但服务器上已经跑着 Kubernetes可能会有端口冲突。我把映射端口改成了API 服务宿主机的6511→ 容器内 8080推理引擎不对外暴露仅内部通信# compose.yaml 修正部分paddleocr-vl-api:ports:-6511:8080# 原来是 8080:80804.4 防火墙放行服务器本地防火墙没有拦截 6511 端口但公司网络设备交换机/ACL限制了非标准端口。最后是提工单请网络管理员放行了10.13.13.221:6511。五、第三阶段启动服务与验证5.1 启动cd/root/hjl/paddleocr-deploydockercompose up-d启动很快约 95 秒两个容器都是healthy状态dockerps# paddleocr-vlm-server Up (healthy) 8080/tcp# paddleocr-vl-api Up (healthy) 6511→8080/tcp5.2 健康检查curlhttp://localhost:6511/health# {errorCode:0,errorMsg:Healthy} ✅5.3 验证 GPU 占用nvidia-smi# GPU 显存占用约 20GB / 46GBVLLM::EngineCore 占用主要显存 ✅六、第四阶段API 联调最大的坑6.1 问题curl 调用返回 422我想用文件上传的方式调用curl-XPOST http://localhost:6511/layout-parsing-Ffile/root/hjl/3.jpg返回{errorCode:422,errorMsg:Input should be a valid dictionary...}6.2 排查发现API 接受 JSON不是 Form Data查看 OpenAPI 文档curlhttp://localhost:6511/openapi.json|python3-mjson.tool发现/layout-parsing接受的是JSONfile字段类型是string需要传Base64 编码。6.3 正确的调用方式最终成功的请求体{file:Base64编码的图片字符串,fileType:1}关键参数fileType: 0→ 文件路径如/home/user/doc.pdffileType: 1→ Base64 编码的二进制数据核心教训我在这一步卡了整整 2 个小时试了纯 Base64、带data:image/...前缀、file://协议都不行。最后发现是fileType参数用错了——传 0 的话 API 会把 base64 字符串当成文件路径去解析自然找不到文件。6.4 最终成功Swagger 页面上测试通过http://10.13.13.221:6511/docs直接上传图片即可得到识别结果。识别的示例一张设备识别卡[doc_title] 设备识别卡 [text] SMT-CV-1471 [text] 型号YCS-G042 [text] 厂商JuDi [text] 序列号0191730 [text] 固定资产NA [footer] 回非关健设备七、总结与经验7.1 踩过的坑 解决方案问题表现解决GitHub 无法访问获取不了配置文件用 Gitee 替代Docker Desktop 安装权限错误以管理员身份运行清理残留手写配置文件不完整缺少启动命令/模型挂载使用官方配置文件端口冲突默认 8080 被占用改为 6511 并申请防火墙放行API 调用 422 错误curl 参数格式不对用 JSON Base64 fileType1堡垒机无法 SSH 隧道端口被公司网络封锁提工单请管理员放行7.2 核心要点配置文件必须用官方的手写的缺胳膊少腿很容易漏掉启动命令和流水线配置端口冲突要提前规划尤其是跑着其他服务的生产服务器fileType 参数是调试 API 的关键0 是文件路径1 是 Base64 编码健康检查很重要vlm-server 加载模型需要时间API 服务依赖它 healthy 后才能启动Swagger UI 比 curl 方便FastAPI 自带的界面能自动处理参数校验调试效率高很多7.3 部署清单速查# 停止服务cd/root/hjl/paddleocr-deploydockercompose down# 启动服务cd/root/hjl/paddleocr-deploydockercompose up-d# 查看日志dockerlogs paddleocr-vl-api--tail20dockerlogs paddleocr-vlm-server--tail20# 查看 GPUnvidia-smi# 健康检查curlhttp://localhost:6511/health附录核心配置文件详解以下是部署中用到的三个关键配置文件带注释说明各参数含义方便后续维护和调优。1..env— 环境变量文件# 设置镜像的后缀标签与离线镜像的 tag 保持一致API_IMAGE_TAG_SUFFIXlatest-nvidia-gpu-offline# API 服务镜像的版本标签VLM_BACKENDvllm# 推理后端目前仅支持 vllmVLM_IMAGE_TAG_SUFFIXlatest-nvidia-gpu-offline# 推理引擎镜像的版本标签说明compose.yaml会引用这些变量来拼接完整的镜像名称这样切换版本时只需修改 env 文件。2.compose.yaml— Docker Compose 编排文件services:# OCR API 服务 paddleocr-vl-api:# 镜像由基础名称 env 中的标签拼接而成image:ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:${API_IMAGE_TAG_SUFFIX}container_name:paddleocr-vl-apiports:-6511:8080# 将容器内的 8080 端口映射到宿主机的 6511避免与现有服务冲突depends_on:paddleocr-vlm-server:condition:service_healthy# 必须等推理引擎健康后才启动deploy:resources:reservations:devices:-driver:nvidiadevice_ids:[0]# 使用第一块 GPUcapabilities:[gpu]user:rootrestart:unless-stoppedenvironment:-VLM_BACKEND${VLM_BACKEND:-vllm}# 设置推理后端类型volumes:# 将流水线配置文件挂载到容器内只读模式-./pipeline_config_vllm.yaml:/home/paddleocr/pipeline_config_vllm.yaml:rocommand:/bin/bash-c paddlex--serve--pipeline /home/paddleocr/pipeline_config_${VLM_BACKEND}.yamlhealthcheck:test:[CMD-SHELL,curl -f http://localhost:8080/health || exit 1]# 推理引擎服务 paddleocr-vlm-server:image:ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-${VLM_BACKEND}-server:${VLM_IMAGE_TAG_SUFFIX}container_name:paddleocr-vlm-serverdeploy:resources:reservations:devices:-driver:nvidiadevice_ids:[0]capabilities:[gpu]user:rootrestart:unless-stoppedhealthcheck:test:[CMD-SHELL,curl -f http://localhost:8080/health || exit 1]start_period:300s# 模型加载需要较长时间前 5 分钟不报错说明两个容器通过 Docker 内部网络通信推理引擎不对外暴露端口只接受 API 服务的请求。start_period: 300s给了推理引擎充足的模型加载时间避免频繁重启。3.pipeline_config_vllm.yaml— OCR 流水线配置pipeline_name:PaddleOCR-VL-1.5# 流水线名称batch_size:64# 全局批处理大小use_queues:True# 启用任务队列提高并发性能# ---- 功能开关 ----use_doc_preprocessor:False# 是否启用文档预处理如校正方向、展平use_layout_detection:True# 是否进行版面分析检测区域use_chart_recognition:False# 是否识别图表我们目前用不到use_seal_recognition:False# 是否识别印章合同中可能有但这里暂不启用format_block_content:False# 是否对识别结果进行格式化merge_layout_blocks:True# 是否合并相邻的相同区域# 在 Markdown 输出中忽略的标签类型如页码、页眉页脚等markdown_ignore_labels:-number-footnote-header-header_image-footer-footer_image-aside_text# ---- 子模块配置 ----SubModules:# 版面检测模块LayoutDetection:module_name:layout_detectionmodel_name:PP-DocLayoutV3# 使用的版面分析模型model_dir:null# null 表示从官方缓存目录加载batch_size:8threshold:0.3# 检测置信度阈值layout_nms:True# 启用非极大值抑制去除重叠框layout_unclip_ratio:[1.0,1.0]# 检测框的扩展比例layout_merge_bboxes_mode:# 针对不同标签的合并策略0:union# abstract1:union# algorithm# ...共 25 个类别篇幅原因不全部列出24:union# vision_footnote# 视觉语言识别模块核心 OCR 模型VLRecognition:module_name:vl_recognitionmodel_name:PaddleOCR-VL-1.5-0.9B# 1.5 版本的 0.9B 参数模型model_dir:nullbatch_size:4096# VL 模型的推理批大小genai_config:backend:vllm-server# 使用 vLLM 推理后端server_url:http://paddleocr-vlm-server:8080/v1# 推理引擎地址# ---- 子流水线文档预处理如果启用 ----SubPipelines:DocPreprocessor:pipeline_name:doc_preprocessorbatch_size:8use_doc_orientation_classify:True# 自动校正文档方向use_doc_unwarping:True# 自动展平弯曲的文档SubModules:# 方向分类模型DocOrientationClassify:module_name:doc_text_orientationmodel_name:PP-LCNet_x1_0_doc_orimodel_dir:nullbatch_size:8# 文档展平模型DocUnwarping:module_name:image_unwarpingmodel_name:UVDocmodel_dir:null# ---- 服务配置 ----Serving:extra:max_num_input_imgs:null# 单次请求最大图片数null 表示不限制说明这份配置决定了 OCR 引擎怎么识别一张图。例如我们关闭了use_chart_recognition和use_seal_recognition因为合同场景下它们可能会引入误检。VLRecognition中的server_url必须与compose.yaml中的服务名一致paddleocr-vlm-server:8080因为 Docker 内部 DNS 会解析这个名称。如果未来需要识别印章只需将use_seal_recognition改为True并重启容器即可。版权声明本文基于真实的部署经历和与 AI 助手的交互记录整理而成希望对你有所帮助。
踩坑实录:离线内网服务器 Docker 部署 PaddleOCR-VL 1.5 完全指南
踩坑实录离线内网服务器 Docker 部署 PaddleOCR-VL 1.5 完全指南目标在公司完全离线的内网服务器上部署 OCR 识别服务供内部人员通过 API 调用。难点本地电脑不能访问 GitHub、服务器不能访问外网、公司网络有各种限制、部署者是新手。整个过程历时 3 天跨越环境准备、离线传输、配置修正、API 联调四个阶段最终成功交付。一、背景与目标公司有一批维保合同的扫描件需要自动识别其中的统一社会信用代码、公司名称、登记机关印章、日期等关键字段。这些文件通常带有印章遮挡、排版错位传统 OCR 很难处理。我们选择的方案是百度的 PaddleOCR VL 1.5——这是一个多模态大模型支持版面分析和文字识别对复杂排版有很好的鲁棒性。参考的部署案例来自博客园iamkun2005 的部署文章。二、环境与前置准备2.1 硬件配置项目配置服务器 GPU单张 NVIDIA L2046GB 显存本地电脑Windows Docker Desktop操作系统Ubuntu 24.04 (WSL 2)虽然不是原作者的双卡 4090但 46GB 显存完全够用。2.2 关键限制本地电脑公司网络屏蔽了 GitHub但可以访问国内镜像站如 Gitee、百度镜像仓库服务器完全无法访问外网只能通过 U 盘或者内网文件共享传输文件连接方式堡垒机登录无法直接使用 SSH 隧道2.3 服务器环境验证部署前需要先确认服务器的基础环境是否就绪# GPU 信息nvidia-smi# 输出NVIDIA L2046GB 显存CUDA 12.6 ✅# Docker 版本docker--version# 输出27.3.1 ✅# NVIDIA Container Toolkitnvidia-ctk--version# 输出1.16.2 ✅# 检查 daemon.json 中的 nvidia runtime 配置cat/etc/docker/daemon.json# 输出runtimes.nvidia 已配置 ✅三、第一阶段本地电脑准备离线包因为服务器不能联网所有镜像和配置文件必须在能联网的电脑上准备好再拿到服务器上部署。3.1 拉取 Docker 镜像两个镜像都来自百度的容器镜像仓库国内地址不受 GitHub 限制# 镜像 1推理引擎vLLM 加速docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest-nvidia-gpu-offline# 镜像 2API 服务Web 服务器 版面分析docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:latest-nvidia-gpu-offline两个镜像总共约 25GB压缩后下载需要 1-2 小时。3.2 保存镜像为 tar 文件下载完成后保存为离线文件docker save ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest-nvidia-gpu-offline-o D:\paddleocr-vlm-server.tar docker save ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:latest-nvidia-gpu-offline-o D:\paddleocr-vl-api.tar最终两个文件大小paddleocr-vlm-server.tar6.84 GBpaddleocr-vl-api.tar5.91 GB3.3 获取配置文件因为 GitHub 打不开我从Gitee国内代码托管平台获取了官方配置文件https://gitee.com/paddlepaddle/PaddleOCR/tree/main/deploy/paddleocr_vl_docker/accelerators/nvidia-gpu核心需要的 3 个文件.env定义镜像版本号和环境变量compose.yamlDocker Compose 编排文件pipeline_config_vllm.yamlOCR 流水线配置版面分析、文字识别的具体参数⚠️关键教训一开始我手写了一个docker-compose.yml但缺少启动命令和环境变量导致服务起不来。务必使用官方配置文件。四、第二阶段文件传输与服务器加载4.1 文件传输把本地准备好的 3 个文件传到服务器上paddleocr-vlm-server.tarpaddleocr-vl-api.tarcompose.yaml、.env、pipeline_config_vllm.yaml我放在了/root/hjl/paddleocr-deploy/目录下。4.2 加载镜像cd/root/hjl/paddleocr-deploy/dockerload-i/root/hjl/paddleocr-vlm-server.tardockerload-i/root/hjl/paddleocr-vl-api.tar验证dockerimages|greppaddleocr# 看到两个镜像大小分别为 14.4GB 和 10.5GB ✅4.3 端口冲突修正官方配置文件默认两个服务都用8080端口但服务器上已经跑着 Kubernetes可能会有端口冲突。我把映射端口改成了API 服务宿主机的6511→ 容器内 8080推理引擎不对外暴露仅内部通信# compose.yaml 修正部分paddleocr-vl-api:ports:-6511:8080# 原来是 8080:80804.4 防火墙放行服务器本地防火墙没有拦截 6511 端口但公司网络设备交换机/ACL限制了非标准端口。最后是提工单请网络管理员放行了10.13.13.221:6511。五、第三阶段启动服务与验证5.1 启动cd/root/hjl/paddleocr-deploydockercompose up-d启动很快约 95 秒两个容器都是healthy状态dockerps# paddleocr-vlm-server Up (healthy) 8080/tcp# paddleocr-vl-api Up (healthy) 6511→8080/tcp5.2 健康检查curlhttp://localhost:6511/health# {errorCode:0,errorMsg:Healthy} ✅5.3 验证 GPU 占用nvidia-smi# GPU 显存占用约 20GB / 46GBVLLM::EngineCore 占用主要显存 ✅六、第四阶段API 联调最大的坑6.1 问题curl 调用返回 422我想用文件上传的方式调用curl-XPOST http://localhost:6511/layout-parsing-Ffile/root/hjl/3.jpg返回{errorCode:422,errorMsg:Input should be a valid dictionary...}6.2 排查发现API 接受 JSON不是 Form Data查看 OpenAPI 文档curlhttp://localhost:6511/openapi.json|python3-mjson.tool发现/layout-parsing接受的是JSONfile字段类型是string需要传Base64 编码。6.3 正确的调用方式最终成功的请求体{file:Base64编码的图片字符串,fileType:1}关键参数fileType: 0→ 文件路径如/home/user/doc.pdffileType: 1→ Base64 编码的二进制数据核心教训我在这一步卡了整整 2 个小时试了纯 Base64、带data:image/...前缀、file://协议都不行。最后发现是fileType参数用错了——传 0 的话 API 会把 base64 字符串当成文件路径去解析自然找不到文件。6.4 最终成功Swagger 页面上测试通过http://10.13.13.221:6511/docs直接上传图片即可得到识别结果。识别的示例一张设备识别卡[doc_title] 设备识别卡 [text] SMT-CV-1471 [text] 型号YCS-G042 [text] 厂商JuDi [text] 序列号0191730 [text] 固定资产NA [footer] 回非关健设备七、总结与经验7.1 踩过的坑 解决方案问题表现解决GitHub 无法访问获取不了配置文件用 Gitee 替代Docker Desktop 安装权限错误以管理员身份运行清理残留手写配置文件不完整缺少启动命令/模型挂载使用官方配置文件端口冲突默认 8080 被占用改为 6511 并申请防火墙放行API 调用 422 错误curl 参数格式不对用 JSON Base64 fileType1堡垒机无法 SSH 隧道端口被公司网络封锁提工单请管理员放行7.2 核心要点配置文件必须用官方的手写的缺胳膊少腿很容易漏掉启动命令和流水线配置端口冲突要提前规划尤其是跑着其他服务的生产服务器fileType 参数是调试 API 的关键0 是文件路径1 是 Base64 编码健康检查很重要vlm-server 加载模型需要时间API 服务依赖它 healthy 后才能启动Swagger UI 比 curl 方便FastAPI 自带的界面能自动处理参数校验调试效率高很多7.3 部署清单速查# 停止服务cd/root/hjl/paddleocr-deploydockercompose down# 启动服务cd/root/hjl/paddleocr-deploydockercompose up-d# 查看日志dockerlogs paddleocr-vl-api--tail20dockerlogs paddleocr-vlm-server--tail20# 查看 GPUnvidia-smi# 健康检查curlhttp://localhost:6511/health附录核心配置文件详解以下是部署中用到的三个关键配置文件带注释说明各参数含义方便后续维护和调优。1..env— 环境变量文件# 设置镜像的后缀标签与离线镜像的 tag 保持一致API_IMAGE_TAG_SUFFIXlatest-nvidia-gpu-offline# API 服务镜像的版本标签VLM_BACKENDvllm# 推理后端目前仅支持 vllmVLM_IMAGE_TAG_SUFFIXlatest-nvidia-gpu-offline# 推理引擎镜像的版本标签说明compose.yaml会引用这些变量来拼接完整的镜像名称这样切换版本时只需修改 env 文件。2.compose.yaml— Docker Compose 编排文件services:# OCR API 服务 paddleocr-vl-api:# 镜像由基础名称 env 中的标签拼接而成image:ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:${API_IMAGE_TAG_SUFFIX}container_name:paddleocr-vl-apiports:-6511:8080# 将容器内的 8080 端口映射到宿主机的 6511避免与现有服务冲突depends_on:paddleocr-vlm-server:condition:service_healthy# 必须等推理引擎健康后才启动deploy:resources:reservations:devices:-driver:nvidiadevice_ids:[0]# 使用第一块 GPUcapabilities:[gpu]user:rootrestart:unless-stoppedenvironment:-VLM_BACKEND${VLM_BACKEND:-vllm}# 设置推理后端类型volumes:# 将流水线配置文件挂载到容器内只读模式-./pipeline_config_vllm.yaml:/home/paddleocr/pipeline_config_vllm.yaml:rocommand:/bin/bash-c paddlex--serve--pipeline /home/paddleocr/pipeline_config_${VLM_BACKEND}.yamlhealthcheck:test:[CMD-SHELL,curl -f http://localhost:8080/health || exit 1]# 推理引擎服务 paddleocr-vlm-server:image:ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-${VLM_BACKEND}-server:${VLM_IMAGE_TAG_SUFFIX}container_name:paddleocr-vlm-serverdeploy:resources:reservations:devices:-driver:nvidiadevice_ids:[0]capabilities:[gpu]user:rootrestart:unless-stoppedhealthcheck:test:[CMD-SHELL,curl -f http://localhost:8080/health || exit 1]start_period:300s# 模型加载需要较长时间前 5 分钟不报错说明两个容器通过 Docker 内部网络通信推理引擎不对外暴露端口只接受 API 服务的请求。start_period: 300s给了推理引擎充足的模型加载时间避免频繁重启。3.pipeline_config_vllm.yaml— OCR 流水线配置pipeline_name:PaddleOCR-VL-1.5# 流水线名称batch_size:64# 全局批处理大小use_queues:True# 启用任务队列提高并发性能# ---- 功能开关 ----use_doc_preprocessor:False# 是否启用文档预处理如校正方向、展平use_layout_detection:True# 是否进行版面分析检测区域use_chart_recognition:False# 是否识别图表我们目前用不到use_seal_recognition:False# 是否识别印章合同中可能有但这里暂不启用format_block_content:False# 是否对识别结果进行格式化merge_layout_blocks:True# 是否合并相邻的相同区域# 在 Markdown 输出中忽略的标签类型如页码、页眉页脚等markdown_ignore_labels:-number-footnote-header-header_image-footer-footer_image-aside_text# ---- 子模块配置 ----SubModules:# 版面检测模块LayoutDetection:module_name:layout_detectionmodel_name:PP-DocLayoutV3# 使用的版面分析模型model_dir:null# null 表示从官方缓存目录加载batch_size:8threshold:0.3# 检测置信度阈值layout_nms:True# 启用非极大值抑制去除重叠框layout_unclip_ratio:[1.0,1.0]# 检测框的扩展比例layout_merge_bboxes_mode:# 针对不同标签的合并策略0:union# abstract1:union# algorithm# ...共 25 个类别篇幅原因不全部列出24:union# vision_footnote# 视觉语言识别模块核心 OCR 模型VLRecognition:module_name:vl_recognitionmodel_name:PaddleOCR-VL-1.5-0.9B# 1.5 版本的 0.9B 参数模型model_dir:nullbatch_size:4096# VL 模型的推理批大小genai_config:backend:vllm-server# 使用 vLLM 推理后端server_url:http://paddleocr-vlm-server:8080/v1# 推理引擎地址# ---- 子流水线文档预处理如果启用 ----SubPipelines:DocPreprocessor:pipeline_name:doc_preprocessorbatch_size:8use_doc_orientation_classify:True# 自动校正文档方向use_doc_unwarping:True# 自动展平弯曲的文档SubModules:# 方向分类模型DocOrientationClassify:module_name:doc_text_orientationmodel_name:PP-LCNet_x1_0_doc_orimodel_dir:nullbatch_size:8# 文档展平模型DocUnwarping:module_name:image_unwarpingmodel_name:UVDocmodel_dir:null# ---- 服务配置 ----Serving:extra:max_num_input_imgs:null# 单次请求最大图片数null 表示不限制说明这份配置决定了 OCR 引擎怎么识别一张图。例如我们关闭了use_chart_recognition和use_seal_recognition因为合同场景下它们可能会引入误检。VLRecognition中的server_url必须与compose.yaml中的服务名一致paddleocr-vlm-server:8080因为 Docker 内部 DNS 会解析这个名称。如果未来需要识别印章只需将use_seal_recognition改为True并重启容器即可。版权声明本文基于真实的部署经历和与 AI 助手的交互记录整理而成希望对你有所帮助。