Groq LangChain agent 调用工具时为何报 tool_use_failed?
结论
这条错误表示 Groq 解析模型生成的工具调用时失败了。failed_generation 中包含 addTopic 和 Topic 参数,但生成内容看起来不是完整、可解析的工具调用,因此 agent 没有进入正常的工具执行流程。仅凭这段日志无法确定根因,还需要核对模型生成的工具调用、工具 schema,以及 LangChain 与 Groq 集成的兼容性。
LLM 不会自动决定是否搜索。只有把搜索能力作为工具提供给 agent,模型才有机会调用它。缺少搜索工具无法解释这条 addTopic 调用解析失败的报错。
先检查失败的工具调用
报错中的这段信息可以说明问题发生在工具调用生成或解析阶段:
'code': 'tool_use_failed'
'failed_generation': '<function=addTopic{"Topic": "Python Lists"}</function>'
日志里的 addTopic 后面紧接着 {,中间没有明显的参数分隔符。这提示生成格式可能不符合当前 Groq 接口或 LangChain 适配层的预期,但仅凭这段内部表示还无法判断具体是哪一层出了问题。也不建议手动修改模型的内部调用文本来绕过错误。
可以按以下顺序排查:
- 确认
llama-3.3-70b-versatile在当前使用的 Groq 接口中支持工具调用,并核对ChatGroq、LangChain 及其 Groq 集成包的版本兼容性。 - 检查 agent 实际绑定的工具 schema,确认
addTopic被识别为一个参数名为Topic、类型为字符串的工具。不要只根据函数名和注释推断 schema;查看框架提供的工具定义或运行日志。 - 暂时缩短工具描述,并在系统提示中明确说明:需要新建主题时调用
addTopic,参数Topic必须是单个具体的 Python 概念。 - 单独调用模型并记录返回的结构化工具调用信息,确认问题出在模型生成、Groq 响应解析,还是后续工具执行阶段。
- 在工具函数入口记录收到的参数,并捕获工具执行异常,以区分工具调用解析失败和工具运行时报错。
改进工具实现
当前 SQL 用 f-string 拼接 Topic。如果主题中包含单引号,SQL 可能执行失败;直接拼接输入也有 SQL 注入风险。使用参数化查询更稳妥:
@tool
def addTopic(Topic: str) -> str:
"""向 TOPICS 表添加一个具体的 Python 学习主题。"""
with sqlite3.connect("learn.db") as connection:
connection.execute(
"INSERT INTO TOPICS (TopicID, Topic, Understood) VALUES (NULL, ?, ?)",
(Topic, False),
)
return f"已添加主题:{Topic}"
这项修改可以处理 SQL 参数转义并关闭连接,但无法修复发生在工具执行之前的 tool_use_failed。如果主题必须唯一,还应在数据库中设置唯一约束,并在代码里处理重复主题。只在工具描述中要求主题唯一,无法保证数据库不会插入重复记录。
搜索工具与对话上下文
LLM 不会因为 agent 配备了工具,就自行访问网页或执行任意搜索。需要搜索时,应将搜索服务封装成工具并传给 agent;模型会根据用户请求和工具描述决定是否调用。如果当前任务只涉及生成 Python 主题并写入 SQLite,就不需要搜索工具。
另外,循环中每次 agent.invoke 都只传入当前输入,没有传入上一次的 result 或对话历史。因此,每轮调用是否保留上下文,取决于是否另行配置并传入会话状态;仅凭这段循环无法假设多轮对话会自动延续。这通常属于对话行为问题,需要与本次工具调用格式错误分开排查。
备注:内容仅供参考。
