最近在做一个能自动查资料、写周报的Agent,用Claude 3.5 Sonnet。一开始System Prompt就200字,跑得挺好。后来为了让它在多轮对话里不跑偏,我不断加规则:什么“如果用户没明确说,不要主动调工具”、“超过3轮必须总结一次”……现在快2000字了,反而感觉它变“呆”了,有时候明明很简单的问题,它非要按我写的流程走一遍,特别啰嗦。
写Agent的System Prompt总是越写越长,怎么控制不失控?
全部回复
共 65 条我最近也踩过这个坑,越加规则模型越死板,感觉它把每条指令都当成最高优先级去执行了,反而丢了原本的灵活度。后来我把那些“不要做什么”的硬规则全删了,改成在关键节点给一个“优先判断”的提示,比如“只有用户明确要求时才调用搜索”放在最前面,其他细节全挪到few-shot示例里让模型自己学。另外发现一个有用的思路:把System Prompt当成一个“角色设定+目标约束”,而不是流程说明书,那些“超过3轮总结”之类的逻辑其实更适合放在代码里控制,每轮对话前动态注入当前状态,而不是让模型自己记。还有个土办法,就是每次改完prompt都拿十个固定问题跑一遍回归测试,一旦发现它开始答非所问或者废话变多,立刻回滚,别心疼删掉的那些字。说到底,2000字可能不是控制力变强,而是把模型的注意力稀释了,它得花精力去权衡哪条规则更重要。
我最近也踩过类似的坑,一开始给Agent定的规矩越多,它反而越容易在无关紧要的地方纠结。后来我发现System Prompt更像是个“边界”而不是“操作手册”,你越是想把每一步都写死,模型就越倾向于机械执行,根本顾不上理解用户的真实意图。我现在的做法是只保留几个核心原则,比如“默认假设用户需要简洁答案,除非明确要求详细”,然后所有额外规则都塞进用户消息的动态上下文里,让模型自己判断什么时候该触发。还有个体会是,那些“超过3轮必须总结”之类的硬性规定,其实可以改成给Agent一个“记忆压缩”的工具,让它自己决定什么时候该清理历史,而不是靠你预设轮次来卡它。你那个“变呆”的现象,我怀疑是2000字的规则里有很多互相矛盾的地方,模型在权衡优先级时把最简单的路径当成了最优解,你可以试着删掉一半约束,只保留那些真正能避免错误行为的,跑几轮看看效果。另外,Claude 3.5对这种冗长指令的遵循度有时候不如短指令来得精准,可能它把更多注意力花在解析规则上了。如果方便的话,可以把你最开始的200字版本和现在的2000字版本做个A/B测试,大概率会发现短版本在灵活度上完胜。
试过把规则拆到工具描述和上下文里吗?主prompt只留核心目标,我这样改完啰嗦少多了。
我最近也踩过这个坑,System Prompt从300字膨胀到1500字之后,模型确实会变得特别“轴”。感觉问题的核心不是规则太多,而是很多规则在互相打架,比如你既让它“灵活判断”,又给它套了“超过3轮必须总结”这种硬性流程,模型只能优先执行最机械的那条。后来我把那些“必须”“一定要”改成“通常”“倾向于”,反而听话多了。其实有些约束根本不该写在System Prompt里,应该交给代码层做状态管理,比如轮次计数、工具调用白名单这些,模型只负责理解和生成。还有一个挺有用的做法,把长规则拆成几个短prompt按场景拼接,别一股脑全塞进去。2000字里估计有一大半是重复表达或者模型本来就会遵守的常识,删掉之后效果反而回升。你可以试试把当前prompt打印出来,逐条问自己“这条不写它会犯吗”,大概率能砍掉三分之一。
我之前也踩过这个坑,规则堆多了模型就开始“过度执行”,把每句话都当圣旨。后来我把那些流程性的约束拆出去,用代码或者工具层去兜底,System Prompt里只留角色定位和判断原则,反而灵活多了。你可以试试把“超过3轮必须总结”这种硬规则改成“感觉对话快跑偏时主动收一收”,给它一点判断空间。说到底模型不是靠规则数量变聪明的,规则太多它就不敢自己思考了。