From 65343473d88927d22864e9755d9fab60e3b3e935 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Mon, 5 Oct 2026 20:35:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(vision-v2):=20P0=20=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E5=A4=B1=E8=B4=A5=20-=20timeout=20=E8=BF=87?= =?UTF-8?q?=E7=9F=AD+=E7=BC=BA=20response=5Fformat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: - _FAST_TIMEOUT/_FAST_JSON_TIMEOUT 设为8s,但qwen3.8-flash关thinking后单图实测8-9s,staging网络稍慢即全部超时 - 超时cancel后走pro兜底,pro timeout=20s也偏紧 - 缺少 response_format=json_object 导致qwen偶发输出中文解释而非JSON 修复: - fast_json: _DEFAULT_TIMEOUT 8→12s - fast_path: _FAST_TIMEOUT/_FAST_JSON_TIMEOUT 8→12s, _PRO_TIMEOUT 20→25s - vlm_fallback: _DEFAULT_TIMEOUT 20→25s - fast_json + fallback 都加 response_format={'type':'json_object'}强约束JSON输出 本地3图E2E: 8.57s, 3/3 fast_json命中, portrait_prompt正常输出一位年轻男性/女性... Refs: staging P0 3/3全返回未识别/无法判断 --- apps/worker/worker_app/tasks/vision/fast_path.py | 6 +++--- apps/worker/worker_app/tasks/vision/vlm_fallback.py | 3 ++- apps/worker/worker_app/tasks/vision/vlm_fast_json.py | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/worker/worker_app/tasks/vision/fast_path.py b/apps/worker/worker_app/tasks/vision/fast_path.py index f8d3435d8..4ec8d33c3 100644 --- a/apps/worker/worker_app/tasks/vision/fast_path.py +++ b/apps/worker/worker_app/tasks/vision/fast_path.py @@ -23,10 +23,10 @@ logger = logging.getLogger(__name__) # 超时(可通过环境变量覆盖) _IMG_WORKERS = int(os.environ.get("VISION_V2_IMG_WORKERS", "8")) -_FAST_TIMEOUT = float(os.environ.get("VISION_V2_FAST_TIMEOUT", "8")) -_FAST_JSON_TIMEOUT = float(os.environ.get("VISION_V2_FAST_JSON_TIMEOUT", "8")) +_FAST_TIMEOUT = float(os.environ.get("VISION_V2_FAST_TIMEOUT", "12")) +_FAST_JSON_TIMEOUT = float(os.environ.get("VISION_V2_FAST_JSON_TIMEOUT", "12")) _OCR_TIMEOUT = float(os.environ.get("VISION_V2_OCR_TIMEOUT", "6")) -_PRO_TIMEOUT = float(os.environ.get("VISION_V2_PRO_TIMEOUT", "20")) +_PRO_TIMEOUT = float(os.environ.get("VISION_V2_PRO_TIMEOUT", "25")) _FALLBACK_RESULT = { "name": "未识别", diff --git a/apps/worker/worker_app/tasks/vision/vlm_fallback.py b/apps/worker/worker_app/tasks/vision/vlm_fallback.py index c9b9e1d61..ae8276535 100644 --- a/apps/worker/worker_app/tasks/vision/vlm_fallback.py +++ b/apps/worker/worker_app/tasks/vision/vlm_fallback.py @@ -17,7 +17,7 @@ logger = logging.getLogger(__name__) _BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1" _PRO_MODEL = "qwen3.7-plus" -_DEFAULT_TIMEOUT = 20 +_DEFAULT_TIMEOUT = 25 _DEFAULT_MAX_TOKENS = 800 _PRO_SYSTEM = ( @@ -113,6 +113,7 @@ def call_pro_vlm( "max_tokens": _DEFAULT_MAX_TOKENS, "stream": False, "enable_thinking": False, + "response_format": {"type": "json_object"}, } try: r = httpx.post( diff --git a/apps/worker/worker_app/tasks/vision/vlm_fast_json.py b/apps/worker/worker_app/tasks/vision/vlm_fast_json.py index 3de9bba1b..8ad44400f 100644 --- a/apps/worker/worker_app/tasks/vision/vlm_fast_json.py +++ b/apps/worker/worker_app/tasks/vision/vlm_fast_json.py @@ -7,7 +7,7 @@ - enable_thinking=false 关闭推理链(reasoning 是延迟主因) - system prompt 极致精简,只给字段 schema 和强约束(禁止自然语言、禁止 markdown) - max_tokens=350、temperature=0.1(稳定输出 JSON) -- timeout=8s(失败由外层走 pro 兜底) +- timeout=12s(失败由外层走 pro 兜底) - API Key 从环境变量 DASHSCOPE_API_KEY 读取 """ @@ -24,7 +24,7 @@ logger = logging.getLogger(__name__) # DashScope OpenAI 兼容 endpoint _BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1" _FAST_MODEL = "qwen3.8-flash" -_DEFAULT_TIMEOUT = 8 +_DEFAULT_TIMEOUT = 12 _DEFAULT_MAX_TOKENS = 350 # 极简 system prompt:只给字段定义 + 硬性输出要求 @@ -108,6 +108,7 @@ def call_fast_json( "max_tokens": max_tokens, "stream": False, "enable_thinking": False, + "response_format": {"type": "json_object"}, } try: resp = httpx.post(