从 blob 小黑到铅笔少年——我用 AI 给自己画了一套博客配图系统

为什么要搞自己的 IP

事情是这样的 —— 我在用 AI 帮我写博客。文章没问题,但配图一直是个痛点。

网上那些插画要么太商业、要么太通用、要么跟我的内容气质完全对不上。一个写 NAS、Docker、自建服务的技术博客,配一张花里胡哨的扁平插画,怎么看怎么别扭。

后来在 GitHub 上看到 Ian 的 小黑怪诞手绘 Skill —— 用一个黑色 blob 小怪物当固定 IP,白底手绘风配中文批注,专门给技术文章做正文配图。这个思路很对:固定角色 + 固定风格 + 内容驱动。

但问题来了。小黑是 Ian 的 IP,不是我的。

于是 fork、改角色、换画风、踩坑、重来。下面就是全部过程。

起点:fork 了 Ian 的仓库

Ian 的小黑 Skill 结构很清晰:

ian-xiaohei-illustrations/
├── SKILL.md # Skill 定义和工作流
├── references/
│ ├── style-dna.md # 风格 DNA:白底黑线、红橙蓝批注
│ ├── xiaohei-ip.md # 小黑 IP 定义
│ ├── composition-patterns.md # 构图模式
│ ├── prompt-template.md # 生图 prompt 模板
│ └── qa-checklist.md # 质量检查清单
└── assets/examples/ # 示例图

我 fork 到了 Smart-Chou/xiaohei-illustrations ,然后就开始想:怎么把那个黑色 blob 换成我自己。

设计 MarxChou

先用 ChatGPT 生成了几版 IP 设计稿。

三套方案:

  • 卡通风(chibi):3D Pixar 风,彩色精致。好看是好看,但像产品宣传图,不像正文配图。
  • 像素风(16-bit SNES):复古游戏风,跟 Linux/Docker/NAS 的 Geek 气质完美契合。但生图模型对像素风中文标注支持不好。
  • 铅笔素描风:黑白线稿、仅卫衣填青绿色、纯白背景。最终选了这个 —— 既有辨识度,又够简洁,插在文章里不突兀。

定稿的人设:清瘦少年、蓬松凌乱短发、黑细圆框眼镜、青绿色连帽卫衣(胸口黑色 M 字母)、安静专注的表情。

选后端:Seedream 接入

Hermes Agent 有内置的 image_generate 工具,但需要配后端。默认的 FAL 需要 API Key,我没有。

好在已经在用火山方舟的 API(vision 模型就是走火山的),而且火山有 Seedream 文生图模型。Hermes 也有现成的火山插件。

但配置过程踩了个坑:插件安装了、enabled 了,image_generate 还是在找 FAL_KEY。

翻了 Hermes 的文档才发现 —— 插件 enabled 只是注册了 provider,但 image_generate 选哪个 provider 需要在 config.yaml 里显式指定:

image_gen:
provider: volcengine

加上这一行,/reset 重载,通了。模型用的是 doubao-seedream-5-0-260128(Seedream 5.0 Lite)。

插件已启用但未被选中

四轮风格探索

有了后端,开始试风格。这个过程比我想象的折腾 —— 前前后后跑了四轮。

四种风格探索

第一轮:保留小黑风,换角色

直接用原版的白底黑线手绘 prompt,把角色描述从小黑 blob 换成简笔 MarxChou。效果还行,但跟原版太像了,没有自己的味道。

第二轮:像素风

16-bit SNES 像素 MarxChou,坐在桌子前,周围 NAS、Docker 鲸鱼、Linux 企鹅全是像素版。说实话效果不错 ——Geek 味拉满,跟博客气质绝配。但有两个问题:Seedream 对像素风的中文标注渲染不稳定,经常出乱码;而且像素画风做概念隐喻(比如「内容发酵」「信任桥」)天生受限 —— 你没法用 32×32 的像素块表达「想法像面团一样发酵」。

第三轮:chibi 矢量风

精致 3D Pixar 风格,MarxChou 坐在办公桌前,细节丰富。这是「最好看」的一轮,但也是最不适合当正文配图的一轮 —— 太像产品宣传图了,插在技术文章里格格不入。

第四轮:铅笔素描风

用户给出了精确的中文提示词:

手绘铅笔素描风,简约干净线稿,同一个清瘦少年男生,蓬松凌乱短发,黑细圆框眼镜,身穿固定青绿色连帽卫衣,卫衣胸口有黑色大写 M 字母,身形比例统一,五官柔和沉稳,表情安静专注;仅卫衣填充统一青绿色,其余人物、背景全黑白线条,纯色空白背景。

