做智能体项目最磨人的阶段,往往不是搭框架,而是调提示。我之前在某个跨平台客服智能体上卡过将近一周:文档检索正常、工具调用正常,任务一复杂就开始胡言乱语,要么跳过关键步骤,要么在同一个错误上反复打转。后来把各种设计模式过了一遍,最后发现真正的瓶颈不在模式本身,而在支撑这些模式运转的提示技术。
这篇内容对应《智能体设计模式详解》B部分的附录A,我把它单独拎出来写,是因为高级提示技术在智能体系统里太容易被当成"顺手调一下的参数",实际上它是给所有设计模式提供行为逻辑的底层协议。看完你应该能回答三个问题:为什么同一个架构换一套提示效果天差地别;思维链、自一致性、反思、少样本这些技术分别在什么场景下必须上;提示出问题的时候该按什么路径排查,而不是靠瞎试。
1. 提示技术为什么是智能体模式的底层操作系统
很多入门的同学会把智能体和"一个大模型API加一圈工具函数"画等号,这种理解不能说错,但容易让人忽略一个事实:设计模式决定的是系统的骨架,而提示技术决定的是骨架里每一块肌肉怎么发力。骨架搭得再漂亮,提示写得稀烂,智能体表现出来的就是个"脑子清楚但手脚不听话"的状态。
1.1 设计模式给骨架,提示给行为
先理清一个概念。设计模式解决的是"结构"问题:ReAct模式决定了智能体要按照"思考→行动→观察"的循环来工作;规划-执行模式决定了系统要先把大任务拆成子任务,再逐个执行;多智能体模式决定了多个角色之间怎么分工、怎么汇报。但模式本身不会告诉你"每一步该怎么想",这个"怎么想"就是提示技术要填充的内容。
我习惯把提示技术比喻成操作系统的指令集。模式是CPU的流水线结构,提示就是流水线上一条条具体的机器指令。同一个CPU架构,跑不同的指令集会得到完全不同的程序行为;同理,同一套ReAct循环,配上不同的思维链提示和工具描述,行为差异可能大到像两个产品。
这也是为什么我在实际项目里从来不建议直接抄别人的系统提示词。架构可以复用,模式可以复制,但提示必须针对你的任务域、你的工具集、你的模型能力重新设计。别人那份提示词是给他的指令集写的,搬过来跑在你的流水线上,大概率是乱码。
1.2 提示技术和设计模式的对应关系
为了后面讨论方便,我先给一张对应关系表。这张表不是严格的一一映射,更多是提醒你:在某个模式里,哪种提示技术是"缺了就跑不动"的关键依赖。
| 设计模式 | 核心依赖的提示技术 | 提示承担的角色 |
|---|---|---|
| ReAct循环 | 思维链提示 + 工具使用格式约束 | 强制模型交替输出推理和动作 |
| 规划-执行 | 任务分解提示 + 子任务描述模板 | 把大目标拆成可执行的小步骤 |
| 反思模式 | 批评者提示 + 修改指令 | 生成对自身输出的审查意见 |
| 多智能体协作 | 角色设定提示 + 协作协议说明 | 定义每个智能体的职责边界 |
| 记忆管理 | 摘要压缩提示 + 相关性筛选提示 | 决定哪些历史信息进入上下文 |
表格里每一行展开都是一套完整的提示设计工作。我在后面几章会挑最常用的几个拆开讲,这里先记住一个核心观点:选模式之前,先想清楚这个模式对提示有什么硬性要求。比如要做多智能体协作,你就必须解决角色提示之间的冲突问题;要做反思模式,你就得设计好批评者提示的"挑剔程度"——太严会让执行器缩手缩脚,太松则反思形同虚设。
2. 实战里最高频的几类提示技术拆解
高级提示技术这个名头听着唬人,实际高频使用的不超过十种。我按在智能体项目里的出现频率排序,讲透最核心的三类:思维链、自一致性、以及少样本与反思的搭配逻辑。
2.1 思维链不是咒语,是一种约束机制
思维链提示,就是让模型在给出结论之前,先把推理过程一条条写出来。很多人把它当成"加一句'让我们一步步思考'就完事"的咒语,这个理解太浅了。它真正的作用是给模型施加一个输出约束:要求模型把隐式的推理过程显式化,从而降低跳跃式推断的概率。
在智能体场景里,思维链还有一个额外的价值:可观测性。模型输出的推理过程会成为日志的一部分,让你能定位到是哪一步出了偏差。没有思维链的智能体,就像没有黑匣子的航班——结果错了你根本不知道是感知错了、推理错了还是动作错了。
我的建议是:凡是需要多步决策的智能体,无论是单智能体还是多智能体,默认开启思维链。但要注意控制格式,明确要求推理过程不超过一定长度,避免模型在思考环节长篇大论,挤占后面工具调用的上下文空间。
2.2 自一致性:用投票抵消单条路径的偶然性
自一致性技术的思路其实特别朴素:同一个问题,让模型用较高的采样温度跑多次,每次得到一条不同的推理路径和答案,然后统计答案的众数作为最终结果。之所以有效,是因为模型的单次推理有随机性,可能这次绕了远路,下次撞进死胡同,但正确推理路径往往会在多次采样中更频繁地出现。
在智能体系统里,自一致性的最佳应用点是"决策环节"。比如在规划模式里,让规划器对同一个目标生成两三份不同的任务拆解方案,再做一次一致性合并,能明显减少那种灵光一现但方向错误的拆解。在工具选择上也可以这么做:拿不准调用哪个工具时,并行采样几次,看哪个工具名出现的频率最高。
不过这个方法有代价:推理成本成倍增加,延迟也会翻几倍。我的经验是只在两类场景启用:一是任务失败代价高的场景,二是模型已经表现出"答案随机波动大"的迹象时。至于采样次数,三四次是一个性价比还不错的区间,再往上收益递减明显。
2.3 少样本与反思提示的场景化用法
少样本提示在智能体里最常见的用途是给模型"打样"。比如你希望工具描述的调用格式是JSON,光在系统提示里写"请用JSON输出"还不够,给出一个完整的输入输出范例,模型几乎不会跑偏。我测试过,纯文字格式说明加上一个范例,格式合规率能从七八成提高到接近满分。
反思提示则是一种自我修正机制。基本结构是:先生成初始答案,再让模型以批评者的视角审视这份答案,找出漏洞,最后根据批评意见重新生成。这个技术在我们内部叫"双程提示",因为它天然就是两个阶段的提示组合。要注意的是,批评者提示和生成者提示必须分工明确,最好用不同的角色描述来分隔,否则模型会陷入"自己肯定自己"的循环,批评环节形同虚设。
3. 把高级提示嵌进智能体循环的落地方式
前一部分讲的是单点技术,这一部分讲组合拳。真正跑起来的智能体,提示不是孤立的一段文本,而是由系统提示、任务提示、工具描述、输出格式约束共同组成的提示栈。下面按最常见的三种模式,演示我实际用的提示结构。
3.1 ReAct循环中的提示结构
ReAct模式的核心是让模型交替进行推理和行动。我常用的系统提示模板长这样:
你是一个能够调用外部工具完成任务的智能体。 在每一步中,请严格遵守以下输出格式: 思考:基于当前状态,简要说明你观察到了什么,以及下一步该做什么。 行动:选择需要调用的工具名称,并给出JSON格式的参数。 观察:等待工具返回结果,然后如实记录。 重复"思考→行动→观察"直到信息充分。 当你可以给出最终结论时,以"最终答案:"开头输出。这个模板有三个设计要点。第一,"思考"字段其实嵌入了一条轻量思维链,逼着模型每次行动前先解释动机,这样可以阻止它盲目调用工具。第二,"行动"字段要求JSON参数,比自由格式更利于下游代码解析,减少工具调用层的容错代码。第三,最后一句"重复循环直到信息充分"是循环终止条件,缺少这句,模型可能在拿到答案后还继续调用工具,白白消耗额度。
3.2 规划-执行模式的提示分工
规划-执行模式把系统拆成两个角色:规划器负责拆任务,执行器负责跑任务。两个角色用两套独立的提示来约束。
规划器提示的核心是"目标分解指令":
你是任务规划器。你的职责是把用户目标拆解为不超过5个可独立执行的子任务。 要求: 1. 每个子任务必须明确输入、操作对象和预期输出。 2. 子任务之间如果存在依赖关系,请标注顺序。 3. 输出为编号列表,不要包含任何解释性前言。执行器提示的核心则是"单任务专注指令":
你是任务执行器。你只需要完成当前分配给你的子任务。 忽略其他无关信息,不要在回答中主动提出规划建议。 完成任务后,用三行以内的文字汇报结果。拆开成两套提示的意义在于隔离复杂度。如果让一个提示同时管规划和执行,模型很容易在规划阶段就开始执行,在遇到中途变化时又无法重新规划。分工之后,规划器可以专注全局视角,执行器可以专注局部操作,各自提示的上下文长度也会更可控。
3.3 多智能体协作中的角色提示
多智能体模式是提示冲突的高发区。多个智能体共享同一个底座模型时,如果每个角色的提示不够鲜明,模型会表现出"角色串味":主管智能体开始亲自干活,执行智能体开始发号施令。
我的解决方法是给每个角色提示里加一个"角色禁区"段落。比如主管智能体的提示会写明:"你只负责分配、协调和汇总,不要直接执行子任务,不要修改下属返回的数据。" 执行智能体的提示会写明:"你无权调用其他智能体的工具,无权更改任务目标,只能操作分配给自己的工具集。"
除此之外,多智能体之间的消息协议也要写进提示。我在一个模拟项目X里用的是简单的结构化消息格式,要求所有智能体的输出必须符合这个格式,包括发送方、接收方、消息类型和载荷内容。别嫌这种格式啰嗦,它能把智能体之间的通信从"自由的散文"降维成"可解析的数据",调试时一眼就能看出是谁说了什么、说给了谁。
4. 高级提示失效的典型场景与排查链路
提示技术不是加了就一定有效,恰恰相反,高级提示在智能体循环里出问题的概率非常之高。这一章记录几个我踩过的坑,以及完整的排查链路。
4.1 思维链导致的行为漂移
思维链在长循环场景里有一个隐蔽的副作用:模型会把"思考"当成一种表演。连续跑了几轮之后,它可能开始输出大量与任务无关的自我怀疑,比如"这里我不太确定""也许用户想要的是另一种结果",然后行动开始畏缩,甚至出现"思考→思考→思考"的循环,就是不调用工具。
我遇到的一次典型情况是:某个模拟项目X的检索智能体,在第五轮循环之后突然不再调用搜索工具,反而开始根据已有信息猜测答案。排查过程是这样的——先看日志里每轮的"思考"内容,发现模型在第三轮已经开始输出"我猜测"这样的词;接着对比工具调用记录,发现工具调用频率从每轮一次骤降到零;最后定位到系统提示里一条"可以基于已有信息推断"的宽松表述,它给了模型偷懒的借口。
修复方案很简单:把系统提示改为"严禁在未调用工具的情况下给出结论性内容。如果你认为信息已充分,必须先输出'信息充分',再给出答案。"同时把思维链的格式从自由文本改成固定结构,限定"思考"部分最多两行,堵住长篇自我怀疑的空间。
4.2 上下文膨胀:提示越长不代表越好
高级提示技术往往伴随着更长的提示文本——思维链要求输出推理过程,少样本要求附加范例,反思模式要求两轮输出。这些内容叠加在一起,会让上下文窗口快速膨胀,最终挤占掉真正重要的工具返回结果的空间。
最典型的表现是:模型在循环后期开始遗忘早期步骤的结果,或者把不同轮次的观察结果混为一谈。我在某个数据分析智能体里就碰到过:模型把第一轮的统计结果和第五轮的新结果做了对比,然后得出了一个完全错误的结论。问题的根源就是上下文里塞满了中间推理过程,早期的观察被"挤"出了模型的注意力范围。
处理思路有两条。第一,给推理过程设置长度上限,能用一两句话说明白就不允许写一整段。第二,引入摘要机制,在每轮循环结束时,用一个独立的摘要提示把当前的中间结论压缩成一段简短记录,替代原始的长文本。这样上下文里保留的是高价值的结论性信息,而不是冗长的过程性描述。
4.3 排查提示问题时的记录方法
排查提示问题最忌讳的就是一次改多个变量。改了温度、换了提示结构、加了范例,效果变好了,但你根本不知道是哪个改动起的作用。我后来养成了一个很笨但有效的习惯:维护一份提示变更记录表。
| 日期 | 变更内容 | 变更原因 | 评测结果 | 是否保留 |
|---|---|---|---|---|
| 某月某日 | 系统提示增加"严禁无工具推断"约束 | 出现行为漂移 | 工具调用率从62%提升至91% | 保留 |
| 某月某日 | 思维链字数上限从无限制改为两行 | 上下文膨胀 | 平均轮次从7.2降到4.5 | 保留 |
| 某月某日 | 少样本范例从1个增加到3个 | 格式合规率不足 | 合规率从78%提升至96% | 保留 |
每次只改一个变量,跑同一批测试用例,把结果记下来。坚持两到三周,你对自己系统里提示的敏感性会有一个非常直观的感知:哪类问题该动系统提示、哪类问题该动输出格式、哪类问题其实是参数设置不对而不是提示的问题。
5. 参数配合与一套可复用的提示模板
最后一部分讲两个实操层面的事:模型参数怎么和提示技术配合,以及我在多个项目里沉淀下来的一套提示模板框架。这部分内容能直接拿来当检查清单用。
5.1 温度与采样参数如何配合提示技术
模型参数中影响最大的是温度。很多人有个误区:推理任务一律把温度调到最低,认为越"确定"越好。但在智能体场景里并非如此——温度的作用要结合提示技术来看。
当你使用自一致性技术时,刻意把温度调高一些反而更有价值。因为自一致性需要多条多样化的推理路径,温度太低会让多次采样结果趋同,投票变成"自己投自己",失去了多路径校验的意义。我在实践中一般把温度设在0.4到0.7之间跑自一致性,这能保证路径多样性,又不至于让输出散到没法看。
反过来,在规划器和执行器这些要求稳定输出的环节,温度调低是合理的,通常0.1到0.3比较合适。还需要提一个容易被忽略的点:如果提示里已经明确要求了输出格式,而模型依然偶尔不按格式来,问题往往不在温度,而在格式指令和上下文里的范例数量不足。先补范例,再动参数,这是顺序问题。
5.2 不同能力模型下的提示写法差异
不同能力的模型对提示的响应模式差异很大,这一点在我同时用过多个底座模型之后感受尤其明显。能力强的模型,你给它一个简洁的约束描述,它自己就能推断出具体行为;能力弱的模型,必须把规则写到"不容误解"的程度。
具体来说,对于能力偏弱的模型,提示要更"啰嗦":每个约束都要配正例和反例,输出格式要给完整模板,角色描述要直接声明"你是""你不是"。对于能力强的模型,反而可以适当精简提示,过度的少样本范例会引入冗余信息,甚至干扰它的判断。这是个反直觉的点:当你换到更强的模型时,不是简单把提示原样搬过去就能获得更好的效果,有时候需要删掉一部分范例才能发挥模型的真正水平。
一个实用建议是:在任何模型迁移之前,先跑一个最小提示测试——只保留系统角色和任务描述,不做任何高级提示包装,看看模型的基线行为是什么。然后逐步叠加提示技术,每一步都做对比。这个过程能帮你判断,哪些提示技巧是在弥补模型的短板,哪些是在放大模型的已有能力。
5.3 我沉淀下来的提示模板框架
这套框架在几个模拟项目和某跨平台系统中反复验证过,Basic结构是五段式,从左到右分别是角色、目标、约束、范例、输出格式。每一段都有明确的职责,改提示时也能精准定位段落。
[角色段] 你是XX智能体,负责XX。你不是XX,不要做XX。 [目标段] 本次任务的最终目标是:XXX。 判断任务成功的标准是:XXX。 [约束段] 必须遵守的规则: 1. ... 2. ... 禁止行为: 1. ... 2. ... [范例段] 示例输入:... 示例输出:... [输出格式段] 请严格按照以下格式输出: 字段1:... 字段2:...别小看这个看起来普通的框架,它最大的价值是强制你把"角色"和"约束"分开写。很多提示翻车,就是因为角色描述里混入了行为约束,导致模型对自身职责的理解出现偏差。分开之后,角色段负责身份认同,约束段负责行为边界,目标段负责价值导向,范例段负责具体打样,输出格式段负责解析稳定性。哪一环出问题,直接改对应段落,不需要重写整份提示。
我在实际运用中还有个习惯:把输出格式段里每条字段的说明都写得能让"一个只看格式不看其他内容的人"也能照着输出。这一步对下游代码的解析至关重要,能把你从"反复解析模型自由文本"的泥潭里彻底拉出来。
最后再分享一个经验。高级提示技术的价值上限,取决于你对自己任务域的理解深度。技术本身是公开的,思维链的论文谁都能看,自一致性的原理也不复杂,但"在你的系统里,哪一步最容易出错、哪个决策需要多路径校验、哪个角色需要更强的约束",这些判断只能来自对项目的反复观察和记录。我建议每个智能体项目从第一天起就建立提示的版本管理意识,把每一次改动当成一次小实验来对待。坚持下来,你会发现自己对智能体行为的掌控感会越来越强——那才是高级提示技术真正带给你的东西。