Function Calling 深度解析:从原理到实践

Function CallingLLM工具调用Agent

Function Calling 深度解析

与 MCP、Skill 的对比 + 全能 AI 助手的可行性边界


一、Function Calling 的本质

Function Calling(又称 Tool Calling)是现代 LLM 的关键能力,但常被误解。其核心不是”模型执行函数”,而是模型输出函数调用的指令,你的代码负责执行

1.1 tools 到底是什么

tools 在技术上就是一个 JSON Schema 格式的函数声明,不是可执行代码:

tool_definition = {
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "获取天气信息",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {"type": "string", "description": "城市名称"}
            },
            "required": ["location"]
        }
    }
}

模型看到这个声明后,如果认为用户问题匹配,返回一个特殊响应 tool_calls

{
  "tool_calls": [{
    "id": "call_xxx",
    "function": {
      "name": "get_weather",
      "arguments": "{\"location\": \"杭州\"}"
    }
  }]
}

你的代码解析这个指令,找到对应的 Python 函数,传入参数执行,把结果塞回对话。模型自始至终只负责”决策调哪个工具”和”生成参数”,实际干活的一直是你的代码。

1.2 执行位置

客户端/服务端

    ├─ LLM API 调用(传 tools 声明 + 用户问题)
    │      │
    │      ▼
    ├─ LLM 返回 tool_calls(模型只决策,不执行)
    │      │
    │      ▼
    ├─ 本地代码解析 tool_calls,执行实际函数(发 HTTP、读文件、查 DB)
    │      │
    │      ▼
    ├─ 将结果以 role: tool 发回 LLM
    │      │
    │      ▼
    └─ LLM 组织最终自然语言回答

工具执行永远在你的进程里。LLM 服务商的服务器只参与”决策调哪个工具 + 生成参数”和”看到工具结果后生成最终回答”两个环节。实际的查天气 API 调用、文件读写、数据库查询全都发生在你自己控制的执行环境中。这也是 Function Calling 安全性的基础——你控制哪些函数暴露、何时调用、如何兜底。


二、Function Calling vs MCP vs Skill

维度Function CallingMCPSkill
本质底层交互机制标准化协议指令/工作流文档
载体JSON Schema 函数声明通过 MCP 协议暴露的工具列表Markdown 文件
谁消费LLM 的 tool_calls 机制LLM(通过宿主)AI Agent(作为上下文指令)
执行者宿主代码MCP ServerAI 自身 + 工具
通信进程内绑定跨进程/跨机器(SSE/stdio)不涉及通信
  • Function Calling: LLM 输出 tool_calls 后宿主代码自己实现逻辑
  • MCP: LLM 输出 tool_calls 后宿主通过 MCP 协议调用远端 Server 的实现。MCP 的 tool 定义和 Function Calling 一一对应:name=namedescription=descriptioninputSchema=parameters。MCP 把”本进程内硬编码的函数”升级为”通过标准化协议发现和调用的远程服务”
  • Skill: 给 AI 的指令文档,定义”怎么做”而非”调什么接口”。在更高层编排能力和思考流程

关系链: Function Calling(基础机制) → MCP(标准化为协议) → Skill(高层编排)


三、全能 AI 助手的可行性

成立的部分

每个 tool 就是一项能力——排列组合可覆盖几乎任何人类通过电脑完成的操作:

能力对应 tool
查天气get_weather
操作文件read_file / write_file
执行代码run_python
控制浏览器navigate / click / type
调用 APIcall_third_party_api
搜索search_web

理论上注册足够多、足够完备的 tool,就能让 AI 助手具备任意能力。这就是 Anthropic Computer Use、OpenAI Operator、各种 Agent 框架的基本思路。

现实约束

约束原因应对
上下文天花板注册 1000 个 tool 的描述就把上下文撑爆分层路由 + 动态注入
决策不可靠复杂场景下 LLM 选错工具、生成错误参数不做全自动,保留人工确认环
错误链式放大一个 tool 返回异常,后续依赖的全跑偏每次调用做验证 + 设回滚点
顺序依赖隐性”先登录才能发帖”,LLM 不一定能推导出显式声明 tool 的前置条件
长尾衰减越少调用的 tool 越容易被遗忘或误用缓存命中率统计 + 不活跃 tool 自动降级

实际架构

全能助手不是”一个模型 + 一万个 tool”,而是多层架构

用户输入 → 意图路由层(判断领域)→ 动态注入层(只加载最相关 10-20 个 tool)
         → 执行+验证层(调用、校验、重试)→ 兜底层(置信度低时走人工/拒绝)

相关笔记

  • [[Q-RAG和Agent的区别与选择]]
  • [[Q-什么时候需要Agent]]
  • [[Q-Query-Routing和Skills机制对比]]