一试,对了。简洁、有辨识度、不抢正文风头。

两个折磨人的坑

坑一:chibi 大头

最早的 prompt 里写了「手绘草图」「doodle」「sketch」这些词。我当时完全没想到,这几个词在 Seedream 眼里就是「请画成小学生涂鸦风格」的指令 —— 人物头占了半个身子,比例像 Q 版手办。

试过的修法:

  • NOT chibi, NOT child, adult proportions → 无效
  • 改成 editorial illustration, New Yorker style → 部分改善
  • 换 Seedream 4.5 模型 → 模型不存在,404
  • 加强负面词:Q版,大头娃娃,chibi,cartoon,cute,child → 还是漂

最后发现根因不在负面词,而在正面风格描述。「手绘草图 / doodle」就是 chibi 触发器。换成「手绘铅笔素描风 + 写实轻漫画质感 + 清瘦少年 + 身形比例统一」,一步到位。

镜子里的 chibi 大头

坑二:画面出现乱线

生成出来的图上经常有莫名其妙的红色 / 橙色涂鸦线和标注,跟场景完全无关。

排查了半天,根因是 prompt 里的这句话:

少量红色 / 橙色中文手写批注

Seedream 把这理解成了「在画面上到处撒点红橙色的涂鸦和文字」。

修法很简单:删掉这句。改为「极度简洁,画面中只出现下述指定的元素」。每个需要的标签在场景描述里逐一指定,不要用通用批注描述。

擦除随机涂鸦

最终 Prompt 模板

折腾了 6 次 commit 之后,落地的模板长这样:

角色(严格锁定):
同一个清瘦少年男生,蓬松凌乱短发,黑细圆框眼镜,
身穿固定青绿色连帽卫衣,卫衣胸口有黑色大写M字母,
身形比例统一,五官柔和沉稳,表情安静专注。
仅卫衣填充统一青绿色,其余人物、背景全黑白线条。
风格:
手绘铅笔素描风,简约干净线稿,纯色空白背景,
线条粗细一致,写实轻漫画质感。
极度简洁,画面中只出现下述指定的元素,
不要任何多余的线条、涂鸦、装饰或标注。
负面提示词:
Q版,大头娃娃,厚涂油画,水彩浓彩,染发,
换外套,无眼镜,脸型变形,五官偏移,夸张表情,
5 collapsed lines
肥胖身材,多人,杂乱背景,阴影过重,色彩杂乱,
chibi,cartoon,cute,child,杂乱线条,多余线条,
噪点,涂鸦,草稿线,多余的批注
{具体场景描述 + 指定标签文字}

改了哪些文件

文件改动
SKILL.md核心定位、提示词全部改为 MarxChou
references/xiaohei-ip.md角色定义:小黑 blob → MarxChou 铅笔素描
references/composition-patterns.md全局替换角色名,动作池更新
references/prompt-template.md完整中文 prompt 模板
references/qa-checklist.md新增年龄和简洁度检查
README.md全文改为 MarxChou
assets/examples/ (14 张)全部重生成
examples/images/ (8 张)全部重生成
MIGRATION.md完整改造记录

完整 diff 和提交历史:GitHub

几条经验

坦率讲,这个过程里学到的不是「AI 生图技巧」,而是「AI 生图这件事的边界在哪」。

1. Seedream 对风格关键词极度敏感

「手绘草图」= chibi,「铅笔素描」= 成人比例。一字之差,输出天差地别。别妄想用英文负面词去压制中文正面词的诱导 —— 正面词的权重远高于负面词。

2. 中文 prompt 比英文 prompt 更稳定

Seedream 是豆包的中文模型,中文人物描述比英文准确得多。「清瘦少年」四个字比 slender young male, ~25 years old, NOT a child 一堆英文管用。

3. 负面 prompt 要穷举

「Q 版」「大头娃娃」「多余线条」「杂乱背景」—— 一个都不能少。AI 不会推理「你不喜欢 chibi 所以也不应该画大头」,你必须把每个不希望出现的东西都列出来。

4. 不要写通用的批注描述

「少量中文手写批注」→ 随机撒涂鸦。正确做法:每个标签在场景描述里逐一指定。给 AI 留发挥空间 = 给 AI 留犯错空间。

5. 逐张审批比批量生成靠谱

14 张示例图,逐张生成 + 逐张检查。中间发现 chibi 问题、乱线问题,立刻纠偏。如果一口气出 14 张再回头看,估计要全部重来。

