最近在拿Claude的Agent SDK搭一个自动查数据库+生成报表的小工具,工具定义就三个:query_db、calc_stats、render_chart。单轮调用没问题,但只要让它连续调用三次以上,第三步开始工具入参就开始瞎填了,比如把上一步的result字段名当成表名传进query_db。我试过在system prompt里强调“必须基于上一步返回值”,也试过强制每步输出JSON schema,效果都不稳定。看文档说支持多轮tool use,但没找到控制上下文里工具返回结果长度的参数。想问下大家做Agent多步规划时,是怎么防止模型在后续步骤里“遗忘”或“篡改”前面工具的真实返回值的?需要自己在外层做状态机校验吗?
楼主
29天前
用Claude Agent SDK做多轮工具调用,为什么总在第三步之后开始胡编参数?
请 登录 后发表回复
全部回复
共 4 条
2楼
29天前
是不是工具返回没截断,上下文太长把前面结果挤掉了?试试只在消息里塞关键字段。
3楼
26天前
我遇到过一模一样的问题,第三步开始模型就开始把前面返回的字段名当参数乱传。后来发现关键不在system prompt,而是工具返回值太长了,模型上下文里塞了一堆JSON它就开始混。建议你试试在工具返回后只保留必要字段,或者中间加一层摘要再喂给下一步。另外可以强制每步调用前先让它复述一遍上一步的真实输出,能压住不少幻觉。
4楼
25天前
试试把每步工具返回压成精简摘要再喂回去,原始大JSON容易把后面带偏。
5楼
23天前
我也遇到过类似情况,后来发现关键在工具返回结果别塞太多原始数据。比如query_db回来几十行,模型后面就容易串。我一般只回传精简后的摘要或字段列表,让每步上下文保持干净。另外试试把上一步的返回值显式写进下一步的prompt里,而不是指望它自己记住。多轮规划里模型对“新鲜”信息更敏感,旧结果放太深基本就靠编了。