Function Calling、MCP 与 Agent Skills 关系详解
·
Function Calling、MCP 与 Agent Skills 关系详解
目录
核心概念
| 概念 | 层级 | 作用 | 类比 |
|---|---|---|---|
| Function Calling | 底层能力 | 让AI识别并调用函数 | 人的"手"(执行动作) |
| MCP | 中间协议 | 标准化工具连接方式 | USB接口标准 |
| Agent Skills | 上层封装 | 预构建的复杂任务模块 | 专业工具套装 |
一句话总结:
Function Calling 是基础能力,MCP 是连接标准,Agent Skills 是封装好的功能模块。
Function Calling
定义
Function Calling(函数调用)是大型语言模型(LLM)的原生能力,允许模型在生成回复时识别需要调用的外部函数,并生成符合函数签名的参数。
核心功能
- 意图识别:判断用户请求是否需要调用工具
- 参数提取:从用户输入中提取函数所需的参数
- 结果处理:将函数执行结果整合到回复中
工作流程
用户输入 → LLM分析 → 识别需调用函数 → 生成参数 → 调用函数 → 返回结果 → LLM整合回复
代码示例(OpenAI)
import openai
# 定义函数
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"]
}
}
}
]
# LLM 判断是否调用
response = openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "北京天气怎么样?"}],
tools=tools
)
# 如果 LLM 决定调用,会返回函数调用信息
if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
# 执行实际函数
result = get_weather(**json.loads(tool_call.function.arguments))
局限性
- 紧耦合:每个AI应用需要单独实现工具连接
- 标准不一:不同厂商的Function Calling格式略有差异
- 维护复杂:工具增加或修改需要更新代码
MCP (Model Context Protocol)
定义
MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 推出的开放协议标准,用于标准化AI模型与外部工具、数据源之间的连接方式。
核心功能
- 标准化接口:统一的工具发现、调用和数据交换格式
- 解耦架构:AI应用与工具实现分离
- 动态发现:运行时动态发现和加载可用工具
- 上下文管理:管理工具和资源的上下文信息
架构组成
┌─────────────────┐
│ AI 客户端 │ ← Claude、ChatGPT 等
│ (MCP Client) │
└────────┬────────┘
│ MCP 协议
▼
┌─────────────────┐
│ MCP 服务器 │ ← 工具提供商实现
│ (MCP Server) │
└────────┬────────┘
│
┌────┴────┐
▼ ▼
┌───────┐ ┌───────┐
│ 工具A │ │ 工具B │ ← 具体功能实现
└───────┘ └───────┘
两种实现方式
1. Python (FastMCP)
from fastmcp import FastMCP
# 创建 MCP 服务器
mcp = FastMCP("我的工具集")
@mcp.tool()
def calculate(expression: str) -> str:
"""计算数学表达式"""
return str(eval(expression))
@mcp.tool()
def get_current_time() -> str:
"""获取当前时间"""
from datetime import datetime
return datetime.now().isoformat()
if __name__ == "__main__":
mcp.run(transport='stdio')
2. Node.js/TypeScript (MCP SDK)
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server(
{
name: "my-tools",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
// 注册工具
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "calculate",
description: "计算数学表达式",
inputSchema: {
type: "object",
properties: {
expression: { type: "string" }
},
required: ["expression"]
}
}
]
};
});
// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "calculate") {
const { expression } = request.params.arguments;
return {
content: [{ type: "text", text: String(eval(expression)) }]
};
}
});
// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);
优势
- 一次编写,到处使用:MCP Server 可被任何支持 MCP 的客户端使用
- 生态共享:社区可以共享和复用 MCP 服务器
- 降低集成成本:AI应用只需实现 MCP Client 即可连接所有 MCP Server
Agent Skills
定义
Agent Skills(代理技能)是预构建的、高层次的工具模块,封装了完成特定复杂任务所需的全部逻辑、提示词、工具调用链和错误处理。
核心功能
- 任务封装:将复杂任务封装为单一可调用的技能
- 最佳实践:内置经过验证的工作流程和提示词
- 组合能力:技能可以组合使用完成更复杂的任务
- 开箱即用:无需了解底层实现即可使用
与 MCP 的区别
| 维度 | MCP | Agent Skills |
|---|---|---|
| 层级 | 协议/基础设施 | 应用/功能层 |
| 关注点 | 如何连接工具 | 如何完成特定任务 |
| 使用者 | 开发者 | 终端用户/Agent |
| 内容 | 工具定义和接口 | 完整任务解决方案 |
| 示例 | 文件系统访问API | “分析代码并生成文档” |
Agent Skills 示例
# skill.yaml - 技能定义文件
name: code-reviewer
version: 1.0.0
description: 自动代码审查技能
# 所需的工具(通过 MCP 获取)
required_tools:
- filesystem # MCP 服务器
- git # MCP 服务器
# 执行流程
workflow:
1. 读取代码文件
2. 静态分析检查
3. 生成审查报告
4. 提供改进建议
# 内置的提示词模板
prompts:
review: |
你是一位资深代码审查专家。请审查以下代码:
{code}
关注:安全性、性能、可读性、最佳实践
使用方式
# 加载并使用技能
from opencode import load_skill
# 加载代码审查技能
code_reviewer = load_skill("code-reviewer")
# 直接使用
result = code_reviewer.review(file_path="src/main.py")
三者关系对比
层次结构图
┌─────────────────────────────────────────────────────────────┐
│ 应用层 (Application) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Agent Skills (代理技能) ││
│ │ ┌─────────────────┐ ┌─────────────────┐ ││
│ │ │ 代码审查技能 │ │ 文档生成技能 │ ... ││
│ │ └─────────────────┘ └─────────────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 协议层 (Protocol) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ MCP (模型上下文协议) ││
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││
│ │ │ MCP Server│ │ MCP Server│ │ MCP Server│ ... ││
│ │ │ - 文件系统│ │ - Git │ │ - 数据库 │ ││
│ │ └──────────┘ └──────────┘ └──────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 能力层 (Capability) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Function Calling (函数调用) ││
│ │ LLM 原生能力:识别、参数、调用、整合 ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
关系详解
1. Function Calling 是基础
- 是什么:LLM 的原生能力
- 作用:让AI"知道"什么时候该调用工具,以及如何调用
- 类比:就像人的神经系统,负责传递信号和控制动作
2. MCP 是标准化层
- 是什么:基于 Function Calling 构建的协议标准
- 作用:统一工具的接口规范,让工具可以被任何AI应用使用
- 类比:就像 USB 接口标准,不同厂商的设备都可以即插即用
- 依赖:底层使用 Function Calling 与 LLM 交互
3. Agent Skills 是应用层封装
- 是什么:基于 MCP 构建的高级功能模块
- 作用:将复杂任务打包成开箱即用的技能
- 类比:就像 Photoshop 的"动作"(Action),一键完成复杂操作
- 依赖:使用 MCP 协议调用底层工具
数据流示例
用户:请审查这段代码并提供改进建议
Agent Skills (code-reviewer)
↓ 分解任务
├─ 1. 读取代码文件 ──────→ MCP Server (filesystem)
│ ↓ 调用
│ Function Calling
│ ↓
│ 执行文件读取
│ ↓
│ 返回文件内容
│ ↓
├─ 2. 分析代码 ─────────→ LLM 推理
│ ↓
├─ 3. 生成审查报告 ─────→ 整合结果
│ ↓
└─ 4. 返回给用户
最终输出:详细的代码审查报告
使用场景与选择
场景决策树
你需要什么?
│
├─► 只是让AI能调用我的函数?
│ └─→ 使用 Function Calling(原生API调用)
│
├─► 希望我的工具能被多个AI应用使用?
│ └─→ 实现 MCP Server(遵循MCP协议)
│
├─► 想要一个开箱即用的复杂任务解决方案?
│ └─→ 使用 Agent Skills(或创建自己的技能)
│
└─► 构建一个企业级AI应用平台?
└─→ 三者结合:Function Calling + MCP + 自定义Skills
具体场景
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 快速原型开发 | Function Calling | 简单直接,无需额外依赖 |
| 构建工具生态 | MCP Server | 一次开发,多客户端使用 |
| 复杂任务自动化 | Agent Skills | 封装完整流程,减少开发量 |
| 企业级AI平台 | 三者结合 | 灵活性与标准化兼顾 |
| 跨平台工具复用 | MCP | 避免重复造轮子 |
实际案例:代码审查系统
# 架构示例:使用三者的完整系统
# 1. Function Calling 层(LLM 原生能力)
# - 由 OpenAI/Claude SDK 提供
# - 自动处理工具调用识别和参数生成
# 2. MCP 层(工具标准化)
# - filesystem-mcp-server: 读取代码文件
# - git-mcp-server: 获取提交历史
# - static-analysis-mcp-server: 代码分析
# 3. Agent Skills 层(业务逻辑)
@skill(name="comprehensive-code-review")
class ComprehensiveCodeReview:
"""综合代码审查技能"""
required_mcp_servers = [
"filesystem",
"git",
"static-analysis"
]
def execute(self, repo_path: str):
# 步骤1: 获取文件列表 (通过 MCP)
files = mcp.filesystem.list_files(repo_path)
# 步骤2: 静态分析 (通过 MCP)
analysis = mcp.static_analysis.analyze(files)
# 步骤3: LLM 生成审查意见 (Function Calling)
review = llm.generate_review(analysis)
# 步骤4: 格式化输出
return self.format_report(review)
# 使用
reviewer = load_skill("comprehensive-code-review")
report = reviewer.execute("./my-project")
总结
核心要点
- Function Calling 是 AI 模型的"本能",让它能够使用工具
- MCP 是工具界的"通用语言",让工具能够被任何 AI 应用理解和使用
- Agent Skills 是"智能积木",封装复杂任务供用户直接使用
发展趋势
- 标准化:MCP 正在逐渐成为行业标准,类似 HTTP 之于 Web
- 生态化:MCP Server 和 Agent Skills 的社区生态正在快速发展
- 低代码:未来会有更多可视化工具来编排 Skills,无需编写代码
学习路径建议
- 入门:先理解并练习 Function Calling,掌握基本原理
- 进阶:学习 MCP 协议,尝试编写自己的 MCP Server
- 精通:设计和封装 Agent Skills,构建完整的 AI 应用解决方案
参考资源
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)