Agent 工具调用:从 Function Calling 到 MCP

Agent 和 Chatbot 的本质区别:Agent 会"动手"——调用工具、读写数据、执行动作。工具调用(Tool Calling / Function Calling)是 Agent 的核心机制。这篇文章从机制讲起,到工程实践,到 MCP 标准化。

一、Function Calling 的机制

核心流程:LLM 决定"该调哪个工具、传什么参数",系统执行,结果回填。

用 L 系 L 户 L 统 L : │ ▼ M │ ▼ 执 │ ▼ M 查 行 一 推 : 组 下 理 ( w ( 织 今 : L e 结 回 天 需 L a 果 答 的 要 M t 回 : 杭 调 h 填 今 州 用 输 e ) 天 天 出 r 杭 气 g 结 _ 州 e 构 a t 化 p 2 _ 工 i 8 w 具 . e 调 g 度 a 用 e , t 请 t 晴 h 求 _ , e ) w 适 r e 合 ( a 出 c t 行 i h 。 t e y r = ( " " 杭 杭 州 州 " " , , d " a 2 t 0 e 2 = 6 " - 今 0 天 5 " - ) 0 5 " ) → { 温 度 : 2 8 , 晴 }

注意:LLM 只"决定"调用,不"执行"调用——执行是系统的责任。LLM 输出的是:工具名 + 参数(结构化 JSON)。

二、工具的定义:名称、描述、参数

工具怎么定义,直接决定 LLM 能不能用对:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "type": "function",
  "function": {
    "name": "search_resume",
    "description": "在简历库中检索候选人。按关键词匹配技能/经历/职位。",
    "parameters": {
      "type": "object",
      "properties": {
        "query": {
          "type": "string",
          "description": "检索关键词,如'Go 后端 3 年经验'"
        },
        "limit": {
          "type": "integer",
          "description": "返回条数,默认 10,最大 50"
        }
      },
      "required": ["query"]
    }
  }
}

三个关键:

1 2 3 . . . n d p a e a m s r e c a : r m L i e L p t M t e i r 用 o s 它 n : 选 : L 工 L L 具 L M ( M 清 按 晰 判 描 、 断 述 语 " 填 义 这 参 化 个 数 ) 工 ( 具 描 适 述 不 决 适 定 合 填 当 得 前 对 任 不 务 对 " ) ( 写 清 楚 能 力 边 界 )

我的经验:工具描述是给 LLM 看的文档——“检索简历"和"在简历库中按技能/经历/职位关键词匹配,返回候选人和匹配度”,后者让 LLM 选得更准。

三、工程实践:工具调用的正确姿势

1. 结果结构要"LLM 友好"

1
2
3
4
5
6
7
8
9
// 错误:返回一堆无关字段,LLM 不知道该提取什么
// 正确:结构清晰 + 字段名语义化
{
  "candidates": [
    {"name": "张三", "skills": ["Go", "K8s"], "match_score": 92},
    {"name": "李四", "skills": ["PHP"], "match_score": 65}
  ],
  "total": 87
}

2. 错误要"可重试"

1
2
3
4
// 工具失败返回的错误,LLM 要能理解并重试/换方式
{"error": "参数非法: date 格式应为 YYYY-MM-DD"}
{"error": "上游超时,请重试"}
{"error": "无权限访问该资源"}

3. 多轮工具调用(Agent 的"思考链")

用 户 : → → → → → 帮 我 调 结 调 结 L 分 用 果 用 果 L 析 : : M 张 s 找 g 工 三 e 到 e 作 综 适 a 简 t 经 合 不 r 历 _ 历 分 适 c r 析 合 h e 后 _ s → 端 r u 岗 e m 输 位 s e 出 u _ 结 m d 论 e e ( t " a 张 i 三 l " ( ) " i d - 1 2 3 " ) 需 要 更 多 信 息

允许多轮工具调用:LLM 可以连续调多个工具(每次调用结果回填上下文,LLM 决定下一步)。

4. 工具循环的安全

✅ ✅ ✅ ✅ 最 每 高 工 大 轮 成 具 调 工 本 结 用 具 / 果 轮 调 写 注 数 用 操 入 ( 都 作 上 默 审 工 下 认 计 具 文 : 5 二 → - 次 1 确 注 0 认 意 轮 P , r 防 o 止 m 死 p 循 t 环 ) 注 入 ( 工 具 返 回 里 藏 指 令 )

四、从 Function Calling 到 MCP

F M u C n 问 P 工 工 好 c 题 : 具 具 处 t : 标 定 调 : i 工 准 义 用 一 o 具 化 ( 套 n 和 工 s → 工 模 具 c 具 C 型 协 h M , a 绑 议 e C 所 l 定 m P 有 l 、 a 模 i 换 ) 协 型 n 模 → 议 / g 型 ( 应 : 要 M C 用 模 重 C l 复 型 写 P i 用 、 e A 工 标 n P 具 准 t I 不 格 可 式 ↔ 的 复 特 用 S 性 e ( r 每 v 个 e 厂 r 商 ) 格 式 不 同 )

演进关系:

F M 生 u C 产 n P 实 c 践 t = : i 模 o 协 型 n 议 层 ( 用 C 工 工 a 具 F 具 l 怎 u 层 l 么 n 用 i 标 c n 准 t M g 化 i C 地 o P = 提 n 供 协 机 和 C 议 制 调 a ( ( 用 l S 模 ) l e 型 i r 怎 n v 么 g e 表 r 达 机 " 制 定 我 , 义 要 调 + 工 具 C " l ) i e n t 接 入 )

五、选型建议

场景 方案
单模型快速开发 直接用 Function Calling(最简)
多模型/多应用复用工具 MCP(标准化)
企业级工具治理 MCP + 鉴权 + 审计
纯本地小工具 Function Calling + 简单函数映射

我的实践:AI 面试产品早期用 Function Calling(快),后期工具多了、要复用了(Best 东方 Skills 给外部 LLM 用),迁到 MCP——机制不变,协议标准化。

六、踩坑记录

  1. 描述写得太简:LLM 不知道该不该用这工具 → 描述写"能力 + 边界 + 示例"
  2. 参数校验在 LLM 侧做:LLM 传错参数就报错 → 系统侧宽松解析 + 纠错(日期格式自动归一)
  3. 工具结果过长:塞进上下文 token 爆炸 → 结果裁剪(只回 Top N + 摘要)
  4. 并行工具调用滥用:一次调 10 个 → 改成"只调相关的 1-3 个"(LLM 靠描述判断)

总结

工具调用的核心认知:

  1. 机制:LLM 决定"调什么、传什么",系统执行"真调用"
  2. 定义质量决定效果:名称清晰、描述写全、参数描述准
  3. 多轮调用是 Agent 的本质:连续工具调用 = 解决问题的过程
  4. MCP 是工具层的标准化:Function Calling 是机制,MCP 是协议

Agent 的能力边界 = 工具集的能力边界。 会定义工具、会管理调用循环、会用 MCP 标准化——这是 AI 应用工程师的核心技能。