系统提示与用户提示
每次都成立的话放系统提示,这一次才成立的话放本轮。放错层,代价是账单、是设定衰减,也可能是安全。
一个常见的误解,是以为模型收到的就是你刚敲进去的那句话。它实际收到的是一整条序列:凡是每一轮都成立的内容,写进系统提示;只在这一轮成立的内容,写进本轮消息。位置放错的代价,轻的是账单,重的是设定慢慢失效,最严重的是安全。
读完你能回答:
- 一句话该放系统提示还是放本轮,判断标准是什么?
- 系统提示的优先级有多高,为什么不能拿它当锁用?
- 让它先反问、给对照物、先想再答、设角色,各自到底在做什么,什么时候不该用?
一条内容该放哪一层,只问一个问题
系统提示,装的是每一轮都成立的内容。产品扮演什么角色、用什么语气、能做什么不能做什么、输出格式约定成什么样、哪些红线绝对不能碰。这些文字每一轮都要重新发一遍,所以它对整段对话一直有效。
判断依据只有一条:放到第一轮成立吗?放到第五十轮还成立吗?两个都成立,就归系统提示。只在当下成立的内容——比如「材料在下面」「用户刚上传了一张图」——归本轮那条消息。
历史对话,装的是此前已经说过的内容。你们的来回往复,一轮接一轮往后堆。它并不具备跨会话的记忆,你觉得它「记得」上一轮说过什么,真实原因是整段历史又被原样发了一遍。工具返回的结果通常也落在这层,所以一旦产品开始一轮轮调用工具,这层的膨胀速度会非常快。
本轮这条,装的是只在此刻成立的内容。用户刚发出的那句话,加上这次要用到的材料:检索回来的文档片段、用户上传的文件、当前页面的数据。
固定内容前置,这条纪律也管账单
除了「每轮成立与否」,分层还有一条同样硬的约束:不变的内容排在前面,会变的内容排在后面。
主流模型服务都支持复用前缀——只要这次请求的开头与上次完全一致,这一段就不需要重新计算,价格低很多。系统提示正好位于最前端且始终不变,它天然就是最应该被复用的部分。而它往往又是整轮请求里最长的一段,命中与否,账单上的差别很直观。
道理听着简单,违反起来却很容易:有人在系统提示里塞进当前时间,或者把用户名拼进去,一个字符不一样,整段前缀就作废了。这类随时会变的信息应该放到本轮这层。官方提示指南把「固定指令前置」写进了最佳实践。openai-prompt-eng
它更受重视,但不是一把锁
系统提示确实享有更高的优先级,但这指的是「更受重视」,而不是「无法违抗」。训练过程引导模型优先遵循系统提示,因此它多数时候会照办;然而这终究只是概率上的倾向,用户输入足够强硬、对话足够长,都可能让它偏离。官方文档表达的也是同一层意思:系统提示是最强的默认值,并不是一把锁。anthropic-system-prompts
由此带来两个实际后果。
一、长对话里设定会衰减。聊到几十轮之后,系统提示被一大堆历史对话包围,分量被稀释了。表现出来就是它渐渐不像你们的产品。缓解手段是把最关键的几条约束在本轮这条里再说一遍——利用结尾位置看得最清楚这个特性。
二、别把安全交给系统提示。把「不要回答与产品无关的问题」写进系统提示,多数时候管用,但它终究不是锁。真正的边界必须由代码来守:不该进的输入在到达模型之前就拦下,不该做的操作在工具那一层根本不给出口。
还有一条不能碰的底线:用户能控制的内容,永远不要拼进系统提示。模板里留个空位让用户填公司名,句子写成「你是某某公司的客服,只解答与该公司业务有关的问题」,那个空位里用户就能填任何东西,包括一整套新的指令,而他填的内容就此获得了系统提示的地位。
指令和数据之间的界线在机制层面本就是模糊的,正确的形态是:系统提示完全由你的代码掌控,用户的一切输入都走本轮这一层。需要引用时用一句明确的声明把它降格为素材——说明这段文字只是用户提供的参考资料,不构成指令——再用清晰的分隔符包起来。
角色设定换的是口吻,不是本事
分层讲完了。接下来看四个常被当成「技巧」的动作,先从用得最多、也最容易被高估的那个说起。
「你是一位从业十五年的审计师」——以这类句子开头的模板遍地都是。它确实有用,但作用被夸大了。
它真正做的事:调整词汇和语气的分布。告诉它这是审计师,输出就会偏向这个行业惯用的措辞、更克制的句式、更常见的免责表述。这是可能性被收窄的直接结果——「审计师」附近的词,确实和「幼儿园老师」附近的不一样。
它做不到的事:让它更懂这一行。模型掌握的知识在训练阶段就已经定型,加一句角色设定既不会带来新知识,也不会提升事实层面的准确率。
这个区别在产品里很要命。有些团队把角色改成「你是持牌理财顾问」,以为输出就会更可靠,于是把核查放松了——这是个危险的误解。语气确实变得更专业,出错概率却纹丝不动,而且因为听着更有权威感,错误反而更难被察觉。官方指南对角色设定的定位也是如此:它调的是风格和语境,不承诺提升能力。anthropic-prompt-eng
所以正确的用法是:角色设定管的是语气和风格,别指望它改变能力。想提高准确率,靠的是给材料、给例子、让它先想再答,以及最后那道校验。与其写「资深专家」这种空泛头衔,不如写具体的行为约束:要求它每处结论都注明依据出自材料的哪一段,遇到不确定的地方直接承认、不要往下猜——这些比任何头衔都管用。
自己说不清,就把问题交还给它
需求还在你脑子里、连自己都没想透的时候,别硬写:让它来问你。
在任务后面加一句:「动手之前,先来问我三个最要紧的问题,等我回答完再开始。」
为什么有效?它把「你得凭空想全所有背景」换成「你只需回答几个具体问题」,后者容易得多。它问出来的问题,往往正是你漏掉的那几个部件——这是「先回查自己」那个姿态的执行方式:与其自己猜哪里没说,不如让它把空白处指出来。
更实在的一点是,你给出的回答也会进入上下文。这一招的实质,是借模型的手把提示词补齐;事后再把这段对话整理定型,就得到一份可以反复使用的提示词。
边界很清楚:它只适合需求模糊的开放任务,不适合批量自动化流程。流水线上要的是确定性,不是对话;那里多一轮问答就是多一份延迟和成本。
能指出一个具体对照物,就别写形容词
这是给例子那一招的推广:手边有现成的参照物时,形容词就可以收起来了。
说「文字再精练一些」,不如说「照这份周报的句子长度来」;说「语气别太生硬」,不如说「按我们给客户的正式回函那种口吻写」;说「视觉上高级一点」,不如干脆把上一版的截图贴过去。
原因还是那个:形容词是压缩过的信息,不同的人展开它得到的结果不一样,模型只能挑一个平均值交差。而一个具体的对照物本身就带着完整细节。
使用时有一步不能省:讲明白要参考的是哪一方面。把一份文档丢过去只说「参考这个」,它无从判断你指的是框架、语气还是篇幅。改写成「照它的信息颗粒度和每段长度来,内容另起一套」,结果会稳定得多。
让它把推演写出来:多写的字就是多花的算力
在提示词里补上一句*「给结论之前,先把你的判断过程逐条写出来」*,多步任务的正确率通常会有明显改善。思维链论文验证的正是这一点:让模型把中间步骤写出来,它的表现会变。chain-of-thought
机制在它猜下一个字的原理里:它的思考就是它的输出,多写就是多算。中间步骤一旦写出来,就进入了序列,后面每一步都能看到前面的推演,等于给了它几次纠错机会。
三条使用提醒,外加一个变体。
一、有代价。中间步骤也算输出,慢一些贵一些。简单任务不必开。
二、推理模型不需要这一句。它内部已经做过这一步了,再提一次反而可能形成干扰。
三、可以让它把推演和结论分开放。推演集中在一边,结论集中在另一边,这样程序能只取结论那部分,不必把推演过程展示给用户。
变体:交付之前让它自查一遍。要求它答完之后,逐条比对前面列出的限制,发现不符就自行修正。当约束是硬性的(字数、禁用词、必须包含的要素)时,这一招格外管用。
它们都有代价,别当开关用
这四个动作很容易被当成万能开关,但它们不是。
收益取决于任务。先想再答在需要多步推理的任务上收益明显,在「把这段翻译一下」上几乎为零。参考锚定在有现成对照物时最强,没有对照物时你只能退回形容词。让它先反问只在需求真的模糊时有用,需求清楚时那几轮问答纯属浪费。判断标准是:这个技巧在治的那个病,你这次有没有得。
收益还取决于模型能力。同一句「先把步骤写出来」,在弱一些的模型上可能只换来一段啰嗦的复述,在强一些的模型上才真的改善推理。所以技巧的效果会随模型更换而变——换模型之后要重跑样例,不能假设技巧还在起作用。
还有一条更根本的:这些动作都不改变「它没有在核对事实」这件事。它们调的是输出的形状、语气和推演过程,不是准确性。要准,靠的是给材料、给可核对的依据、以及最后那道校验。
因此技巧的正确位置是排在最后:先补齐四个部件、把该放的层放对,再考虑加技巧。加的时候一次只加一个,用同一组样例比出它到底有没有用——具体做法在提示词怎么迭代。
写法到这里讲完了,还剩一件事比任何技巧都要紧:手头这个活,到底该不该交给它。它能补全实现,补不上判断,那是一条用三秒钟就能划出来的线。
