feat(#674): 豆包大模型 Phase 2 - 智能素材语义匹配 #753

Merged
xiaoxia merged 1 commits from feat/doubao-ai-integration-phase2 into develop 2026-07-23 17:33:08 +08:00
Owner

变更说明

#674 接入豆包大模型 Phase 2 — 智能素材语义匹配。

基于 Phase 1 的统一AI服务层(PR #752),新增语义匹配能力。

功能

智能素材语义匹配

  • 根据用户描述,调用豆包评估每个素材的语义匹配度(0-1分)
  • 输入素材信息:名称 + 标签 + 描述(最多50个素材)
  • 支持3种返回格式解析:{id: score} / {matches: [...]} / [{id, score}]
  • 按匹配度降序返回,支持 top_k 限制数量

降级方案

  • 无 API Key 或调用失败时自动降级为关键词匹配
  • 中英文关键词提取 + 名称命中加权
  • 保证接口始终可用

API

  • POST /api/v1/ai/assets/match — 素材语义匹配

测试

  • 新增18个单测 + Phase 1的24个 = 共42个AI单测全部通过
  • 覆盖:降级匹配(5个)、返回解析(7个)、集成场景(6个)

后续 Phase

  • Phase 3: AI推荐片段编排(替换 ai_recommend stub)
## 变更说明 #674 接入豆包大模型 Phase 2 — 智能素材语义匹配。 基于 Phase 1 的统一AI服务层(PR #752),新增语义匹配能力。 ## 功能 ### 智能素材语义匹配 - 根据用户描述,调用豆包评估每个素材的语义匹配度(0-1分) - 输入素材信息:名称 + 标签 + 描述(最多50个素材) - 支持3种返回格式解析:`{id: score}` / `{matches: [...]}` / `[{id, score}]` - 按匹配度降序返回,支持 `top_k` 限制数量 ### 降级方案 - 无 API Key 或调用失败时自动降级为关键词匹配 - 中英文关键词提取 + 名称命中加权 - 保证接口始终可用 ### API - `POST /api/v1/ai/assets/match` — 素材语义匹配 ## 测试 - 新增18个单测 + Phase 1的24个 = 共42个AI单测全部通过 - 覆盖:降级匹配(5个)、返回解析(7个)、集成场景(6个) ## 后续 Phase - Phase 3: AI推荐片段编排(替换 ai_recommend stub)
Collaborator

代码审查结果 - PR #753

⚠️ 问题(2个需要修改)

  1. apps/api/app/services/ai_service.py (semantic_match_assets函数):当传入素材数量超过50时,未评估的素材会获得默认0.3分,可能导致排序结果不准确。

    • 原因:代码中限制了只将前50个素材发送给模型(assets[:50]),但在后续遍历赋值分数时(for asset in assets:)遍历了所有素材。第51个及之后的素材会通过 scores.get(aid, 0.3) 获得固定的0.3分。如果前50个素材的AI评分较低(如0.1),这些未被AI评估的素材反而会排在前面,导致业务逻辑错误。
    • 修改建议:应在函数入口处根据模型处理能力截断 assets(如 assets = assets[:50]),或者对超出部分的素材使用 fallback 逻辑打分,而不是赋予固定的0.3分。
  2. apps/api/app/services/ai_service.py (_semantic_match_fallback函数):函数存在副作用,不一致地修改了输入参数。

    • 原因:当 not keywords 时,函数直接修改了传入的 assets 列表中的字典元素(添加 match_score),并返回原列表。而在 else 分支中,它返回了一个新构建的列表 results。这种不一致的行为会导致调用方难以预测输入数据是否被修改,容易引发bug。
    • 修改建议:统一返回新列表,避免直接修改传入的 assets 参数。

💡 建议(1个可选)

  1. apps/api/app/services/ai_service.py (_semantic_match_fallback函数):中文分词逻辑较为简单,可能产生大量无效的N-gram片段。
    • 说明:当前使用双层循环生成2-4字的所有中文片段,虽然对于500字以内的短文本性能尚可,但会产生大量无语义的噪音词(如“的”、“了”等组合),可能影响匹配准确度。
    • 建议:如果后续发现匹配效果不佳,建议引入简单的停用词过滤或使用更轻量的分词库(如 jieba 的 cut_for_search 模式)。

格式检查通过 | 逻辑审查需修改 | 性能无明显问题


🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 03:55:53 | 模型:

## 代码审查结果 - PR #753 ### ⚠️ 问题(2个需要修改) 1. **apps/api/app/services/ai_service.py (semantic_match_assets函数)**:当传入素材数量超过50时,未评估的素材会获得默认0.3分,可能导致排序结果不准确。 - **原因**:代码中限制了只将前50个素材发送给模型(`assets[:50]`),但在后续遍历赋值分数时(`for asset in assets:`)遍历了所有素材。第51个及之后的素材会通过 `scores.get(aid, 0.3)` 获得固定的0.3分。如果前50个素材的AI评分较低(如0.1),这些未被AI评估的素材反而会排在前面,导致业务逻辑错误。 - **修改建议**:应在函数入口处根据模型处理能力截断 `assets`(如 `assets = assets[:50]`),或者对超出部分的素材使用 fallback 逻辑打分,而不是赋予固定的0.3分。 2. **apps/api/app/services/ai_service.py (_semantic_match_fallback函数)**:函数存在副作用,不一致地修改了输入参数。 - **原因**:当 `not keywords` 时,函数直接修改了传入的 `assets` 列表中的字典元素(添加 `match_score`),并返回原列表。而在 `else` 分支中,它返回了一个新构建的列表 `results`。这种不一致的行为会导致调用方难以预测输入数据是否被修改,容易引发bug。 - **修改建议**:统一返回新列表,避免直接修改传入的 `assets` 参数。 ### 💡 建议(1个可选) 1. **apps/api/app/services/ai_service.py (_semantic_match_fallback函数)**:中文分词逻辑较为简单,可能产生大量无效的N-gram片段。 - **说明**:当前使用双层循环生成2-4字的所有中文片段,虽然对于500字以内的短文本性能尚可,但会产生大量无语义的噪音词(如“的”、“了”等组合),可能影响匹配准确度。 - **建议**:如果后续发现匹配效果不佳,建议引入简单的停用词过滤或使用更轻量的分词库(如 `jieba` 的 cut_for_search 模式)。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 03:55:53 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia changed target branch from feat/doubao-ai-integration-phase1 to main 2026-07-23 13:17:41 +08:00
xiaoxia changed target branch from main to develop 2026-07-23 13:18:06 +08:00
xiaoxia added 1 commit 2026-07-23 14:04:44 +08:00
feat(#674): 豆包大模型 Phase 2 - 智能素材语义匹配
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 5s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m19s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m14s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 9s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m41s
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 / PR Build Web Image (pull_request) Successful in 24s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 22s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 57s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m7s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 40s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m23s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m32s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m47s
AI Code Review / AI Code Review (pull_request) Successful in 9m13s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 27s
df7dafb8c4
- 新增 semantic_match_assets 语义匹配服务
- 豆包评估素材名称/标签/描述与目标描述的匹配度(0-1分)
- 支持3种返回格式解析:dict / matches数组 / 数组
- 降级方案:基于关键词的本地匹配(中英文支持+名称加权)
- 新增 POST /ai/assets/match 接口,支持 top_k 限制
- 新增 18 个单测,覆盖降级匹配/解析/集成场景
- 累计42个AI单测全部通过
xiaoxia force-pushed feat/doubao-ai-integration-phase2 from 344ca36b4d to df7dafb8c4 2026-07-23 14:04:44 +08:00 Compare
xiaoxia merged commit 5c260c1c87 into develop 2026-07-23 17:33:08 +08:00
xiaoxia deleted branch feat/doubao-ai-integration-phase2 2026-07-23 17:33:08 +08:00

🗑️ 预览环境已清理

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

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

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