大可的 AI Builder 手记
跟随系统
颜色主题
长沙小桌实战
大可 Dako
大可 Dako大可 DakoAI Builder · Agent 实践者用 AI 做真正能用的产品。专注探索 Agent 工程化落地、Vibe Coding 实践与商业化交付。
内容平台即将上线,敬请期待
每次请求发过去的都是一整条序列01系统提示每轮都成立的东西:角色、口径、红线,固定在最前混入动态内容,前面那一整段就没法复用了02历史对话之前的来回逐轮累加,工具结果也塞在这里长任务里膨胀最快的一层03本轮这条这一次才成立的东西:用户这句话和这次的材料用户能控制的内容绝不能拼进系统提示✓ 固定内容放前面,变化内容放后面
每轮发过去的都是一整条序列,不只是你刚说的那句。固定内容放前面,变化内容放后面,这一条同时决定成本和稳定性。

系统提示与用户提示

每次都成立的话放系统提示,这一次才成立的话放本轮。放错层,代价是账单、是设定衰减,也可能是安全。

一个常见的误解,是以为模型收到的就是你刚敲进去的那句话。它实际收到的是一整条序列:凡是每一轮都成立的内容,写进系统提示;只在这一轮成立的内容,写进本轮消息。位置放错的代价,轻的是账单,重的是设定慢慢失效,最严重的是安全。

读完你能回答:

  • 一句话该放系统提示还是放本轮,判断标准是什么?
  • 系统提示的优先级有多高,为什么不能拿它当锁用?
  • 让它先反问、给对照物、先想再答、设角色,各自到底在做什么,什么时候不该用?

一条内容该放哪一层,只问一个问题

系统提示,装的是每一轮都成立的内容。产品扮演什么角色、用什么语气、能做什么不能做什么、输出格式约定成什么样、哪些红线绝对不能碰。这些文字每一轮都要重新发一遍,所以它对整段对话一直有效。

判断依据只有一条:放到第一轮成立吗?放到第五十轮还成立吗?两个都成立,就归系统提示。只在当下成立的内容——比如「材料在下面」「用户刚上传了一张图」——归本轮那条消息。

历史对话,装的是此前已经说过的内容。你们的来回往复,一轮接一轮往后堆。它并不具备跨会话的记忆,你觉得它「记得」上一轮说过什么,真实原因是整段历史又被原样发了一遍。工具返回的结果通常也落在这层,所以一旦产品开始一轮轮调用工具,这层的膨胀速度会非常快。

本轮这条,装的是只在此刻成立的内容。用户刚发出的那句话,加上这次要用到的材料:检索回来的文档片段、用户上传的文件、当前页面的数据。

固定内容前置,这条纪律也管账单

除了「每轮成立与否」,分层还有一条同样硬的约束:不变的内容排在前面,会变的内容排在后面。

主流模型服务都支持复用前缀——只要这次请求的开头与上次完全一致,这一段就不需要重新计算,价格低很多。系统提示正好位于最前端且始终不变,它天然就是最应该被复用的部分。而它往往又是整轮请求里最长的一段,命中与否,账单上的差别很直观。

道理听着简单,违反起来却很容易:有人在系统提示里塞进当前时间,或者把用户名拼进去,一个字符不一样,整段前缀就作废了。这类随时会变的信息应该放到本轮这层。官方提示指南把「固定指令前置」写进了最佳实践。openai-prompt-eng

它更受重视,但不是一把锁

系统提示确实享有更高的优先级,但这指的是「更受重视」,而不是「无法违抗」。训练过程引导模型优先遵循系统提示,因此它多数时候会照办;然而这终究只是概率上的倾向,用户输入足够强硬、对话足够长,都可能让它偏离。官方文档表达的也是同一层意思:系统提示是最强的默认值,并不是一把锁。anthropic-system-prompts

由此带来两个实际后果。

一、长对话里设定会衰减。聊到几十轮之后,系统提示被一大堆历史对话包围,分量被稀释了。表现出来就是它渐渐不像你们的产品。缓解手段是把最关键的几条约束在本轮这条里再说一遍——利用结尾位置看得最清楚这个特性。

二、别把安全交给系统提示。把「不要回答与产品无关的问题」写进系统提示,多数时候管用,但它终究不是锁。真正的边界必须由代码来守:不该进的输入在到达模型之前就拦下,不该做的操作在工具那一层根本不给出口。

还有一条不能碰的底线:用户能控制的内容,永远不要拼进系统提示。模板里留个空位让用户填公司名,句子写成「你是某某公司的客服,只解答与该公司业务有关的问题」,那个空位里用户就能填任何东西,包括一整套新的指令,而他填的内容就此获得了系统提示的地位。

指令和数据之间的界线在机制层面本就是模糊的,正确的形态是:系统提示完全由你的代码掌控,用户的一切输入都走本轮这一层。需要引用时用一句明确的声明把它降格为素材——说明这段文字只是用户提供的参考资料,不构成指令——再用清晰的分隔符包起来。

角色设定换的是口吻,不是本事

分层讲完了。接下来看四个常被当成「技巧」的动作,先从用得最多、也最容易被高估的那个说起。

「你是一位从业十五年的审计师」——以这类句子开头的模板遍地都是。它确实有用,但作用被夸大了。

