“一天一个开源项目”这个系列写到第 230 篇,能被它选中的基本都不是那种刷 star 的玩具项目,而是真正能把某个痛点解决得让人想发朋友圈推荐的东西。这一篇要聊的 HandRaw-Style 就是典型代表,一句话概括它的价值:把 327 种手绘风格、165 种排版、36 种配色全部编号化,让 AI 画图不再每次都飘。
你如果被 AI 绘画的随机性折磨过,一定能理解这个项目有多救命。同一段提示词,第一张生成出来是干净利落的钢笔淡彩,第二张就变成毛茸茸的蜡笔涂鸦,第三张直接给你糊一层水彩晕染。想复现某次偶然生成的满意结果,把对话记录翻了个底朝天,发现参数一字没改,可再跑一遍就是另一张图了。这类问题不是提示词写的不够好,而是自然语言本身的歧义加上采样过程的随机性,让“风格”这种需要高精度控制的东西变成了抽签。
HandRaw-Style 的做法非常朴素但高效:风格不再是“清新手绘感”“复古质感”这种模糊的自然语言,而是一串确定的编号。手绘风格 SP-001 到 SP-327,排版模板 LT-001 到 LT-165,配色方案 CP-001 到 CP-036。三个维度任选组合,像拼积木一样把每一次生成的风格特征固定死。这篇文章我打算从问题根源拆起,把编号库的设计逻辑讲清楚,再给你一套可以直接照着用的接入方案和避坑清单,适合正在做 AI 素材批量生产、想做手绘风产品化、或者单纯被风格漂移折磨到不想生成的设计师和内容创作者。
1. 我遇到的“风格漂移”问题,比你想象的更离谱
1.1 一个真实翻车现场:同样提示词、三张完全不同的图
我有一次想生成一组植物手账配图,需求很简单:细笔触钢笔画、线条干净、留白多、适合排版文字。提示词我写得很具体,把“fine line”、“steel pen”、“botanical illustration”、“hand lettering border”这些关键词全塞进去了。结果第一张出来确实是线稿风,但线条粗细不均,像用圆珠笔使劲戳的;第二张整体还不错,却突然多了一层淡黄色水彩背景,我的需求里根本没有“水彩”两个字;第三张更离谱,直接变成儿童蜡笔涂鸦。
这个例子说明什么?自然语言描述风格的可控性太差了。模型不是把“细笔触”“干净线条”当作锁定条件去执行,而是把这些词当作概率分布里的一个采样点。每次生成,模型在自己庞大的潜在空间里做随机游走,上一次走到了“钢笔淡彩”的邻域,下一次可能就滑到了“蜡笔”的邻域,中间的过渡状态甚至可能是几种风格的诡异混合体。
1.2 为什么“固定 seed”也救不了风格一致性
很多朋友遇到风格不稳的第一反应是固定随机种子 seed,有用,但救不了风格。固定 seed 本质上只是把初始化噪声和采样路径固定住,它保证的是同一个模型版本、同一组参数下构图大致一样。但如果你微调了提示词里的一个形容词,或者换了采样器、换了模型版本,整体结果马上就会跳变。
更麻烦的是,不同模型对风格词的理解差异巨大。同样一个“vintage sketch”,在某个底模上是复古铜版画,在另一个底模上可能是旧报纸插画,再换一个底模直接就变成波普艺术了。也就是说,自然语言风格词和模型内部视觉特征之间的映射关系本身就不稳定,换个环境就得重新调。用手绘风格的业务场景来说,如果你有二十张图要统一成同一种手绘风,靠随机抽签或者反复改 prompt 来碰运气,时间成本高到没法接受。
1.3 我需要的不只是“好看”,而是“可复现”
后来我想明白了一件事:我需要的不是一个能生成惊艳单张图的魔法词,而是一套能让风格“锁定”的机制。它应该满足三个条件。
第一,同一套设置,不管跑多少次,出来的图风格应该站在同一个聚类里,允许细节不同,但媒介质感、线条方式、排版结构、色调倾向必须一致。第二,风格之间要能自由组合,今天用钢笔淡彩加手账排版,明天用炭笔素描加海报排版,改起来足够方便。第三,这套设置要能够跨模型迁移,不能只在某一个底模下有效,换个模型就得推倒重来。
HandRaw-Style 的编号化设计,本质就是冲着这三个条件去的。
2. HandRaw-Style 的编号化设计,到底在解决什么
2.1 把“玄学风格”变成“确定性参数”,思路像 CSS 类名
我最初看到这个项目时,第一反应是它的底层思路特别像前端开发里的样式管理。前端写样式不会每次用自然语言描述“我要一个蓝色带圆角阴影的按钮”,而是直接给元素挂一个.btn-primary类名,样式细节全部封装在类里。HandRaw-Style 做的事情就是给 AI 绘画里的风格写了一批“类名”,只不过这些类名是编号。
SP、LT、CP 三个前缀分别对应风格、排版、配色,编号后面的数字就是确定性凭证。你在提示词里写SP-042 LT-012 CP-006,就好比你直接告诉 AI:按第 42 号手绘风格、第 12 号排版模板、第 6 号配色方案来画。AI 不需要再从自然语言里去猜“清新”“复古”“淡雅”这些词具体对应什么视觉特征,因为编号背后已经绑定了一份详细的特征描述图谱。
这种设计的直接好处有三个:一是天然抗歧义,编号没有语义漂移空间,在哪个大模型里SP-042指向的都是同一份介质特征描述;二是组合自由度高,三个维度解耦,你换排版不用动风格,换配色也不用重调线条,做到互不干扰;三是沉淀性强,一个编号组合可以被保存成 preset 或者 API 参数,下次直接调用,不用从头再试。
2.2 三大维度拆解:手绘风格、排版模板、配色方案
具体看这三个字段的设计逻辑。SP,也就是手绘风格,管的是“媒介与笔触”。它定义了画面是用什么工具画出来的,以及线条和纹理长什么样。比如SP-010可能指向水彩湿画法,SP-044指向针管笔细线稿,SP-087指向蜡笔硬质纹理,SP-112指向粉笔粉质颗粒感。这个维度决定了 AI 用哪种笔去触碰画面。
LT,也就是排版模板,管的是“元素在画面上的分布方式”。它决定了主体画在哪里、留白留多少、文字和装饰元素怎么摆。LT-003可能是左右留白的书票式排版,LT-021可能是手账日记式的散点分布,LT-055可能是漫画分镜的网格格。这个维度解决的是构图层面的稳定性问题。
CP,也就是配色方案,管的是“颜色倾向”。它不是简单给你一组色号,而是给定一个色调映射规则,相当于给整张图套上一层色彩滤镜。CP-005可能是莫兰迪灰粉系,CP-014可能是棕绿复古系,CP-029可能是蓝白冷调系。这个维度把每次生成的颜色离散度控制在一个狭小的邻域里。
三个维度拼起来,就等于告诉 AI:用什么笔、怎么布局、涂什么色。清晰、完整、可枚举。
2.3 组合语法与优先级规则,比想象中灵活
HandRaw-Style 的用法不是死板的三个编号堆一起,而是给了组合语法和优先级控制。基础用法是把三个编号用加号拼在后缀里,像SP-044 + LT-012 + CP-008这样直接跟在主体描述后面。进阶用法是可以加权重,比如SP-044:1.2表示比默认权重增强 20%,这样当你觉得这套组合里风格感弱了、被主体内容压制住时,可以单独把 SP 拉高。
还有个细节是优先级顺序。我自己测试下来,编号在提示词里的位置会影响控制强度。靠前的位置容易被模型当作主要指令,靠后的位置更像是微调。所以实际使用中建议按“主体描述 + SP + LT + CP”的顺序写,把风格编号放在主体之后立即跟上来,能最大程度避免风格感被主体内容覆盖。
如果做批量生产,还可以用换行或分隔符把主体描述和编号块物理隔离,这能帮助模型把编号当作一个完整的“风格上下文”来理解,减少语义串扰。
3. 327 种手绘风格 + 165 种排版 + 36 种配色,资源库到底怎么拆
3.1 手绘风格 SP-001 到 SP-327 的分类逻辑
三百多个风格编号听起来有点吓人,其实分类逻辑非常清晰。它不是一个扁平的大字典,而是按照媒介工具、线条属性、纹理表现、纸张质感四个维度做了分层。媒介工具决定了底层视觉效果,比如水性、油性、干性、湿性四大类;线条属性决定了笔触的性格,比如均匀、顿挫、细腻、粗犷;纹理表现决定画面的表面质感,比如颗粒、水渍、刮痕、噪点;纸张质感则是背景层的特点,比如白卡纸、牛皮纸、宣纸、网格纸。
四个维度组合下来,数量自然不就上了三百。实际选的时候不用挨个试,先定媒介工具,再定线条性格,基本就能把范围缩小到十来个候选编号。比如你先想要水性媒介,再想要细腻线条,那就是在若干个水彩编号里挑自己更想要的那款质感。
3.2 排版模板 LT-001 到 LT-165 的类型化结构
排版维度看的是“画面内容的组织框架”。一百多个模板听起来多,但实际上手账、海报、卡片这些典型场景都已经覆盖得比较均匀。比如和手绘最搭的手账类模板,从全页边手写批注式到半页插图半页文字式,不下三十种。
我用得最多的是四种类型:手账散点式,元素零散分布在页面各处,适合日记游记类内容;卡片标签式,画面主体居中,周围有标签和花边,适合做图书封面、文创产品图;漫画分镜式,分成四格或者六格,适合叙事型的短篇视觉;大留白海报式,主体只占画面三分之一,其余空着方便后期排版文字或者贴 logo。掌握这四种类型,已经能覆盖大多数内容创作的日常需求。
从这个项目给的默认标签来看,它给每个排版模板都标了使用场景,比如“适合瘦长图”“适合方形图”“适合文字覆盖”。如果你生成的图片后续要叠加大量文字,优先选留白率在 60% 以上的模板,不然后期排版会很痛苦。
3.3 配色方案 CP-001 到 CP-036 的快速选色思路
36 套配色做的是“克制”而不是“丰富”。它不像色卡工具那样给几万个色号,而是只给 36 套能明确区分情绪的场景色系。按我自己的使用习惯,可以按应用场景来选:做植物手账素材,优先考虑 CP-006(鼠尾草绿系)或者 CP-015(燕麦奶米色系);做美食插画,试试 CP-012(陶土红砖色系)和 CP-021(藤黄暖棕系);做科技类配图,选 CP-029(午夜蓝金)或者 CP-033(石墨冷灰系)。
36 套配色基本遵循“主色不超过 3 个、辅助色不超过 2 个”的约束,所以生成出来的图不会因为颜色乱七八糟而翻车。它内部还定义了每个色系的主色占比权重,比如 CP-003 落日橙系里,晚霞橙做主色占到 50%,辅助色是奶油白和铅灰,这样画面拿到手就自带稳定的色彩结构。
3.4 一张索引表的正确阅读方法
拿到 HandRaw-Style 的编号索引表,别急着从上往下扫描。我建议按“排除法”来用:先把绝对不用的介质类型划掉,比如我不需要油画棒、不需要丝网印刷,范围立刻从三百多缩到一百多;再把排版模板按使用场景过滤,比如我只需要方形图、不需要瘦长图,又砍掉一半;最后配色先看色系大方向,锁定冷调或者暖调,再在十几个候选里对比。
排除到最后,实际上经常用的组合可能就固定那么 20 到 30 组。把它们整理成自己的快速选择清单,复制粘贴起来比临时翻索引表高效得多。这个项目允许你自己给常用编号组合做别名标记,我就是把日常最常用的“钢笔淡彩手账模式”“炭笔速写海报模式”建了两个本地预设,调用成本直接降到最低。
4. 实操:把编号化方案接进生成工作流,三步就位
4.1 安装与依赖:需要准备哪些环境
先说安装。HandRaw-Style 本质上是提示词构建和风格特征描述库,运行它不需要独立服务,主要是把映射文件、描述模板和调用脚本集成到你的 AI 绘画工作流里。我在本地的实践是 clone 下来之后先跑一个自检脚本,它会读取全部编号并输出每一条对应的特征描述,确认索引文件没有缺漏。
注意:项目本身不依赖某个特定的大模型,它只是把编号映射成描述文本。但 328 行的特征描述质量是否能在不同底模里生效,取决于你当前使用的模型能不能理解这些描述词汇。我用下来的经验是,在主流绘画底模上表现都不错,但在定制程度很高的二次元专用模型上,建议先用小批量试三组,不要直接大批量跑。
安装目录结构大概是这样:一个存放编号映射表 JSON 的index/文件夹、一个存放描述模板的templates/文件夹,外加一个可以给命令行调用或者被外部程序import的 Python 入口文件。
git clone <项目地址> cd handraw-style python scripts/self_check.py这里的<项目地址>根据你的实际情况替换成你拉取源码的路径即可。自检脚本跑完如果显示All indexes loaded, 528 entries verified,说明环境就绪。
4.2 基础调用:生成一条稳定的风格提示词
核心用法是通过 Python 脚本把主体描述和编号组合起来,生成最终的自然语言提示词。脚本内部做的事本质上是“查表 + 拼接”。
from handraw_style import StyleBuilder builder = StyleBuilder() prompt = builder.build( subject="a potted succulent on wooden desk", style_id="SP-044", layout_id="LT-012", color_id="CP-006", style_weight=1.2 ) print(prompt)输出大概是这样一段文本:
a potted succulent on wooden desk, fine line steel pen illustration, clean contour, delicate hatching, white background with subtle paper texture, handwritten labels scattered around the main subject, palette of sage green, oat milk white, warm charcoal, in garden journal layout, soft shadows, ink linework emphasized 1.2把这整段塞进绘画工具的正面提示词区,负面提示词里按需加上watercolor, crayon texture, oil pastel, over-exposed, messy composition之类的排除项,生成效果就会明显向指定编号靠拢。我这套组合测试了十次,十次的线条媒介和配色都稳在同一个风格域里,差别只在植物姿态和留白细节上。
4.3 进阶用法:批量批处理与参数组合矩阵
做内容生产时,单张生成不够用,批量才是常态。HandRaw-Style 支持用配置文件驱动批量生成。我建议把常用参数写成一个 JSON 配置,丢到循环里跑。
{ "tasks": [ { "subject": "a cup of coffee with croissant", "style_id": "SP-010", "layout_id": "LT-003", "color_id": "CP-021", "width": 768, "height": 512, "batch": 4 }, { "subject": "a stack of vintage books", "style_id": "SP-112", "layout_id": "LT-055", "color_id": "CP-014", "width": 768, "height": 768, "batch": 4 } ] }跑批时会发现,同样一个手绘风格编号,配不同排版和配色,出来的氛围完全不一样。这里面参数的优先级值得研究。源码里默认是SP > LT > CP的控制强度顺序,也就是当视觉冲突发生时,先保风格媒介,其次保构图,最后保色调。如果你更在意色调统一,就把 CP 的权重手动调高,比如写成CP-014:1.3,让它压过其他两个维度。
4.4 把编号化方案接入 Web 界面或 API 的思路
不是所有人都在命令行工作,很多设计师习惯在 Web 界面里操作。我的做法是写了一个小的本地服务,把编号映射成界面下拉框。前端拉三个下拉框,分别选择风格、排版、配色,后端调用StyleBuilder生成提示词,然后把提示词塞给绘画接口。
如果你在调用某个第三方绘画 API,直接把上面生成的长提示词放进prompt字段即可。需要强调一点:启动生成前,检查模型版本参数是否固定。模型版本一变,编号对应的描述词虽然不变,但底层模型对这些视觉词汇的响应可能产生偏移。我的经验是,同一个编号组合在 A 模型和 B 模型下,风格相似度可能只能保持七到八成,所以正式投产前先做一轮模型版本兼容性测试,锁定一个主用版本,别频繁换。
注意:接入自动化工作流时,建议把编号字典单独打包上传到对象存储,不要每次运行都重新加载整个 JSON。对这个量级的数据,解析耗时虽然不大,但在高频调用下能省则省。
5. 踩坑记录:风格编号失效的常见原因与排查手册
5.1 问题速查表:现象、原因、解法
我在实际使用中积累了一些典型问题的排查经验,整理成了一张速查表,方便对照参考。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 编号完全没生效,风格和默认模型一致 | 编号拼写错误或索引库未加载成功 | 跑自检脚本验证映射表,检查编号前后是否存在多余空格 |
| 风格生效了,但整体色调偏离严重 | 配色编号与风格编号不兼容 | 改用同类色系的 CP 编号,或者降低 CP 权重让 SP 主导 |
| 排版模板没生效,画面全是主体内容 | 主体描述的词元信息量过大,压制了排版描述 | 把排版模板的权重提升至 1.4,并将主体描述中关于构图的词删掉 |
| 批量生成时部分图片风格跳变 | 绘画接口在批次内使用了不同的模型版本或采样器 | 锁定 model 和 sampler 参数,必要时在 API 请求里写明版本号 |
| 多次生成出现轻微水印或纸纹不稳定 | 纹理类描述在不同 CFG 值下响应不同 | 固定 CFG 值在 7 到 9 之间,避免过高的自由发挥 |
| 换底模后风格明显偏掉 | 目标底模对精细线条类描述不敏感 | 先在目标底模上做编号描述覆盖测试,筛选兼容组合 |
| 加了多个编号还是稀疏感强 | 风格权重整体太低 | 检查组合中是否同时存在负权重设置,调整全局风格权重 |
5.2 三个容易被忽略的细节
第一个细节是坐标系问题。LH 风格编号在方形构图和宽幅构图上表现差异很大。LT-003这类左右留白模板在方形图上还能看出结构,放到 16:9 宽图上就可能直接被拉伸成中间一小团、两边大片空白,看起来像没加排版。建议在配置里为不同宽高比分别选配模板,不要再为瘦长图选方形图模板。
第二个细节是负面提示词的配合。如果你的负面提示词里也写了风格类词汇,比如“no watercolor”但当前风格编号恰好就是水彩,模型就会陷入矛盾。排查时先清空负面提示词里的风格词汇,只保留low quality, blurry, extra fingers, messy这类与风格无关的质量词,能减少大量冲突。
第三个细节是权重增量并不是越大越好。我之前把SP-044:1.8直接拉满,结果生成出来的画面线条深到像用马克笔描边,完全失去了钢笔淡彩的轻盈感。经验值是在 1.1 到 1.3 区间最安全,超过 1.5 容易产生过饱和或边缘过重的副作用。
5.3 如何验证一套编号组合是否稳定
验证稳定性不能只看两张图,至少要做一个十张抽样组。操作方式很简单:固定主体描述和编号组合,保持所有参数不变,连续生成十张,然后逐张检查三个维度是否都保持一致。
我的判断标准有三条:风格媒介一致性,水彩就还是水彩,不能出现蜡笔或彩铅混进来;排版结构一致性,主体所在位置和留白区域基本稳定,不能每张构图切线都不同;色调倾向一致性,主色和辅助色的比例关系不出现大的偏移。如果十张里八张以上通过三条检查,这组编号就可以放心批量使用。
提示:建议把每次验证的结果保存成一个评估表格,记录模型版本、CFG、采样器、日期、表现评分。长期积累数据以后,你就能知道哪一套编号在哪个模型上是最稳的,遇到换模型直接查表,不用重新试。
6. 从“能用”到“好用”:我对编号化手绘方案的几点体会
用了两周之后,我最大的感受是,这个项目没有试图消灭 AI 绘画的随机性,这是不可能的,也是没必要的。它所做的是把随机性限制在一个可控的邻域里:每张图依然有不同的细节变化,但媒介、排版、配色这三件最影响风格认知的事情被牢牢定死了。对创作来说,这种“可控的变异”其实是理想状态——既有新鲜感,又不会跑偏。
项目把艺术作品里最抽象的“风格”二字拆成了可枚举、可组合、可迁移的参数,从实际体验来看是行得通的思路。我建议你在使用它的时候,不要把它当成死的编码库,而是当作一套风格坐标系。先花半小时浏览索引,选出 10 组自己有眼缘的编号,然后用这 10 组组合去批量生成,很快就能建立自己的风格预设库。后续所有项目,直接调用预设,再也不用为“这一张风格为什么飘了”失眠。
最后告诉一个小技巧:批量生成时不要一个编号组合只跑一次,一组设置连续跑 6 到 8 张,会让你更直观地看到这个编号的稳定边界在哪。如果你发现 8 张里有两三张明显不一致,就先别硬用,换一套兼容编号或者调整权重,直到稳定边界符合你的预期。这个项目有意思的地方就是,你把所有变量都理顺之后,AI 绘画那个“飘”的问题,真的可以被驯化成一种稳定输出。