36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""OCR 编排:Pix2Text 优先,失败/低置信/未部署时降级到多模态 VLM。"""
|
||
import logging
|
||
|
||
from app.config import settings
|
||
from app.services.llm.client import LLMClient
|
||
from app.services.ocr.base import OcrResult
|
||
from app.services.ocr.pix2text_client import Pix2TextClient
|
||
from app.services.ocr.vlm_engine import VlmOcrEngine
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# Pix2Text 结果置信度低于此值则降级到 VLM
|
||
_CONFIDENCE_THRESHOLD = 0.5
|
||
|
||
|
||
async def run_ocr(image_bytes: bytes, mime: str, llm: LLMClient) -> OcrResult:
|
||
"""返回识别结果,engine 字段标明最终使用的引擎。"""
|
||
# 1. 若配置了 Pix2Text 服务且健康,优先用
|
||
if settings.ocr_service_url:
|
||
client = Pix2TextClient(settings.ocr_service_url)
|
||
if await client.healthy():
|
||
try:
|
||
result = await client.recognize(image_bytes, mime)
|
||
if result.markdown.strip() and result.confidence >= _CONFIDENCE_THRESHOLD:
|
||
return result
|
||
logger.info(
|
||
"Pix2Text 置信度低(%.2f)或结果为空,降级 VLM", result.confidence
|
||
)
|
||
except Exception as e: # noqa: BLE001
|
||
logger.warning("Pix2Text 识别失败,降级 VLM:%s", e)
|
||
else:
|
||
logger.info("Pix2Text 服务不健康,降级 VLM")
|
||
|
||
# 2. 降级 / 默认:多模态大模型
|
||
return await VlmOcrEngine(llm).recognize(image_bytes, mime)
|