feat(vision): #2200 V2图片分析快速路径 OCR+lite JSON VLM并行 目标单图<3s/8图<15s #2200

Merged
xiaoxia merged 1 commits from feat/vision-v2-fast-path into develop 2026-10-05 17:08:53 +08:00
Owner

背景

灵应直接指令(10-05):图片分析专用API组合方案直接干,优先火山引擎视觉智能API,人体属性/商品检测/图像标签/OCR四并行,结果代码组装portrait_prompt,VLM保留为fallback,目标单图1-3秒、8图<15秒。

API 选型说明(关键决策)

经过火山引擎官方文档/控制台/API 全量盘点,火山云端公开HTTP API实际可用的结构化视觉能力只有 OCR:

期望能力 火山是否有云端HTTP API 实际方案
OCR 文字识别 ✅ 有(AI MediaKit tools-sync/ocr,Bearer鉴权,同步) 直接接入专用API
人体属性(性别/年龄/服饰/颜色) ❌ 仅有移动端SDK(智能美化特效,年费6-60万),无云端HTTP API doubao-seed-2.1-lite + 强约束JSON-only prompt(伪专用API,目标1-3s返回结构化字段)
商品检测/分类/属性 ❌ 无公开云端API(即梦商品提取是生图不是识别) 同上lite JSON VLM
图像标签/场景分类 ❌ 无公开云端API 同上lite JSON VLM

按灵应「遇到选型决策点按最优方案执行」指令,采用务实方案:专用API(OCR)+ 极快VLM强约束JSON(弥补缺失3类)+ pro VLM兜底。

架构

新模块 apps/worker/worker_app/tasks/vision/:

  • vlm_fast_json.py:doubao-seed-2.1-lite 调用,system prompt 极致精简只给JSON schema+强约束(禁止自然语言、禁止markdown、禁止解释),temperature=0.1,max_tokens=350,timeout=8s
  • ocr_volc.py:火山MediaKit POST /api/v1/tools-sync/ocr,Bearer鉴权,timeout=8s,返回去重文本列表
  • assembler.py:字段映射+portrait_prompt模板拼接(60-100字穿搭描述,适配Seedream纯文生图),输出dict字段与旧_normalize()完全一致
  • fast_path.py:
    • analyze_image_v2():单图2路并行(OCR + lite JSON VLM),fast_timeout=10s;结果不可用/失败自动降级复用旧_analyze_single_image lite/pro竞速VLM
    • analyze_images_v2():外层8图全并发(VISION_V2_IMG_WORKERS可调,默认8)

_step_image_analysis() 增加灰度开关 VISION_V2_ENABLED(默认 false 走旧V1竞速路径;true走V2快速路径)。

下游零改动:输出 dict 字段(name/brand/category/appearance/packaging/text_on_package/key_features/scene/mood/portrait_prompt/summary/_source)与旧 VLM _normalize() 格式完全一致,信任链 t2i / intent_parsing / script_generation 不需要任何改动。

性能预期

