fix(#1743): smart-match 排序随机噪声 + 素材使用次数按成片实际片段计数 #1747
Reference in New Issue
Block a user
Delete Branch "fix/smart-match-noise-usage-count-1743"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
#1743 评论补充发现的智能选素材「每次只选同样几个素材」3 个缺陷中的后端两项(第③项候选池扩大属前端 useSmartMatch.ts,由前端 #1744 处理)。
① smart-match 评分排序零随机(主因)
smart_select_assetsStep4 排序与多样性分桶注入0~SCORE_RANDOM_NOISE_MAX(20)随机噪声(与 from-assets 片段分配同源常量)r.score始终为无噪声原始分rng注入(测试可复现);smart-match API、正式生成候选截断、模板编辑器三个调用点全部受益(正式生成分配的_sort_assets_by_smart_score此前已有噪声,但候选池截断固定 → 池子相同,本次修复后池子本身也随机)② 使用次数计数口径错误 + 回写核实
task.asset_ids每个 +1,未被 plan clips 选用的素材(0c1bfa83)也被计数,实际渲染 2 次的素材只计了 3mark_asset_used_for_generation(asset, times=N)支持按片段数累加;worker 回写改为统计最终成片 plan(重渲后为重渲版 plan)的edit_plan_clipsasset 引用次数_count_plan_clip_asset_usage/_record_rendered_asset_usage可测函数;plan 无有效片段兜底 task.asset_ids 单次计数;单素材失败不阻断其他素材get_asset_recent_use_counts)本就基于 used_time_ranges 片段级追踪,口径准确;本次修复后generation_use_count(unused_bonus 评分维度)同样准确③ 测试
1. smart-match 排序零随机修复(主因): - smart_select_assets 排序/多样性分桶注入 0~SCORE_RANDOM_NOISE_MAX 随机噪声, 同分/近分素材每次选出不同组合与顺序;分差>20的高质量素材保持稳定优先级 - 噪声以 asset.id 为 key 同次调用内一致;r.score 始终为无噪声原始分 - 支持 rng 注入(测试可复现);smart-match API/正式生成/模板编辑器三调用点全受益 2. 素材使用次数口径修复: - mark_asset_used_for_generation 新增 times 参数,按成片实际渲染片段引用次数累加 - worker 回写从 task.asset_ids(请求列表,含未被plan选用的素材)改为 统计最终成片 plan 的 edit_plan_clips(同素材多片段复用按片段数累加) - 抽 _count_plan_clip_asset_usage/_record_rendered_asset_usage 纯函数(可单测) - plan 无有效片段时兜底 task.asset_ids 单次计数;单素材失败不阻断其他 3. 测试:22 新测试(噪声 10 + 回写计数 12);旧确定性排序断言注入零噪声 rng; 修复 test_distribute_assets 预存在 flaky(shuffle 未被零噪声 patch 覆盖)🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不合并)
_record_rendered_asset_usage函数中,通过循环遍历used_counts并对每个 asset_id 调用asset_repo.get(aid),在素材数量较多时可能产生 N+1 查询问题。虽然这是在 Worker 异步任务中执行且通常素材数量有限,但建议优化为批量查询(如session.query(Asset).filter(Asset.id.in_(asset_ids)).all())以提升性能,特别是在高并发或素材库较大的场景下。✅ 良好实践
_record_rendered_asset_usage中对单个素材的更新操作进行了 try-except 包裹,确保单个素材更新失败不会阻断整个任务的统计流程,容错性好。rng参数和_ZeroNoiseRandom类,使得包含随机噪声的排序逻辑在单元测试中可以完全复现,保证了测试的稳定性和覆盖率。plan中无有效片段时,自动回退到task.asset_ids进行计数,保证了在异常数据情况下统计信息不丢失。格式检查:✅ 逻辑审查:✅ 性能:⚠️
🤖 由 AI 代码审查机器人自动生成 | 2026-09-06 12:00:31 | 模型:
🗑️ 预览环境已清理
PR #1747 已关闭或合并,对应的预览环境已被清理。