6. 插件 enabled ≠ provider 被选中

Hermes 的 image_gen 需要显式在 config.yaml 里指定 provider。插件 enabled 只是注册了候选,不指定的话默认仍然走 FAL。

后续:换个后端试试

Seedream 跑了几天之后,我开始想一个问题:每张图 ¥0.25,如果一篇文章配 5 张,就是 ¥1.25。不算贵,但一个月写 8 篇就是 ¥10,写 20 篇就是 ¥25—— 对于一个博客来说,这个开销不是问题,但也不是可以完全忽略的数字。

而且 Seedream 那两个坑 ——chibi 关键词触发和红蓝标签随机涂鸦 —— 虽然找到了规避方法,但本质上是模型的行为特征,不是 bug。你永远不知道下次会不会冒出新花样。

发现一个更便宜的代理

我本来就在用 SchrodingCatAI(xuedingmao.com)的 API 代理跑聊天和 embedding。某天顺手查了一下它的模型列表,发现居然有 gpt-image-2——OpenAI 的图片生成模型,而且走的是 OpenAI 兼容端点。

更重要的是价格:

Seedream 5.0GPT Image 2
单张成本~¥0.25~¥0.01
10 张¥2.50¥0.10
100 张¥25.00¥1.00

25 倍的差距。说实话看到这个数字的时候我愣了一下 —— 这意味着我可以用 ¥1 生成 100 张图,反复试风格、试构图、试不同隐喻,成本几乎为零。

切换配置

Hermes 切换到新后端只需要三步:

Terminal window
# 1. 切换 provider 和 key
hermes config set image_gen.provider xuedingmao
hermes config set image_gen.xuedingmao.api_key "sk-xxx"
# 2. 启用插件(最容易漏的一步!)
hermes plugins enable xuedingmao
# 3. 新会话生效
# /reset

注意第二步 —— 只改 config 不启用插件,image_generate 会报 provider='xuedingmao' is set but no plugin registered。这个跟之前 Seedream 那个「插件 enabled 但 provider 没指定」是同一个坑的对称版本,只是方向反了。

用新后端重新生成了 14 张示例图

换后端之后第一件事:把 14 张示例图全部重新生成一遍,验证迁移效果。

结果出乎意料地好。GPT Image 2 对中文 prompt 的理解不比 Seedream 差,而且在那两个已知的坑上表现更好:

  • chibi 触发: 我没在 prompt 里写 hand-drawn sketchdoodle,直接用的中文「手绘铅笔素描风,写实轻漫画质感」,出来的图比例完全正常,没出现大头娃娃。
  • 乱线问题: 我用的是全中文 prompt,标注只限于场景描述中指定的文字,没有出现随机涂鸦。GPT Image 2 对「画面中只出现下述指定的元素」这条指令遵守得相当好。
  • 色彩控制: Seedream 标注颜色只能用橙色(红色和蓝色容易触发随机装饰线),GPT Image 2 对颜色的遵守更严格,但目前只验证了全橙标注,其他颜色还没充分试。

14 张图,生成时间大约 4 分钟,总成本约 ¥0.14。同样的图用 Seedream 要 ¥3.50。

两个后端的行为差异

跑了两个后端之后,总结了几个值得注意的差异:

Seedream 5.0GPT Image 2
单张成本~¥0.25~¥0.01
Prompt 最佳语言全中文中英文混搭没问题
红 / 蓝标注易触发随机涂鸦目前没发现问题
chibi 触发词hand-drawn sketch, doodle未触发(可能不敏感)
中文文字渲染同样好
角色一致性需要严格负面词同样需要,但漂移更少

有一个反直觉的点:Seedream 作为中文原生模型,在中文 prompt 上应该比 GPT Image 2 强才对。但实际用下来,GPT Image 2 对中国风格关键词(铅笔素描、清瘦少年、蓬松短发)的理解并不逊色,而且在「不要画面中出现多余东西」这条指令上的遵守度反而更高。

这可能不是因为模型能力差异,而是因为我用的是 API 代理 —— 代理层可能对 prompt 做了优化,也可能是 GPT Image 2 本身的泛化能力更强。总之结果是好的。


这套 Skill 现在已经在用了。以后写文章配图,就一句 /skill xiaohei-illustrations,告诉它主题,剩下的它自己搞定。14 张示例图已经躺在新仓库里,随时可以用 —— 或者说,随时可以继续改。

毕竟折腾永无止境。

这里没有答案,但有同路人。

仓库地址:Smart-Chou/xiaohei-illustrations