瀏覽代碼

feat: 为 PaddleOCR doc_parser 添加 VL 识别后端配置支持

- 在 config.yaml 和 config.py 中新增 vl_rec_backend 和 vl_rec_server_url 配置项
- 更新 paddleocr_fallback.py,在执行 doc_parser 命令时动态追加 --vl_rec_backend 和 --vl_rec_server_url 参数
- 确保 paddle_ocr_device 配置能正确影响命令中的 --device 参数
- 更新 test_config.py 以显示新的 PaddleOCR 相关配置

Co-authored-by: Cursor <cursoragent@cursor.com>
何文松 2 周之前
父節點
當前提交
1cd66b8826

+ 8 - 0
pdf_converter_v2/config.py

@@ -37,6 +37,14 @@ DEFAULT_RETURN_IMAGES = _config.get_bool("return_images", False)
 DEFAULT_RETURN_CONTENT_LIST = _config.get_bool("return_content_list", False)
 DEFAULT_SERVER_URL = os.getenv("SERVER_URL", "string")
 
+# PaddleOCR 配置
+PADDLEOCR_CMD = _config.get_str("paddleocr_cmd", "paddleocr")
+PADDLE_OCR_DEVICE = _config.get_str("paddle_ocr_device", "")
+PADDLE_OCR_DEVICES = _config.get_str("paddle_ocr_devices", "")
+PADDLE_DOC_PARSER_CMD = _config.get_str("paddle_doc_parser_cmd", "paddleocr")
+VL_REC_BACKEND = _config.get_str("vl_rec_backend", "")
+VL_REC_SERVER_URL = _config.get_str("vl_rec_server_url", "")
+
 # 日志配置(可选)
 LOG_DIR = _config.get_str("log_dir", "./logs")
 LOG_LEVEL = _config.get_str("log_level", "INFO")

+ 6 - 0
pdf_converter_v2/config.yaml

@@ -66,6 +66,12 @@ paddle_ocr_devices: ""
 # PaddleOCR 文档解析命令
 paddle_doc_parser_cmd: "paddleocr"
 
+# PaddleOCR VL 识别后端 (例如 "vllm-server")
+vl_rec_backend: "vllm-server"
+
+# PaddleOCR VL 识别服务器 URL
+vl_rec_server_url: "http://172.17.0.1:8118/v1"
+
 # =============================================================================
 # 返回格式配置
 # =============================================================================

+ 15 - 0
pdf_converter_v2/test_config.py

