构建实录 / 2026-06-07
提示词工厂:11 个系列、204 张科普海报的批量生产线

这个项目不是应用,是一条提示词流水线:产出喂给 AI 绘图工具的英文提示词文本,由绘图工具生成竖版 3:4 的「博物馆级儿童百科」海报。到目前为止跑了 11 个系列、约 204 条提示词、约 175 张成图——水果/蔬菜/谷物/豆类/坚果五个剖面系列,世界杯三部曲,动物/海洋/危险动物三个自然系列。
它解决的问题一句话能说清:怎么让"再做一个系列"这件事,不需要再做一遍工程。 每个系列都是同一条流水线:
数据(JSON) + 模板(MD) --脚本(PS1)--> 一批提示词(MD) --分组打包--> 笔记包 --AI绘图--> 图片(PNG)
一、数据协议:一条数据,两个受众
每个系列一份 <series>_prompt_data.json,顶层数组、一个元素一张海报。字段设计里有个值得记的决策:同一条数据同时服务两个完全不同的受众——
- 绘图指令字段(
main_visual、habitat_ref)写英文,因为读者是绘图模型; - 卡片文案字段(
features、fact)写中文,因为它们会被印在海报上给孩子和家长看。
列表型字段用半角分号 ; 分隔(如 "honors": "夺冠5次;1958三度捧杯" 这种写法是错的——必须半角),脚本 -split ";" 后按用途重拼:特征点拼成 · 项目符列表,步骤拼成 → 箭头链。
二、模板 × 脚本:placeholder 替换,没有魔法
生成脚本朴素到只有一个循环:读模板、读 JSON、逐字段 .Replace()、按规范落文件名:
$content = $template
$content = $content.Replace("[ANIMAL_NAME_CN]", $animal.name_cn)
$content = $content.Replace("[MAIN_VISUAL]", $animal.main_visual)
$content = $content.Replace("[FEATURE_POINTS]",
"· " + (($animal.features -split ";" | % { $_.Trim() }) -join "`r`n· "))
$fileName = "{0:D2}-{1}-{2}.md" -f ($i + 1), $safeName, $animal.name_cn
文件名规范是流水线的粘合剂:{序号两位}-{英文slug}-{中文名}.md,成图文件名 = 提示词文件名换 .png。提示词和图靠文件名一一对应,中间不需要任何映射表。
一个把我坑过的细节:含非 ASCII 的 PowerShell 脚本必须存成 UTF-8 BOM。PS 5.1 对无 BOM 的文件按 GBK 读,· 会变成 路、→ 变成 鈫?——而且是静默地写进几十份产出里。这条教训现在写在项目规范第一屏。
三、doctor:在生成之前拦住错误
流水线的质量闸门是 validate_prompts.ps1——只读不改、FAIL 即 exit 1 的体检脚本。它自动发现所有 generate_*_prompts.ps1,从各脚本的 param 默认值解析出"数据/模板/输出"三件套路径(还兼容水果系列的历史命名),逐系列检查:
- JSON 可解析、
name_cn/name_en必填、无空字段、无全角分号 - 模板 placeholder 与脚本
.Replace()调用静态对应——模板加了 placeholder 但脚本忘了替换,在生成前就被拦下,而不是等 20 份产出里全带着[MAIN_VISUAL]字样 - 输出文件数 = 数据条数、文件名符合规范、无 placeholder 残留
- 有笔记分组时:覆盖完整、无重复归属、单条不超 18 张
对内容流水线,"静态对应检查"是性价比最高的一条——它把最常见的人为失误(改模板忘改脚本)从"批量污染产出"变成"生成前报错"。
四、笔记分组:系列是内容库,笔记是发布单元
一开始容易犯的错是"一个系列发一条笔记"。实际约束来自平台:小红书一条笔记最多 18 张图,而且 20 张同系列图按顺序切三份,三条笔记就是同一个主题的三次重复。
所以发布单元被单独建模成 <series>_note_groups.json:每条笔记有自己的 slug、中文主题、封面钩子文案和条目清单——20 张的系列拆 3 条笔记,每条必须有不同的细分主题,不许按顺序切块。generate_note_packages.ps1 按分组产出完整的笔记包:封面卡 + 内容卡 + note_copy.md 发布文案 + index.md 顺序清单,发布时照着包发就行。
五、批量出图与密钥纪律
generate_images.ps1 把出图也批量化:读系列提示词目录,逐条 POST 到 OpenAI 兼容中转站的 /images/generations,同名 .png 落进 <series>_images/。密钥只放 .env(gitignore 忽略),项目规范明写:不进 .ps1、不进 CLAUDE.md、不进任何会 commit 的文件。
六、内容红线
给孩子的内容有两条不可协商的线。科普准确性:宁可少写不可写错,只用稳定事实(历史年份、结构原理),会过时的实时数据(世界排名、现役名单)弱化处理,不确定的逐项人工核对,不凭记忆编。版权规避:涉及真实品牌和人物的系列(世界杯队伍),在模板层就禁止真实赞助商 logo、机构徽标、真实人脸——用国旗配色、球衣、符号替代,从源头规避而不是事后审查。
七、新增一个系列 = 补一份数据
流水线的价值最终落在这件事上:新增一个系列的标准流程是 8 步——写数据 JSON(先 1–2 条跑通)、写模板、复制最接近的脚本改字段名、跑生成、写笔记分组、跑打包、跑 doctor、登记使用说明。全程不改流水线本身。11 个系列就是这么长出来的:第一个系列搭流水线花了几天,后面每个系列只是一份数据加一个模板的事。
如果你也在做批量内容生产,这个项目能给的经验有三条:把数据和模板分开(数据变了不动模板,风格变了不动数据);把质量检查做成生成前的静态拦截(比事后人工看产出便宜一个量级);把发布单元和内容单元分开建模(平台约束属于发布层,不该污染内容库)。