函数调用 Function Calling 实战:让模型动手做事

运营GO 编辑部

模型光会说话还不够,真正能干活的 Agent 靠的是函数调用:让 AI 输出一段结构化指令,由你的代码去查数据库、发消息、调接口。这一步做对,模型就从聊天机器人升级成执行引擎。

快速结论

  • 函数调用是模型输出”要调哪个函数、填什么参数”的 JSON,实际执行在你自己的代码里。
  • 工具描述写清楚参数和用途,模型填参才不会乱,错误率直接下降。
  • 拿到返回结果后要再喂回模型,让它判断是否继续调用或给出最终答复。
  • 给调用加超时、权限和白名单,避免模型越权去动不该动的东西。

函数调用到底发生了什么

一次完整调用分四步。你先把可用工具以 JSON Schema 形式告诉模型,包含函数名、用途说明和每个参数的类型;模型读懂后,在需要时会返回一段 JSON,指明要调的函数和参数;你的后端代码执行这个函数,拿到真实结果;最后把结果再次喂回模型,它据此决定继续调用还是直接回答。整个过程模型不碰外部系统,只负责”决策”,安全边界清晰。

这套机制的关键价值是”可控”。模型永远在沙箱里产出指令,真正动手的是你写的、可测试的代码。相比让模型直接生成要执行的命令,函数调用的出错面小得多,也更容易加校验和日志。它是把大模型接进现有系统的标准接口。

工具描述决定成败

模型填参全靠你给的描述。描述里要写清三件事:这个函数干什么、每个参数什么含义、什么情况下该用。一个常犯的错是把函数名起得含糊,比如叫 process_data,模型不知道何时该调;改成 fetch_order_by_id 这类动词加宾语的命名,准确率立刻提升。参数示例也建议给一两个,模型照着填比凭空猜稳得多。

还有一类坑是”工具太多”。一次塞给模型三四十个函数,它会挑花眼,调用准确率明显下降。经验值是对单次任务只暴露 8 到 12 个最相关的工具,其余按需动态加载。就像你不会把整个工具箱拍在桌上,只把要用的几把扳手递过去。

把结果喂回去再循环

很多新手在拿到第一次工具返回后就直接把结果展示给用户,跳过了”回灌模型”这步。正确做法是把结果作为新的一轮消息送回,让模型判断:信息够了就总结答复,不够就再发起下一次调用。多步任务像订机票,要先查航班、再填乘客、最后支付,每一步都依赖上一步的真实返回。

回灌时记得带上”这是上一步的返回结果”这样的角色标记,避免模型把工具输出误当成用户新问题。如果是长链路,还可以在每轮附上累计进度摘要,让模型知道自己已经走到哪一步,减少重复调用同一个函数的浪费。

安全护栏不能省

函数调用把”动手能力”交给了模型,也带来了风险。务必给每个工具设权限白名单,比如发邮件工具只允许发给内部域名;给外部请求加超时,防止某个接口卡死拖垮整条链路;对会改数据的操作加二次确认。没有护栏的 Agent 上线,等于把公司系统钥匙交给一个会犯错的实习生。

建议再补一层”调用预算”:限制单个会话最多发起多少次工具调用、累计花费多少。一旦超阈就强制终止并交人工。这样即便模型陷入死循环或被人诱导,损失也被框在预算内。安全不是某一个开关,而是白名单、超时、确认、预算四道防线叠加。

调试从日志开始

函数调用出问题,九成能在日志里找到。把每次”模型请求了什么函数、填了什么参数、代码返回了什么、模型最终怎么决策”完整记下来,复盘时一眼就能看出是描述不清还是代码报错。没有日志的 Agent 出了错,你只能盲猜。

更进一步,把失败案例攒成回归测试集:每条记录输入与期望调用,每次改工具描述后跑一遍,确认准确率没掉。团队规模一大,这套自动化校验比人工盯屏靠谱得多,也是函数调用能稳定上线的底线保障。

性能与成本的平衡

工具调用不是免费的。每次调用都意味着一次模型推理加一次后端请求,链路越长花费越高。能并行查的独立信息就别串行等,比如同时查天气和查汇率,两路一起发比先后发快一倍。

另一个省法是在会话内缓存工具 Schema 和不变的中间结果,避免每轮都重新序列化几十个函数定义。把单次任务暴露的工具数控制在十来个,既保准确率又控成本。调用次数和花费,要当成和准确率一样的核心指标盯着。

核心要点声明工具用 JSON Schema 描述入参模型决策判断是否调用及填参执行回传代码跑完结果喂回循环继续模型据结果再规划

图:函数调用流程 核心要点(运营GO 整理)

环节谁来做关键注意
工具声明开发者Schema 写清参数与用途
调用决策模型输出函数名与参数 JSON
实际执行你的代码加超时、权限、白名单
结果回灌开发者+模型再判断继续或答复
预算兜底平台限次数与花费防失控

延伸阅读:什么是 MCP(模型上下文协议)提示词工程进阶怎么写

下一步行动清单

  • 把要开放的接口整理成 JSON Schema,每个函数名用”动词+宾语”命名。
  • 单次任务只暴露 8 到 12 个相关工具,其余动态加载。
  • 搭建”调用-执行-回灌”循环,别在第一次返回后就中断。
  • 给写操作类工具加白名单、超时和二次确认,设调用预算。
  • 把失败案例攒成回归测试集,每次改描述后跑一遍。

相关阅读