知识库
知识wiki
Agent vs Function Calling:工具调用范式演进对比

Agent与Function Calling是指两种不同的LLM工具调用范式。Function Calling(函数调用)是LLM API原生支持的、将外部函数描述为结构化JSON Schema并由模型选择调用的单向执行模式;Agent(智能体)则是基于循环推理(Reasoning-Action-Observation循环)的自主执行范式,模型可以自行判断何时调用工具、解析结果、多步规划并修正错误。两者在调用机制、控制权归属、错误处理能力上存在本质差异,适用于不同的应用场景。
术语表
| 术语 | 定义 |
|---|---|
| Function Call(函数调用) | LLM API将外部工具描述为JSON Schema,模型在生成回复时选择调用并返回结构化参数的单轮执行模式 |
| Tool Use(工具使用) | Function Calling的广义称谓,泛指模型调用外部工具(API、代码执行器、数据库查询)的能力 |
| Agent(智能体) | 以LLM为核心控制器,通过Reason-Act-Observe循环自主决策、调用工具、处理结果的多步执行系统 |
| ReAct循环 | Reasoning(推理)+ Acting(行动)+ Observation(观察)的三步循环,Agent的核心执行模式 |
| Tool Schema | 描述工具名称、参数类型、返回值结构的JSON格式定义,通常参照OpenAPI规范 |
| Orchestrator(编排器) | 管理Agent执行流程的中间件,负责维护上下文、调度工具调用、处理循环逻辑 |
1. 架构对比
1.1 Function Calling 架构
Function Calling是LLM API内置的轻量级工具调用机制。工作流程为单向线性:
用户输入 → LLM解析 → 模型选择工具 → 返回结构化参数 → 应用侧执行 → 结果回填 → 最终回复
核心特征:
- 单轮调用:一次用户请求触发至多一次工具调用
- 应用侧执行:模型仅输出工具选择结果,实际执行由宿主应用完成
- 无状态循环:不维护连续的多步推理上下文
- API原生支持:OpenAI、Claude、Gemini等主流API均原生支持
1.2 Agent 架构
Agent架构在LLM之外增加了循环控制层。工作流程为循环迭代:
用户输入 → [思考 → 行动 → 观察]ⁿ → 满足终止条件 → 最终回复
核心特征:
- 多步循环:同一任务可触发多次工具调用,上一步结果是下一步的输入
- 自主决策:模型自行判断何时调用工具、调用哪个工具、何时终止
- 错误重试:工具调用失败后可自动分析原因并尝试替代方案
- 上下文累积:完整的推理链和工具结果保持在对话上下文中
2. 分类维度对比
| 维度 | Function Calling | Agent |
|---|---|---|
| 调用触发 | 用户输入→模型一次判断 | ReAct循环中模型自主触发 |
| 调用次数 | 单次输入1次调用 | 单次任务0~N次连续调用 |
| 工具链 | 单工具独立 | 多工具链式组合 |
| 错误处理 | 应用侧兜底 | 模型自主重试/替代 |
| 规划能力 | 无 | 多步规划与子任务分解 |
| 状态维护 | 无 | 维护执行状态与中间结果 |
| 上下文消耗 | 低(单轮) | 高(累积推理链) |
| 延迟 | 低(1~2次API调用) | 高(N次API调用+工具执行) |
| 实现复杂度 | 低(API原生) | 高(需编排器/框架) |
| 可靠性 | 高(可预测) | 中(偶发循环/幻觉) |
3. Tool Schema 定义对比
Function Calling定义工具时使用JSON Schema描述参数结构:
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"},
"unit": {"type": "string", "enum": ["celsius","fahrenheit"]}
},
"required": ["city"]
}
}
}
Agent框架中工具的Schema扩展了执行上下文信息:
{
"tool": {
"name": "search_web",
"description": "搜索互联网获取实时信息",
"parameters": { /* JSON Schema */ },
"execution": {
"timeout_ms": 15000,
"retry_on_failure": true,
"max_retries": 3,
"side_effects": false
}
}
}
4. 执行流程差异
4.1 Function Calling 执行流程
1. 用户: "北京今天多少度?"
2. → LLM接收消息+工具Schema
3. → LLM输出: tool_call(get_weather, city="北京", unit="celsius")
4. → 应用执行 get_weather("北京","celsius") → {"temp": 28, "condition": "晴"}
5. → 执行结果回填给LLM
6. → LLM输出: "北京今天28°C,晴。"
4.2 Agent 执行流程
1. 用户: "帮我规划周末北京两日游,预算2000元"
2. → Agent推理: 需要查询北京景点、天气、交通、住宿
3. → 调用 search_web("北京周末旅游攻略")
4. → 观察: 返回景点列表
5. → 调用 get_weather("北京","2026-06-20")
6. → 观察: 天气数据
7. → 调用 search_web("北京经济型酒店")
8. → 观察: 酒店价格信息
9. → 汇总推理,生成完整行程规划
10. → 输出最终回复
5. 框架支持对比
| 框架/平台 | Function Calling | Agent模式 | 实现方式 |
|---|---|---|---|
| OpenAI API | ✅ 原生支持 | ⚠️ Assistants API | tool_choice + 循环封装 |
| Claude API | ✅ 原生支持 | ⚠️ Tool Use扩展 | toolUse块 + system prompt |
| Gemini API | ✅ 原生支持 | ⚠️ 可切换 | tool_config + 循环 |
| LangChain | ✅ bind_tools | ✅ AgentExecutor | ReAct/ActorCritic |
| LangGraph | ✅ 节点级 | ✅ 有向图编排 | StateGraph + tool_node |
| CrewAI | ⚠️ 间接 | ✅ 原生 | Agent→Task→Crew |
| AutoGen | ✅ 对话中 | ✅ 原生 | AssistantAgent + ToolAgent |
| OpenClaw | ⚠️ 通过MCP | ✅ 原生 | Skill + MCP Server |
6. 选型决策因素
| 场景特征 | 推荐范式 | 依据 |
|---|---|---|
| 单次查询(天气、翻译、计算) | Function Calling | 低延迟,高可靠,实现简单 |
| 结构化数据提取 | Function Calling | 模型返回JSON schema,精确可控 |
| 多步数据分析 | Agent | 需要中间结果驱动下一步 |
| 复杂工作流(订票、客服) | Agent | 需多步骤、条件分支、错误重试 |
| 高吞吐量生产环境 | Function Calling | 成本可控,延迟可预测 |
| 需要人类确认的流程 | Agent | 支持暂停等待用户确认 |
7. 局限与演化方向
- Function Calling的局限:无状态、无推理链、无错误恢复、工具间无依赖关系管理;复杂任务需大量应用层胶水代码
- Agent的局限:上下文开销大(推理链条增长导致token膨胀)、偶发循环死锁(模型反复调用同一工具)、时延高、成本不确定
- 演进趋势:静态Schema → 动态工具发现(MCP/OpenAPI);单一范式 → 混合模式(Function Calling作为Agent的基础原子操作);开发范式趋同(统一的Tool接口标准)
MCP协议的出现正在模糊Function Calling与Agent的边界——MCP Server提供标准化的工具发现和调用接口,既可作为Function Calling的Schema来源,也可作为Agent框架的工具层基础设施,两者在工具接口层面正在走向统一。
参见
- MCP协议详解 — 标准化工具接口规范
- Agent框架横向对比 — 主流Agent框架架构比较
- OpenAI Function Calling API文档
- LangGraph Agent Executor实现源码
- Anthropic Tool Use规范


黑公网安备 23010302001359号