2026/10/21 8:07:21

AI主题生成标准化:拆解Theme-Factory技能,从设计令牌到工程落地

AI主题生成标准化:拆解Theme-Factory技能,从设计令牌到工程落地 拿到这个官方 Skill 的时候我的第一反应其实是有点怀疑的。theme-factory——主题工厂听起来就像《黑客帝国》里那句有无限多的牛肉意思是有无限多的主题。但真正拆开用了一遍之后我承认之前的判断过于草率了。它解决的不是能不能换个颜色这种表面问题而是把 AI 生成主题这件事从碰运气式的一句话调参变成了一套有输入协议、有校验步骤、有兜底策略的标准化流程。如果你也跟我一样平时要维护博客、文档站、客户端皮肤或者干脆负责公司里的设计系统管理这篇文章值得耐心看完。我会把 skill 的完整拆解、一次真实从零到发布的实操链路、还有我在反复测试中踩过的大量坑一次性都讲清楚。1. 为什么单靠帮我换个主题总是翻车先说一个很多人都有过的体验你在一款 AI 助手里输入帮我生成一个北欧极简风主题出来的东西乍看很漂亮深灰浅白、间距舒适、字重得体。但是当你真的把代码粘进项目里问题立刻暴露某个按钮的文字对比度只有 2.3:1根本读不清某一组色板只有 4 个色值深色模式下完全不够用更麻烦的是变量命名体系天马行空上一次叫primaryColor这一次叫color-blue-500两次对话产出的东西根本没法整合。这不是 AI 笨而是这类任务的本质就决定了一句话 prompt不可能稳定。一个完整可用的主题背后至少包含六层知识色彩系统的构建逻辑主色、辅助色、中性色、语义色成功/警告/危险怎么分层对比度合规WCAG 标准要求正文文本至少 4.5:1大文本和 UI 组件至少 3:1字号与字重的阶梯关系标题、正文、辅助说明、代码片段都有不同的排印规则组件变量的映射一个按钮牵扯到背景色、文字色、边框色、悬停态、激活态、禁用态至少 8 个 token深色模式的切换策略不是简单反色而是基于色相和明度的整体重映射导出物结构JSON 设计令牌、CSS 变量、框架主题包、文档说明缺一不可。这些东西如果你不预先让 AI 知道它就只能自由发挥。而自由发挥的结果就是视觉上永远好看工程上永远不可用。这恰恰是 theme-factory 这个官方 Skill 存在的原因——它把上面提到的专业经验全部固化成了一段结构化指令。实际上我在拿到这个 Skill 的说明书之后观察到一个细节它没有要求模型发挥创意反而大量使用了必须禁止默认这种强约束词。这说明一个很好懂的事实——AI 生成主题这门手艺瓶颈从来不在创意而在纪律。没有纪律的生成做得越多返工越狠。1.1 主题生成的三大经典失败场景我在各种群里观察过大家分享的翻车截图基本都是这三种第一种是调色盘灾难。模型喜欢把对比色放到相邻位置几个颜色放在一起看还行一旦大面积铺开视觉噪声会直接掩盖核心内容。这背后是缺少色板生成算法处于纯靠经验感觉生成的状态。第二种是有样式无系统。产物里确实有 CSS 变量但变量层级只有一层组件 A 用了--card-bg组件 B 自己偷偷写死了一个#F5F7FA。表面上能跑实际按照设计系统的标准这属于半成品。第三种是一次性彩票。同一个 prompt 跑十次每次出来一套完全不同的颜色和字体。如果给客户做演示还好但如果你想把这套流程接到公司内部系统上这种不确定性直接导致不可交付。theme-factory 的存在本质上就是为了把第三种变成确定性的动作把第二种压缩成一次自检就能发现的问题把第一种直接扼杀在第一步。1.2 这个 Skill 的基本定位用一句话概括它是一个让 AI 在生成主题时遵循设计系统方法论的技能包。你给它一个目标描述、一张参考截图、或者只是一段品牌说明它会按照固定的生产管线运作——提取风格意图、拆解色彩与排印需求、生成结构化的设计令牌和主题代码、再做一轮自检最后输出一份可继承、可维护、可打包的主题工程。它不是教你写 CSS那太低级了也不是替你完成视觉创意那也不现实。它更像是插在设计意图和可上线代码之间的那根质量控制器。2. 拆包 theme-factory技能指令、语义边界与执行触发既然说是官方 Skill那它的载体自然是一个标准技能包。实际内容并不复杂核心就是一整套 SKILL.md 指令连同少数辅助模板文件。我把它拆开之后真正有价值的部分其实在三层输入协议、输出协议、决策规则。2.1 技能的基本形态指令文件与触发逻辑Skill 的本质是一份写给大模型的岗位说明书。拿到模型手上后模型会根据对话内容判断是否需要激活它。触发逻辑的关键词自然包含 theme、palette、design tokens、皮肤、配色 这些语义但我试过直接说帮我的博客换个好看的样子系统同样能调起来——说明触发条件是语义化的不是死板的字符串匹配。这份说明书会定义几个关键要素能力边界什么能做什么不能做输入要求需要哪些参数缺失时怎么处理工作步骤从分析到产出一共几大步约束条件命名规则、色彩标准、默认值输出格式文件清单和内容结构。有意思的是它还会明确要求模型在执行前先做意图理解回显。也就是说它不是直接开干而是先用自己的话复述一遍任务再列出假设和参数让你确认之后才动手。这个设计看起来像个笨步骤实际极大避免了设计意图被误读五条街的悲剧。2.2 输入协议先补齐参数再谈生产我在实际使用中总结出的核心输入字段包括这些输入字段说明是否必填theme-name主题名称用于命名空间和导出文件名是brand-palette品牌主色或品牌参考截图决定色板基调建议填target-platforms目标平台Web / VS Code / Figma / 文档站等是style-tags风格描述明亮、柔和、工业、极简、古典等建议填constraints硬性限制禁用某些颜色、固定某个字体等否我最在意的是第 4 和第 5 项。如果你只给明亮两个字模型会默认走一套很安全的浅色方案但如果你想的是舒适的夜间阅读模式那必须在 constraints 里写明背景色要给低亮度值。这些参数最后会被转化成一套内部基线供后续所有决策作锚点。2.3 输出协议四类产物缺一不可它产出的不是一个 CSS 文件而是一个文件族。默认情况下会包含design-tokens.json所有颜色、字体、间距、圆角、阴影的数值化定义theme.css基于 tokens 编译出的 CSS 变量文件支持明暗模式切换theme-guide.md一份面向使用者的人类可读说明包含色板展示、用法示例integration-tips.json如果目标是特定平台会额外产出适配配置提示。这套输出结构最大的好处在于即使你完全不认同它的配色方案你依然可以直接拿着 tokens 文件去改数值而不用在几十个样式文件里海里捞针。这个先项目化再审美化的顺序是工程经验最集中的体现。2.4 内建的决策规则与降级策略官方 Skill 里最容易被忽视的其实是几个降级逻辑。当输入信息不足时它不会硬着头皮瞎猜而是按优先级触发默认规则未提供品牌色默认使用一组中性蓝色作为主色并显式告知这是占位色未说明目标平台默认走 Web CSS 变量方案目标平台之间冲突比如要求同时兼容某设计软件和 Web它会生成两套导出物并分别标注参考图无法识别色彩它会量化提取主色区而不是强行逐像素去匹配。这些降级策略让我意识到这个技能的设计者非常清楚大模型的短板它擅长看到语义却不擅长憧憬未知。与其让模型放飞自我生成一套想象中的主题不如让它老老实实基于可验证的基线做扩展。所以我后来用的时候几乎都会刻意留一个参数不填观察它如何处理缺省值——这本身就是对模型心智模式的一次很好的压力测试。3. 一次完整实操把一段设计意图变成可发布主题包理论说够了我们直接来过一遍完整的工作流。为了模拟真实场景我这次没有用现成品牌色而是给了一段模糊描述一个适合中文技术博客阅读的主题明亮但不过曝强调内容沉浸度代码块要清楚需要有深色模式。3.1 输入材料准备与意图确认第一轮我先丢出上面的描述没有任何额外参数。模型首先做了意图回显我把它理解出来的要点摘取一下色彩取向高明度背景、低纯度中性色、模块间用阴影而非重边框分隔代码块偏好高对比背景、等宽字体、语法高亮不能刺眼深色模式保持同色相体系但明度整体下移 30~40%字体策略优先系统字体栈中文优先使用无衬线等宽字体用于代码。回显出来的东西和我的本意基本一致这是一个好信号。确认之后它主动要求我补充两个参数主题命名我定了 tech-reading和目标平台Web然后就进入了生产阶段。3.2 从色彩基线到设计令牌第一步是确定主色。由于没有品牌参考它选取了偏冰冷的蓝灰色 #2563EB 衍生系作为强调色中性色则是带一点点灰底的低饱和白 #F7F8FA。这里有个细节让我很满意它不是简单地给三四个色值而是直接生成了一个 10 阶的色阶梯度。我后来单独问过它的取色逻辑才发现它默认在 OKLCH 色空间里做插值。这非常重要因为传统 HEX 颜色在渐变插值时中间色经常发灰、偏脏人眼感知不均匀。OKLCH 解决的是看起来均匀的人眼感知问题。这一点如果你是自己手动调色几乎不会想到但它对于生成一个专业的 10 阶色板却是决定性的。生成的 tokens JSON 长这样{ brand: { primary: { 50: #EEF3FE, 100: #DCE6FC, 200: #BBCEF9, 300: #93AFF4, 400: #5C88ED, 500: #2563EB, 600: #1D4ED8, 700: #1E40AF, 800: #1E3A8A, 900: #172554 }, neutral: { bg: #F7F8FA, surface: #FFFFFF, border: #E5E7EB, text: #111827, muted-text: #6B7280 } }, semantic: { success: #10B981, warning: #F59E0B, danger: #EF4444, info: #3B82F6 }, dark: { bg: #111827, surface: #1F2937, border: #374151, text: #F9FAFB, muted-text: #9CA3AF } }注意它把深色模式下的颜色列完整了不只是一个dark-bg就收工而是一整套完整的中性色阶。这就是专业系统和个人随手写的分水岭。3.3 主题 CSS 与组件变量映射tokens 确定之后下一步是把它映射到 CSS 变量并细化组件级状态。它生成的 CSS 片段里我最喜欢的是按钮部分的实现:root { --th-bg: #F7F8FA; --th-surface: #FFFFFF; --th-primary: #2563EB; --th-primary-hover: #1D4ED8; --th-primary-active: #1E40AF; --th-primary-disabled: #93AFF4; --th-border: #E5E7EB; --th-text: #111827; --th-muted: #6B7280; --th-radius-md: 8px; --th-shadow-sm: 0 1px 2px rgba(0,0,0,0.05); --th-shadow-md: 0 4px 8px rgba(0,0,0,0.08); } .btn-primary { background: var(--th-primary); color: #FFFFFF; border-radius: var(--th-radius-md); box-shadow: var(--th-shadow-sm); transition: background 0.2s ease, box-shadow 0.2s ease; } .btn-primary:hover { background: var(--th-primary-hover); box-shadow: var(--th-shadow-md); } .btn-primary:disabled { background: var(--th-primary-disabled); cursor: not-allowed; }注意--th-primary-disabled不是随便找了一个浅色调出来的它是基于主色色阶的第 300 级同时做了饱和度调整避免看起来是灰的但带一点点脏蓝这种廉价感。悬停态用的是比主色更深的 600 级这种语义化取色规则完全符合设计系统里常见的按色阶步进模式。3.4 对比度自检与人工复核输出最后它没有直接说完成了而是给了一张自检清单每一条都标了实际的对比度数值正文 #111827 在 #F7F8FA 背景上的对比度约为 14.1:1满足 AAA 标准深色模式正文 #F9FAFB 与 #111827 背景对比度约为 15.3:1同样满足强调色 #2563EB 作为普通 UI 组件的背景时白色文字的对比度约为 4.6:1满足 AA 标准但muted-text#6B7280 在白色背景上的对比度只有约 4.1:1作为正文刚好踩线作为小字号辅助文字则不达标。最后一条它主动提醒我如果辅助说明文字会比较小建议把muted-text调深一档到 #4B5563这样对比度会提升到约 7.1:1。这个自我纠偏动作让我很意外因为它不是简单罗列参数而是真正基于排版场景做了风险判断。这其实也是 skill 内置的决策规则在起作用——它被要求在每个可能影响可读性的地方做一次额外的合理性检查。到这里主题包的核心部分已经齐整了。如果你只是想自己用theme.css和 tokens 文件就够了如果你打算投入到生产环境接下来还得处理我踩过的那些坑。4. 实测翻车日志五个高频问题与修复链路再好的 skill 也不是免死金牌。我在重复测试中遇到过大量翻车场景这里挑五个最有代表性的把完整排查链路写出来。排查思路比答案本身更值得看。4.1 近似色让 contrast 静默失守第一次跑深色模式配色的时候产物看起来一切正常背景 #111827文字 #E5E7EB。肉眼看上去对比度显然没问题可我一测发现某个小号辅助文字实际用的是 #9CA3AF这个颜色在 #111827 上对比度只有大约 5:1按 UI 组件标准是合格的但按小号正文的 4.5:1 也勉强如果用户把屏幕亮度调低几乎看不清。根因在于技能生成 10 阶色阶时第 400 级和第 500 级之间的差异在人眼看来非常接近AI 把它当作可以用作辅助文本的色值但实际数值上仍存在风险。修复方法是给 skill 增加一条硬规则所有语义文本色必须经过显式对比度计算如果低于阈值自动后退一档色阶。后来我还让它在输出注释里直接写上本色值对比度通过 AA字样方便我在代码里一眼验证——把隐性问题变成显式注释这个思路在任何自动化工具里都通用。4.2 命名习惯漂移导致多组件无法对齐有一版输出让我印象深刻token 命名里同时出现了--font-main、--family-sans、--text-font三种写法分别出现在 头部、正文、侧边栏 的样式里。单独看每一段都正常合在一起就精神分裂。这种情况比颜色错误还阴险因为它不报错你自己的开发体验会非常痛苦。出现原因是模型在一个比较长的输出流程中一开始选定了某个命名体系执行到后面上下文注意力衰减又换了一套同义但不同形的命名。要避免这个不能靠记得保持一致这种软指令而是要靠命名规范表硬约束。我在 skill 的文件里加了一个命名 Schema 强制块把常用 token 的命名前缀做成枚举表格禁止出现任何不在表内的变量名。效果立竿见影后续几乎没再出现过同类问题。这一步的经验是凡是需要跨组件保持稳定的概念绝对不能用自然语言约束必须用枚举结构约束。4.3 参数缺失导致整套系统崩溃有一次我只丢了一张截图进去没给任何文字描述。当时预期是它能从截图里自动提取品牌色结果产出的色板完全偏离它把截图里暗角阴影的颜色当成了主色调导致生成的是一个灰色调主题跟我想要的完全相反。排查后发现它在截图 → 色彩量化这一步采用的是像素聚类取主色但那张截图的视觉中心是亮色角落是大面积暗影聚类算法把暗影当成了信息量更大的区域于是主色取成了深灰。这不能全怪模型因为输入本身有歧义。修复方法是我给输入协议加了一个focus-region字段提交截图时可以用文字标注取画面中央 50% 区域的主色块也可以直接框选区域。如果不标注技能就必须向用户二次确认主色区域而不是自作聪明。从这次之后我养成了一个习惯凡是涉及参考图的任务宁可多写一句区域描述也不要省。4.4 有了完美 CSS组件碎片却接不上某次生成的目标平台是 VS Code 主题它给出了非常完整的tokenColors配置单个看毫无问题。但当我把它导入编辑器后发现代码注释的斜体样式莫名丢掉了某些语法高亮层的foreground引用了一个未定义的 token 名。这种情况的本质是输出内部不一致——主题主体是从设计系统基线生成的一套独立令牌而编辑器专属映射是另一套逻辑生成的两套逻辑在模型内部没有共享同一个中间表示。换句话说它分别正确了但没有整体对齐。修复链路比想象中简单对所有平台专属输出技能必须先行输出一份共享中间表示比如设计令牌 JSON再从这个 JSON 派生出各平台的具体配置。只要该平台产物里的每个颜色都严格引用自这份 JSON就不会出现指向不存在变量的情况。我把这一步叫单一事实源校验强烈建议所有做过主题迁移的人都检查一下自己的产物是否符合这个原则。4.5 上下文污染上一个主题的影响渗透进下一个连续测试多套主题时我遇到一个很难察觉的问题第三个主题的深色模式背景色里混进了第一套主题的色相。从数值上看它确实生成了新色板但色相偏移的规律明显是拿旧主题当参考了。原因很直接AI 在处理连续任务时对话上下文里前几轮的历史主题会形成隐式先验。如果前一套主题是个红色系后面生成蓝色系主题时深色模式里的蓝灰色会不自觉地偏紫。这是所有 AI 工具在资产生产中都可能踩到的坑。我的对策是在进入新主题生成前强制插入一条重置指令并让技能输出一版基线声明——声明本次任务与前序任务的边界、本次使用的原始参数、以及确认不使用任何历史主题的颜色信息。一般来说这样一轮操作之后颜色就能回到正常轨道。别小看这个动作它几乎是我测试中最常重复做的一件事。5. 把官方技能私有化让它成为团队自己的设计系统生成器官方 Skill 默认是一套通用方法论但用在我们团队内部时我会做三处定制。做完整套调整之后它的产出才真正贴合我们的视觉语言。5.1 扩充风格描述词库缩小模型自由发挥空间默认情况下模型的风格理解非常宽泛。现代两个字它能联想到十几种方向这对一个追求一致性的品牌来说是不确定的源头。所以我们做了一本风格词汇表把内部认可的设计语言全部枚举出来用了哪种色彩倾向、边界条件下偏好怎么处理、什么情况下需要加粗边框、什么情况下完全禁止渐变。这本词汇表会被直接附加进 skill 的知识文件里。从此轻量现代在我们团队内部就是一个有确定含义的词对应明快的背景和克制的阴影重专业则是深色页眉加高信息密度表格。这套自定义词表越厚模型的产出就越贴近团队审美。5.2 让主题包对接到自己组件库的变量层我们团队前端用的是组件库里一套根据经验沉淀下来的变量体系和官方 skill 默认的--th-前缀体系不一样。直接套用官方产出的 CSS 变量意味着还要再做一层迁移浪费工时不说迁移过程还可能漏掉一两个变量。我的做法是直接改写技能的输出协议把所有默认输出前缀映射到团队已有的规范前缀比如--th-primary改为--ui-color-brand-strong。同步在 skill 里内置了一个团队令牌映射表起到字典的作用。这样一家通用工具的产物一旦进入我们团队就是原生语言不需要翻译。5.3 增加回归验证环节让 AI 做 AI 的质检员这是在一次大规模主题重构后总结出来的办法。我们几十套主题并行修改时靠人工逐个检查对比度几乎不可能。后来我写了一套约束检查 prompt在技能生成完主题后自动把产物立即交回给另一轮审查员角色做回归检测检查命名是否全部在许可枚举表内检查引用是否全部指向已定义变量检查对比度是否线性满足阈值检查深色模式和浅色模式是否使用同一套语义色映射。如果审查员角色发现问题它必须先描述根因、再给修复建议然后重新提交一轮生成。实际上这等于把作者-评审-修改-复审这个敏捷流程整套交给 AI 来执行其中的角色切换是通过提示词实现的。因为 skill 天然支持多轮角色切换这个扩展比预想中轻松得多。6. 进阶玩法从单套主题到批量主题矩阵如果你已经把 theme-factory 用顺手了我建议再玩一玩它最擅长的事情批量生产主题族而不是一套一套手搓。这纯粹是效率层面的巨大跃迁。6.1 一次输入输出整个风格矩阵我给同事们演示过一个玩法提交一个 CSV 文件里面每一行是一个主题的参数组合包括不同的主色、风格标签、平台目标。我在提示词里让 skill 按照 CSV 逐行执行生成并确保每套主题的产物都输出到独立命名空间。结果一次任务跑下来一小时左右的时间我们拿到 12 套主题的完整 tokens 和 CSS 文件。这个能力对跨境电商、SaaS 多租户、或者要给不同客户品牌做皮肤定制的团队几乎没有成本收益却巨大。以前一个前端开发一周只能交付两套精细主题现在模型介入以后可以把产能的瓶颈从生成转移到审美验收上这是完全不同量级的效率。6.2 多平台主题的一致性维护typo——我说的是一致性。真实业务中很常见你给 Web 端做了一套主题还需要给客户端加一套品牌皮肤。如果两边由不同的人维护很快会魔法般失去联系。有了这个技能以后我习惯让它在同一份设计令牌 JSON 的基础上同时派生 Web CSS 主题和客户端主题描述文件。这样改一个主色全平台同步生效从根本上避免Web 是蓝色客户端却变成绿色的尴尬。6.3 和构建流程集成让主题生成变成自动化工序再往前走一步是用脚本把 skill 的输出接入到你已有的 CI 流程。比如在主题仓库里提交一个配置文件触发器执行后自动调用 AI 生成所有缺失的模板变量再走一遍对比度质检输出结果作为静态资源发布到 CDN。这样做的好处是即使你不设计新主题每次风格升级都能自动验证老主题在新规则下是否仍然合规。当然自动化会很复杂。我的建议是先跑通手动流程再把 review 环节固化成固定的提示模板最后才算到自动化。不要跳过中间那一步否则出错都不知道在哪一环。在我自己用了三个月之后最后想说的只有一件事官方 skill 的价值不在于它多聪明而在于它把美术直觉变成了可执行的工程流程。如果你现在还在用请生成一个好看的主题这种提示词去驱动 AI我强烈建议你把这个技能包拿回去拆开看一眼。把它的输入协议、输出结构、审查逻辑全部剥开你会突然明白原来那些看起来让人眼前一亮的主题背后其实是一整套非常冷静的判断规则。最后再分享一个小技巧正式投入使用之前请记得为它准备一份你自己品牌的基线审查清单并把所有硬性约束写死在技能描述里。别高估模型的自觉性也别低估它的潜力——你给它的规则越清晰它能转动的半径就越大。