最近在学AI Agent,参考LangChain官方文档写了个简单的ReAct Agent,用来查天气和发邮件。工具函数单独跑都没问题,但一集成到Agent里,它要么调错参数,要么说“no tool found”。我甚至把工具描述写得很详细了,还是经常抽风。用的是GPT-4和最新的LangChain版本,是不是我prompt写太长了?或者工具返回格式有坑?求大佬们分享下踩坑经验,或者有没有更稳的Agent框架推荐?先谢过了!
用LangChain搭Agent,工具调用总是失败,有大佬指点下吗?
全部回复
共 168 条工具调用这块我踩过一模一样的坑,大概率是工具描述和参数schema对不上。LangChain的ReAct对格式特别敏感,工具返回如果不是纯字符串,或者中间夹了换行符,它就容易解析崩掉。你可以先把工具描述砍短,只留关键参数说明,再在prompt里加一句“调用工具前先确认参数名”。另外GPT-4偶尔会自己编工具名,换个支持function calling的Agent类型会稳很多。
工具调错参数这个坑我也踩过,八成是description写得太抽象了,模型压根不知道哪个参数该填啥,最好在描述里直接给个调用示例。no tool found一般是函数名和prompt里提到的对不上,或者用了AgentExecutor但没把tools正确传进去,建议先打印一下实际喂给模型的prompt看看。还有个容易被忽略的点,工具返回结果如果是dict记得转成字符串,有些版本解析会直接报错。稳一点的话可以试试换OpenAI的function calling模式,比ReAct省心不少。
工具返回格式统一成字符串试试,我之前也是这毛病,改成json.dumps后就稳了。
工具描述别写太长,GPT-4反而容易挑花眼。试试把返回格式统一成JSON,LangChain解析稳很多。
工具描述写太细反而容易让模型纠结,我一般只保留关键参数说明,再加一句“不确定时直接问用户”。另外检查下工具返回是不是纯字符串,LangChain对非文本输出挺敏感的,套个json.dumps会稳很多。GPT-4偶尔也会犯轴,试试把temperature调到0,ReAct的prompt别塞太多few-shot示例。实在不行换AutoGen或者CrewAI,工具调用的容错确实比裸LangChain好一些。
ReAct对工具描述格式挺敏感的,建议换成OpenAI function calling模式试试,稳定不少。
这个思路不错,收藏了。
这个坑我踩过,大概率是工具描述里的参数schema没对齐,LangChain对参数类型挺敏感的,比如你写的是string但模型传了个数字就会挂。另外工具返回结果建议统一包成字符串,别直接丢dict,不然Agent解析容易出问题。还有GPT-4有时候会自己脑补工具名,把tool名字改得简单点、别带特殊符号试试。ReAct本身就不太稳,可以试试换OpenAI的function calling模式或者看看AutoGen,容错好不少。