风格锁 · AI 批量产出一致性锁定
核心命题:AI 不是不会做,是没记忆。一致性是记忆的函数,一个没有记忆的工具只能"运气好"。
行业证据(2025–2026,多方交叉印证同一结论):
- Figma 官方:"你纠正一次,这一轮能拿到对的蓝。明天再问一次,又回到猜。"(LLM Context Design,2025)
- NN/g 评测:同一个 ChatGPT 提示词,产出三个差异极大的设计。(AI Design Tools Are Not Ready,2025)
- Superside:"它在生成之间会遗忘……一致性按定义就是记忆的函数。没有记忆的工具不可能一致,只可能运气好。"(2025)
- Adobe 系研究:42% 的 AI 生成界面共享近乎相同的导航结构——默认审美回归。(UI Monoculture,2026)
- G2 用户实测:63% 报告间距不一致,57% 说颜色不对。(Design Systems for AI UI,2026)
- 中文一线:"四张图单看都能交,放进同一页汇报里却像四个项目。"(搜狐,2026)
诊断:这不是审美问题,是架构问题。主流生成模型是 stateless 的——规范只活在提示词里,会话结束即失效。
本技能的解法只有一句:把规范从提示词里的形容词,变成磁盘上机器可读的持久约束。
一、为什么常规做法必然失败
| 常规做法 | 失效机制 | 失败率 |
|---|---|---|
| 在提示词里写"高级感、科技蓝、简约" | 形容词不是值,模型每次解释不同 | 几乎必然 |
| 在会话里纠正一次,继续生成 | 纠正在会话内,换窗口即清零 | 几乎必然 |
| 贴一张参考图让它"照这个来" | 参考图在上下文里被后续内容挤出 | 批次越大越必然 |
| 写一份设计规范文档.md 给它读 | 文档是散文,没有可判定的值,也没有校验环节 | 高 |
| 让它"保持和上次一致" | 它不记得上次 | 必然 |
共同根因:规范没有落盘,也没有校验闭环。
二、三层约束模型(本技能的核心结构)
风格不是一段描述,是三层可判定的约束。任何一层缺失,漂移就会从那里漏进来。
┌─────────────────────────────────────────┐
│ 禁令层 BAN │ 一票否决。命中即判不合格,不看权重
│ 「禁止紫蓝渐变科技风 / 禁止 emoji / │ 作用:挡住默认审美回归
│ 禁止'赋能''抓手''闭环'」 │
├─────────────────────────────────────────┤
│ 规格层 SPEC │ 结构与节奏。半可判定(脚本给线索,人工定)
│ 「每页一个主张 / 标题≤12字 / │ 作用:保住"看得出是一套"
│ 图注在图下方 / 段首不缩进」 │
├─────────────────────────────────────────┤
│ Token 层 TOKEN │ 原子值。完全可判定(脚本直接判)
│ 「主色 #C0392B 仅标题 / 字号档 10·12· │ 作用:机器能查的都放这层
│ 14·18·24 / 间距 4 的倍数」 │
└─────────────────────────────────────────┘
设计理由:把约束按"可否机器判定"分层。能判定的下压到 Token 层交给脚本,不能判定的上浮到 BAN 层用一票否决兜底。中间的 SPEC 层由脚本给线索、人做决定。不假装脚本能判一切。
三、锚定优先原则(本技能最重要的一条)
不要用形容词描述风格,用锚定样本指向风格。
对比:
| 写法 | 结果 |
|---|---|
| "简约高级、暖红色系、科技感" | 三次生成三种解释 |
"以 anchor/cover.png 为准,与其差异仅允许:尺寸 16:9、标题区在下方三分之一" |
稳定复现 |
锚定样本(Anchor)= 你已经满意的那一份产出。 用户手上通常已经有一版满意的——那是唯一可靠的风格载体,比任何描述都准。
差分描述(Delta)= 只说"和锚定样本哪里不同",不说"要什么风格"。
这是关键技巧:描述绝对风格需要无限多个词,描述相对差异只需要几个词。
> 好:与锚定样本一致;仅改:背景改为 #FFF8F0,去掉副标题
> 坏:温暖、专业、有品质感的设计
四、五步工作流
S1 定载体(Carrier)
确定产出类型,加载对应 profile。六类:image(图/海报/封面)、ppt(幻灯片)、doc(文档/报告)、code(代码)、copy(文案/社媒)、table(表格)。
→ 见 references/carrier-profiles.md
S2 锚定(Anchor)
找到或生成锚定样本。没有锚定样本时,先单产一版让用户确认,再把它定为锚。
→ 见 references/anchor-craft.md
S3 抽 SPEC
从锚定样本反推 SPEC 规格档,落成 style.spec.yaml(或 .md)。
可直接调用:python3 scripts/lock_init.py <锚定样本路径> --carrier <类型> -o style.spec.yaml
→ 字段详解见 references/spec-schema.md
S4 按 SPEC 产出
生成时引用文件,不在会话内重述规范。批次产出时每 N 项回读一次 SPEC 防止挤出。
S5 校验回灌
python3 scripts/lock_check.py style.spec.yaml <产出路径> → 越项台账 → 修 → 复检。
校验不过不进下一批。
五、漂移类型学(为什么会跑偏,六类)
| 类型 | 现象 | 根因 | 对应机制 |
|---|---|---|---|
| 形容词漂移 | 同一句描述,结果不同 | 规范不是值 | Token 层 |
| 参照丢失 | 前 2 张对,第 3 张开始飘 | 锚定被上下文挤出 | 每 N 项回读 SPEC |
| 局部修正全局漂 | 改了标题,正文没跟着改 | 无全局约束层 | SPEC 层 + 全量校验 |
| 批量衰减 | 批次越大,后段越不像 | 注意力稀释 | 分批锁(每 5 项一锁) |
| 默认值回归 | 不指定就变紫蓝渐变圆角卡片 | 训练分布默认审美 | BAN 层 |
| 跨会话清零 | 明天再做又回到猜 | 规范只在会话内 | SPEC 落盘 |
> 默认值回归是最隐蔽的一类:不是模型做错,是它回到最熟悉的默认。唯一解是显式 BAN 掉默认审美,而非正向描述"要什么"。
六、铁律(5 条,违反即失效)
- 先锚定,后描述。 没有锚定样本的 SPEC 只是一组形容词。
- 值必须可判定。 "高级感"不合格;"#C0392B 仅用于一级标题"合格。
- 禁令优先于偏好。 正向描述列不完,BAN 层挡得死。
- 批次内不重述规范,只引用文件。 重述=重新解释=漂移入口。
- 校验不过不进下一批。 否则误差在批次内累积。
七、决策表:什么时候用哪一层
| 场景 | 用哪层 | 说明 |
|---|---|---|
| 一次性的单张产出 | 都不用 | 直接生成,本技能是负担 |
| 2–5 项小批次 | 锚定 + BAN | 锚定样本够用,不值得建 SPEC |
| 6 项以上同系列 | 锚定 + Token + BAN | 必须建 SPEC |
| 跨天/跨人协作 | 全套 + 落盘 | SPEC 是唯一能传递的载体 |
| 品牌物料(对外) | 全套 + CI 卡点 | lock_check.py 退出码 1 阻断 |
| 代码风格 | Token 层为主 | 现有 linter 更专业,本技能补"跨文件一致性" |
八、边界(本技能不做什么)
- 不解析位图像素。 png/jpg 的颜色、构图无法离线判定,脚本对位图返回"无法判定",由人工看。诚实声明,不假装能判。
- 不保证内容质量。 本技能锁形式(一致),不锁内容(正确/有洞察)。内容质量请用
delivery-qc。 - 不替代设计能力。 没有锚定样本也没有审美判断时,本技能只能保证"批次内一致",不能保证"好看"。
- 跨批次一致 ≠ 版本迭代。 需要刻意改版时,应新建 SPEC v2 而非复用 v1。
九、脚本
scripts/lock_init.py
从锚定样本反推 SPEC 草稿。零依赖。
python3 scripts/lock_init.py anchor.png --carrier image -o style.spec.yaml
python3 scripts/lock_init.py ref.md --carrier doc -o style.spec.yaml
位图锚定样本:无法解析像素,输出带 [待填] 占位符的 SPEC 骨架(不编造值)。
文本/网页/文档锚定样本:真实抽取颜色、字号、字体、术语,输出可直接用的 SPEC。
scripts/lock_check.py
校验产出是否越界。零依赖。
python3 scripts/lock_check.py style.spec.yaml output.html
python3 scripts/lock_check.py style.spec.yaml dist/ --recursive
支持:.md .html .css .svg .py .js .ts .json .pptx .docx
不支持位图判色(返回"无法判定",不误报)。
退出码:0 通过 / 1 存在致命项(可接 CI)/ 2 用法或文件错误。
脚本的定位是筛子不是法官:能查的查到位,查不准的明说"无法判定",绝不为了显得有用而编造判定结果。
十、最小可用路径(第一次使用)
1. 找到你满意的那一份产出 → 这是锚定样本
2. python3 scripts/lock_init.py <锚定样本> --carrier <类型> -o style.spec.yaml
3. 人工补/改 SPEC 里 [待填] 的项,尤其 BAN 层
4. 后续每次生成:引用 style.spec.yaml,不重述
5. 产出后:python3 scripts/lock_check.py style.spec.yaml <产出>
完整走一遍的示例见 assets/example/(含锚定样本、SPEC、首版产出、校验台账、修正后终版)。