提示词工程实战:从三层结构到Midjourney参数与回归测试 简介这份指南围绕AI艺术与ChatGPT的提示工程展开面向初学者与进阶创作者帮助理解提示构成、主题与修饰符的作用并讨论负提示、零提示与对话式提示的适用边界同时把迭代式细化、ReAct提示等策略用于图像生成和对话式应用。内容以提示工程基础、负提示与零提示、技能进阶、AI艺术提示设计、对话式提示工程、语言与意象的力量等章节为主线拆解主体、修饰符、变体与负面提示等要素并配有应用案例与示例提示便于从基础概念到工具实操形成较完整的路径。资源包为1个PDF文件约2.31MB轻量便携适合按章节阅读与查阅。已有69人学习对希望提升提示精度、减少试错的读者有参考价值。可从中获得提示结构拆解、优化思路与工具实践示例用于AI绘画和对话交互场景。1. 一份把提示词当工程文档拆的指南适合谁前阵子帮人看一屏 Midjourney 出图同一条提示词一个人跑出来是灰蒙蒙的水泥森林另一个人跑出来是晨雾里的玻璃温室。模型版本一样参数一样差别全在提示词写得够不够「可执行」。这份《AI 艺术与 ChatGPT 提示工程指南》走的就是这条路把提示词当成可拆解、可复用、可回归验证的工程对象而不是碰运气的咒语。全书从主体提示、修饰符、固化词这些基础构件讲起一路推到 ReAct 提示、迭代式细化以及 Midjourney 与 Leonardo 的画面控制。它适合两类人刚上手 AI 绘画和对话模型、想摆脱「随便写写」的从业者以及已经在用但输出飘忽、需要一套收敛方法的设计与产品岗。2. 提示词的三层结构主体、修饰符、固化词怎么叠一条提示写崩八成不是模型不行而是三层结构里有一层缺了或者混在一起。指南第一章把提示拆成主体、修饰符、固化词再加上变体提示和负提示这个分法看着朴素落到实操里非常省事——因为它给了你一个「哪一层出问题就改哪一层」的定位坐标而不是每次出图不对就整条重写。2.1 主体提示先定焦点不然后面全是白写主体可以是人、地点或物任何构成提示核心的东西。定义主体这一步要做三件事说清这次要产出什么、想清谁会看这张图、挑出能落地的关键词。第三件事最容易被跳过也最容易翻车。关键词的判断标准只有一条这个词能不能被画出来、被验收。「氛围感」不行「霓虹灯在积水里的倒影」行「高级」不行「低饱和、大留白、单一光源」行。处理大体量素材时这一点更明显模糊词会让模型在几十个方向里随机挑一个你要复现的时候完全无从下手。受众这一层常被忽略。给电商详情页做主图主体周围必须留出文案位做概念设定主体就得留出想象空间。同一个「未来城市」两种用途的提示写法不应该是同一套。写法提示片段问题改法模糊一个漂亮的未来城市「漂亮」不可执行玻璃幕墙、空中连廊、黄昏侧光多主体城市、飞船、人物、宠物权重互相抢只留城市其余降权或进负提示抽象有故事感无法翻译成画面半开的门、地上的长影、逆光剪影语言精确度对结果的影响是指数级的不是线性的。含糊的描述会让模型在语义空间里做一次大范围随机采样精确的描述把采样范围压到一个窄区间这才是「稳定出图」的真正来源。2.2 修饰符负责给方向和质感修饰符是加在提示里的额外词或短语用来提供上下文、清晰度、具体性。它的作用不是「让提示变长」而是把主体的表现方向收窄。指南里的例子很直白把「全球变暖」改成「全球变暖的成因与解决方案」输出就从泛泛而谈变成有结构的分析把「健康饮食」改成「简单可操作的饮食建议」输出就从科普变成能落地的清单。落到图像上修饰符我一般分四个维度来配每个维度挑一到两个总数压在 3 到 5 个风格cinematic photography、flat illustration、risograph print材质质感film grain、matte plastic、brushed metal视角镜头low angle、wide lens、macro shot情绪光线overcast、tungsten warm、cold fluorescent超过 5 个修饰符边际收益迅速衰减甚至会互相稀释——「柔光」和「硬光」同时写模型会给你一个既不通透也不锐利的中间态。经验值是一条提示里出现两个以上互相矛盾的修饰符这条提示基本就废了。修饰符还有一个很实用的用法就是给输出「加人味」。同一段机器生成的文案加上「用口语、举一个具体场景、别用行业黑话」这类修饰可读性会立刻不一样。这不算玄学本质是把你的偏好翻译成了模型能对齐的约束。2.3 固化词把「感觉」压成硬约束指南里提到的 solidifier我习惯叫固化词。它和修饰符的区别在于修饰符是「往哪个方向走」固化词是「必须满足什么」。前者影响风格后者影响可验收性。文本场景下固化词是输出格式、段落数、字数区间、必须包含的字段、禁止出现的表达。图像场景下固化词是画幅比例、媒介、光照方案、构图法则、主体占比、留白位置、渲染方式。一条固化词写得好的提示标志很明确拿到结果之后你能逐条打勾。比如电商主图的固化词可以写成——1:1 画幅、主体占画面 60%、留白集中在左上角、纯色背景、画面内无文字、无人物。这六条里任何一条不满足就是这次生成失败不需要再争论「好不好看」。提示固化词写在修饰符之后、参数之前。位置靠后模型对它的遵循度通常更高一些尤其是格式类约束。2.4 用一段代码把三层拼起来手写提示写到几十条之后靠脑子记结构一定会乱。我一般用一个小的组装器把这四层固定下来改动时只动对应字段不碰整条字符串。# prompt_layers.py # 把一条提示拆成四层方便逐层调参、逐层留档 from dataclasses import dataclass, field from typing import List dataclass class PromptSpec: subject: str # 唯一主焦点一句话说清 modifiers: List[str] field(default_factorylist) # 3~5 个分维度挑 solidifiers: List[str] field(default_factorylist) # 必须可验收的硬约束 negatives: List[str] field(default_factorylist) # 只写要排除的名词 def render(self, sep: str , ) - str: parts [self.subject] parts self.modifiers parts self.solidifiers text sep.join(p.strip() for p in parts if p.strip()) if self.negatives: # 负提示单独成段避免和正向词混排后被模型当成描画对象 text f --no {, .join(self.negatives)} return text if __name__ __main__: spec PromptSpec( subject雨夜的旧城区十字路口便利店灯牌亮着, modifiers[湿沥青反光, 低机位视角, 青橙对比], solidifiers[16:9 画幅, 广角镜头, 无人物出镜, 左侧留白], negatives[文字, 水印, 过曝], ) print(spec.render())这段代码没什么技术含量价值全在结构上。subject是唯一主焦点写两个以上就相当于放弃了焦点控制modifiers用列表而不是长字符串是为了逼自己按维度挑选而不是想到什么加什么solidifiers和negatives分开存是因为它们的修改时机完全不同——前两层在探索阶段反复动后两层一般在收敛阶段才定稿。render()里的sep参数值得单独说一句。Midjourney 这类工具用逗号分隔最稳但有些工具对换行更敏感把分隔符做成参数就不用改代码。负提示单独拼--no段是因为负向词一旦和正向描述混在同一个逗号序列里很容易被模型当成「要画的东西」这个坑后面还会再提一次。2.5 零提示与负提示什么时候用什么时候别用零提示就是不给示例、不给上下文直接下指令。优点是快缺点是完全不可控。我的用法是把它当探测工具同一个问题连问五次看模型往哪些方向偏偏出来的那些方向就是你需要补约束的地方。它不适合做正式产出但很适合做第一轮摸底。负提示是写你要排除的东西。这里最常见的错误是把它写成否定句——「不要模糊」「不要有噪点」「不要出现文字」。不少模型对否定结构的处理并不理想容易把「模糊」「噪点」拆成关键词反而强化。正确写法是只写名词一词一条放进独立的负提示字段。错误写法问题建议写法不要模糊否定句被拆词「模糊」反被强化模糊画面里不要有水印和文字句子太长权重被稀释水印, 文字别太暗也别过曝双向否定模型无法解析欠曝, 过曝3. ReAct 提示与迭代式细化让输出从「能看」到「能用」出图能看和能用之间隔着一整套收敛流程。指南把 ReAct 提示和迭代式细化放在一起讲逻辑是通的ReAct 解决「过程可追溯」迭代细化解决「结果可复现」。前者管多步推理后者管单条提示的打磨节奏两个工具配合起来才谈得上把 AI 输出纳入工程流程。3.1 ReAct 的三个字段思考、行动、观察ReAct 的思路是把模型的回答拆成三段先写思考Reasoning再决定做什么动作Acting拿到观察结果Observation之后进入下一轮。它的价值不在于「让模型更聪明」而在于把一次性憋答案变成了可检查的过程链。在只有对话模型的场景里动作可以是列提纲、拆子问题、换个角度重述、交叉自查。真正的硬约束只有一条观察结果必须来自外部不能由模型自己编。这条约束不落实ReAct 就会退化成一段看起来很专业、实际上全是编的推理表演。我一般会在提示里显式规定三段格式并且要求每一轮结束时输出「本轮结论一句话」。轮次上限设 4 轮超过基本就是在原地打转继续下去只会把上下文越堆越乱。3.2 迭代式细化的四轮收敛法迭代细化的核心不是「多改几次」而是「每次只改一个变量并且留快照」。改三个变量然后发现效果变差你根本不知道是哪个改坏的只能整条回退前面几轮的收获全丢。轮次本轮只改观察指标停止条件R1主体与构图主体是否唯一、位置比例是否合理主体识别无误R2风格与质感风格词是否真的体现在画面上连续两张稳定命中R3细节与负向瑕疵是否减少、有没有引入新瑕疵瑕疵不再新增R4参数与固化词画幅、光照、留白是否逐条达标能逐条打勾四轮跑完还没收敛通常不是提示的问题而是主体本身选错了——比如要求一个模型画出它训练数据里几乎没有的东西。这时候继续磨提示是浪费时间换方案更快。每一轮结束后要留快照内容包括完整提示词文本、参数、生成工具、本轮改了什么、一句话结论。这条记录后来会救你很多次尤其是隔了一周客户说「还是上一版好」的时候。3.3 一个可跑的 ReAct 循环骨架真正要防的是模型自己填观察字段。下面这段代码不负责调模型只负责在结构上卡住这个漏洞。# react_trace.py # 只做结构约束每轮必须落 thought / action / observation 三字段 from dataclasses import dataclass from typing import List, Optional dataclass class Round: thought: str action: str observation: Optional[str] None # 必须由外部工具或人填模型不得自填 def close(self, observation: str) - Round: if not observation or observation.strip() : raise ValueError(观察结果为空本轮不成立) self.observation observation return self def check(trace: List[Round]) - bool: for i, r in enumerate(trace, start1): if r.observation is None: raise RuntimeError(f第 {i} 轮缺少观察结果推理链断裂) return Trueclose()是整个骨架的关键。它把「填观察结果」变成一个必须显式调用的动作而调用方是外部脚本或者你自己不是模型。模型只能产出thought和actionobservation空着链条就不完整check()直接报错。check()放在提交前跑一遍作用类似黑匣子——出问题时能一眼看出断在第几轮。轮次上限建议写在调用层不要写进Round结构里这样换任务时不用改数据结构。3.4 对话式提示工程把多轮当状态机多轮对话最大的问题是上下文漂移。聊到第十轮模型对你最初定的格式要求已经记不清了输出开始走样。解决办法不是每次重发一遍全部要求而是设一个锚点段落隔几轮重述一次。# anchor.py ANCHOR 角色{role} 目标{goal} 输出格式{format} 硬约束{constraints} 禁止{forbidden} 回答前先用一句话复述上述要求再开始作答。role写清楚模型扮演什么goal一句话说清这次任务的终点format必须具体到字段名或段落结构constraints放字数、条数、必须覆盖的点forbidden放不要出现的表达和不要展开的方向。最后那句「回答前先复述」是个低成本自检。模型复述错了说明它理解偏了这时候纠正的成本远低于等它输出完一大段再回滚。4. Midjourney 与 Leonardo把语言意象翻译成画面参数文本提示和绘画提示的差别不在词汇量而在「有没有物理约束」。文字可以写「他很孤独」画面必须写成「一个人坐在长桌尽头头顶一盏灯其余座位空着」。指南里专门用一章讲语言与意象讲的就是这个翻译过程。这一章把翻译过程拆成可操作的段落结构、参数表和工具差异。4.1 Midjourney 提示的分段写法我把 Midjourney 提示固定成六段主体、场景、风格媒介、光照、镜头构图、参数。顺序固定下来之后出问题时能快速定位是哪一段拖后腿。# mj_prompt.py def mj_prompt(subject, scene, style, light, camera, params): body , .join(x.strip() for x in [subject, scene, style, light, camera] if x.strip()) return f{body} {params}.strip() print(mj_prompt( subjecta rain-soaked crossroads at night, sceneold town street, a convenience store sign glowing, stylecinematic photography, fine film grain, lightmixed cyan and orange light, reflections on wet asphalt, cameralow angle, wide lens, deep depth of field, params--ar 16:9 --no text, watermark --stylize 200, ))subject和scene分开写是因为它们的修改频率完全不同主体定了基本不动场景可以反复换。style控制在两到三个词多了会互相打架。light是图像提示里性价比最高的一段光源方向、色温、反射介质这三件事写清楚画面质感能上一个台阶。camera负责空间关系低机位加广角会天然带出压迫感。params单独抽出来是为了让参数和描述解耦。同一套描述换不同画幅做 A/B只改这一个参数就行。4.2 参数与权重几个常用项的边界参数/语法作用常用取值注意--ar画幅比例1:1、16:9、9:16改了画幅主体位置要重调--no排除元素名词列表只写名词别写句子--stylize风格化强度0–1000常用 100–400调太高会盖掉主体细节--chaos结果多样性0–100调高之后基本不可复现::分段权重主体2::背景::1权重差超过 3 倍容易失衡--stylize是最容易被滥用的一个。很多人出图不够「有感觉」就一路往上加结果主体被风格彻底淹没人脸糊成一团。我的习惯是从 200 附近起步需要更写实就往下压需要更插画化再往上加一次调 100不跳档。::权重语法的用法是给每一段单独标权。写a red car::2, city street::1表示车的权重是街道的两倍。这个语法很有效但差距不能拉太开主体2对背景0.5已经接近极限再大就容易出现结构崩坏。--chaos在探索阶段有用能一次给你四种完全不同的构图帮你找方向。但一旦进入收敛阶段就必须归零否则你永远拿不到第二张一样的图迭代细化的前提直接没了。4.3 Leonardo 的负提示与引导强度Leonardo 的面板结构和 Midjourney 差别不小最直观的一点是它有独立的负提示输入框不用挤在参数里写--no。做需要精确排除的活比如不能出现文字、不能出现多余手指这一点比命令行参数好用得多。几个参数的实际手感Guidance Scale 控制提示词对生成结果的约束强度。偏低画面松散、不贴提示偏高会僵硬、色彩发死、细节过度锐化。常见做法是先取中间值出一张然后上下各走一步看哪一侧更接近目标不要一次跨太大。Image Guidance 是垫图强度。垫太高等于在描图风格被参考图完全锁死垫太低等于没垫白费一张好参考。这个参数和参考图的构图复杂度强相关抽象参考可以垫高复杂参考要压低。Prompt Magic 会对提示做一次自动增强。好处是短提示也能出细节坏处是你对画面的控制权被分走了一部分。做需要稳定复现的商业图时我一般会关掉它宁可自己把提示写长。注意不同工具对同一个语义的处理方式并不一致同一套提示在 Midjourney 和 Leonardo 上跑出来的差异经常比调参数的差异还大。换工具时不要直接搬参数只搬描述层。4.4 语言与意象抽象词怎么落到视觉词这是整本书里我觉得最实用的一节。抽象词不能直接进提示必须先翻译成画面元素。抽象描述落不到画面的原因可执行的视觉词高级感无对应视觉特征低饱和、大留白、单一光源、哑光材质科技感语义太宽泛冷白光、玻璃反射、几何线条、无尘表面治愈情绪词暖色温、柔焦、晨光斜射、织物纹理压抑情绪词顶光、窄画幅、深灰调、封闭构图未来时间概念无缝曲面、悬浮结构、冷色补光翻译的时候有个小技巧先问自己「如果只能用一张照片证明这个词我会拍什么」。答不上来说明这个词还没被翻译完。中英混写这件事也值得说清楚。中文负责组织语义和逻辑关系英文负责提供视觉关键词原因是主流绘图模型的训练语料里英文视觉词密度更高同一个概念用英文往往命中更准。但两段要分开写不要一句中文里塞三个英文词那样容易在分词阶段被切碎风格词直接失效。5. 避坑与排查五类翻车现场的记录下面这五条是实打实踩过的按现象、原因、解决三段来写。顺序大致按出现频率排前两条几乎每个新手都会撞上。5.1 主体越写越长画面反而发散现象提示词写到八十字出图里元素一堆但没有一个能当视觉中心。原因多个主体挤在同一层级抢权重模型只能平均分配注意力结果每个都画了一半。修饰符堆太多也会造成同样效果——每个词都在争夺「这条提示到底在说什么」的解释权。解决一条提示只保留一个主焦点其余降权到::0.5以下或者干脆移进负提示。写完先数一遍主语超过两个就砍。修饰符按维度挑同一维度只留一个。5.2 负提示写成了正面句子现象明明写了「不要模糊、不要噪点」出来的图反而更糊更脏。原因否定结构在部分模型里会被拆成关键词「模糊」「噪点」作为高频视觉词被保留下来否定词本身被丢弃。写负提示等于在给画面加元素。解决负提示只写名词一词一条放进独立字段。写完自查一遍凡是带「不要」「别」「避免」的全部删掉前缀重写。5.3 ReAct 里模型「假装」查了资料现象推理链写得很完整每一步都有小结论但引用的数据、日期、来源全都对不上。原因观察字段是模型自己生成的。没有外部输入的情况下模型会把「可能长这样」的结果当成事实填进去整条链看起来无懈可击实际上从第一步就是编的。解决在结构上堵死这条路。观察字段留空由外部脚本或人工填写填完再进入下一轮。链条断在哪一轮一眼就能看出来。5.4 迭代细化越改越糊现象改了七八轮画面离最初那版越来越远也说不上哪里不对。原因每轮改多个变量加上没有留快照出问题之后无法定位只能继续往前改误差一路累积。解决一次只改一个变量其余全部冻结。每轮存一份完整记录提示文本、参数、改了什么、结论。改坏了直接回滚到上一版快照不要试图在坏版本上修复。5.5 中英混写导致关键词被吃掉现象中文描述里嵌了几个英文风格词出来的图完全看不出那些风格。原因中英混排时标点用得乱英文词被长中文句包住在分词阶段就被稀释掉了。多个英文词连写也会互相干扰。解决中文一段、英文一段用明确的分隔符断开英文视觉词两到三个一组不要连成一长串。改完对比一次纯英文版确认风格词是否真的生效。6. 台账与回归测试把一次成功变成可复现做到这一步单条提示已经能稳定出结果了。真正拉开差距的是下一步把成功的那些提示变成可复用的资产。我在项目里会建一张提示词台账字段不多但每条都填编号、用途、完整提示文本、参数、工具与版本、迭代轮次、当时的结论、缩略图路径。填的时候别嫌烦隔两周再回头看没有台账的提示词基本等于丢了你只能凭记忆重写而重写出来的东西一定和原来不一样。台账之上再做一层回归测试。做法很土但有效从台账里挑出十条核心提示每次换工具版本、换参数、换模型都把这十条跑一遍把结果和旧图并排看。指标不用复杂三档就够——主体是否还在、风格是否还在、瑕疵是否新增。三项里有两项退化就说明这次变更不能上生产。检查项判定标准处理主体保持主焦点位置、比例、识别度不变退化则回退参数风格保持色调、质感、光线方向一致退化则回退风格词瑕疵不新增文字、多余肢体、结构错乱未增加新增则补负提示这套流程还有个副作用就是能治好「凭感觉调参」的毛病。以前改参数全靠手气有了基线对比之后你会很快发现很多参数其实一直在做无用功真正影响结果的只有两三个。还有个小技巧值得单独拎出来把台账里的提示词按「场景」而不是按「工具」归档。同一套描述层在 Midjourney 上可能换个参数就能用在 Leonardo 上可能只需要调整引导强度。按工具归档会让这些复用机会全部沉底。提示回归测试的样本量不必大十条足够但必须固定。样本一变前后就没有可比性了。从那以后我每次接新的出图需求都强制先建一个空台账第一条记录一定是在需求确认当天写下的哪怕当时提示词还是半成品。这个习惯救过我两次——客户中途改需求我能翻出三周前哪一版最接近他最后想要的效果直接回滚加微调而不是从零再来一遍。希望帮到你。本文还有配套的精品资源点击获取