6.4 KiB
6.4 KiB
13. 标签驱动提示词工程
一句话概括:40+ 预定义标签映射到精确的图像生成指令,保障风格一致性与管线友好性。
处理流程
flowchart LR
A["用户选择标签\n+ 输入描述"] --> B["Tag Mapper\n标签→指令映射"]
B --> C["Prompt Template\n三段式结构组装"]
C --> D{"LLM 可用?"}
D -->|"是"| E["PromptOptimizer\nLLM 精炼"]
D -->|"否"| F["Fallback Template\n模板生成"]
E --> G["Final Prompt\n最终提示词"]
F --> G
G --> H["AssetGenerator\n文生图 API"]
style B fill:#7c4dff,stroke:#333,color:#fff
style D fill:#ff9800,stroke:#333,color:#fff
style G fill:#4caf50,stroke:#333,color:#fff
标签分类体系
系统内置 40+ 预定义标签,分为 7 大类别,每条标签精确映射到一条图像生成指令。
内容类型 — 决定布局与格式
| 标签 | 映射指令要点 |
|---|---|
瓦片/图块 |
瓦片集,可无缝拼接,网格排列,白色背景 |
背景/远景 |
三层结构(远景/中景/前景),视差滚动适配 |
前景/装饰 |
独立遮挡物,白色背景,可叠加 |
图集 |
多元素打包,网格排列,白色背景 |
纹理 |
可无缝平铺,白色背景 |
序列帧 |
连续动画帧,网格排列,标注方向和帧数 |
纸娃娃部件 |
可组合散件,统一比例和锚点 |
美术风格 — 决定渲染技术
| 标签 | 映射指令要点 |
|---|---|
像素 |
严格像素网格,无抗锯齿,有限色盘 |
卡通 |
粗轮廓线,明亮饱和色彩,夸张比例 |
手绘 |
自然笔触纹理,不规则线条 |
矢量 |
干净几何形状,平滑曲线 |
扁平 |
无阴影或极少阴影,纯色块面 |
色调配色
| 标签 | 映射指令要点 |
|---|---|
暖色 |
红橙黄为主,温暖活力氛围 |
冷色 |
蓝青紫为主,冷静神秘氛围 |
鲜艳 |
高饱和度,强烈对比 |
柔和 |
低饱和度,温和内敛 |
单色 |
单一色相,明暗层次 |
线条粗细
| 标签 | 映射指令要点 |
|---|---|
无 |
无线条轮廓,纯色块面 |
细线 |
0.5-1px,细腻精致 |
中等 |
1-2px,清晰明确 |
粗线 |
2-4px,粗犷有力 |
场景氛围
| 标签 | 映射指令要点 |
|---|---|
森林 |
树木、藤蔓、蘑菇、落叶 |
地牢 |
石砖墙壁、火把、蛛网 |
城市 |
建筑、街道、路灯 |
太空 |
星云、行星、飞船 |
水下 |
珊瑚、水草、气泡 |
沙漠 |
沙丘、仙人掌、绿洲 |
光照效果
| 标签 | 映射指令要点 |
|---|---|
明亮 |
充足自然光,无深阴影 |
昏暗 |
低光照,柔和阴影 |
戏剧 |
强烈明暗对比,聚光灯效果 |
霓虹 |
高饱和彩色光源,赛博朋克辉光 |
情绪基调
| 标签 | 映射指令要点 |
|---|---|
欢快 |
明亮色彩,圆润造型 |
黑暗 |
深色调,尖锐造型 |
神秘 |
朦胧效果,未知元素 |
史诗 |
宏大场面,壮观远景 |
平静 |
柔和色彩,开阔空间 |
精灵图特殊处理
flowchart TD
T["用户标签"] --> G{"包含网格标签?\n瓦片/图集/序列帧/纸娃娃"}
G -->|"是"| S["注入网格布局指令\n白色背景 + 8-16px 间隙\n投影法可检测"]
G -->|"否"| N["标准布局指令"]
S --> P["Prompt 构建"]
N --> P
当标签命中 gridLayoutTags 集合时,自动注入网格布局专用指令:
- 纯白色背景 (
#FFFFFF) - 帧间 8-16px 纯白间隙
- 间隙内不得有任何像素
- 确保投影法能可靠检测间隙
这些指令对下游的 SplitSprite 切割算法至关重要。
未知标签回退
当用户输入系统未预定义的标签时,不会报错,而是降级为通用风格描述:
func tagToInstruction(tag string) string {
if inst, ok := tagInstruction[tag]; ok {
return inst
}
// 未知标签:作为风格修饰词处理
return fmt.Sprintf("风格特征: %s(用户自定义标签,按其字面含义应用到画面中)", tag)
}
这保证了系统的向前兼容 — 新增标签无需修改核心逻辑。
PromptOptimizer 节点
PromptOptimizer 是 Eino 管线的第一个节点,负责将标签指令组装为最终提示词。
flowchart LR
subgraph "输入"
A["全局风格提示词\nprojectStyle"]
B["任务描述\nprompt + userNote"]
C["标签指令\ntagInstructions"]
D["拒绝原因\nqualityFeedback\n(重试时)"]
end
subgraph "PromptOptimizer"
E["buildMetaPrompt\n组装元提示词"]
F{"LLM 可用?"}
G["callLLMRefine\nLLM 精炼"]
H["fallbackRefine\n模板生成"]
end
subgraph "输出"
I["Final Prompt\n三段式结构"]
end
A --> E
B --> E
C --> E
D --> E
E --> F
F -->|"API Key 已配置"| G
F -->|"未配置 / 调用失败"| H
G --> I
H --> I
三段式输出结构:
| 段落 | 内容 | 示例 |
|---|---|---|
| 【主题】 | 画面主体与场景 | "一个融合像素风格的游戏角色精灵图..." |
| 【风格】 | 艺术风格与视觉特征 | "美术风格: 像素画;色调: 暖色系..." |
| 【技术】 | 分辨率和格式参数 | "输出格式: spritesheet;纯白色背景..." |
LLM 回退机制
当 LLM 不可用时(API Key 未配置 / 网络故障),系统自动降级到模板生成:
flowchart TD
A["callLLMRefine"] --> B{"API Key\n已配置?"}
B -->|"否"| F["fallbackRefine\n模板回退"]
B -->|"是"| C["调用 Chat API"]
C --> D{"调用成功?"}
D -->|"是"| E["返回 LLM 优化结果"]
D -->|"否"| F
F --> G["解析标签\n组装三段式提示词"]
G --> H["返回模板生成结果"]
模板回退同样遵循标签驱动逻辑,保证即使没有 LLM 参与,生成的提示词也具备结构化和一致性。
关联文档
| 文档 | 关系 |
|---|---|
| 05 - 生成管线 | PromptOptimizer 是管线第一阶段 |
| 06 - 精灵图处理 | 网格布局指令影响切割算法 |
| 01 - 系统总览 | 提示词工程在整体架构中的位置 |
| 00 - 索引 | 返回文档总览 |