1. 从 Function Call 到 Agent Skills:AI 能力扩展的技术演进
最近在体验 Claude 的 SKILLS 功能时,我深刻感受到 AI 能力扩展技术正在经历一场革命。作为一名长期关注 AI 落地的开发者,我想通过这篇文章系统梳理从 Function Call 到 MCP 再到 Agent Skills 的技术演进路径,帮助大家理解这些概念背后的技术逻辑。
AI 能力扩展的核心目标是让大模型从"只会聊天"进化到"能真正做事"。这就像给一个知识渊博但行动不便的学者配备了一支专业执行团队,学者负责思考和决策,团队负责具体执行。下面我们就来看看这个进化过程是如何实现的。
2. Function Call:大模型能力的第一次飞跃
2.1 技术背景与核心机制
在 Function Call 出现之前,大模型面临着严重的"纸上谈兵"问题。以天气查询为例,模型要么基于训练数据猜测("北京今天可能晴天"),要么直接编造数据("北京气温25度"),这种回答既不可靠也不专业。
2023年 OpenAI 推出的 Function Calling 功能解决了这个问题。其核心创新在于:
- 允许开发者向模型"注册"可用的外部工具
- 模型在对话过程中可以自主决定何时调用工具
- 通过结构化 JSON 格式实现工具调用与结果返回
一个典型的天气查询交互流程如下:
json复制// 模型输出的调用请求
{
"name": "get_weather",
"arguments": {
"location": "北京",
"unit": "celsius"
}
}
// 外部系统返回的结果
{
"temperature": 22,
"condition": "sunny",
"humidity": 45%
}
2.2 技术实现细节
在实际开发中,Function Call 的实现包含三个关键组件:
-
工具定义:在系统提示中完整描述每个工具的:
- 功能说明
- 必需参数及其类型
- 返回数据结构
-
调用决策:模型基于以下因素决定是否调用工具:
- 用户意图识别
- 工具适用性判断
- 参数完整性验证
-
结果整合:将工具返回的结构化数据转化为自然语言回复
2.3 局限性分析
尽管 Function Call 是重大突破,但在实际使用中我们发现几个明显问题:
- 工具定义冗余:每个应用都需要重复定义相似工具(如不同应用的数据库查询工具)
- 生态碎片化:工具接口没有统一标准,无法跨应用复用
- Token 消耗:所有工具定义必须放在系统提示中,随着功能增多导致成本飙升
- 维护困难:工具变更需要同步修改系统提示,在复杂场景下难以管理
实践建议:在简单场景下,Function Call 仍然是最轻量级的解决方案。但当工具数量超过10个或需要跨团队协作时,建议考虑更先进的方案。
3. MCP 协议:构建AI工具生态的基石
3.1 协议设计理念
2024年 Anthropic 发布的 Model Context Protocol (MCP) 从根本上解决了 Function Call 的生态问题。我们可以将 MCP 理解为 AI 领域的 RPC 协议标准,它实现了:
- 统一的工具描述规范:所有工具按照标准格式定义接口
- 动态发现机制:AI 可以运行时发现可用工具
- 跨模型兼容:协议设计独立于具体模型实现
3.2 协议工作流程
一个完整的 MCP 交互包含以下阶段:
- 工具发现:
mermaid复制sequenceDiagram
participant Client
participant Server
Client->>Server: GET /mcp/tools
Server->>Client: 返回工具列表
- 工具调用:
mermaid复制sequenceDiagram
participant User
participant Client
participant Server
User->>Client: "查询北京天气"
Client->>Server: POST /mcp/execute {tool:"weather", params:{location:"北京"}}
Server->>Client: 返回结构化结果
Client->>User: 生成自然语言回复
3.3 关键技术优势
与传统 Function Call 相比,MCP 带来了质的飞跃:
| 维度 | Function Call | MCP |
|---|---|---|
| 工具定义 | 每个应用独立定义 | 统一协议标准 |
| 工具发现 | 静态配置 | 动态发现 |
| 生态复用 | 难以复用 | 一次开发,处处可用 |
| 跨模型支持 | 绑定特定模型 | 开放标准 |
| 维护成本 | 高(需更新系统提示) | 低(服务端独立更新) |
3.4 实践案例:数据库查询工具
通过一个具体案例展示 MCP 的实际价值。假设我们需要开发一个数据库查询工具:
- 工具定义(MCP 描述文件):
yaml复制name: database_query
description: 执行SQL查询并返回结果
parameters:
- name: query
type: string
description: 要执行的SQL语句
returns:
type: array
items: object
- 服务端实现(Python示例):
python复制@app.post('/mcp/execute')
def handle_mcp_request():
tool = request.json['tool']
if tool == 'database_query':
query = request.json['params']['query']
result = db.execute(query)
return {'status': 'success', 'data': result}
- 客户端集成:
- 任何兼容 MCP 的 AI 系统都可以自动发现并使用该工具
- 工具升级时,所有客户端自动获得新功能
4. Agent Skills:能力扩展的终极形态
4.1 概念演进
2025年 Anthropic 推出的 Agent Skills 在 MCP 基础上实现了更高层次的抽象。其核心创新是将"工具调用"升级为"技能加载",关键区别在于:
- 按需加载:只注入当前任务相关的技能提示
- 模块化管理:技能可以独立开发、测试和部署
- 资源整合:一个技能可以组合多个工具调用
4.2 技术架构
Skills 系统采用分层设计:
code复制技能仓库层(Skills Hub)
│
├── 公共技能(如GitHub集成)
├── 企业技能(内部工具)
│
技能运行时层
├── 技能加载器
├── 上下文管理器
│
模型交互层
├── 提示工程
└── 工具调用
4.3 两阶段加载机制
为解决 token 消耗问题,Skills 采用精妙的两阶段加载:
-
元数据阶段(低token消耗):
- 加载技能名称和简短描述
- 通常每个技能消耗30-100 tokens
-
完整加载阶段(按需):
- 当模型判断需要某技能时加载完整定义
- 包含详细指令、示例和工具绑定
以博客写作技能为例:
markdown复制---
name: blog_writer
description: 专业博客写作助手
requires: [markdown, image_upload]
---
# 技能指令
你是一位专业的技术博客作者,擅长:
- 将复杂技术概念转化为易懂的文字
- 保持行文流畅且结构清晰
- 自动配图并上传到图床
## 工作流程
1. 接收用户草稿
2. 优化文章结构
3. 生成配图提示词
4. 调用image_upload工具上传图片
5. 返回完整markdown
4.4 技能开发实践
开发一个完整的Skill需要关注以下要素:
- 元数据定义:
yaml复制name: weather_reporter
description: 专业天气报告生成
version: 1.0.0
author: John Doe
requires: [mcp_weather]
- 提示工程设计:
- 角色设定
- 工作流程
- 示例对话
- 工具绑定:
yaml复制tools:
- name: mcp_weather
params:
location: {{user_input}}
- 测试用例:
yaml复制test_cases:
- input: "上海天气怎么样?"
expected_steps:
- call mcp_weather {location:"上海"}
- generate_report
5. 实战:构建个人自动化技能
5.1 技能规划
以"自动生成博客封面图"为例,该技能需要完成:
- 分析文章内容提取关键词
- 生成配图提示词
- 调用图像生成API
- 上传到图床
- 返回图片URL
5.2 技能实现
完整技能文件 blog_cover.skill.md:
markdown复制---
name: blog_cover
description: 自动为技术博客生成封面图
requires: [image_generator, image_upload]
---
# 博客封面图生成器
## 能力
1. 分析Markdown内容提取3-5个关键词
2. 生成DALL-E提示词
3. 调用图像生成服务
4. 自动上传到指定图床
## 示例
用户: 为我的React教程生成封面
AI: [分析内容...]
生成提示: "现代React开发, clean code, 组件树, 蓝色科技感"
调用image_generator...
上传到图床...
返回: 
5.3 技能部署
部署方式取决于使用场景:
- 本地开发:
bash复制mkdir -p ~/.claude/skills
cp blog_cover.skill.md ~/.claude/skills/
- 团队共享:
- 部署到企业MCP Hub
- 通过版本控制系统管理
- 生态分发:
- 发布到公共Skills Hub
- 支持
/plugin install blog-cover安装
6. 技术演进趋势与未来展望
6.1 三阶段发展模型
基于当前技术发展,我们可以预见AI能力扩展将经历三个阶段:
| 阶段 | 特点 | 技术表现 | 用户感知度 |
|---|---|---|---|
| 手动时代 | 显式配置 | 需要编写工具定义 | 高 |
| 发现时代 | 半自动 | 技能市场/自动更新 | 中 |
| 隐形时代 | 全自动 | 动态技能组合/意图识别 | 低 |
6.2 关键技术挑战
在向"隐形时代"演进过程中,仍需解决:
-
技能发现:
- 如何从海量技能中快速定位所需
- 技能相似度评估与冲突解决
-
组合执行:
- 跨技能的工作流编排
- 异常处理与事务回滚
-
安全机制:
- 技能权限控制
- 敏感操作确认
- 执行沙箱隔离
6.3 开发者机遇
对开发者而言,这个演进过程创造了新的机会领域:
-
技能开发:
- 垂直领域专用技能
- 技能测试框架
-
技能市场:
- 技能分发平台
- 质量评级系统
-
中间件:
- MCP协议网关
- 技能组合引擎
7. 实践建议与经验分享
7.1 技能设计原则
基于多个技能开发经验,我总结出以下最佳实践:
- 单一职责:每个技能只解决一个特定问题
- 明确边界:清晰定义技能的作用范围
- 版本控制:使用语义化版本管理变更
- 文档完备:包含使用示例和测试用例
7.2 性能优化技巧
-
提示词精简:
- 使用缩写句式
- 移除冗余说明
-
缓存策略:
- 缓存常用技能元数据
- 实现提示词片段复用
-
懒加载:
- 分阶段加载技能内容
- 动态注入工具定义
7.3 调试方法
当技能不能正常工作时,建议检查:
-
元数据完整性:
- 名称和描述是否准确
- 必需工具是否正确定义
-
工具可用性:
- MCP服务是否在线
- 权限配置是否正确
-
模型理解:
- 描述是否清晰无歧义
- 示例是否具有代表性
8. 总结与个人体会
回顾从 Function Call 到 Agent Skills 的演进,我深刻感受到AI应用开发正在经历从"手工劳作"到"工业化生产"的转变。在这个过程中,有几个关键认知:
-
抽象层次提升:从具体的API调用到抽象的Skill概念,开发者可以更专注于业务逻辑而非技术细节。
-
生态效应显现:标准协议的出现催生了工具开发生态,形成了正向循环。
-
人机协作进化:AI从被动工具变为主动助手,改变了人机交互范式。
在实际项目中使用这些技术时,我的建议是:从具体的小场景入手,逐步构建技能库。比如先自动化一个重复的文档处理流程,再扩展到更复杂的业务场景。这种渐进式 adoption 策略既能快速验证价值,又能控制技术风险。
最后需要强调的是,无论技术如何演进,理解用户需求和提供可靠服务始终是核心。Agent Skills 等新技术只是手段,真正的价值在于它们能帮助我们构建什么样的解决方案。