你让 AI 做了五版,然后呢?
一个 Agent Skill:让 AI 用不同的 skill / prompt 跑同一个需求,产出 N 个版本,然后并排盲评、逼出一个赢家。
生成从来不是瓶颈,挑选才是。实际发生的情况是:你打开五个标签页来回切,看到第四个的时候已经忘了第一个长什么样,最后选的往往不是最好的那个,而是最后看的那个。
你说要做什么 → 找候选 / 你指定 → 隔离生成 N 版 → 并排盲评 → 一个赢家 + 评语
- 隔离生成:每个候选一个独立子 agent,只允许读它被指定的那一份 skill,互相看不见
- 统一呈现:HTML 直接内嵌真实页面(动效交互都在),pptx / pdf / 图片自动转成逐页图
- 盲评:编号随机打乱,评完才揭晓
- 必须落到一个:排名只是过程,最后强制二选一
git clone <repo> ~/.claude/skills/pick-one
npm i --prefix ~/.claude/skills/pick-one puppeteer-core依赖:Node、puppeteer-core(驱动系统 Chrome)、ImageMagick(magick)。
只有需要评 pptx / pdf 时才要 LibreOffice:brew install --cask libreoffice。
Chrome 路径可用 CHROME_PATH 覆盖,puppeteer 位置可用 PUPPETEER_CORE_PATH 覆盖。
对 Claude 说:
帮我对比几个 PPT skill,做一份季度经营汇报
它会先问你评什么,然后列出候选让你确认,接着隔离生成、建评审页。
也可以跳过生成,直接评手上已有的东西:
<run>/candidates/
01-方案A/index.html
02-方案B/deck.html
03-方案C/slides/… 多文件也行
04-方案D/report.pptx 自动转图
05-方案E/ 一堆 png 也行
然后:
~/.claude/skills/pick-one/scripts/prepare.sh <run_dir> "课题名"
<run_dir>/开始评.sh
⚠️ 必须用开始评.sh打开,不能双击 html。file://下浏览器会拦掉「网页里再嵌网页」,多文件候选会白屏。
不打 1–10 分。 档位太多反而分不清,还容易一堆并列——实测七个产物打出 8/8/7/5/5/5/4,挤成四档;换一批又出现三个并列 8 分,排序直接失效。
改成四档标签 + 归并对比:
| 步骤 | 做什么 | 次数(7 个候选实测) |
|---|---|---|
| ① 逐个看并分档 | 全屏看完一个,当场定档 + 写评语 | 7 次 |
| ② 档内两两对比 | 归并排序驱动,只排前两档 | 3 次 |
| ③ 边界确认 | 上一档末位 vs 下一档头名 | 1 次 |
| ④ 定下赢家 | 最后必须落到一个 | 1 次 |
约 12 次操作排完。对照:全量两两对比要 21 次。
只排前两档的理由很简单:后两档你本来就不会从里面选。
判断必须发生在「正看着」的时候。 评判条钉在全屏浏览页底部,而不是关掉之后回缩略图上选。用户原话:「你出来之后,就没有那么强的一个感知了。」
评语比名次有用。 名次基本可以预测,「乱」「排版不容易读」这种一句话不能——它们才是整个评测里信息量最大的产出。所以评语框放在最显眼的位置,导出的 markdown 里评语单独成节。
必须有裸跑对照组。 一个什么都不装、只拿到同样 brief 的候选。没有它你分不清「这个 skill 让结果变好了」和「模型本来就能做到」。实测中裸跑对照组两轮都进了前二,七个 skill 里只有一个真正赢过它。
<run>/
brief.md 事实底稿(数字、结论都定死)
assets/ 统一素材
candidates/<名字>/ 每个候选一个目录,里面放什么都行
_pages/ prepare.sh 生成的逐页 PNG
contact-sheet.png
review.html 盲评页(编号已打乱)
_key.json 编号 ↔ 候选名,**评完再看**
开始评.sh
| 命令 | 作用 |
|---|---|
scripts/prepare.sh <run> [标题] |
全流程:产物 → 逐页图 → 拼图 → 评审页 |
scripts/build_review.py <run> [--reshuffle] |
只重建评审页(默认沿用编号,不重洗牌) |
scripts/shoot.mjs <deck.html> <out> |
单文件 deck 逐页截图 |
scripts/shoot_multifile.mjs <slidesDir> <out> |
多文件 deck 逐页截图 |
scripts/office2png.sh <file.pptx|pdf> <out> |
Office/PDF → 逐页 PNG + 翻页壳 |
scripts/verify_review.mjs <review.html> |
评审页自检(卡片数 / 图加载 / 翻页 / 定档 / 回写) |
这些都是真出过事的,写在这里省得你再踩一遍。
| 坑 | 后果 | 处理 |
|---|---|---|
| 截图前不量舞台宽度 | deck 按 1920 画,用 1600 拍会切掉右边一条,而且看起来像「排版满」 | 自适应画布 |
| 只按「画面不变 = 翻到底」 | 有分步动画的页让它提前收工,15 页只拍到 3 页 | 双判据 + 换键重试 |
| 只按「当前可见第几页」 | 容器整体位移的 deck 索引恒为 0,只拍到 1 页 | 拿不到就退回帧序列 |
| 卡住时按 PageDown 救场 | 一次翻两页,中间那页被跳过 | 缺页自动补拍 |
| 去重用 md5 | 抗锯齿差几个像素就骗过去 | 改用 RMSE |
| 全序列去重 | 会误删版式相近的真幻灯片 | 只从末尾往回砍 |
| 重建页面时重新洗牌 | 评到一半的档位挂到别的候选上,整轮作废 | 默认沿用编号 |
上次跑挂留下空 _pages |
被当成「已完成」跳过,永远补不上 | 按图片数判断 |
| LibreOffice 共享 profile | 已有实例在跑时新的静默退出,什么都不产出 | 每次转换独立 profile |
| 候选同时导出了 pdf 副本 | 按时间取最新会选到 pdf 再去转 pdf | 有 pptx 优先用 pptx |
file:// 下嵌套 iframe |
多文件候选白屏 | 走本地 http |
一条元教训:最容易被工具链坑的,是那个「结构跟别人不一样」的候选。 每次出现「某个候选看起来内容缺失 / 排版崩了」,先怀疑自己的工具,再怀疑它。
- 客观指标预测不了人的判断。 实测中按中文排版专业属性排名第一的那个,实际盲评只得 5 分,而裸跑对照组得 8 分。量化只能用来解释结果,不能用来预测结果。
- 评测方式本身有倾向。 我们的流程奖励视觉完整度,惩罚事实克制——唯一严格执行「不许编造内容」的候选(遇到缺失信息就留占位符)两轮都垫底。如果你的场景更看重准确性,得改评审维度。
- 方差比均值更重要。 一个每次都给你 7 分的工具,比一个在 4 分和 9 分之间跳的工具更值得依赖。想测方差就用「同一配置跑 N 次」模式。
MIT