Agent工具调用技术详解

Agent 工具调用技术详解

概述

现代 AI Agent 需要与外部世界交互才能完成实际任务。本文详细介绍三种核心技术:Function CallingMCPAgent Skills,它们构成了 Agent 工具调用的完整技术栈。

1
2
3
4
5
6
7
8
9
10
┌─────────────────────────────────────────────────────────┐
│ Agent Skills │
│ (高层封装:工作流指令 + 脚本 + 参考文档) │
├─────────────────────────────────────────────────────────┤
│ MCP │
│ (协议层:标准化连接外部工具/数据源) │
├─────────────────────────────────────────────────────────┤
Function Calling
│ (底层能力:模型生成结构化调用参数) │
└─────────────────────────────────────────────────────────┘

一、Function Calling(函数调用)

1.1 定义

Function Calling 是大模型的一种原生能力,允许模型:

  • 识别何时需要调用外部工具
  • 生成结构化的函数调用参数(JSON 格式)
  • 理解函数返回结果并继续对话

1.2 工作流程

sequenceDiagram
    participant U as 用户
    participant M as 大模型
    participant T as 外部工具
    
    U->>M: 发送请求
    M->>M: 判断需要调用工具
    M->>T: 输出函数名 + 参数(JSON)
    T->>T: 执行函数
    T->>M: 返回执行结果
    M->>U: 整合结果并回复

1.3 示例

用户请求:“北京今天天气怎么样?”

模型输出:

1
2
3
4
5
6
7
{
"function": "get_weather",
"parameters": {
"city": "北京",
"date": "2026-01-14"
}
}

1.4 主流平台支持

平台 支持情况
OpenAI ✅ 原生支持(2023年6月推出)
Anthropic Claude ✅ Tool Use
通义千问 ✅ Function Calling
文心一言 ✅ 函数调用

1.5 特点

  • 底层能力:是其他工具调用技术的基础
  • 结构化输出:强制模型输出符合 JSON Schema 的参数
  • 各厂商不统一:每个平台的实现细节略有差异

二、MCP(Model Context Protocol)

2.1 定义

MCP 是 Anthropic 于 2024 年推出的开放协议标准,用于统一 AI 应用与外部数据源/工具的连接方式。

核心理念:一次适配,多处复用——解决”每个工具都要单独适配”的问题。

2.2 架构

1
2
3
4
5
6
7
┌──────────────┐      ┌──────────────┐      ┌──────────────┐
│ MCP Host │◄────►│ MCP Client │◄────►│ MCP Server │
│ (AI 应用) │ │ (连接器) │ │ (工具提供方)│
└──────────────┘ └──────────────┘ └──────────────┘
│ │
│ 标准化协议通信 │
└──────────────────────────────────────────┘

2.3 三种能力类型

类型 描述 示例
Resources 静态数据资源 文件、数据库记录、API 响应
Tools 可执行的操作 发送邮件、执行代码、调用 API
Prompts 预定义的提示词模板 代码审查模板、翻译模板

2.4 类比理解

MCP 就像 AI 领域的 USB 接口标准

  • USB 出现前:每种设备需要专用接口
  • USB 出现后:统一接口,即插即用
  • MCP:统一 AI 与工具的连接标准

2.5 与 Function Calling 的关系

  • Function Calling 是模型输出调用意图的能力
  • MCP 是执行调用的标准化协议
  • MCP Server 内部可能使用 Function Calling 来触发工具

三、Agent Skills

3.1 定义

Agent Skills 是 Anthropic 于 2025 年 10 月推出的一种新方式,用于将专业知识封装成可复用的能力模块

核心理念:为 Agent 准备”入职指南”——不是构建定制化 Agent,而是让通用 Agent 具备专业能力。

3.2 Skill 的结构

一个 Skill 是一个包含 SKILL.md 文件的目录:

1
2
3
4
5
6
my-skill/
├── SKILL.md # 必需:核心文件(YAML 元数据 + 指令)
├── reference.md # 可选:详细参考文档
├── examples.md # 可选:使用示例
└── scripts/
└── helper.py # 可选:可执行脚本

3.3 SKILL.md 格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
name: pdf-processing
description: Extract text, fill forms, merge PDFs. Use when working with PDF files.
allowed-tools: Read, Bash(python:*)
---

# PDF Processing

