
简介这份PDF电子书《AI艺术与ChatGPT提示工程指南》面向AI艺术创作者、ChatGPT使用者及希望提升提示设计能力的初中级读者系统讲解如何用精确提示连接自然语言与生成式模型。全书围绕提示工程基础展开涵盖负提示与零提示、ReAct提示、Midjourney等工具的AI艺术提示设计、迭代式提示细化、ChatGPT对话式提示工程以及语言与意象在提示中的作用并附Leonardo应用案例与示例提示技巧。资源包共1个PDF文件大小约2.31MB结构完整、便于随身查阅。已有69人学习适合作为提示工程入门到进阶的参考手册也可用于AI绘画与对话应用的实际练习和方案查阅。1. 提示工程不是「会说话就行」它是一门把概率分布收窄的手艺很多人第一次用 AI 艺术工具和 ChatGPT会觉得提示工程是玄学同一句话昨天出图惊艳今天一塌糊涂。反直觉的地方在于起作用的往往不是你以为的那个华丽形容词而是提示对输出分布的收窄幅度。一段提示真正的功能是把模型面前近乎无限的可能空间切成一个足够小、又足够具体的子集。AI 艺术如此对话式生成也如此。搞懂这个「收窄」是怎么发生的你才知道该加词还是该删词该换写法还是该换参数。2. 提示的分层结构主题、修饰符、固化符与负向约束为什么不能混着写把提示当成一句自然语言来写是最常见的第一层误解。更贴近实现的理解是提示是一组带权重的条件模型在这些条件下做逐 token 采样或者扩散去噪。条件之间会互相干扰所以它天然是分层的——主体定方向修饰符定偏移固化符定边界负向约束定排斥区。混着写不是不行而是失败时你没法定位是哪一层出了问题。2.1 主题subject先划语义域再谈风格模型处理提示不是「读懂句子」而是把 token 序列编码成一个条件向量再在这个向量的约束下生成内容。主体词决定的是这个条件向量的锚点位置。锚点清晰后续所有修饰才有落点锚点模糊条件向量就接近训练分布的均值输出自然落到最高频、最没个性的那类结果上。这解释了一个很常见的现象你写「一个东西赛博朋克电影感8K」出图往往好看但空洞。因为主体那一层几乎是空的模型只能靠后面的风格词硬撑而风格词只改变渲染方式不改变「画什么」。反过来主体写死成「一台生锈的工业机械臂握着半杯冷掉的咖啡」即便不加任何风格词画面也已经成立了。原文里提到的一个对照很能说明问题把「公园散步」改成「魔法王国与神奇生物」画面质变不是因为词更华丽而是主体所在的语义域被整体搬走了。前者落在日常摄影的分布里后者落在奇幻插画的分布里。所以写主体时值得问自己一句这个描述能不能让一个没见过图的人画出大致轮廓如果不行模型多半也不行。还有一层容易被忽略主体不是越具体越好而是要「具体在关键维度上」。人物提示里年龄、服饰、姿态、所处环境这四个维度决定了绝大部分像素至于「善良」「忧郁」这类抽象性格词对图像模型几乎无效对文本模型才有效。分不清哪些词对哪种模型有效是新手最烧时间的地方。2.2 修饰符modifier形容词不是装饰是采样方向修饰符在原书里被定义为「提供上下文、清晰度或特异性的附加词」。换成机制语言它不改变主体是谁只改变主体在语义空间里被拉向哪个方向。文本模型里它表现为注意力权重在相关 token 上的再分配图像模型里它表现为文本嵌入向量的一次偏移。这个区别很重要。因为修饰符是可叠加的、可交换的也是会互相抵消的。你同时写「极简」和「繁复」模型不会取平均给你一个中庸结果而是会在两次采样之间摇摆出图风格随机漂移。同理「明亮」和「暗调」并列等于把光照这一维度的条件抹平了。原文举的两个例子都是「加限定词收窄问题域」的典型把「全球变暖」改成「全球变暖的成因与解决方案」模型输出从泛泛而谈变成有结构的两段式把「健康饮食」改成「健康饮食的简单实用建议」输出的语气和颗粒度立刻从科普变成可执行清单。这里的机制是修饰符把开放式生成变成了带槽位的填空模型不需要自己猜你想要哪一面。比较实用的判断标准是一个修饰符如果可以用「更……一些」来改写它就是有效的方向词如果它只是情绪表达那大概率是噪音。写十个有效方向词胜过写三十个形容词。2.3 固化符solidifier把「希望」变成「必须」原书把 solidifier 译作「固化剂」我一般把它理解成「硬约束词」它不描述内容只描述边界。典型形态是格式约束、长度约束、角色约束和禁止项比如「只输出 JSON不要任何解释」「用三句话不要分点」「以审稿人视角不要赞美」。为什么需要单独一层因为模型的默认行为是「尽量配合」它会自动补上你没要求的东西。你让它写摘要它给你摘要加评论你让它输出表格它给你表格加前言。固化符的作用就是压掉这部分自由度。它的位置有讲究——放在提示末尾比放在开头更有效因为自回归生成时越靠近生成起点的指令对后续 token 的约束越强。一个反面案例是我早期踩过的坑把「必须输出严格 JSON」写在提示第一行后面跟了三百字的业务背景结果模型经常在 JSON 前后加一句「以下是结果」。原因不是它不听话而是那三百字背景把格式指令的权重稀释了。把格式要求挪到最后一句话再补一句「第一个字符必须是左花括号」成功率立刻上去了。这就是固化符的正确用法短、硬、靠后。2.4 变体提示variation单变量原则才是「工程」的部分变体提示指的是固定主体和固化符只在一个维度上替换修饰符批量跑出一组结果做对比。它是把提示从「碰运气」变成「做实验」的关键一步因为只有控制变量你才知道是哪个词起了作用。常见的实现思路是维护三份东西一份稳定的骨架主体 固化符一份可替换的修饰符池按风格、光照、镜头分组一份结果记录。每次只从池子里换一个维度其余不动。这样跑十轮你能得到一张清晰的「哪个词影响哪个维度」的地图而不是十张风格各异的图和一个模糊的印象。提示变体实验里最容易犯的错是同时换两个维度比如既换风格又换镜头。结果好看但你不知道功劳归谁下次复用就失效了。2.5 负向约束它不是删除是把概率质量推开负提示negative prompt常被误解成「过滤器」——好像模型先生成再把不要的东西擦掉。实际机制更接近「排斥」在带引导的采样里模型同时计算条件预测和一个对照预测再把两者的差值放大负提示做的就是把对照预测替换成负向条件于是采样方向变成「朝正向走、同时背离负向」。理解这一点很多怪现象就顺了。第一负提示写得太多效果反而变差因为排斥方向互相干扰采样在多个方向之间被拉平。第二你拼命写「不要多余的手指」手指反而更容易出现因为那些词本身进入了条件向量模型对「手指」这个概念的注意力被抬高了。更稳的写法是把负向词控制在少数几个高价值项上比如「模糊」「水印」「低分辨率」而不是罗列一长串解剖学错误。第三负向约束和正向约束的强度不是对称的。正向词加一个是加一份牵引负向词加一个是加一份排斥而排斥过强会把采样推到分布边缘产生畸变。所以负向词宁少勿多这是血泪经验。2.6 零提示zero-shot你以为没给先验其实借了模型的先验零提示指的是不给任何示例直接下指令。它经常被说成「模型没见过例子也能做」这个说法不准确。真实情况是你把「该怎么做」的先验完全交给了预训练分布。模型在训练中见过大量「翻译」「摘要」「分类」的任务形态所以这些任务的零提示效果好而「按我们内部模板输出」「用我们行业的术语体系」这类私有约定预训练分布里根本不存在零提示必然翻车。所以零提示和少样本提示few-shot不是先进与落后的关系而是先验来源不同前者借模型的后者借你的。判断标准很简单——这个任务的形态在公开语料里常见吗常见就走零提示省 token不常见就老老实实给两三个示例示例的格式一致性比数量更重要。3. AI艺术提示的视觉语法词序、五段式与 Midjourney 的参数化控制文本提示和图像提示在机制上有共性也有硬差异。共性是都要收窄分布差异在于图像模型的文本编码器通常只做一次编码然后把整个向量喂给扩散过程中间没有「逐词纠错」的机会。这意味着图像提示对词序和词间冲突的敏感度远高于文本提示写错顺序的代价是整张图跑偏。3.1 词序即权重为什么前几个词决定构图多数图像工具的提示解析是分段加权的越靠前的片段对整体构图的约束越强。常见的实现思路是给序列前段更高的注意力权重或者在解析时把前若干 token 视作「主体段」。这不是玄学而是编码器位置权重和工具侧解析策略共同作用的结果。实践含义很直接主体必须放在最前面风格、光照、镜头这些「渲染层」词往后放。很多人习惯先写「masterpiece, best quality, 8K」再写内容等于把最高的权重给了一堆空词主体被挤到后面出图就成了「精致但不知道画的是什么」。一个可复用的排布是主体 → 动作/状态 → 环境 → 媒介与风格 → 光照 → 镜头与构图 → 材质细节。这个顺序不是规定而是因为它符合「先决定画什么再决定怎么画」的因果链。当你不确定某个词该放哪时问一句它改变的是内容还是渲染内容往前渲染往后。3.2 五段式拆解把「感觉」翻译成可复现的词「电影感」这类词之所以低效是因为它对应的是几十种不同的视觉方案的叠加。要让它可复现就得拆成具体维度。我一般用五段式主体、媒介、光照、镜头、材质。# 图像提示的结构化拼装每一段只放一类信息避免语义打架 def build_image_prompt(subject, action, scene, medium, lighting, camera, texture): parts [ f{subject} {action}, # 主体动作决定画什么必须最靠前 fin {scene}, # 环境决定空间关系 medium, # 媒介油画/胶片/3D渲染决定整体质感 lighting, # 光照逆光/柔光/硬光决定影调 camera, # 镜头广角/长焦/微距决定透视与压缩感 texture, # 材质细节金属划痕/皮肤纹理/布料褶皱 ] return , .join(p for p in parts if p) # 空段直接丢弃避免留下悬空逗号 prompt build_image_prompt( subjecta rusted industrial robotic arm, actionholding a half-empty cup of cold coffee, scenean abandoned workshop with dust in the air, medium35mm film photography, lightingsingle hard side light, deep shadows, camera85mm lens, shallow depth of field, texturescratched metal, chipped paint, fine dust particles, )这段代码的价值不在「拼字符串」而在于把提示变成了带槽位的结构。每个参数只承载一类信息冲突就容易被发现——比如光照段里同时出现「柔光」和「硬光」你一眼就能看出来而混在一句话里就很难察觉。另外空段用条件过滤丢弃是为了避免出现连续的逗号某些解析器会把空段当成一个权重占位导致前后词的权重被稀释。需要强调的是这个模板不是要你每次都填满七段。段数越多词间冲突的概率越高。常见的做法是先只写主体和环境跑一版看构图对不对构图对了再加光照和镜头最后才补材质。分层加词比一次性堆二十个词更容易定位问题。3.3 参数化控制把随机性收进可调旋钮提示词之外工具侧的参数决定了「同样的词能跑出多大的差异」。这部分最容易被忽略但它才是可复现性的来源。以 Midjourney 为例几个高频参数的作用方向大致如下参数作用对象什么时候该调宽高比画布形状与构图重心一开始就定后期改会重排整个画面风格化强度模型自由发挥的程度想要忠于提示就调低想要「更好看」就调高多样性四张结果之间的差异度探索阶段调高收敛阶段调低随机种子复现同一批结果定稿后必须固定用于微调对比负向参数排斥项只放少数高价值项不要堆列表这张表的用法不是背数值而是建立「哪个旋钮管哪一维」的映射。调参最常见的错误是同时动三个旋钮然后得出「提示词改坏了」的结论。真正有效的做法是提示词固定只动一个参数看变化方向确认方向后再回到提示词层做微调。3.4 参考图与「垫图」为什么图会盖过文字带图像参考功能的工具机制是把参考图编码成视觉向量与文本向量一起参与条件构造。问题在于视觉向量的信息密度远高于文本向量——一张图能承载构图、色调、材质、风格上千个维度而你的文字可能只描述了其中三个。结果就是图把文字盖住了你写「改成蓝色调」出图依然保持参考图的暖色因为视觉条件在总条件里占比更高。破解思路有两个方向。一是降低图像权重让文本有机会生效代价是风格迁移变弱。二是把参考图从「内容参考」切换成「风格参考」很多工具提供这种模式只提取色调和笔触不继承构图。判断该用哪种看你要的是「同样的东西换个风格」还是「同样的风格换个东西」——前者调低图权重后者用风格参考。这个区分听起来简单但调错方向的成本是一下午的反复重跑。另一类工具会提供「提示增强」开关自动把你的短提示改写成更长的描述。它在探索阶段很有用因为能补上你没想到的维度但在复现阶段是灾难因为改写结果不完全可控同一句话两次运行可能得到不同的增强文本。我的一般做法是探索时开着定稿前关掉用原始提示 固定种子锁死结果。注意任何「自动帮你优化提示」的功能都会破坏控制变量。要用它就把它当成生成候选提示的工具而不是生成最终结果的工具。4. ReAct 提示为什么「先想再做」能把幻觉压下去对话式提示工程里最实用的一种结构叫 ReAct名字来自 Reasoning 和 Acting 的组合。它的核心不是让模型「更聪明」而是改变生成的条件依赖关系把原本藏在一次前向计算里的推理摊开成上下文里可见的中间结果让后续生成条件在这些结果上。这个改动很小效果却很明显原因值得拆开看。4.1 三段式Thought、Action、Observation 各自解决什么问题自回归生成的特点是每个 token 只条件于它前面已经存在的 token。这意味着如果模型在一次输出里「默默推理」那些推理过程没有对应的 token也就无法成为后续 token 的条件。它必须把结论直接压进最终答案中间没有任何落脚点。步骤一多误差就累积最后表现为「看起来很自信但事实错误」。ReAct 的解法是给推理一个载体。Thought 段写出当前判断和下一步意图Action 段声明要调用的工具和参数Observation 段填工具返回的真实结果然后循环。三个段各司其职Thought 把隐式计算外化成文本让后续 token 有条件可依Action 把「模型自己编」换成「去外部取」Observation 把外部世界的真实数据注入上下文直接压制了编造空间。这里的关键洞察是幻觉的根源往往不是模型「想错」而是它「没有可用的真实信息却必须给出答案」。ReAct 不解决前者但很有效地解决了后者——只要 Observation 里放的是真实返回模型就没有必要编。4.2 一个最小可运行循环MAX_STEPS 6 # 步数上限防止模型陷入无休止的自我循环 def react_loop(question, tools, llm): # 初始上下文只给任务和可用动作清单不给答案暗示 context f问题{question}\n可用动作{list(tools.keys())}\n for step in range(MAX_STEPS): # 一次生成同时产出 Thought 和 Action格式由提示里的固化符约束 output llm(context 请输出 Thought 和 ActionAction 必须是可用动作之一。) thought, action_line parse(output) # 解析出思考与动作 context fThought: {thought}\n{action_line}\n name, args parse_action(action_line) # 解析动作名与参数 if name not in tools: # 动作空间不闭合时直接终止 context Observation: 动作不存在请从可用动作中选择。\n continue if name finish: # 显式终止动作避免提前下结论 return args[answer] try: obs tools[name](**args) # 真实调用返回值必须是字符串 except Exception as e: obs f调用失败{e} # 失败也作为观测注入不吞掉 context fObservation: {obs}\n # 关键一步真实结果进入上下文 return 达到步数上限未得出结论这段代码有四个设计点值得说明。第一MAX_STEPS是硬性的止损因为 ReAct 的失效模式之一就是动作重复、无限循环靠提示词劝它「不要循环」并不可靠必须在代码层截断。第二动作空间校验放在调用之前模型编造工具名是高频问题直接拒绝并回注一条 Observation比让它继续编下去要好。第三异常也转成 Observation 注入而不是抛出终止——工具报错本身是有用信息模型据此可以换个参数重试。第四终止必须是一个显式动作不能靠「模型觉得差不多了」否则它容易在 Observation 为空时草率收尾。参数上tools是一个「动作名 → 可调用对象」的字典动作名要短、要有语义因为模型是靠名字选动作的参数建议用扁平结构嵌套太深时模型拼参数的错误率会明显上升。llm这一层建议把温度调低ReAct 需要的是稳定复现的决策不是文采。4.3 两个失效模式观测污染与动作不闭合观测污染指的是工具返回的内容本身带有误导性文本被模型当成事实吸收。典型场景是搜索工具返回了一段包含错误信息的摘要或者接口返回了一整页 HTML模型从里面挑了一句话当结论。解法是在注入前做裁剪和标注比如只保留结构化字段并加一句「以下为工具原文未经核实」。动作不闭合指的是模型反复选择一个不会推进任务的动动作比如不停「再搜索一次」而不去读结果。这通常不是模型笨而是提示里没有定义「什么算任务完成」。补一条明确的终止条件——「当 Observation 中已包含 X 字段时调用 finish」——比反复强调「请尽快结束」有效得多。4.4 把 ReAct 用在非工具场景写作与出图前的自检ReAct 不必真的调用外部工具。它更通用的形态是「先列要素、再查缺项、后输出」用在长文写作和图像提示上都成立。比如写一段产品描述前先让模型列出必须覆盖的四个信息点再逐条检查哪些还没确定最后才动笔出图前先让它把提示拆成主体、环境、光照三段指出哪一段是空的。这个自检循环的成本只有几十个 token但能挡掉大量「写完了才发现漏了关键信息」的返工。5. 避坑与排查提示工程里最容易翻车的四类场景5.1 越写越长反而更差指令稀释现象提示从三行加到三十行模型开始只执行其中一部分越靠后的要求越容易被忽略。原因条件向量是所有 token 共同作用的结果指令越多单条指令的权重占比越低同时长上下文里存在明显的「中段遗忘」夹在中间的要求最容易被跳过。这不是模型不听话而是注意力分配的必然结果。解决把提示按「必须有 / 最好有 / 参考」三档分级只保留第一档进提示其余移到外部配置或分步执行。固化符统一挪到末尾核心约束用短句重复一次。长度控制的经验值是一次提示里超过七条硬要求就该考虑拆成两轮。5.2 负向词写太多画面出现你禁止的东西现象负提示列了二十项其中「多余手指」「文字水印」反而更频繁出现。原因负向条件不是过滤器而是排斥方向。词一多排斥向量互相干扰采样被推到分布边缘而被点名的概念本身进入了条件注意力被抬高。解决负向词压到三到五项只保留高价值、高频率的失败项。把「不要 X」改写成正向的「要 Y」比如用「干净的画面」替代一长串「不要文字、不要水印、不要噪点」。改完跑一轮对比通常能立刻看出差别。5.3 多轮对话后模型「忘了」设定上下文不是记忆现象第一轮设定好的角色和格式聊到第八轮就开始漂移语气变了、格式也不守了。原因上下文窗口是有限的早期内容在后续生成中的权重会被不断稀释而且每一轮的回答都会成为下一轮的条件误差会累积放大。模型没有「记忆」只有「当前上下文」。解决把关键设定做成可重复注入的短块每隔几轮重新贴一次或者用「每次请求都带完整系统提示」的方式而不是依赖对话历史。重要任务的对话不要拉太长一个任务一个会话做完就换。5.4 同一个提示换时间结果不一样种子与模型侧变化现象昨天调好的提示今天跑出来风格全变参数一个没动。原因一是没固定随机种子采样起点不同二是工具侧可能调整了默认参数或底层模型这类更新通常不通知三是自动提示增强开着改写结果不可控。解决定稿流程里强制固定种子、关闭自动增强、把完整参数串记录下来。发现结果漂移时先重跑一次固定种子的任务做对照——如果固定种子能复现、换种子就漂移问题在采样如果连固定种子都复现不了那就是模型侧变了只能重调。5.5 排查顺序从现象定位到层遇到问题先别改提示词按这个顺序过一遍能省掉大半无效尝试现象先查什么再查什么画面/内容完全跑偏主体词是否在最前是否有互相冲突的修饰符风格对了但内容不对词序是否被风格词挤占参考图权重是否过高输出格式不守固化符是否在末尾是否被长背景稀释结果不可复现种子是否固定自动增强是否关闭多轮后质量下降上下文是否过长关键设定是否被稀释6. 迭代式细化与上下文什么时候该停手迭代式细化最容易滑向的一个陷阱是把「多改几轮」当成「改得更好」。我自己的收敛判据是如果连续两轮只换了同义词、结构没动收益基本归零该停手了。真正有效的迭代一定发生在结构层——补一个缺失的维度、砍掉一个冲突的修饰、把一段模糊描述换成具体参数而不是把「美丽」换成「惊艳」。6.1 上下文是资产也是负债对话式提示工程的优势在于可以逐步补信息代价是每一轮都在给后续生成增加条件噪音。原文强调语言与意象在提示中的力量落到实现上就是一句话具体的名词压过抽象的形容词。你写「温馨的客厅」模型要猜你写「一张磨出包浆的橡木桌桌上有一盏没关的台灯」模型不用猜。前者的成本转嫁给了模型后者的成本由你承担但结果可控。所以我现在的习惯是第一轮只定主体和结构确认方向对了再逐层加词每加一层只加一个维度并且固定种子做对照。这个流程听起来慢但它把「碰运气」变成了「有记录的实验」返工次数反而少了。从那以后我每次开新任务都强制走一遍「定主体—锁参数—单变量加词—记录参数串」再没出现过调好之后复现不出来的情况。希望帮到你。本文还有配套的精品资源点击获取