提示工程进阶:五段式提示、ReAct与单变量迭代收敛 简介《Ignite Your Creativity》是一本英文原版提示工程指南面向学习AI艺术创作与ChatGPT对话式应用的人适合入门到进阶的创作者、设计师和开发者系统补齐提示设计方法。全书先讲提示的构成要素说明主题提示、修饰符与固化词各自的作用再介绍负提示、零提示与变体提示的适用场景随后进入ReAct提示、Midjourney等工具的AI艺术提示设计、迭代式细化流程和ChatGPT对话式提示的构建技巧并专章讨论语言与意象在提示中的表现力附有Leonardo应用实操案例与示例提示供读者对照模仿。压缩包仅有1个PDF文件约2.31MB轻量便携便于在电脑或平板上通读和检索。目前已有69人学习下载读者能获得一套可复用的提示搭建思路、常见反例与优化路径以及把文字描述稳定转化为画面效果的实践参考。1. 提示工程的边界为什么同一句话换个顺序输出就判若两人AI 艺术和提示工程这两个词现在被说得太轻好像会打字就能出图。真做久了会发现同一段描述换个词序、加一个限定词出来的画面能差出一个档次。这里面没有玄学只有一个很朴素的事实模型接收的不是你的意思而是一串被切碎的词元每个词元都在给下一步的概率分布投票。提示工程做的事就是把模糊意图压缩成一组能被解析的约束——做什么、用什么风格做、什么不能出现、输出成什么形状。这份指南把这件事拆成主体、修饰、固化、变体、负向、ReAct、迭代细化几个环节其中真正拉开差距的不是第一条提示写得多漂亮而是迭代式细化的收敛方法你如何定义变量、如何只改一个、如何判断这次改动是有效还是噪音。理解了这一点再去看那些所谓神级提示词就不会只抄表面文字而能看出它在哪个维度上施加了约束。2. 主体与修饰词一条提示的骨架是怎么搭起来的把提示写成一句通顺的散文是最常见的起点也是最常见的瓶颈。指南给出的解法是把它拆成可组合的部件主体决定生成什么修饰词决定往哪个方向生成固化词决定每次都必须保持什么变体词决定这次只测什么。这四个槽位分开之后调提示就从改一句话变成改一个参数失败了也能定位到底哪一项出了问题。2.1 主体Subject先把坐标系锁死主体是提示里第一个必须确定的槽位。原文的定义很朴素主体可以是人、地点或事物任何构成你想达成的核心的东西。之所以要把它单独拎出来是因为模型的生成本质上是条件概率——给定前文预测下一个词元。主体就是条件里权重最高的那一项它决定了采样从哪一片分布区域里抽。反例最能说明问题。画一只猫这五个字给模型的条件极宽模型只能返回最平均的那只猫正面、居中、光线均匀、背景干净。这不是模型偷懒是宽分布下的众数天然平庸。换成雨夜里蹲在便利店霓虹灯下的流浪猫分布被压到一条窄带上画面里立刻长出具体的东西湿毛发、反光的地砖、冷色环境里的暖色光源。原文还强调了两件容易被跳过的事。第一是受众定义主体时要想清楚这条提示的产出给谁看给同行看技术图和给大众看封面图主体选词完全不同。第二是关键词选择原文特别指出在处理大规模数据集时没有清晰、简洁的关键词就根本无法收窄结果——放到今天多轮对话和批量出图的场景里这条依然成立主体词含糊后面加多少修饰都救不回来。原文同时点出精确语言与模糊语言的分野模糊或歧义的语言会得到不相关甚至误导性的结果。原因不神秘模型处理模糊词的方式是把所有可能解释做加权平均平均出来的往往是个四不像。2.2 修饰词Modifier形容词不是装饰是旋钮原文把修饰词定义为添加到提示里的额外单词或短语用来提供上下文、清晰度或具体性并给了几个很典型的改写把全球变暖改成全球变暖的原因与解决方案把健康饮食改成简单实用的健康饮食建议历史课上的提示加上对社会的影响创意写作里加上魔法王国与神奇生物。这些例子的共同点在于修饰词改的不是语气是任务类型和信息密度。从机制上分修饰词有三类作用点完全不同方向性修饰比如原因与解决方案对社会的影响。它切换的是任务范式从描述切到分析输出结构会整体重排。限定性修饰比如简单实用面向零基础。它压低某一类分支的概率把学术腔、理论化的表达推远。氛围性修饰比如魔法王国霓虹雨夜。在图像模型里它拉的是风格词元的权重改变的是视觉质感而不是内容主体。一个血泪经验是不要在同义词上堆叠。美丽、漂亮、好看、精致四个词扔进去概率不会更集中只会让模型在近义词区间里来回摇摆输出反而更飘。正确做法是一个维度只留一个词加之前先想清楚它在收窄哪个方向。可复现的验证方法也简单先拿裸主体跑一次当基线再每次只加一个修饰词跑一次两次结果放在一起比改动的贡献就一目了然。2.3 固化词与变体词稳定性和多样性的两个旋钮原文提到固化提示solidifier用来加强提示也提到变体提示variation prompt。这两者的关系我一般会这么理解固化词是跨批次不变的那一段变体词是每次只动一项的那一段合起来就是一个控制变量实验。固化词通常承载四类内容输出格式字段、长度、比例、风格锚点摄影介质、渲染方式、构图约束视角、留白、禁止项不要文字、不要水印。它的价值不在于让单次结果更好看而在于让多次结果之间可比——没有可比性你就永远不知道改动是好是坏。变体词则相反它存在的唯一目的就是被替换。替换时最忌讳顺手多改一个因为一旦两个变量同时变动结果变好你不知道是哪个起的作用变差你也不知道该回滚哪一项。这个道理和调参一样写在纸上都懂真上手时几乎人人都会犯。下面这段代码把四个槽位落成一个可执行的模板重点不在代码本身而在那条白名单校验——它强制你先把变量声明出来才能改。# 提示模板把自然语言提示拆成可替换槽位 # 目的不是让提示更高级而是让每次改动只影响一个变量 TEMPLATE { subject: a stray cat, # 主体只放名词短语不塞形容词 modifiers: [rainy neon street], # 修饰一个维度一项避免同类堆叠 solidifiers: [ # 固化跨批次冻结保证结果可比 35mm photography, # 风格锚点 rule of thirds, eye level, # 构图约束 no text, no watermark, # 禁止项 ], variations: {color: teal and orange}, # 变体允许变动的维度集合 } def build(tpl, **override): override 只允许覆盖 variations 里预声明的键防止一次改多个维度 for k in override: if k not in tpl[variations]: raise KeyError(f{k} 未在 variations 中声明先声明再改) merged {**tpl[variations], **override} parts [tpl[subject], *tpl[modifiers], *tpl[solidifiers]] parts [f{k}:{v} for k, v in merged.items()] return , .join(parts) print(build(TEMPLATE)) print(build(TEMPLATE, colormuted grey)) # 只改色彩其余全部冻结这段代码的关键逻辑有三处。subject单独成槽是为了逼你把主体写成干净的短语避免形容词混进来污染坐标系。solidifiers独立成组是为了让它在所有实验里原样复现一旦你开始临时调一下风格词对照就失效了。build里的白名单校验是防守动作它把顺手改两个变量这种失误挡在运行之前——报错比出一张看不懂原因的废图便宜得多。参数上modifiers每项只描述一个维度variations里的键名建议直接用画面或文本的可观测属性色彩、景别、语气、长度方便事后归因。3. 文生图提示的结构化语法五段式与权重到底改了什么图像提示和文本提示最大的差别在于容错率。文本输出跑偏了还能读图像跑偏了就是一张废图而且你很难从图里反推出是哪句话导致的。所以图像提示更依赖结构而不是文采。3.1 五段式结构让每个词各归其位把一条图像提示拆开稳定可用的结构大致是五段主体、媒介与风格、构图与视角、光照与色彩、技术渲染。指南里讲 AI 艺术提示设计的那一章本质上也是在做这种分层——先确定画面里有什么再确定它被怎么拍出来。为什么要分段而不是写成一句流畅的话因为文生图模型的文本编码器会把提示切成词元再和视觉特征做对齐。当风格词散落在句子各处时多个风格描述会竞争同一组视觉方向谁也没压倒谁最后的画面就是风格混叠一半油画一半照片谁看都别扭。分段之后同一段内部的词在语义上互相支持冲突概率明显下降。优先级也需要明确。主体必须前置因为注意力对靠前的词元更敏感主体放在句末模型很可能把它当成修饰成分吃掉。风格词放在主体之后、构图之前因为风格决定的是整体质感它应该先于局部约束生效。禁止项和建议项放最后它们不参与画面构建只做过滤。3.2 权重与顺序括号和数字改的是条件强度加权语法在各家工具里写法不同有(word:1.3)这种带系数的也有(word)这种叠括号的但语义是一致的给某个词元的条件向量乘一个系数系数大于 1 就往那个方向拉小于 1 就往外推。这里有两个必须知道的边界。第一加权不是线性的。系数从 1.0 调到 1.2画面变化是渐进的从 1.3 调到 1.8经常直接崩——过饱和、结构扭曲、主体变形。原因是权重放大到一定程度后该词元在特征空间里压过了其他所有约束包括这应该是一张正常照片这种基础约束。第二加权语法不通用。同一段带括号和数字的提示换一个工具括号很可能被当成普通文字处理输出里真的给你画出括号。跨工具迁移提示时第一件事是把加权符号全部剥掉只保留纯文本再按目标工具重写。顺序敏感性也值得单独说。同一个词放在开头和放在结尾效果差别可能比调权重还大。所以做对照实验时调换词序本身就应该被当成一个独立变量来测而不是改提示时顺手做的调整。3.3 三组示例的逐段拆解下表把同一条提示的槽位拆开看每一格改动会牵动画面里的什么。这种表格比背提示模板有用得多因为它给的是因果不是答案。槽位示例值改这一项会动什么主体一位背着旧帆布包的旅人换主体等于换整张图的语义核心其余槽位需重新校准媒介与风格35mm 胶片摄影轻微颗粒改这里动的是质感与年代感不动内容构图与视角低机位仰拍人物偏左三分线改这里动的是空间关系与压迫感不动风格光照与色彩阴天散射光低饱和青灰改这里动的是情绪基调最容易过度使用技术渲染浅景深背景虚化改这里动的是视觉焦点影响观众先看哪里用这张表做实验有个技巧每次只动一行其余四行整行复制。动光照时发现画面变冷了那是光照的贡献如果你同时把风格从胶片改成数码画面变冷就说不清是谁干的。三组示例跑下来你对自己这套工具的词感基本就建立了——这比收藏一百条提示词管用。4. 从一次性提示到协议零示例、ReAct 与多轮对话前面讲的都是单轮、单次的提示构造。一旦任务变复杂单轮就撑不住了模型要么漏步骤要么自己编一个中间结论往下推。指南后半部分给的三个方案——零示例提示、ReAct、对话式提示——本质上都是在把一次性问答升级成有协议的交互。4.1 零提示没有示例时靠什么对齐零提示指的是不给任何输入输出样例只给指令。它和少样本提示的差别在于模型失去了照猫画虎的参照只能靠预训练阶段积累的任务先验来理解你要什么。这个先验很不稳定。同一个指令模型可能理解成写一段介绍也可能理解成列一个清单还可能理解成给一段分析。所以零提示要成立必须显式补齐三件套任务做什么动词要具体、格式输出长什么样字段、层级、字数、边界信息不足时该说什么什么情况该拒答。第三件最容易被忽略也最容易翻车。不写边界模型遇到不知道的东西不会停它会补一个听起来很合理的答案。补出来的内容语法通顺、格式工整唯一的问题是错的。所以零提示里那句如果资料中没有相关信息直接回答无法确定不要推测不是客套话是给模型一个合法的退出通道。4.2 ReAct把想一想变成可观察的词元ReAct 的核心是把推理和行动拆成交替的步骤而不是让模型一口气吐出最终答案。它的骨架是三段循环先写 Thought说明当前判断和下一步打算再输出 Action指定要调用的工具和参数执行之后把 Observation 原样回填然后回到 Thought基于新观察继续。这套结构为什么有效可以从两个角度看。一是计算层面原本藏在一次前向计算里的多步推理被摊开成多个词元步骤每一步的结果都进入上下文下一步的概率计算建立在这些中间结果之上复杂推理的负担被分摊了。二是纠错层面Action 交给外部工具执行Observation 是真实返回值模型编造的中间结论会在这一步被现实打脸然后它有机会在下一个 Thought 里修正。代价也很明确token 消耗成倍增长延迟变高而且一旦某一步的 Observation 格式混乱后续推理会沿着错误前提一路跑偏。所以 ReAct 适合步骤可验证、工具有确定返回值的任务不适合开放式创作。4.3 多轮对话上下文是资产也是负债对话式提示的直觉是聊着聊着就清楚了但实际用起来经常是聊着聊着就散了。原因是上下文窗口是有限预算而且历史消息不会自动失效。你在第五轮说改成更简短的版本第三轮那句尽量详细展开依然躺在上下文里两者权重接近模型就会给你一个又长又短的四不像。稳住多轮的办法是主动做上下文管理而不是指望模型自己记住重点。常见做法是每轮开头重述一次当前任务 硬约束 已确认的决定把漂移拉回来历史过长时把前面的对话压成几条结论再放回去原始对话丢弃关键约束单独成行不要混在长段落里。下面这段是 ReAct 的最小骨架把上面几节的东西串起来。工具函数是假的结构是真的。# ReAct 最小骨架推理与行动交替观察结果回填上下文 def react_loop(question, tools, max_steps5): history [f问题{question}] for _ in range(max_steps): ctx \n.join(history) # 1) Thought先写判断不允许直接给答案 thought llm(f{ctx}\n请先输出 Thought当前已知什么、下一步要查什么) history.append(fThought{thought}) # 2) Action约束成结构化字段方便程序解析 action llm(f{ctx}\n输出 Action: tool(arg) 或 Final: 答案) history.append(fAction{action}) if action.startswith(Final:): return action.split(:, 1)[1].strip() # 3) Observation真实执行结果原样回填不做改写 try: name, arg parse_action(action) obs tools[name](arg) except Exception as e: obs f执行失败{e} # 失败也回填让模型知道这条路走不通 history.append(fObservation{obs}) return 达到步数上限最后一条观察 history[-1]几个参数值得说明。max_steps是止损阀ReAct 在工具反复返回无用信息时会陷入循环没有上限就是无限烧 token。Observation必须原样回填任何顺手整理一下都会污染后续推理模型会把你整理后的版本当成事实。解析失败时把异常信息当观察结果回填比直接抛错更有用——模型看到参数格式不对下一步往往能自己改对。Final:是显式终止信号比让模型觉得差不多了就停可靠得多。5. 避坑清单六个把提示越改越烂的常见动作提示调优最反直觉的地方在于很多优化动作本身就是问题源。下面六条是按现象倒推出来的每条都能对上具体的机制。5.1 图像侧三个高频翻车现场第一条一条提示塞进五个风格词。现象是画面四不像既不像油画也不像照片细节糊成一团。原因在于风格词竞争同一组视觉特征方向权重接近时没有赢家模型只能做加权平均。解决办法是只留一个主风格词其余降权到 0.5 以下或者直接删掉让主风格拿到决定性权重。第二条用负向词硬压解剖错误。现象是越写不要多手指越多手指越写不要畸形越畸形。原因在于负向词依然会激活对应概念它在特征空间里做的是往反方向推但当这个概念本身很强时推力不够反而因为被提及而加强了存在感。解决办法是改成正向替代加构图规避把不要多手指换成双手插在口袋里从根上减少手部露出比对抗可靠。第三条直接复制别人的长提示当模板。现象是在别人那里出神图在你这里出废图。原因不止是随机种子还包括不同模型版本的词表差异、权重语法不兼容、以及那段提示里大量词是针对特定模型调过的。解决办法是先固定种子再把长提示按五段式切开逐段替换只保留结构不保留具体词这样迁移的才是方法而不是巧合。5.2 文本侧三个隐形陷阱第四条对话里改了需求但没有重述。现象是模型答的还是上一轮的任务你明明已经说了换成另一个方向。原因是上下文里旧指令的权重并不低新指令只是又一条消息两者并列存在。解决办法是每轮开头用一句话重述当前任务与硬约束把新指令的权重顶上去必要时把已废弃的旧指令显式作废。第五条用更专业一点再深入一些这类模糊修饰。现象是输出变长了但准确度没变甚至更啰嗦。原因是这类修饰不改变约束集只改变长度和语气分布模型能做的只是把话说得更绕。解决办法是把模糊要求翻译成可验证的契约要求包含哪几个字段、每个字段多少字、必须引用哪些材料、禁止出现哪些表述。第六条把整篇参考文档塞进上下文。现象是关键信息被淹没模型引用了一句边角料主线结论反而丢了。原因是上下文预算有限长文档会稀释注意力位置靠中间的内容最容易被忽略。解决办法是先摘要再引用把结论前置把要引用的段落单独摘出来放在指令附近而不是整篇丢进去。这六条有个共同点它们都是想省一步导致的。省掉重述、省掉重写否定、省掉切分结构短期看是效率长期看是反复返工。黑匣子不可怕可怕的是改了参数却不记录改了什么。6. 收敛一次只改一个变量比一次改十个更接近目标迭代式细化这个词听起来很温和实际执行起来是全文最费纪律的一节。多数人调提示的过程是这样的出图不满意凭感觉加三个词再出图还不满意删两个词再加两个词。跑了二十轮终于有一张能看但你不知道是哪几个词起的作用下次遇到同类需求还得从头再来。这不是在细化是在碰运气。把提示当代码管是我认为这份指南里最值得带走的一条隐性主张。落到操作上就是三件事版本、对照、回归。版本是每条提示带编号改了什么写在旁边别嫌麻烦一周之后你会感谢自己。对照是同一批次里只允许一个变量不同其余整段复制。回归是攒一组固定输入每次改完提示都拿这组输入跑一遍看老场景有没有被改坏——提示调优最常见的失败不是新需求做不好而是改好了新的、弄坏了旧的。设计取舍上有三组矛盾值得提前想清楚取舍偏向稳定偏向多样固化词比例高结果可预期适合批量生产低单次可能惊艳但不可复现提示长度短约束少模型自由发挥长约束密容易互相冲突约束显式度写死格式与边界机器可解析留给模型判断适合开放创作没有普适解只有场景解。批量出图、要交付的场景固化词拉高、约束写死探索风格、找灵感的阶段固化词压低、允许跑偏。真正要避免的是在同一批实验里两种取向混用——那等于同时动了好几个变量。从那以后我每次改提示都强制走一遍单变量对照哪怕只是加一个逗号也要记一条。听起来过分但正是这个习惯让我从这张图为什么好的困惑里走出来变成能说清这一项改动带来了什么。这份指南的价值也在这里它给的不是一堆可以直接抄的提示词而是一套能让你自己收敛到目标的方法。希望帮到你。本文还有配套的精品资源点击获取