## Quick start
Extract text:
```python
import pdfplumber
with pdfplumber.open("doc.pdf") as pdf:
text = pdf.pages[0].extract_text()

For form filling, see FORMS.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

### 3.4 元数据字段详解

| 字段 | 必需 | 作用 |
|------|------|------|
| `name` || Skill 的唯一标识名 |
| `description` || 描述何时触发该 Skill |
| `allowed-tools` || 限制可用工具(安全考虑) |
| `model` || 指定使用的模型版本 |
| `context: fork` || 在独立上下文中运行 |
| `hooks` || 定义工具调用前后的钩子 |
| `user-invocable` || 是否允许用户通过 `/skill-name` 调用 |

### 3.5 渐进式披露(Progressive Disclosure)

这是 Skills 的**核心设计原则**

```mermaid
flowchart TD
A[启动] --> B[加载 name + description 到系统提示词]
B --> C{用户请求与 Skill 相关?}
C -->|| D[读取完整 SKILL.md]
C -->|| E[继续正常对话]
D --> F{需要更多细节?}
F -->|| G[按需读取 reference.md 等]
F -->|| H[执行任务]
G --> I{需要执行脚本?}
I -->|| J[运行 scripts/ 中的脚本]
I -->|| H

优势:上下文窗口使用量可无限扩展,只加载真正需要的内容。

3.6 Skills 存放位置

位置 作用域 适用场景
~/.claude/skills/ 用户级 个人通用 Skills
.claude/skills/ 项目级 项目专用 Skills
插件中的 skills/ 可分发 通过插件市场共享

3.7 与 MCP 的关系

官方明确指出 Skills 和 MCP 是互补关系

“We’ll also explore how Skills can complement MCP servers by teaching agents more complex workflows that involve external tools and software.”

  • MCP:提供工具连接的标准协议(”有什么工具”)
  • Skills:教会 Agent 如何使用这些工具完成复杂工作流(”怎么用工具”)

四、三者对比

4.1 定位对比

维度 Function Calling MCP Agent Skills
层级 底层能力 协议标准 高层封装
粒度 单个函数调用 工具连接规范 完整工作流
标准化 各厂商不统一 统一协议 Anthropic 标准
复用性 低(需重复定义) 高(一次适配) 高(文件夹共享)
推出时间 2023 年 2024 年 2025 年

4.2 协作关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
用户请求: "帮我填写这个 PDF 表单"


┌─────────────────────────────────────────────────────────┐
Agent Skills: pdf-processing │
│ ├─ 读取 SKILL.md 获取处理指令 │
│ ├─ 按需加载 FORMS.md 获取表单填写规范 │
│ └─ 调用 scripts/fill_form.py 执行填写 │
└─────────────────────────────────────────────────────────┘

▼ 通过 MCP 协议连接
┌─────────────────────────────────────────────────────────┐
MCP Server: pdf-tools │
│ └─ 提供 PDF 读写工具 │
└─────────────────────────────────────────────────────────┘

▼ 基于 Function Calling
┌─────────────────────────────────────────────────────────┐
│ 大模型: 生成工具调用参数 │
│ └─ {"function": "fill_pdf_form", "params": {...}} │
└─────────────────────────────────────────────────────────┘

4.3 使用场景选择

场景 推荐方案
简单的单次工具调用 Function Calling
连接多个外部服务 MCP
复杂的多步骤工作流 Agent Skills
需要团队共享的专业能力 Agent Skills + 插件分发
需要动态上下文加载 Agent Skills(渐进式披露)

五、实践建议

5.1 何时使用 Skills vs 其他方式

方式 适用场景
Skills 复杂的多步骤工作流,需要动态加载上下文
CLAUDE.md 项目级通用规则(始终加载)
斜杠命令 用户主动触发的快捷操作(如 /deploy
MCP 服务器 连接外部工具和数据源
Hooks 工具调用前后的自动化脚本

5.2 Skills 开发最佳实践

  1. 从评估开始:先观察 Agent 在哪些任务上表现不佳,再针对性开发 Skill
  2. 结构化扩展:当 SKILL.md 变得臃肿时,拆分到多个文件
  3. 从 Claude 视角思考:关注 name 和 description 的编写,这决定了触发时机
  4. 与 Claude 迭代:让 Claude 帮助总结成功模式和常见错误

5.3 安全考虑

  • 仅安装受信任来源的 Skills
  • 审查 Skill 中的脚本和外部连接
  • 使用 allowed-tools 限制工具访问范围

六、参考资料


Agent工具调用技术详解
https://zmmmmy.github.io/2026/01/14/Agent工具调用技术详解/
作者
ZhiMy
发布于
2026年1月14日
许可协议