@@ -31,6 +31,12 @@ from pdf_converter_v2.config import (
     DEFAULT_RETURN_IMAGES,
     DEFAULT_RETURN_CONTENT_LIST,
     DEFAULT_SERVER_URL,
+    PADDLEOCR_CMD,
+    PADDLE_OCR_DEVICE,
+    PADDLE_OCR_DEVICES,
+    PADDLE_DOC_PARSER_CMD,
+    VL_REC_BACKEND,
+    VL_REC_SERVER_URL,
     LOG_DIR,
     LOG_LEVEL,
     LOG_TO_FILE,
@@ -66,6 +72,15 @@ def print_config():
     print(f"  服务器URL: {DEFAULT_SERVER_URL}")
     print()
     
+    print("【PaddleOCR 配置】")
+    print(f"  PaddleOCR 命令: {PADDLEOCR_CMD}")
+    print(f"  推理设备: {PADDLE_OCR_DEVICE}")
+    print(f"  多卡设备: {PADDLE_OCR_DEVICES}")
+    print(f"  文档解析命令: {PADDLE_DOC_PARSER_CMD}")
+    print(f"  VL 识别后端: {VL_REC_BACKEND}")
+    print(f"  VL 识别服务器: {VL_REC_SERVER_URL}")
+    print()
+    
     print("【返回格式配置】")
     print(f"  返回ZIP格式: {DEFAULT_RESPONSE_FORMAT_ZIP}")
     print(f"  返回中间JSON: {DEFAULT_RETURN_MIDDLE_JSON}")

+ 24 - 5
pdf_converter_v2/utils/paddleocr_fallback.py

@@ -15,6 +15,13 @@ import ast
 import re
 
 from ..utils.logging_config import get_logger
+from ..config import (
+    PADDLEOCR_CMD as _PADDLEOCR_CMD,
+    PADDLE_OCR_DEVICE as _PADDLE_OCR_DEVICE,
+    PADDLE_OCR_DEVICES as _PADDLE_OCR_DEVICES_CONFIG,
+    VL_REC_BACKEND,
+    VL_REC_SERVER_URL,
+)
 
 logger = get_logger("pdf_converter_v2.utils.paddleocr")
 
@@ -41,10 +48,10 @@ except ImportError:
 
 
 def _get_paddleocr_executable() -> str:
-    """返回 paddleocr 可执行文件路径命令名,供 subprocess 使用。
+    """返回 paddleocr 可执行文件路径 or 命令名,供 subprocess 使用。
     当以 systemd 等方式运行时 PATH 可能不包含 venv/bin,故优先使用当前 Python 同目录下的 paddleocr。
-    可通过环境变量 PADDLEOCR_CMD 显式指定(完整路径或命令名)。"""
-    cmd = os.getenv("PADDLEOCR_CMD", "").strip()
+    可通过配置 PADDLEOCR_CMD 显式指定(完整路径或命令名)。"""
+    cmd = _PADDLEOCR_CMD.strip()
     if cmd:
         return cmd
     # 与当前 Python 同目录(venv/bin)下的 paddleocr
@@ -70,11 +77,11 @@ def _get_paddle_ocr_devices() -> List[str]:
     with _PADDLE_OCR_DEVICE_LOCK:
         if _PADDLE_OCR_DEVICES:
             return _PADDLE_OCR_DEVICES
-        multi = os.getenv("PADDLE_OCR_DEVICES", "").strip()
+        multi = _PADDLE_OCR_DEVICES_CONFIG.strip()
         if multi:
             _PADDLE_OCR_DEVICES[:] = [d.strip() for d in multi.split(",") if d.strip()]
         if not _PADDLE_OCR_DEVICES:
-            single = os.getenv("PADDLE_OCR_DEVICE", "").strip()
+            single = _PADDLE_OCR_DEVICE.strip()
             if not single:
                 from .device_env import is_npu
                 if is_npu():
@@ -415,6 +422,12 @@ def call_paddleocr(image_path: str) -> Optional[Dict[str, Any]]:
             "--save_path", save_path_base
         ] + _paddle_ocr_device_args()
         
+        # 添加 VL 识别后端配置(如果已配置)
+        if VL_REC_BACKEND:
+            cmd.extend(["--vl_rec_backend", VL_REC_BACKEND])
+        if VL_REC_SERVER_URL:
+            cmd.extend(["--vl_rec_server_url", VL_REC_SERVER_URL])
+        
         # 设置环境变量,限制GPU内存使用
         # env = os.environ.copy()
         # 设置PaddlePaddle的GPU内存分配策略,使用更保守的内存分配
@@ -853,6 +866,12 @@ def call_paddleocr_doc_parser_for_text(image_path: str, save_path: str) -> tuple
             "--save_path", save_path_base
         ] + _paddle_ocr_device_args()
         
+        # 添加 VL 识别后端配置(如果已配置)
+        if VL_REC_BACKEND:
+            cmd.extend(["--vl_rec_backend", VL_REC_BACKEND])
+        if VL_REC_SERVER_URL:
+            cmd.extend(["--vl_rec_server_url", VL_REC_SERVER_URL])
+        
         logger.info(f"[PaddleOCR DocParser] 执行命令: {' '.join(cmd)}")
         
         # 执行命令(env 含 LD_PRELOAD 与 PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK)