AI面包君Learn · Build · Share
全部文章
AI AgentAI面包君

Function Calling:Tool 的底层实现机制

上一篇我们讲了 Tool(工具)——Agent 用工具跟外部世界交互。

2026-06-024 分钟

上一篇我们讲了 Tool(工具)——Agent 用工具跟外部世界交互。

但 Agent 怎么"知道"该调用哪个工具?怎么"告诉"大模型有哪些工具可用?工具调用的结果怎么返回给大模型?

这背后的技术机制就是 Function Calling。

💡 更详细的 Function Calling 科普,请参考我之前写的《Function Calling:大模型的"双手"》(在 1-AI认知/AI基础认知 目录下)。本篇聚焦 Agent 开发视角。


📖 一句话定义

Function Calling 是一种让大模型输出结构化"函数调用指令"而非自然语言的技术。 大模型不直接执行函数,而是输出"我想调用这个函数,参数是这个"——由你的程序去执行。


🎬 一个精妙的类比:导演和场务

拍电影时:

  • 导演(大模型):看剧本,决定"下一场需要什么"
  • 对讲机(Function Calling 协议):导演通过它对讲
  • 场务(你的程序):听到导演的指令,去执行
导演:"下一场需要一把椅子,放在舞台中央"
        ↓ (对讲机,格式:{action: "place", object: "chair", position: "center"})
场务:搬来椅子,放在舞台中央
        ↓ (对讲机回复:"椅子放好了")
导演:"好,演员准备"

大模型不自己搬椅子——它告诉场务"我需要椅子",场务去搬,搬完了告诉它结果。

🖼️ 图片建议: 一张"导演和场务"流程图。左侧"大模型/导演":拿着剧本,通过对讲机发出指令(标注"Function Call:{name: 'place_chair', args: {position: 'center'}}")。中间"对讲机/协议"。右侧"程序/场务":接收指令,实际搬椅子,通过对讲机回复结果(标注"Function Result:{success: true}")。风格:电影片场 + 技术信息图。


🔄 Function Calling 的完整流程

① 用户说:"帮我查一下明天北京的天气"

② 你的程序把用户消息 + 可用工具列表发给大模型
   messages: [{"role": "user", "content": "帮我查明天北京的天气"}]
   tools: [
     {
       name: "get_weather",
       description: "查询指定城市和日期的天气",
       parameters: {
         city: "城市名",
         date: "日期"
       }
     }
   ]

③ 大模型返回一个 Function Call(不是自然语言!)
   {
     "role": "assistant",
     "content": null,               // ← 没有文字内容!
     "tool_calls": [{
       "name": "get_weather",        // ← 我要调用这个函数
       "arguments": {
         "city": "北京",
         "date": "2026-06-03"
       }
     }]
   }

④ 你的程序执行这个函数
   result = get_weather(city="北京", date="2026-06-03")
   // → {temperature: 28, weather: "晴"}

⑤ 把执行结果返回给大模型
   messages.push({
     "role": "tool",
     "tool_call_id": "...",
     "content": '{"temperature": 28, "weather": "晴"}'
   })

⑥ 大模型根据结果生成自然语言回复
   "明天北京晴天,气温 28°C,适合出行!"

🆚 Function Calling vs Tool:什么关系?

这两个词经常混用,但它们不是一个东西:

Function CallingTool
是什么协议/机制——大模型怎么"表达"要调用函数概念/实体——Agent 可以用的外部功能
谁定义的AI 服务商(OpenAI/Anthropic 的 API 规范)你(开发者)
类比对讲机的通信协议场务手上的工具
关系Function Calling 是实现 Tool 调用的技术手段Tool 是通过 Function Calling 暴露给大模型的功能

一句话:Tool 是"什么",Function Calling 是"怎么"。


🧠 Agent 开发中的 Function Calling 实践

1. 工具描述写得好,Agent 才不会乱调用

# ❌ 描述太模糊
{"name": "search", "description": "搜索"}

# ✅ 精确描述:什么时候用、返回什么
{
  "name": "web_search",
  "description": "搜索互联网获取最新信息。当用户询问实时信息、新闻、或需要最新数据时使用。",
  "parameters": {
    "query": {"type": "string", "description": "搜索关键词,使用简洁的关键词组合"}
  }
}

2. 处理错误和重试

# Function Calling 可能失败
try:
    result = execute_tool(tool_name, arguments)
    return {"success": True, "data": result}
except Exception as e:
    # 把错误信息返回给大模型,让它自己决定怎么办
    return {"success": False, "error": str(e)}
    # 大模型可能会:"搜索失败了,我换个关键词试试"

3. 控制并发和成本

# Agent 可能同时调用多个工具
# 但要注意:每个 Function Call 都消耗 token
# 限制单次任务的工具调用次数,防止成本失控
MAX_TOOL_CALLS = 20

💡 总结

  • Function Calling = 大模型输出"我想调这个函数"而非自然语言的机制
  • 大模型不执行函数——它说"我要调什么",你的程序去执行
  • Function Calling 是"怎么"(机制),Tool 是"什么"(概念)
  • 工具描述要精确,Agent 靠描述决定用什么工具
  • 做 Agent 开发要处理调用失败、并发和成本控制

下篇预告:MCP——让 Agent 能接"任何工具"的通用协议


面包君 🍞 比你多懂一点的朋友