它真正做的事:调整词汇和语气的分布。告诉它这是审计师,输出就会偏向这个行业惯用的措辞、更克制的句式、更常见的免责表述。这是可能性被收窄的直接结果——「审计师」附近的词,确实和「幼儿园老师」附近的不一样。

它做不到的事:让它更懂这一行。模型掌握的知识在训练阶段就已经定型,加一句角色设定既不会带来新知识,也不会提升事实层面的准确率。

这个区别在产品里很要命。有些团队把角色改成「你是持牌理财顾问」,以为输出就会更可靠,于是把核查放松了——这是个危险的误解。语气确实变得更专业,出错概率却纹丝不动,而且因为听着更有权威感,错误反而更难被察觉。官方指南对角色设定的定位也是如此:它调的是风格和语境,不承诺提升能力。anthropic-prompt-eng

所以正确的用法是:角色设定管的是语气和风格,别指望它改变能力。想提高准确率,靠的是给材料、给例子、让它先想再答,以及最后那道校验。与其写「资深专家」这种空泛头衔,不如写具体的行为约束:要求它每处结论都注明依据出自材料的哪一段,遇到不确定的地方直接承认、不要往下猜——这些比任何头衔都管用。

自己说不清,就把问题交还给它

需求还在你脑子里、连自己都没想透的时候,别硬写:让它来问你。

在任务后面加一句:「动手之前,先来问我三个最要紧的问题,等我回答完再开始。」

为什么有效?它把「你得凭空想全所有背景」换成「你只需回答几个具体问题」,后者容易得多。它问出来的问题,往往正是你漏掉的那几个部件——这是「先回查自己」那个姿态的执行方式:与其自己猜哪里没说,不如让它把空白处指出来。

更实在的一点是,你给出的回答也会进入上下文。这一招的实质,是借模型的手把提示词补齐;事后再把这段对话整理定型,就得到一份可以反复使用的提示词。

边界很清楚:它只适合需求模糊的开放任务,不适合批量自动化流程。流水线上要的是确定性,不是对话;那里多一轮问答就是多一份延迟和成本。

能指出一个具体对照物,就别写形容词

这是给例子那一招的推广:手边有现成的参照物时,形容词就可以收起来了。

说「文字再精练一些」,不如说「照这份周报的句子长度来」;说「语气别太生硬」,不如说「按我们给客户的正式回函那种口吻写」;说「视觉上高级一点」,不如干脆把上一版的截图贴过去。

原因还是那个:形容词是压缩过的信息,不同的人展开它得到的结果不一样,模型只能挑一个平均值交差。而一个具体的对照物本身就带着完整细节。

使用时有一步不能省:讲明白要参考的是哪一方面。把一份文档丢过去只说「参考这个」,它无从判断你指的是框架、语气还是篇幅。改写成「照它的信息颗粒度和每段长度来,内容另起一套」,结果会稳定得多。

让它把推演写出来:多写的字就是多花的算力

在提示词里补上一句*「给结论之前,先把你的判断过程逐条写出来」*,多步任务的正确率通常会有明显改善。思维链论文验证的正是这一点:让模型把中间步骤写出来,它的表现会变。chain-of-thought

机制在它猜下一个字的原理里:它的思考就是它的输出,多写就是多算。中间步骤一旦写出来,就进入了序列,后面每一步都能看到前面的推演,等于给了它几次纠错机会。

三条使用提醒,外加一个变体。

一、有代价。中间步骤也算输出,慢一些贵一些。简单任务不必开。

二、推理模型不需要这一句。它内部已经做过这一步了,再提一次反而可能形成干扰。

三、可以让它把推演和结论分开放。推演集中在一边,结论集中在另一边,这样程序能只取结论那部分,不必把推演过程展示给用户。

变体:交付之前让它自查一遍。要求它答完之后,逐条比对前面列出的限制,发现不符就自行修正。当约束是硬性的(字数、禁用词、必须包含的要素)时,这一招格外管用。

它们都有代价,别当开关用

这四个动作很容易被当成万能开关,但它们不是。

收益取决于任务。先想再答在需要多步推理的任务上收益明显,在「把这段翻译一下」上几乎为零。参考锚定在有现成对照物时最强,没有对照物时你只能退回形容词。让它先反问只在需求真的模糊时有用,需求清楚时那几轮问答纯属浪费。判断标准是:这个技巧在治的那个病,你这次有没有得。

收益还取决于模型能力。同一句「先把步骤写出来」,在弱一些的模型上可能只换来一段啰嗦的复述,在强一些的模型上才真的改善推理。所以技巧的效果会随模型更换而变——换模型之后要重跑样例,不能假设技巧还在起作用。

还有一条更根本的:这些动作都不改变「它没有在核对事实」这件事。它们调的是输出的形状、语气和推演过程,不是准确性。要准,靠的是给材料、给可核对的依据、以及最后那道校验。

因此技巧的正确位置是排在最后:先补齐四个部件、把该放的层放对,再考虑加技巧。加的时候一次只加一个,用同一组样例比出它到底有没有用——具体做法在提示词怎么迭代。

写法到这里讲完了,还剩一件事比任何技巧都要紧:手头这个活,到底该不该交给它。它能补全实现,补不上判断,那是一条用三秒钟就能划出来的线。

参考资料

  1. System prompts — Anthropic
  2. Prompt engineering — OpenAI
  3. Prompt engineering overview — Anthropic
  4. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models — arXiv