去年有一段时间,我特别迷信各种提示词模板,备忘录里存了满满一屏。直到有个项目要批量生成产品文案,我用同一段Prompt跑了三家模型,三份回答各写各的:一份像广告软文,一份像说明书,一份直接跑题。那一刻我才意识到,Prompt工程不是背模板,而是搞清楚大模型到底在什么条件下才愿意稳定输出。这篇不是科普长文,把我踩过坑之后真正沉淀下来的6个提升输出精准度的技巧都列出来,每个技巧都带原理、对比和可以直接改改就用的写法,适合那些正在调Prompt但总觉得结果忽好忽坏的人。
1. 为什么同样的提示词,输出忽好忽坏
1.1 大模型不是"逻辑引擎",而是"概率填空器"
很多人第一次翻车,是因为把大模型当成了数据库或逻辑引擎,以为"我输入清楚,它就应该输出正确"。但大模型的底层工作方式,是一个"概率填空器":它根据你已经给它的一段上下文,逐字预测最可能出现的下一个token。这个"最可能"是一个概率分布,不是唯一答案。
所以输出不稳定至少有三个来源。第一个是采样随机性:即便temperature拉低,只要没到0,每个采样步仍有随机性;就算调到0,不同模型在不同硬件环境下也可能有微小差异。第二个是上下文编码的敏感度:Prompt里多一个顿号、少一个换行,都可能让注意力权重重新分配。第三个是模型对"模糊指令"的默认假设:你说"请专业一点",它理解的专业,和你理解的专业未必是同一种专业。
这个理解直接决定了后面所有技巧的走向:既然模型是根据上下文来调节行为,那我们的工作就不是"把话说清楚"这么简单,而是把上下文结构搭到让它的概率分布集中在你想要的那一类答案上。这一句,可以说是我对Prompt工程的全部理解。
另外想多说一句:很多人第一反应是"把temperature调到0是不是就稳了"。实测下来,调0能减少发散,但解决不了"理解偏了"的问题。判断一个输出问题是随机性还是理解性,有个土办法:同一个Prompt重复跑三次。如果三次内容五花八门,说明随机性占主导,可以调低temperature;如果三次内容都稳定地答非所问,那就是理解问题,需要改Prompt本身。
1.2 精准度问题的三种典型症状:跑题、跑形、跑偏
我把平时遇到的不精准,归纳成三种症状,排查起来非常方便。
第一是跑题:问的是A,回答里拐到B。比如让它分析销售数据下跌原因,它却开始写促销方案。这通常是角色和任务边界没划清楚,模型不知道"你到底要我干嘛"。
第二是跑形:内容方向对,但格式乱。让它列出5个要点,它给出一整段话;让它输出JSON,它多了一段解释。这是缺少结构约束,它不知道"输出形式"本身也是需求的一部分。
第三是跑偏:内容沾边,但颗粒度不对。写总结写得像全文复述,写标题写得像论文摘要。这是缺少"评分标准",模型没有标尺去判断什么算好。
我把三种症状和对应的解法做成了一张表,后面的章节就是按这个顺序展开的:
| 症状 | 典型表现 | 优先使用的解法 |
|---|---|---|
| 跑题 | 答非所问、方向偏移 | 技巧一:角色+任务+约束 |
| 跑偏 | 颗粒度不对、详略失控 | 技巧二:可检查的评分标准 |
| 跑形 | 字段混乱、格式不符 | 技巧四、技巧六:示例与结构化输出 |
| 综合症 | 任务复杂,什么都想要 | 技巧三:单步指令链、技巧五:CoT |
2. 技巧一:角色、任务、约束三段式,让模型先"定性"再"作答"
2.1 角色设定如何改变输出分布
第一个技巧看起来最简单,但很多人只用了半截。完整的做法是"角色、任务、约束"三段式,少一段输出就会开始漂。
先说原理。预训练模型见过海量的"角色—对话"语料:律师说话是什么风格、客服说话是什么风格、小学老师又是什么风格。当你给模型一个明确的角色,等于在几十亿参数里激活了一个高概率的行为分区。角色设定越具体,激活的分区就越窄,输出也就越容易被"框住"。
直接看一个对比。烂写法:
请帮我写一段产品介绍。这个Prompt跑十次,十次风格都不一样。好的写法:
角色:你是一名擅长电商文案的资深文案编辑。 任务:为一款适合上班族使用的便携榨汁杯写一段商品详情页介绍。 约束:字数控制在150字以内;突出3个核心卖点;语言风格偏日常、有生活感;结尾加一句购买引导语。区别在哪儿?角色给了它"文案编辑"的措辞偏好,任务给了它一个具体动词"写一段商品详情页介绍",约束给了它字数、卖点数、风格和结构。三样加在一起,模型的可选择空间被压缩到了一个很小的范围内,答案自然稳定。
2.2 三段式的落地模板与常见反例
如果不想每次从零开始写,可以套用这个通用模板:
角色:你是【某个领域的专家/具备某种身份的人】,擅长【几项具体能力】。 任务:请为【具体对象】完成【一个动词性动作】,目标受众是【谁】。 约束:字数不超过【N】;必须包含【关键点1/2/3】;不要出现【禁忌内容】;输出用【格式】。我个人的经验是,角色设定宁可用一句话交代"擅长什么",也不要堆一长串头衔。我踩过一个坑:某次让模型同时扮演"资深律师、理财顾问、心理学专家、写作达人"去写一封沟通邮件,结果它的措辞一会儿法律条款、一会儿心理分析,整体像四人在抢话筒。角色越复杂,行为分区越互相干扰,输出越分裂。
还有一个反例是"只给角色,不给任务"。你让它"作为资深数据分析师",然后直接问"这个表格怎么办",它可能给你一堆空话套话,因为你没有告诉它"该怎么办"的具体动作。正确做法是让角色和任务之间明确衔接,比如:
你作为资深数据分析师,请根据以下销售数据,找出三个最可能的原因,每个原因附一条数据证据。角色和任务之间用"请根据……完成……"连接,输出就踏实了。
3. 技巧二:把"你看着办"改成可检查的评分标准
3.1 为什么模型也需要"打分表"
第二个技巧是解决"跑偏"问题的核心。很多时候模型的输出不是差,而是"不对味"——你说写总结,它给你写概述;你说写得精炼,它给你压缩到几个短句。问题的根源在于,用户脑子里的"好"是没有表达的。
大模型生成回答的过程,其实很像一个人在做开放式论述题:如果考试只写了"请作答",没有评分标准,学生只能凭感觉写。而如果你把评分标准也写进Prompt,模型在生成过程中就相当于拿到了一份"自查表",每一步都会朝这些维度靠拢。
但"评分标准"不能是空话。像"逻辑清晰""语言流畅"这类词,模型基本无法操作。要改成可以被检验的动作。比如:
- "每个结论后面必须给出一个数据或事实支撑"
- "每条建议必须对应一个具体的实施动作"
- "不允许出现'总之''此外'等没有任何信息量的过渡语"
这些标准有一个共同点:模型在生成时能够自我检查是否做到。能检查,才有约束力;不能检查,写了等于没写。
3.2 用"满分定义 + 关键维度 + 否决项"约束输出
我的实操写法,是把评分标准拆成三块:满分定义、关键维度、否决项。
满分定义用来告诉模型"一份合格的答案长什么样"。关键维度告诉它"好有哪几个方面,按什么优先级"。否决项告诉它"出现什么情况就算不及格"。三块的Prompt示例:
请为以下产品写一段客服道歉回复。 评分标准: 1. 满分定义:一份让用户感到被重视、同时把解决方案讲清楚的回复。 2. 关键维度(按优先级排列): - 共情(先承认用户的不便,再解释原因); - 明确(补偿方式/时间节点必须具体,不能写"尽快"); - 简洁(不超过120字)。 3. 否决项:出现推卸责任的字眼,或没有给出可执行的补偿方案,直接视为不合格。实际操作中,把"模糊要求"和"评分标准"放在一起对比效果更明显:
| 模糊要求 | 评分标准写法 | 输出变化 |
|---|---|---|
| 写得好一点 | 每个论点后必须跟一个数据支撑 | 句子密度明显提升 |
| 语气温和一点 | 开头必须先道歉,禁止使用"你误会了" | 开头稳定,不再防御性 |
| 概括全面一点 | 必须覆盖价格、规格、售后三个主题 | 缺项明显减少 |
最后提醒一句:评分标准不要超过5条。模型在上下文里的注意力是有限的,我给某项目写了8条评分标准,结果模型只记得前4条,后4条完全被忽略。收敛到最关键的3-5条,比列一堆更有用。
4. 技巧三:拆成单步指令链,一次只让模型干一件事
4.1 多任务指令为什么容易"顾此失彼"
第三个技巧,是我在真实项目里觉得性价比最高的一个:把大任务拆成多个小任务,一次只让模型干一件事。
很多人在写Prompt时喜欢"大而全":让模型"总结全文、提炼观点、提出建议、生成标题、顺便改成社交媒体风格"。我理解这种偷懒心理,一次调用多省事。但实测下来,任务一旦超过两三个,输出质量会明显下滑。
原因是多任务会稀释模型的注意力分配。它在生成每一个token时,都要同时惦记着你扔给它的所有要求,很难保证每个环节都照顾到。更麻烦的是错误会传导:前面"总结"部分如果写得偏了,后面"提炼观点"就会基于错误的摘要继续延伸,最后整条链都歪掉。
打个比方:你让一个实习生一次处理五件事,他会怎么做?大概率每件事都做得马马虎虎,还有可能把咖啡洒在文件上。你让他一次只处理一件事,处理完再安排下一件,效率和质量反而上来。大模型也一样。
4.2 指令链的落地方式:把中间结果当成下一步的输入
我自己常用的拆法,是先把任务拆成"可以单独交付中间结果"的链条。以客服工单生成为例,原来一个Prompt想搞定全流程,后来拆成三步:
第一步,让模型判断工单类别:
请判断这条用户留言属于以下哪一类:售后、物流、使用咨询、其他。 只输出类别名称,不要解释。 用户留言:……第二步,根据类别提取关键字段:
上一步判断的类别是【售后】。请从用户留言中提取:订单号、问题描述、用户期望的处理方式这三个字段。 如果某个字段不存在,输出"未提及"。第三步,根据前面结果生成回复:
基于以上提取结果,请生成一段客服回复。 回复需要用第一人称、语气诚恳,并给出明确的处理时限。这个做法的关键在于,每一步的Prompt都显式引用了上一步的输出,模型不用去同时处理所有约束,只需专注当前这一步。如果中间某一步出了问题,你也能很快定位到是哪一步,而不是对着整段输出做无头苍蝇式排查。
在工程实现上有两种方式:一种是分多次调用API,每次把上一步的结果拼进下一步的Prompt;另一种是在一次会话里多轮对话,交替扮演"执行者"和"传递者"。前者更容易做程序化控制,后者更适合调试阶段人工观察。
需要注意别把指令链写得过长。链条太长,中间错误累积和token浪费会抵消它带来的精度收益。我的经验是:超过4步的任务,先想想是不是任务本身定义得太复杂了。有些任务看起来复杂,其实是Prompt设计者自己没想清楚。
5. 技巧四:少样本示例选准参照系,正反例比数量更重要
5.1 示例不是越多越好,关键是"分布对齐"
第四个技巧是关于少样本(Few-shot)的。很多人以为给模型的示例越多,模型学得越好,于是一股脑塞进去七八个例子。但我用下来的感受是:示例质量远比数量重要,更重要的是示例要跟真实输入"对齐"。
模型在上下文中看示例,本质是在做类比推理:它从示例里归纳出"用户想要的输入输出映射长什么样"。如果示例和真实任务存在分布偏差,比如示例全是长文本,真实输入却是短句,模型就会机械模仿长文本的格式;如果示例的输出全部是俏皮话,模型的正式任务输出也会变俏皮。
我吃过一次亏:某次做意图分类,给模型喂了三个示例,全是"用户问价格"的意图,结果真实输入里用户问"怎么退款",模型按着示例的格式输出了一大段售前话术,而不是分类结果。不是模型傻,是示例让它以为"所有输入都要按这个风格回答"。
所以选示例有三个原则:格式一致、难度相近、目标输出风格统一。你希望模型最终输出什么形态,示例就尽量长成什么形态。
5.2 正例+反例的组合,比堆数量更管用
在实际项目里,我更推荐"正例+反例"的组合方式。正例告诉模型"应该怎么做",反例告诉模型"不要怎么做",两者的对比能帮模型更快划清边界。
以意图分类为例:
请判断用户的意图属于:价格咨询、功能咨询、售后问题、其他。 示例1(正例): 用户:这个榨汁杯能打冰吗? 意图:功能咨询 示例2(正例): 用户:现在买有优惠吗? 意图:价格咨询 示例3(反例): 用户:不买了,东西有质量问题要退货。 输出如果判断为「价格咨询」是错误的,正确意图是「售后问题」。 请对下面这句话进行分类,只输出意图名称。 用户:昨天收到的线控耳机右耳没声音。只给正例的时候,模型可能只学到"从问题里抓关键词";加了反例之后,它更清楚"边界在哪里、哪些情况不能混为一谈"。我在另一个项目上做过对比:同一批测试集,只放正例的准确率约78%,加了明显错误反例后提升到89%。当然不是每个任务都能提升这么明显,但"少给几个、给得准"几乎总是优于"多给几个、给得杂"。
还有一个小建议:反例的选择要针对"高发错误"。如果你发现模型总把"物流咨询"误判成"售后问题",那就专门造一个这样的反例放进去,比新增10个正例都管用。少样本是一场定向纠偏,不是题海战术。
6. 技巧五:先推理后作答,把"思考过程"写进输出
6.1 思维链(CoT)激活的机制与适用场景
第五个技巧,是在复杂推理任务里效果最明显的:让模型"先想再答"。这种现象在行业里通常叫思维链(Chain of Thought,CoT),我换一个更容易理解的说法:强制模型把中间计算步骤写出来,给推理过程一个"草稿区"。
原理其实不神秘。模型是逐token生成的,每生成一个token就消耗一份概率。如果它直接给结论,就跳过了大量中间步骤,很容易在关键计算上"跳步",得出貌似合理但实际不对的结果。而如果你让它"先列出推理步骤,再给结论",它等于在输出里给自己搭了一张草稿纸,每一步都会重新审视前一步,错误率自然下降。
适用场景非常明确:数学题、逻辑判断、多条件规则匹配、需要比较再决策的任务。我用过一个典型案例,判断订单是否符合发货条件:
用户订单信息: - 商品状态:已付款 - 收货地址:偏远地区,不在普通配送范围内 - 库存:有货 请判断该订单能否按普通流程发货。 要求:先列出判断步骤,每一步对照订单条件,最后给出结论。输出里会出现"步骤1:已付款,满足付款条件;步骤2:偏远地区,不满足普通配送范围;结论:不能按普通流程发货。"这样就算结论错了,你也能顺着推理步骤找到是哪一步跳了。
6.2 思维链Prompt的写法与边界控制
但CoT不是万灵药。最典型的反例是简单任务:你让模型翻译一句"hello",它也非要先写"这句话的意思是……",然后给翻译,纯属浪费token和延迟。另一个问题是过度推理:某些任务本来可以直接凭直觉判断(比如情感分类),强行加推理反而可能引入不必要的纠结和幻觉。
我的写法经验是给出明确的"推理边界":
请先进行推理,再把结论放在最后一行。 要求: - 推理步骤不超过3步,每步不超过20个字; - 结论必须单独一行,以"结论:"开头; - 如果题目很简单,可以直接给结论,不需要推理。第三句"如果题目很简单,可以直接给结论"很关键,它给了模型一个出口,避免简单任务也背上一层推理脚手架。
还有一个常见的坑是"推理诱导偏见"。如果你在Prompt里写了倾向性的话,比如"你觉得用户肯定不满意吧",模型可能会顺着你的话往前推理,最后得出一个迎合性的结论。所以在需要客观判断的场景,不要在推理引导句里夹带自己的预判。我在项目里遇到过一次:某个自动化审核流程加了CoT后,结论一直偏向"通过",后来发现是Prompt里写了"如果没有严重问题就通过",模型把"没有严重问题"当成了合理默认值,再一路推理自证。后来改成"请独立检查以下风险项,再给出结论",偏见才消除。
7. 技巧六:结构化输出 + 自校验,兜住最后一公里
7.1 从"请用JSON"到显式schema约束
最后一个技巧,是偏工程向的:如果你要让模型输出结构化数据,指望"请用JSON格式返回"已经不够了,得把schema写进Prompt里。
我见过太多人写"请用JSON返回结果",然后模型输出了JSON夹杂一句"以下是结果:",甚至把某个字段值写成undefined。原因很简单:你告诉它"用JSON",但没告诉它JSON长什么样。它只能靠概率猜,猜着猜着就跑形了。
更稳的写法是把字段名、类型、允许值、是否必填,直接展示给它看:
请分析下面这段用户反馈,输出JSON对象。 JSON字段定义: - sentiment: 字符串,只能是"positive"、"negative"或"neutral"; - key_issues: 字符串数组,最多5项; - summary: 字符串,不超过50个字; - urgent: 布尔值,是否属于紧急投诉。 要求:只输出JSON对象本身,不要输出任何解释或代码块标记。这样做有两个好处:一是把输出空间压缩到了很小的范围,模型采样时想跑偏都难;二是程序解析方便,后续接流程几乎零成本。注意最后那句"只输出JSON对象本身",这句话能干掉80%的"多余前缀后缀"问题。
7.2 自校验循环:让模型检查自己的输出
但即便做了schema约束,模型偶尔还是会犯低级错误:字段缺失、数值越界、枚举值拼错。针对这种情况,我的做法是加一道自校验循环:让模型生成完之后,用另一轮Prompt检查自己的输出。
典型的写法是两步走。第一步正常生成,第二步追加:
请检查你上一步生成的JSON对象: 1. 是否包含所有必填字段; 2. sentiment字段的值是否在允许枚举内(注意拼写); 3. summary是否超过50字; 4. 是否混入了JSON之外的文字。 如果发现问题,请输出修正后的完整JSON;如果没有问题,直接输出"通过"。实操里需要注意,自校验会显著增加token消耗和延迟,所以不是所有任务都值得做。我的取舍标准是看"输出出错的代价":代码生成、合同摘要、医疗建议、自动工单这类高风险场景,多花一次校验很值得;而像文案改写、头脑风暴这类低风险场景,来回校验纯属浪费。
从工程角度看,自校验其实是最后一道护栏,不要把全部希望压在它上面。我在生产项目里的组合是:提示词用前面的技巧把底座打好,再用程序做JSON.parse、字段枚举校验,最后在解析失败时才触发模型自校验。能靠代码约束的,就不要靠模型自觉;模型自校验只是兜底,不是万能。这个思想,我认为才是整个提示词工程进阶的核心:把它当工程来搭,而不是当咒语来念。
我自己现在调试一个Prompt的固定顺序,基本上就是围绕这6个技巧来的:先定角色和任务边界,不贪多,拆成小步骤,然后给它评分标准和正反例,复杂任务再让模型先推理;最后统一用结构化输出接程序,实在不行才上自校验。整套走下来,项目里的输出精准度基本是可控的,后续维护也只是小修小补。提示词工程最大的价值,不是让你变魔法,而是让你把一个不稳定系统,逐步驯化成可以依赖的工具。