feat(asset-dedup): 素材去重机制6项优化 — 调参+警告+贪心分配 #1611
Reference in New Issue
Block a user
Delete Branch "feat/asset-dedup-optimization"
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?
改动
①②③ 调参(asset_segment_tracker.py)
MAX_RANGE_USE_COUNT: 3 → 2(单区间最多复用2次)REUSE_RATIO_LIMIT: 0.15 → 0.10(复用占比上限收紧至10%)SEGMENT_EDGE_GAP: 0.3 → 1.5(边缘间隙扩大避免首尾紧贴)④ 成片级去重拦截(clips.py)
_calc_plan_internal_duplicate_rate()辅助函数duplicate_warning⑤ 素材耗尽提示(clips.py)
all_assets_exhausted标志exhaustion_warning,建议补充素材⑥ 跨素材组合打散(clips.py)
asset_ids[(i + offset) % n]→ 按使用次数升序贪心分配Schema 变更
ClipsFromAssetsResponse新增duplicate_warning和exhaustion_warning可选字段测试
test_config_constants适配新常量值test_find_reusable_*适配新 MAX_RANGE_USE_COUNT=2test_conflict_*适配新 SEGMENT_EDGE_GAP=1.5test_assets_round_robin_assignment→test_assets_balanced_assignment🚀 预览环境已部署
22690e6a9fto4e701abeeb6d34e3cdf9to99a1b368a9【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/api/app/api/routes/templates_editor/clips.py: ~765] 素材分配循环缺少 break 语句
for candidate in sorted_candidates:循环中,当找到可用素材(candidate_start is not None)并设置asset_id等变量后,代码没有break跳出循环。这会导致循环继续执行,如果后续还有其他满足条件的素材,当前的asset_id会被覆盖。由于sorted_candidates是按“使用次数最少”排序的,这会导致最终选中的素材可能不是最优解(即不是使用次数最少的),破坏了贪心算法的均衡分配策略。if candidate_start is not None:判断块内的逻辑执行完毕后,添加break语句,确保选中第一个最优候选后立即停止搜索。[apps/api/app/api/routes/templates_editor/clips.py: ~768] 异常抛出与警告提示逻辑冲突
if not asset_id or start_time is None:判断块中设置了all_assets_exhausted = True,随后立即抛出HTTPException。这会导致函数直接终止,后续位于函数末尾的if all_assets_exhausted and created_count < len(segments):判断逻辑永远不会执行,新增的exhaustion_warning字段也永远不会被返回给客户端。这与 PR 意图(支持部分生成并返回警告)相悖。raise HTTPException替换为break(跳出外层循环,停止生成后续片段),以便函数能正常执行到末尾并返回带有警告信息的响应对象。💡 改进建议(不阻塞合并)
[apps/api/app/api/routes/templates_editor/clips.py: ~730] 循环内排序的性能隐患
for i, ... in enumerate(segments)内部,每次都执行sorted(asset_ids, ...)。如果片段数量(N)和素材数量(M)较大(例如均超过100),这将导致 O(N * M * log M) 的时间复杂度。虽然当前场景下数据量可能不大,但从代码健壮性角度,建议使用优先队列(堆)来维护素材使用顺序,将复杂度降低至 O(N * log M)。[apps/api/app/services/asset_segment_tracker.py: 46] 边缘间隙配置值过大
SEGMENT_EDGE_GAP从0.3调整为1.5(秒)。这是一个较大的缓冲区,意味着两个片段之间必须间隔 1.5 秒以上才被视为不冲突。在短视频或素材时长较短的场景下,这可能导致大量可用区间被判定为冲突,从而过早触发“素材耗尽”或强制复用逻辑。建议确认该值是否符合所有业务场景的需求,或考虑将其改为可配置参数。✅ 良好实践
_calc_plan_internal_duplicate_rate函数逻辑清晰,通过排序和线性扫描高效计算了重叠时长,算法正确。🤖 由 AI 代码审查机器人自动生成 | 2026-09-01 09:24:45 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1611 已关闭或合并,对应的预览环境已被清理。