函数调用(Function Calling)让智能体从"只会说话"变成"能干活",是智能体落地生产环境的关键能力。
大语言模型本身只能生成文本,无法查询数据库、调用API或操作文件。函数调用机制让模型能够"决定调用哪个函数、传什么参数",由外部代码执行后再把结果喂回模型。这套机制是智能体操作真实世界的基础。
一次完整的函数调用包含四个步骤:
整个过程中,模型本身不执行任何代码,它只负责"决策"。真正的执行权在开发者手中,这也是函数调用安全可控的原因。
大多数主流模型API采用类似的工具定义格式。以"查询天气"为例:
{
"name": "get_weather",
"description": "查询指定城市的实时天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,如'北京'、'上海'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位,默认摄氏度"
}
},
"required": ["city"]
}
}
几个要点:
给智能体配备工具时,工具数量并非越多越好。实践中的经验值:
| 工具数量 | 效果 | 适用场景 |
|---|---|---|
| 1-5个 | 调用准确率高,模型选择困难少 | 单一功能智能体 |
| 6-15个 | 需要清晰的描述区分,偶有误调用 | 中等复杂度工作流 |
| 15个以上 | 误调用率明显上升,需要分组或路由 | 复杂平台型智能体 |
当工具超过15个时,建议引入"工具路由"机制:先用一个轻量模型判断用户意图属于哪个类别,再只加载该类别的工具列表给主模型。
构建智能体时,以下几类工具覆盖了大部分需求:
信息获取类工具风险最低,适合作为第一批上线的工具。状态操作类工具涉及数据修改,需要加入确认机制。
模型输出的参数并非总是正确的。开发者代码中必须做参数校验:
执行失败时,错误信息要"对模型友好"。不要返回堆栈trace,而是返回结构化的错误提示,比如:
{
"error": "city_not_found",
"message": "未找到城市'火星',请输入有效的城市名称"
}
模型读到这样的错误信息后,通常能自动向用户解释问题并建议正确做法。
当智能体需要连续调用多个工具时,就进入了"多步工具调用"的范畴。比如用户问"帮我查北京明天的天气,然后发邮件提醒我带伞",智能体需要先调天气查询,拿到结果后再调发邮件工具。
这种场景下,系统提示词中需要明确告知智能体可以按顺序调用多个工具,以及工具之间的依赖关系。大多数现代模型支持在单次对话中多次往返调用工具,开发者只需把每一轮的工具结果正确回传即可。
函数调用是智能体从"聊天机器人"升级为"工作助手"的分水岭。掌握工具定义规范、做好参数校验和错误处理,就能让智能体安全地操作真实系统。