feat: #1970 片段级 AI 标签 + 叙事加权匹配 + 冗余核查 #1981

Merged
xiaoxia merged 1 commits from feat/1970-ai-tagging-and-cleanup into develop 2026-09-18 21:08:02 +08:00
Owner

概述

#1970 智能剪辑流程重构 P2 功能:片段级 AI 标签识别 + 叙事模式加权匹配

冗余代码核查(Task 2)

  • scripts_ai.py:无 yt-dlp/cookies/ttwid 死代码
  • distribute_assets:plan_generator_service.py 仍活跃使用,不可删
  • editing_mode (ONE_TAKE/PIP/VOICE_PIP):模板系统深度依赖,已标 deprecated 保留兼容
  • douyin_resolver.py:未配置 key 的源已正确跳过
  • TODO 标记:仅 2 个支付相关合法占位
  • 结论:无需清理

片段级 AI 标签(Task 1)

新增能力

  1. DoubaoClient 视觉扩展:新增 vision_completion() 多模态方法,支持图片 base64/URL 输入
  2. atom_clip_tagger.py:核心标签模块
    • MediaKit 抽 3 帧(首/中/尾)→ 豆包视觉 API 识别 → 结构化标签
    • 降级:MediaKit 不可用 → ffmpeg 本地抽帧;视觉 API 失败 → 仅继承素材标签
  3. Celery 任务链generate_atom_clipstag_atom_clip(异步链式触发)
  4. 叙事加权匹配:片段级 AI 标签权重 2.0,素材级标签权重 1.0
  5. 批量回填backfill_atom_clip_tags 任务(限频 N=10/M=5s 防 API 爆量)
  6. Migration 081asset_atom_clipsai_tags JSON 列

标签结构

{"scene": ["工厂"], "objects": ["产品"], "action": ["演示"], "shot": "特写", "has_text": false, "inherited_tags": ["tag_id_1"]}

降级策略

  • DoubaoClient 不可用 → 仅继承素材标签
  • MediaKit 抽帧失败 → ffmpeg 本地抽帧
  • 视觉 API 超时/失败 → 仅继承素材标签
  • 任何环节失败都不阻断主流程

测试

  • 新增 42 个测试(17 tagger + 25 加权匹配)
  • 全量 15796 passed / 28 skipped

文件变更(14 files)

  • packages/config/base.py:新增 doubao_vision_model 配置
  • packages/shared/ai_client.py:vision_completion() 多模态方法
  • packages/domain/asset_atom_clip.py:加 ai_tags 字段
  • packages/domain/atom_clip_tagger.py:核心标签模块(新增)
  • packages/domain/narrative_match.py:AI 标签加权匹配
  • packages/adapters/sqlalchemy_impl/models.py:ORM ai_tags 列
  • packages/adapters/sqlalchemy_impl/asset_atom_clip_repository.py:update_ai_tags / find_untagged
  • alembic/versions/081_atom_clip_ai_tags.py:migration
  • apps/worker/worker_app/tasks/atom_clip_tagging.py:tag_atom_clip 任务(新增)
  • apps/worker/worker_app/tasks/backfill_atom_clip_tags.py:批量回填(新增)
  • apps/worker/worker_app/tasks/atom_clips.py:链式触发 tag 任务
  • apps/worker/worker_app/tasks/__init__.py:注册新任务
  • tests/unit/test_1970_atom_clip_tagger.py(新增)
  • tests/unit/test_1970_narrative_clip_weighted.py(新增)
## 概述 #1970 智能剪辑流程重构 P2 功能:片段级 AI 标签识别 + 叙事模式加权匹配 ## 冗余代码核查(Task 2) - scripts_ai.py:无 yt-dlp/cookies/ttwid 死代码 ✅ - distribute_assets:plan_generator_service.py 仍活跃使用,不可删 - editing_mode (ONE_TAKE/PIP/VOICE_PIP):模板系统深度依赖,已标 deprecated 保留兼容 - douyin_resolver.py:未配置 key 的源已正确跳过 - TODO 标记:仅 2 个支付相关合法占位 - **结论:无需清理** ## 片段级 AI 标签(Task 1) ### 新增能力 1. **DoubaoClient 视觉扩展**:新增 `vision_completion()` 多模态方法,支持图片 base64/URL 输入 2. **atom_clip_tagger.py**:核心标签模块 - MediaKit 抽 3 帧(首/中/尾)→ 豆包视觉 API 识别 → 结构化标签 - 降级:MediaKit 不可用 → ffmpeg 本地抽帧;视觉 API 失败 → 仅继承素材标签 3. **Celery 任务链**:`generate_atom_clips` → `tag_atom_clip`(异步链式触发) 4. **叙事加权匹配**:片段级 AI 标签权重 2.0,素材级标签权重 1.0 5. **批量回填**:`backfill_atom_clip_tags` 任务(限频 N=10/M=5s 防 API 爆量) 6. **Migration 081**:`asset_atom_clips` 加 `ai_tags` JSON 列 ### 标签结构 ```json {"scene": ["工厂"], "objects": ["产品"], "action": ["演示"], "shot": "特写", "has_text": false, "inherited_tags": ["tag_id_1"]} ``` ### 降级策略 - DoubaoClient 不可用 → 仅继承素材标签 - MediaKit 抽帧失败 → ffmpeg 本地抽帧 - 视觉 API 超时/失败 → 仅继承素材标签 - **任何环节失败都不阻断主流程** ## 测试 - 新增 42 个测试(17 tagger + 25 加权匹配) - 全量 15796 passed / 28 skipped ## 文件变更(14 files) - packages/config/base.py:新增 doubao_vision_model 配置 - packages/shared/ai_client.py:vision_completion() 多模态方法 - packages/domain/asset_atom_clip.py:加 ai_tags 字段 - packages/domain/atom_clip_tagger.py:核心标签模块(新增) - packages/domain/narrative_match.py:AI 标签加权匹配 - packages/adapters/sqlalchemy_impl/models.py:ORM ai_tags 列 - packages/adapters/sqlalchemy_impl/asset_atom_clip_repository.py:update_ai_tags / find_untagged - alembic/versions/081_atom_clip_ai_tags.py:migration - apps/worker/worker_app/tasks/atom_clip_tagging.py:tag_atom_clip 任务(新增) - apps/worker/worker_app/tasks/backfill_atom_clip_tags.py:批量回填(新增) - apps/worker/worker_app/tasks/atom_clips.py:链式触发 tag 任务 - apps/worker/worker_app/tasks/__init__.py:注册新任务 - tests/unit/test_1970_atom_clip_tagger.py(新增) - tests/unit/test_1970_narrative_clip_weighted.py(新增)
xiaoxia added 1 commit 2026-09-18 20:39:42 +08:00
feat: #1970 片段级 AI 标签 + 叙事加权匹配
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 30s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 39s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m46s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m48s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 5m46s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 6m39s
AI Code Review / AI Code Review (pull_request) Successful in 6m46s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 12m2s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m36s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 19m56s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 23m16s
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 / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m7s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 6m25s
c24d00dc80

🚀 预览环境已部署

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

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

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

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

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

🗑️ 预览环境已清理

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

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

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