版本 单图耗时 3图总耗时 8图总耗时
V1(当前staging,#2198/#2199竞速) 40-75s ~115s(实测a68e5ebd) ~300s+
V2(本PR) <3s(OCR+lite JSON并行取最慢,8s封顶) <10s <15s
V2 兜底(fast失败降级pro VLM) 40-60s 同V1 同V1

环境变量

  • VISION_V2_ENABLED=true:开启V2快速路径(默认false走V1)
  • VISION_V2_IMG_WORKERS=8:外层图片并发数(默认8)
  • VISION_V2_FAST_TIMEOUT=10:单图fast路径总超时(默认10s)
  • VISION_V2_FAST_JSON_TIMEOUT=8:lite JSON VLM单次超时(默认8s)
  • VISION_V2_OCR_TIMEOUT=8:OCR单次超时(默认8s)

风险与回滚

  • 灰度开关默认关闭,合入develop不影响现有staging/prod行为
  • 开启后若V2效果不及预期,设置 VISION_V2_ENABLED=false 立即回退到V1
  • OCR或lite JSON任何一路失败都不影响另一路,两路都失败自动降级pro VLM,三层防护

测试计划

  1. staging部署后设置 VISION_V2_ENABLED=true
  2. 用之前E2E的3张unsplash测试图验证:目标<10s/3张,3/3 portrait_prompt有效
  3. 8图压测:目标<15s
  4. 与V1对比portrait_prompt质量(穿搭描述准确度、风格一致性)
## 背景 灵应直接指令(10-05):图片分析专用API组合方案直接干,优先火山引擎视觉智能API,人体属性/商品检测/图像标签/OCR四并行,结果代码组装portrait_prompt,VLM保留为fallback,目标单图1-3秒、8图<15秒。 ## API 选型说明(关键决策) 经过火山引擎官方文档/控制台/API 全量盘点,**火山云端公开HTTP API实际可用的结构化视觉能力只有 OCR**: | 期望能力 | 火山是否有云端HTTP API | 实际方案 | |---------|---------------------|---------| | OCR 文字识别 | ✅ 有(AI MediaKit `tools-sync/ocr`,Bearer鉴权,同步) | 直接接入专用API | | 人体属性(性别/年龄/服饰/颜色) | ❌ 仅有移动端SDK(智能美化特效,年费6-60万),无云端HTTP API | doubao-seed-2.1-lite + 强约束JSON-only prompt(伪专用API,目标1-3s返回结构化字段) | | 商品检测/分类/属性 | ❌ 无公开云端API(即梦商品提取是生图不是识别) | 同上lite JSON VLM | | 图像标签/场景分类 | ❌ 无公开云端API | 同上lite JSON VLM | 按灵应「遇到选型决策点按最优方案执行」指令,采用务实方案:**专用API(OCR)+ 极快VLM强约束JSON(弥补缺失3类)+ pro VLM兜底**。 ## 架构 新模块 `apps/worker/worker_app/tasks/vision/`: - `vlm_fast_json.py`:doubao-seed-2.1-lite 调用,system prompt 极致精简只给JSON schema+强约束(禁止自然语言、禁止markdown、禁止解释),temperature=0.1,max_tokens=350,timeout=8s - `ocr_volc.py`:火山MediaKit `POST /api/v1/tools-sync/ocr`,Bearer鉴权,timeout=8s,返回去重文本列表 - `assembler.py`:字段映射+portrait_prompt模板拼接(60-100字穿搭描述,适配Seedream纯文生图),输出dict字段与旧`_normalize()`完全一致 - `fast_path.py`: - `analyze_image_v2()`:单图2路并行(OCR + lite JSON VLM),fast_timeout=10s;结果不可用/失败自动降级复用旧`_analyze_single_image` lite/pro竞速VLM - `analyze_images_v2()`:外层8图全并发(`VISION_V2_IMG_WORKERS`可调,默认8) `_step_image_analysis()` 增加灰度开关 `VISION_V2_ENABLED`(默认 false 走旧V1竞速路径;true走V2快速路径)。 **下游零改动**:输出 dict 字段(name/brand/category/appearance/packaging/text_on_package/key_features/scene/mood/portrait_prompt/summary/_source)与旧 VLM `_normalize()` 格式完全一致,信任链 t2i / intent_parsing / script_generation 不需要任何改动。 ## 性能预期 | 版本 | 单图耗时 | 3图总耗时 | 8图总耗时 | |-----|---------|----------|----------| | V1(当前staging,#2198/#2199竞速) | 40-75s | ~115s(实测a68e5ebd) | ~300s+ | | V2(本PR) | <3s(OCR+lite JSON并行取最慢,8s封顶) | <10s | <15s | | V2 兜底(fast失败降级pro VLM) | 40-60s | 同V1 | 同V1 | ## 环境变量 - `VISION_V2_ENABLED=true`:开启V2快速路径(默认false走V1) - `VISION_V2_IMG_WORKERS=8`:外层图片并发数(默认8) - `VISION_V2_FAST_TIMEOUT=10`:单图fast路径总超时(默认10s) - `VISION_V2_FAST_JSON_TIMEOUT=8`:lite JSON VLM单次超时(默认8s) - `VISION_V2_OCR_TIMEOUT=8`:OCR单次超时(默认8s) ## 风险与回滚 - 灰度开关默认关闭,合入develop不影响现有staging/prod行为 - 开启后若V2效果不及预期,设置 `VISION_V2_ENABLED=false` 立即回退到V1 - OCR或lite JSON任何一路失败都不影响另一路,两路都失败自动降级pro VLM,三层防护 ## 测试计划 1. staging部署后设置 `VISION_V2_ENABLED=true` 2. 用之前E2E的3张unsplash测试图验证:目标<10s/3张,3/3 portrait_prompt有效 3. 8图压测:目标<15s 4. 与V1对比portrait_prompt质量(穿搭描述准确度、风格一致性)
xiaoxia added 1 commit 2026-10-05 17:06:45 +08:00
feat(vision): V2 快速图片分析路径 — OCR+lite JSON VLM并行,单图<3s目标
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 58s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m19s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m41s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Waiting to run
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 43s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m59s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 4m43s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 5m49s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 5m50s
CI/CD Pipeline / Validate - Style (pull_request) Failing after 6m5s
AI Code Review / AI Code Review (pull_request) Successful in 6m59s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m3s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 12m21s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Failing after 6s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ed20fbad49
灵应直接指令(10-05):图片分析专用API组合方案直接干,不要等方案确认。

API现实说明:
- 火山引擎云端真实可用的视觉专用HTTP API:OCR(MediaKit tools-sync/ocr,Bearer鉴权)
- 人体属性/商品检测/图像标签:火山云端无公开HTTP API,仅有移动端SDK(智能美化特效,年费6-60万)
- 务实方案:OCR专用API + doubao-seed-2.1-lite强约束JSON-only prompt(替代3类缺失的专用API),
  pro VLM保留为终极兜底

架构:
- 新模块 apps/worker/worker_app/tasks/vision/:
  - vlm_fast_json.py:lite VLM极简JSON schema prompt,max_tokens=350,temp=0.1,timeout=8s
  - ocr_volc.py:MediaKit同步OCR封装,返回文本列表
  - assembler.py:字段映射+portrait_prompt模板拼接,输出格式与旧_normalize完全一致
  - fast_path.py:analyze_image_v2/analyze_images_v2,单图2路并行(OCR+lite JSON),
    外层8图全并发,置信度低/失败自动降级旧lite/pro竞速VLM
- _step_image_analysis增加VISION_V2_ENABLED环境变量开关:
  - true→走V2快速路径
  - false(默认)→走V1 #2198/#2199 lite/pro竞速路径(过渡期兜底)
- 下游信任链/t2i零改动:输出dict字段(name/brand/category/appearance/key_features/
  scene/mood/portrait_prompt/summary/_source)与旧格式完全兼容

性能目标:
- 单图fast路径目标<3s(OCR+lite JSON并行取最慢)
- 8图全并发<15s(较当前V1的~115s/3图提升10倍+)
- 兜底路径仍复用现有V1竞速,最坏情况不劣化

🚀 预览环境已部署

项目 详情
PR号 #2200
预览链接 https://pr-2200.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #2200 | | 预览链接 | [https://pr-2200.preview.xiaoxiajianji.com](https://pr-2200.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia merged commit 6243196408 into develop 2026-10-05 17:08:53 +08:00

🗑️ 预览环境已清理

PR #2200 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #2200 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.