最近在做一个能帮我整理待办、查资料的小 Agent。核心机制是工具调用:我把一组函数描述给模型,模型决定什么时候调用哪个、传什么参数。看起来简单,实际踩了不少坑。

坑一:工具太多,模型选不准

一开始我一口气给了十几个工具,结果模型经常选错,或者在相似的工具之间犹豫。后来把功能相近的合并,只保留最核心的几个,准确率明显提升。

经验:工具宁少勿多,每个工具的职责要清晰、不重叠。

坑二:描述写得太简略

search(query) 这样的描述,模型并不知道它能搜什么、不能搜什么。把描述写成给新同事看的说明:什么时候该用、返回什么、有什么限制。

{
  "name": "search_notes",
  "description": "在我的个人笔记中做全文搜索。适合查找我以前记录过的结论或代码片段;不能搜索互联网。返回最多 5 条结果,每条包含标题和摘要。",
  "parameters": {
    "type": "object",
    "properties": {
      "query": { "type": "string", "description": "搜索关键词,尽量具体" }
    },
    "required": ["query"]
  }
}

坑三:出错时只返回“失败”

工具报错时如果只告诉模型“调用失败”,它往往会原样重试。返回具体原因和建议——比如“日期格式应为 YYYY-MM-DD”——模型通常能自己修正参数再试一次。

坑四:返回内容太长

把整篇文档原样塞回给模型,很快就会挤占上下文。现在我的工具都会先截断或摘要,只返回模型做下一步决策需要的信息。

总结

设计工具,本质上是在给一个聪明但不了解背景的同事写接口文档。站在模型的角度想一想“我拿到这个工具会怎么用”,大部分坑都能提前避开。

文章作者:Lxx

文章链接:https://lanjiangtao.cn/posts/agent-tool-calling/

版权声明:本文为原创内容,转载请注明来自 Lxx的日常。

评论

评论区即将开放,欢迎先通过侧边栏的方式联系我。

输入关键词开始搜索,支持标题、标签和正文。