一个带删除工具的Agent,配上一句宽松的提示词,会把"帮我清理旧记录"读成授权。整个过程没有任何东西出故障——这句话允许这种理解,工具也允许这个动作。缺的是一条规则:这个工具什么时候可以跑。
问题不在于模型有多聪明,而在于代码里有没有一道闸门。自主性不是模型的性格,而是你的代码强制执行的一套策略。
自主性到底是什么
一个Agent的自主性,指它在人类必须批准、审查或介入之前,能自己走多远。它属于工具,不属于整个Agent。同一个Agent,读操作可以放在最高级别,删除操作却只能停在需要人点头的那一档。
作者给了一套从Level 0到Level 4的刻度。需要说明的是,没有任何标准定义这些级别,这是作者自己的工作刻度。
按"错一次的代价"给工具分类
读工具什么都不改。写工具改了东西,但还能撤销。不可逆工具则收不回来:删数据、发消息、动钱。这个分类来自一次错误调用的代价,跟工具叫什么名字无关。
决策逻辑很直接:
- 读工具:直接跑。
- 写工具:Level 1拒绝,Level 2问人,Level 3或4放行。
- 不可逆工具:Level 1拒绝,Level 2或3问人,Level 4才放行。
人批准了就跑,拒绝了就把一个错误结果回传给模型,而不是抛异常。拒绝和未获批准都走这条路,模型因此能自己解释发生了什么。
代码里的闸门
示例用TypeScript写,跑起来只要一行命令,改环境变量里的数值就能对比不同级别的行为。三个工具分别是查总额、记一笔支出、按id永久删除一笔支出,风险等级依次是读、写、不可逆。
有一个细节值得单独拎出来:风险表里漏掉的工具,会默认落到不可逆一档。也就是说,你忘了分类的东西,拿到的是最严格的待遇。这是有意的失败关闭设计。
回头看自己写过的代码
作者重读自己系列里的旧代码,发现了三处值得说的地方。
提示词工程那篇里的系统提示写着"除非用户明确要求,否则永远不要删除或修改过去的支出"。可那篇里的Agent根本没有删除工具——这行话守的是一个它做不到的动作。
组件那篇里的记账器写入时没有任何审批,只有一个六步上限。那其实是一个Level 3的决定,只是当时没被命名。
所以这道闸门要放在代码里、紧挨着执行函数,提示词那句话只能算第二层。
几个常见错误
- 规则只写在提示词里。
- 按工具名字分类,而不是按一次错误调用的代价分类。
- 没给未分类工具设默认值。应该失败关闭。
- 抬高整个Agent的级别,而不是一次只调一个工具。
- 并行跑审批。任何要等人回应的环节都必须串行。
- 把用户拒绝当成程序崩溃,而不是作为工具结果返回。
最后留一个问题:你自己的Agent里,哪些工具是你绝对不会让它不问一声就跑的?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.