← 返回列表
未验证
EditApart — AI 品味驱动的编辑器智能体预设
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/24 · 已提供中文文档
面向 DeepSeek Harness 的 schema 驱动、自动化优先的视频 + 照片编辑器预设:确定性渲染 -> 评审 -> 修订,并将编辑决策作为可审计、可训练的对象。EditTogether 集合的一部分。
综合分
29.8
GitHub 分
29.8
用户评分
—
★ Stars
0
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add EditTogether/DSH-EditApart该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
信任档位:已验证本站已于 0 天前真实安装成功
- 是什么
- dsh 原生插件 · vision
- 装得上吗
- 本站已真实安装成功(非静态推断)
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 活跃:最近一次提交在 2 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
🟢实装验证通过· 2026/9/25
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/25(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成EditApart — AI 品味驱动的编辑器(智能体预设)
EditApart 是面向 EditTogether 社区的自动化忠实编辑器。
它接收原始素材,构建镜头清单,针对声明的剪辑准则提出一份 EDIT DECISION SCHEMA,
用 ffmpeg/scenedetect(照片则用 ImageMagick)确定性地渲染它,对照准则
评判渲染结果,并修订直至收敛。
它不操作视频编辑 GUI。它推理的是剪辑判断。
该插件在同一个身份下同时注册视频和照片工具以及品味模型工具(共 15 个);
引擎分别是 bin/edit_apart_core.py(视频)、
bin/photo_core.py(照片)和 bin/taste_model.py(每位创作者的模型)。
核心设计
- Schema 是通用中介语。 同一份 EDIT DECISION SCHEMA 既是你用来训练的东西,
也是你用来渲染的东西,还是你用来评判的东西。在“AI 意图”与“渲染结果”之间
没有鸿沟。
- 通用语法共享;品味按创作者区分。 一个共享的风格大脑
(电影语法参数)+ 一个位于每位创作者 GGUF 中的小型创作者身份潜变量 z_u。
只有身份是按创作者区分的——该产物只保存 z_u
以及它所属主干的摘要,别无其他。
- 奖励是稠密的 + 组相对的(GRPO)。 评判器为一次渲染打分,并
给出逐元素的保留/丢弃/原因增量;r = overall + λ·Σ(deltas)。组
相对优势 A_k = (r_k − mean(r))/std(r),然后进行 PPO-clip 步骤。
- 权重用 Muon,潜变量用 AdamW。 Muon 对
二维权重矩阵的动量做正交化;绝不用于身份潜变量(Newton-Schulz 在
一维上会退化)。AdamW 处理 z_u 以及所有一维/偏置/嵌入参数。
- 自博弈与历史交错进行。 propose_schema 从确定性网格中发出一组
候选 schema;该组会被记录,其中一个候选被选中,然后
渲染/视觉/创作者结果会回写到它上面。
训练在夜间消费这些组。
- 三个模型部分,其中只有一个是会话模型。 通用部分(会话模型:读取素材、提出方案、评判)· FilmGPT 风格大脑
(共享电影语法)· 创作者品味(z_u)。像
GLM-5.3(Z.ai / zai,OpenAI 兼容)这样的视频输入/输出模型仅替换通用
部分——它通过 {"type":"video_url","video_url":{"url":…}}
读取原始片段,而不是预先提取的帧;FilmGPT 和品味部分不受影响。
- 模型生成的视频是选择性加入的架构,而不是预设声明。 ffmpeg
渲染最终剪辑(render_schema)。完全由 AI 生成的片段来自一个
独立的存储插件(或 harness 的 video_generate 工具,例如
grok-imagine-video),需选择性安装。当它存在时,你可以生成一个片段
并将其作为 generated 片段插入到常规剪辑中(源素材 + AI
片段是渲染器拼接的独立输入)。该预设本身绝不
声称会生成视频。
- 照片编辑仅处理图像——少一种模态。 同一个由品味驱动的循环通过 edit-apart 插件(bin/photo_core.py)编辑单张图像,它只需要 image 输入(没有 video 模态,也没有视频输入/输出注册),因此可与现有的支持图像的通用模型配合使用。ImageMagick 渲染器在运行时解析(DSH_IMAGEMAGICK/PATH),并且不是硬依赖——web 配置的浏览器内渲染器可以提供它。
流水线
编辑器的工具(作为预设插件挂载在 plugins/edit-apart.mjs)是薄薄的门面;bin/edit_apart_core.py(视频)和 bin/photo_core.py(照片)是它们通过 shell 调用的确定性引擎。
source ─► inventory ─► shot inventory
│
features ─► per-shot luminance/motion/audio
│
propose_schema + rubric ─► GROUP of candidate EDIT DECISION SCHEMAS
│ │ (logged to .editapart/taste_samples.jsonl)
│ ▼
│ taste identity scores the group ─► selected schema
│
render_schema ─► deterministic ffmpeg render
│
critic_edit ─► score + per-element keep/drop/why deltas
│ │ (logged as that candidate's reward;
│ │ chosen_by=creator|agent = revealed preference)
revise_schema ─► revised schema ─► re-render (bounded loop)
│
train_identity ─► shared style-brain GGUF + per-creator z_u GGUF
品味模型的状态。 身份学习是已实现并接入循环的,不是脚手架。propose_schema 构建并记录一组候选,当创作者身份存在时用它选择一个,critic_edit 为实际渲染的候选记录奖励,train_identity 拟合共享风格大脑以及该创作者的潜在 z_u,并写出真实的 GGUF 产物。实测结论及其局限见下文 品味模型——包括它尚未做到的事情(训练好的选择器,不是微调的语言模型;仅限视频)。
照片编辑(仅图像)
一个并行的单图像循环,通过 edit-apart 插件挂载:
photo_inspect → photo_propose(评分标准 → 照片 EDIT DECISION SCHEMA)→
photo_render(ImageMagick)→ photo_critic(客观 + 主观)→
photo_revise。它比视频少一种模态(image,而非
video),并且其渲染器不是硬依赖(在运行时解析;
web 配置的浏览器内 ImageMagick/ffmpeg 可以提供它)。
品味模型也接入在这里,有自己的 photo/v1 布局、自己的
分组日志和自己的风格大脑(style_brain_photo_v1.gguf),因此创作者
最终每种模态都有一个身份。有三件事使这一模态比视频更难,
而这三件事都是实测而非假设的:
- 没有可依赖的时间轴,因此布局综合了空间结构:
裁剪几何加上裁剪保留区域的统计量,从 photo_inspect 在与全局统计相同的降采样上计算出的 4×4 区域网格中读取(全局数值保持不变)。
- 候选评分需要一次渲染。 照片奖励定义在渲染后的图像上,因此一个 K 候选组会被渲染并评分 K 次(视频的目标评判器是纯算术)。group=1 且无数据集时仍是旧版、无需渲染的提议。
- 量化奖励使组内无差异。 曝光曾是一个阈值,因此一个 6 候选组得分为 6 × −0.05,分布为 0.0——组相对信号恰好为零。现在奖励是分级的(在容差内给满分,在容差外线性衰减),这使该组的分布达到 0.47,并让 11/18 个训练组具有信息量。
在合成的 1600×1200 图像上测量,两个具有相反构图品味的创作者(最紧裁剪 vs 最松裁剪)共享一个冻结主干:来自训练家族的 10/10 个留出简报被以不同方式选择,10/10 符合预测方向(平均裁剪面积 0.155 vs 0.389)。在一种未见过的裁剪几何上它也能迁移——在十个不同简报上达到 10/10——但边际更小:平均裁剪面积 0.30 vs 0.45,差距为 0.15,而分布内为 0.233。这是 docs/paper-findings.md(发现 4c)中的几何/内容混杂因素在缩小效应,而不是抹除效应。(早先“0/10,无迁移”的解读来自 Corrections 下描述的目标 bug;它是伪影,已撤回。)
一个四臂后续实验(tests/experiment_photo_transfer.py:{1 张图像,3 张图像} × {固定,变化裁剪家族},共享探针阶梯,匹配步数)发现修复是部分的,并且沿着内容轴,而不是几何轴:只有 3 图像/窄家族臂迁移到了未见过的图像和几何(3/3,比率 0.400),而两个变化几何臂均为 0/3。一个无品味对照身份显示排序指标的噪声底为 ±0.36——大于大多数被测效应——因此应将这些结果视为提示性而非已确立。docs/paper-findings.md 的发现 4c/4d 有表格、功效分析和规则(在你将使用的家族上训练;包含家族外检查和无品味对照)。
品味模型(已接入,已测量)
bin/taste_model.py 是每个创作者的模型;bin/train_identity.py 是其 CLI。
bin/edit_apart_core.py 中的循环驱动它。
架构。 一个共享主干作用于 16 个命名编辑特征(节奏、镜头选择、速度、能量、顺序),并馈入一个隐藏层,创作者潜变量以三种方式调制该隐藏层:
u = tanh-free ranking score =
(a ⊙ (1 + tanh(W_s z + b_s))) @ W2 + b2 # latent gates the hidden activations
+ (z @ W_z + b_z) # latent output offset
+ x · (z @ W_l) # per-creator linear readout over the features
z_u 是唯一的按创作者张量,因此创作者产物约为 1 KB,而主干是共享的。该映射在 z 中是非线性的(tanh 门、乘法项)且可插值(潜在变量是连续的;中点潜在变量的得分介于其端点之间——测试套件中已断言)。
目标。 对于每个片段,循环会记录一组候选及其评论家的密集奖励。GRPO 将其转化为组相对优势
A_k = (r_k − mean r)/std r,更新是在组 softmax 选择策略上的 PPO-clip 代理目标,外加对实际渲染所选内容的辅助成对偏好损失,以及一个小的熵奖励。效用值在 softmax 之前会在候选组内部进行标准化:这使 logits 保持响应性,从而潜在变量始终可以重新排列候选——在无界后压缩的输出下,效用值会在 margin 目标下饱和,潜在变量会完全失去对排序的控制权(实测:12/12 中性简报完全相同,而修复后为 12/12 不同)。
优化器拆分。 Muon(五次 Newton-Schulz,系数和 nesterov 形式来自参考 Muon 实现)用于 2D 权重;AdamW 用于 z_u 以及所有 1D/偏置参数。Muon 的学习率以谱范数单位计,因此在这些小矩阵上它必须比 Adam 学习率低约 10 倍——在更高的学习率下,模型会停止拟合(实测:训练准确率停滞在约 0.5,而正常约为 0.85)。
产物。 真实的 GGUF v3 文件(F32 张量 + 元数据):一个共享的 style_brain_video_v1.gguf 和一个微小的按创作者 .gguf,后者携带 z_u、特征布局,以及其训练所依据的主干摘要。摘要不匹配会被拒绝,而不是用错误的主干静默评分。
循环如何为其提供输入
1. propose a GROUP (logged automatically); the best candidate by the identity
is selected, or by the objective critic reward when no identity exists yet
propose_schema inventory= rubric= group=4
2. render the selected candidate, then log that group's outcome
critic_edit schema= inventory= rubric= group_id= \
candidate= chosen_by=creator
3. inspect and train
taste_status
train_identity creator=erkin # writes .editapart/identity.gguf
train_identity creator=erkin freeze_style=true # later: only z_u moves
the photo loop is the same protocol on its own log/identity
photo_propose src= inspect= rubric= group=4
photo_critic schema= rubric= result= group_id= \
candidate= chosen_by=agent
taste_status modality=photo
train_identity modality=photo creator=erkin
chosen_by=creator|agent 很重要:该选择会被记录为显示偏好,成为该组的最高奖励,并给训练器一个偏好项。仅由评分标准推导出的奖励无法识别每个用户的品味:如果目标中没有用户相关项,两个品味相反的创作者会在
只有 4/12 的中性简报(p ≈ 0.21,相对于无关选择零假设),而一旦揭示的选择进入目标函数,则为 8/12(p ≈ 0.0006)(边距 +3.6 秒对 +7.0…+9.4 秒)。此外,覆盖机制比辅助损失更好地拟合创作者自己的语料库(0.83/1.00 对 0.22/0.26),因此两种机制都保留;tests/experiment_revealed_preference.py 可复现整个表格。
实测结果
| 主张 | 测量 |
| --- | --- |
| 梯度正确 | 解析梯度与有限差分:1.7e-08(模型)/ 1.7e-09(完整目标,含偏好项) |
| 目标函数能恢复隐藏偏好 | 留出集成对一致率 0.82–0.84 对 0.50 随机;argmax 0.55–0.86 对 0.20 随机(3 个种子,120 个合成片段) |
| 身份可插值 | 中点潜变量在 ≥70% 的候选中夹住端点,并使均值单调移动 |
| 优化器拆分成立 | Muon 仅接触 2D,AdamW 仅接触 1D(已断言,并有见证) |
| 产物可往返 | GGUF 写入→读取位精确;摘要不匹配会被拒绝 |
| 身份改变循环 | 同一共享主干上的两个创作者:8/12 中性简报不同,8/12 方向符合预测,平均选中时长 21.4 秒对 12.0 秒(在下方目标函数修复后重新测量) |
| 揭示的选择才是承载品味的因素 | 消融(重新测量):无用户项时 4/12 简报不同(p ≈ 0.21,与无关选择无法区分),而尝试的每种机制均为 8/12(p ≈ 0.0006);奖励覆盖机制也更好地拟合创作者自己的语料库(0.83/1.00 对 0.22/0.26),并扩大边距(+9.4 秒对 +7.0 秒) |
| 照片品味可迁移,但跨族时边距更窄 | 两个创作者,一个共享主干:10/10 留出简报选择不同(10/10 方向一致,裁剪面积 0.155 对 0.389);在一种未见过的裁剪几何 10/10 上,但差距更小(0.30 对 0.45)——几何/内容混杂使其变窄 |
| 修复是部分的且由内容驱动 | 4 臂迁移实验(重新测量):只有 3 图/窄族臂迁移到未见过的图像+几何(紧/松比 0.400),而 A1/A2/B2 无效果(1.000);在相同几何的已见过图像上,四臂中有三臂确实产生了区分。来自无品味对照的 ±0.36 排序指标噪声底是修复前的测量 |
| 循环可选依赖 numpy | 旧版 propose group=1 和分组日志在屏蔽 numpy 时仍可工作;只有模型路径报错 |
用 tests/test_taste_model.py(35 个测试,无需媒体)和 tests/test_loop_e2e.py(真实素材;见 验证)复现。
边界(诚实说明)
- 训练出的策略是选择器,不是语言模型。 训练改变的是循环在该引擎生成的候选中选择哪一个;它不会微调 LLM,也无法发明候选网格中不存在的剪辑。
- 仅限视频。 该设计的 v0 范围是节奏 + 镜头选择 + 速度,这
以上是功能布局所覆盖的内容。照片品味(色彩/构图)是下一阶段;模型对功能规格是通用的,但 photo_propose 仍然只输出一个由评分标准推导出的 schema,并且不记录任何内容。
- 它需要足够多的片段。 只有当日志中有若干片段后,留出准确率才有意义;只有一两个片段时,模型只会拟合它们,无法泛化任何东西。taste_status 会报告日志中有多少个可训练分组。
- 主干是共享的,因此针对单个创作者的训练会冻结它(freeze_style=true);普通运行也会训练主干,其目的是从多个创作者的日志并集中构建共享模型。
安装
EditApart 的安装是 harness 用户预设根目录下的一个目录。目录名就是预设 id,agent.cordis.yml 是加载器所拥有的组合,而 preset.yml 仅携带展示元数据——因此请以你想要的 id 克隆该仓库:
git clone https://github.com/EditTogether/DSH-EditApart.git ~/.dsh/.agent-presets/ai-video-editor
可选地配置场景检测器/渲染器工具链(使用 venv,因此不会影响你的系统 Python):
cd ~/.dsh/.agent-presets/ai-video-editor && bash setup.sh
重启 DeepSeek Harness(或打开一个新会话),并在模式选择器中选择 EditApart (AI taste editor)。使用
git -C ~/.dsh/.agent-presets/ai-video-editor pull 进行更新;删除该目录即可卸载。
要求。 你要将其安装到的 harness——该组合只引用了 harness 已自带的插件,因此无需添加任何 npm 依赖——以及用于视频的 ffmpeg/ffprobe 和 scenedetect,以及可选的用于照片的 ImageMagick。任何地方都没有写死绝对路径:工具链按 DSH_ 环境变量 → /.dshenv → PATH 的顺序解析,因此机器本地安装是一个 .dshenv(被 gitignore 忽略),而绝不是对仓库的修改。
已验证为已安装。 针对本仓库的普通 git clone 运行 harness 自带的预设发现功能,会报告 id 为 ai-video-editor、名称为
"EditApart (AI taste editor)",并且没有 broken 判定——组合中的每一行插件都能针对运行时的包基础解析成功。两个文件都必须保留在仓库根目录:一个缺少 agent.cordis.yml 的目录仍然会占用其 id,并显示为损坏,而不是被挂载。
本项目可在 DeepSeek Harness 生态系统中通过
dsh-plugin 主题被发现。
如何使用
1. 在此预设上启动一个会话(在模式选择器中选择 ai-video-editor / EditApart)。该预设会挂载它自己的 edit-apart 插件,因此工具
inventory、features、propose_schema、render_schema、
review_frames、critic_edit、revise_schema、train_identity、
taste_status、identity_init、photo_inspect、photo_propose、
photo_render、photo_critic 和 photo_revise 会出现在该会话的
目录中。
2. 捆绑的 edit-apart 技能驱动整个循环。
3. 工具链在运行时解析,而非硬锁定:ffmpeg/ffprobe/
scenedetect/Python(视频)以及 ImageMagick(照片)来自匹配的
DSH_ 环境变量(DSH_FFMPEG、DSH_FFPROBE、DSH_SCENEDETECT、DSH_EDIT_PY、
DSH_IMAGEMAGICK),然后是 .dshenv,最后是 PATH。web-profile 的浏览器内
ffmpeg / ImageMagick(一个 store 插件)可以代替本地二进制文件来提供它们。
便携安装(公开 / 另一台机器)
代码从不硬编码绝对路径。工具链按 环境变量 DSH_ →
/.dshenv → PATH* 的顺序解析,因此只要机器上有 ffmpeg +
scenedetect,该 preset 就能运行。要在 scenedetect 位于 venv(不在
PATH 上)的机器上进行配置:
bash setup.sh # creates ~/dsh-edit-venv, installs scenedetect, writes env.sh
source ./env.sh # makes DSH_EDIT_PY / DSH_SCENEDETECT available for this shell
OR, if the tools are already installed:
cp env.sh.example env.sh && source ./env.sh
setup.sh also writes .dshenv so the plugin auto-loads paths without sourcing.
- env.sh.example — 便携模板;复制为 env.sh(已被 gitignore)并编辑。
- env.sh — 生成的、机器本地的、已被 gitignore;导出 DSH_ 变量。
- .dshenv — 当匹配的 DSH_ 环境变量尚未设置时,插件自动加载的
机器本地路径(已被 gitignore)。
- requirements.txt — scenedetect(+ numpy/.editapart)、
DSH_EDITAPART_STYLE(共享的 style-brain 路径)以及 DSH_EDITAPART_GROUP
(每次提议的候选数,默认 4)。identity 和日志有意按工作区划分,
这样每个项目都会积累自己的创作者历史。
该插件有意做到无导入:用户 preset 相对挂载的模块无法导入
@deepseek-ai/(其内部导入是相对于 preset 目录解析的,而非 harness)。
它手工构建 ToolDefinition 并调用
ctx.tools.register(),通过 shell 调用 bin/edit_apart_core.py /
bin/photo_core.py。
信任与安全
- 无 shell 命令注入。 引擎使用列表参数
subprocess.run([...]) 启动进程,插件使用 spawn(PY, [CORE, ...args]) —
从不使用 shell 字符串,从不使用 shell=True/os.system。路径和 schema 值
作为字面参数传递,因此像 x; rm -rf / 这样的值无法被
shell 解释。用 ; 连接的 ffmpeg filter_complex 字符串是一个
单个 argv 元素,而非 shell 语法。
- 字幕文本会被净化。 ImageMagick 的 -annotate/-caption/-label
会解释 %[...]/%[fx:...] 格式转义,并将开头的 @ 视为“从文件读取文本”。
照片引擎会将 %/@/\ 转义为视觉上相同的全角码点
(_escape_annotate_text),因此不受信任的字幕文本无法触发 IM 表达式或
文件读取——这与宿主 ImageMagick 的 policy.xml 无关。(系统软件包策略
已在许多镜像上禁用了 @ 文件读取,但代码不再依赖这一点。)
- 路径是受信任的工具参数。 src、out、outdir 以及生成的 asset
路径由操作员/模型提供,并直接传递给 ffmpeg/scenedetect。
在 DSH 内,沙箱会限定写入范围;如果你在 DSH 之外运行这些引擎,
请限定进程范围,使精心构造的 out/outdir 无法写入你预期目录之外的位置。
- .dshenv 是信任边界。 插件会加载 /.dshenv 并设置
process.env(仅当匹配的 DSH_ 环境变量尚未设置时)。任何能写入该文件的人
都能控制 DSH_EDIT_PY/DSH_SCENEDETECT,从而控制所执行的解释器。请将其
排除在版本控制之外(它已被 gitignore),并将其视为操作员所有。
视频参考运行(已验证)
在 better-com-ceo-roasted-by.mp4 上(41.7 秒,23 个镜头):
- 清单:23 个镜头。
- 评分标准:节奏明快,镜头时长 0.9–4.0 秒,目标 20 秒。
- Schema:11 个片段(丢弃了一个 0.58 秒的镜头)。渲染:有效的 20 秒 1080p mp4。
- 客观评审器:总体 0.3,奖励 −0.1,将 clip_001/clip_002 标记为
“低运动/冷场”。这是错误的——一个运动亮度启发式方法将铺垫
(“Well, when are you going”)和第一个笑点(Ramsay,
“and start showing some”)判定为冷场,并且会丢弃两个最佳节拍。
- 视觉评审器(规范性):总体 0.62。保留 clip_001/clip_002(铺垫 + 笑点,
带字幕且价值高);修剪/剪掉 clip_005(一个长达 3.8 秒的静态停留镜头);
考虑将“BETTER.COM EMPLOYEES”切入镜头(clip_010/011)提前重新排序,
作为建立主体的卡片。
该技能中沉淀的经验教训:视觉分支(帧检查)是规范性的;运动亮度只是一个提示,
并且在最高价值的镜头上可能会自信地出错。 在丢弃镜头之前,始终先执行
review_frames。
照片参考运行(已验证)
在一张合成的 1800×1200 横向图片(photo.jpg)上,评分标准 = 温暖冲击力,
饱和度 1.15,裁剪 600×500,宽度 1200,target_luma 0.52:
- 检查:mean_luma 0.264,luma_std 0.19,p50 0.18/p95 0.835,饱和度 0.132,
mean_rgb [0.214, 0.277, 0.288]。
- Schema:裁剪 → 调色 → 缩放。
- 渲染:1200×1000。评审器:总体 0.5,exposure_ok/contrast_ok 为 true,
奖励 0.5,所有操作均保留;修订保留了裁剪/调色/缩放。
- 曝光/对比度项是分级的(见照片品味部分):在容差范围内给予满分,
与之前完全一致;在容差范围外线性衰减,因此通过的候选者得分与分级前的
评审器完全相同。
更正
一次外部评审重新运行了测试套件并复现了五个缺陷。所有这些缺陷都已在此修复,并且本 README 报告的行为数值在此之后重新测量过(先前的数字已撤回,而非悄悄保留)。
1. GRPO 比率并不是一个比率(bin/taste_model.py)。train() 将原始标准化 logits 存储为比率基线,因此 rho = exp(log_softmax(s) - s) = 1/Z——一个每组常量。负优势候选随后总是落入裁剪分支,其向下的推力不再取决于 |A|(实测:对于 A = −0.1、−2.0 和 −8.0,均为相同的 0.0268),因此目标函数已悄然退化为仅正向的 REINFORCE。遥测也有同样的 bug:clip_fraction 是每次调用的总和除以批次计数,报告为 5.9(即 590% 的“比例”)。修复方法是存储 log_softmax(...) 并分离两个分母;tests/test_taste_model.py::TestObjectiveFidelity 固定了 rho == 1、clip_fraction ∈ [0, 1],以及 −2.0 优势的推力约为 −0.1 的 10 倍。后果: 视频的每个创作者分离度重新测量为 12/12 → 8/12(21.4s 对 12.0s),照片的族外结果 0/10 → 10/10,但余量更窄(0.30 对 0.45)。
2. ImageMagick 6 悄然杀死了照片循环的裁剪轴(bin/photo_core.py)。解析 convert 后运行 convert identify … 在 IM6 上会失败,而 _dims 悄然返回 0x0:每个百分比裁剪都变成 0x0+0+0,整个空间特征族归零,而 inspect/propose/render/critic 仍全部报告成功。现在 identify 二进制被单独解析(DSH_IDENTIFY > magick identify > 同级 identify > PATH),维度失败会大声报错,propose 会拒绝无维度的 inspect 或全同的候选组,并且两个核心都附带 selftest 一致性检查(python bin/photo_core.py selftest)。
3. 视频渲染硬性要求每个输入都有音频。 一个静音片段使整个图失败,报错“Stream specifier 'a' matched no streams”。现在静音输入会获得 anullsrc,而当没有输入携带音频时,静音输出会不使用 loudnorm——对数字静音进行单遍 loudnorm 会除以零能量,并把 NaN 交给 AAC 编码器。
4. "reward_obj": null 中止了整个训练日志(float(None))。未评分的候选现在被容忍并跳过,计数器由 taste_status 显示。
5. 视频 E2E 记录了错误候选的奖励:它批评的是选中的 schema,却用 --candidate 标记奖励。候选 schema 现在暴露在组元数据中——这也是该技能的“渲染与所选不同的候选”工作流所需要的——并且测试断言记录的奖励是所选候选的。
同一评审中的较小修复:到达 ffmpeg 的 schema 值
filtergraph 已验证(_num/_ff_crop),revise 不再在没有 meta 的
schema 上抛出 KeyError,photo temperature 现在真正生效(之前是
-fill … -colorize 0,一个 0% 的空操作),每次 propose 调用使用一个临时目录,而不是每个
候选一个,created_at/trained_at 产物元数据已保持一致,并且空的
style_file 不再解析为一个目录。
验证
模型 + 视频循环单元测试套件:36 个测试,无需媒体文件(约 25 秒)
~/dsh-edit-venv/bin/python tests/test_taste_model.py -v
照片品味测试套件:23 个测试(特征测试无需渲染器;分组和
按创作者测试需要 ImageMagick;约 4 分钟,主要耗时在候选渲染上)
~/dsh-edit-venv/bin/python tests/test_photo_taste.py -v
在真实素材上的端到端测试(scenedetect + ffmpeg + 一次真实渲染)
DSH_EDIT_PY=~/dsh-edit-venv/bin/python \
DSH_SCENEDETECT=~/dsh-edit-venv/bin/scenedetect \
DSH_EDITAPART_E2E_SRC=/path/to/footage.mp4 \
~/dsh-edit-venv/bin/python tests/test_loop_e2e.py -v
单元测试套件检查 Newton-Schulz 的有界频带和尺度不变性、
优化器拆分(Muon 永远不会看到一维梯度,AdamW 永远不会看到二维梯度)、
解析梯度与有限差分的对比、GGUF 往返和摘要不匹配拒绝、数据集折叠(包括遗留记录和损坏行)、
在合成隐藏偏好上的学习、潜在消融/插值、
group=1 精确复现遗留 schema、critic 奖励日志记录,以及
在 numpy 不可用时的优雅降级。
E2E 套件从真实素材构建清单,驱动两个具有
不同已揭示偏好的创作者通过真实循环,训练一个共享主干
加两个冻结主干身份,并断言同一个中性简报会得到
实质性不同的编辑——然后用真实 ffmpeg 渲染品味选中的 schema
并对其进行评判/修订。在
better-com-ceo-roasted-by.mp4(41.7 秒,23 个镜头)上测得:8/12 个简报不同,
长镜头 21.4 秒 vs 短镜头 12.0 秒的平均选中时长;渲染出的
品味选中编辑为 18.75 秒,critic 总体 −0.15,修订后从 10 个片段变为 7 个片段。(这些是
修正后的数字;见下方 Corrections。)
完整协议见 skills/edit-apart/SKILL.md。