💡 核心亮点
Function Calling、Skills、MCP 是当前 AI 智能体三大主流工具调用协议,分别代表不同阶段的技术演进:
- Function Calling:OpenAI 提出的单轮工具调用标准(2023 年),解决"LLM 如何调用外部函数"的问题
- Skills:Claude 提出的可复用技能包概念(2024 年),解决"如何组织和管理复杂工具链"的问题
- MCP(Model Context Protocol):Anthropic 提出的开放协议(2024 年底),解决"AI 应用如何标准化连接外部数据源和工具"的问题
结论:Function Calling 是当前必选项,Skills 是中期优化方向,MCP 是未来生态标准。
Function Calling 是 OpenAI 在 2023 年 6 月提出的协议,允许 LLM 在对话过程中"调用外部函数"获取数据或执行操作。
工作流程:
用户提问
↓
LLM 决策(看工具 schema)
↓
输出工具调用请求(JSON 格式)
↓
代码端执行工具
↓
把结果返回给 LLM
↓
LLM 综合生成最终回答
1. 标准化 schema 定义
tool_schema = {
"type": "function",
"function": {
"name": "search_sites",
"description": "搜索全国重点文物保护单位",
"parameters": {
"type": "object",
"properties": {
"province": {"type": "string", "description": "省份名"},
"batch": {"type": "string", "description": "批次"}
}
}
}
}
2. LLM 自主决策
response = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "广东有哪些国保?"}],
tools=[tool_schema],
tool_choice="auto", # LLM 自主决定调用哪个工具
)
3. 结构化返回
{
"name": "search_sites",
"arguments": {
"province": "广东",
"batch": null
}
}
ping_02(通用智能助手):
# app/ping_02/PingRouter02.py
tools = [
SCHEMA_SEARCH_SITES, # 国保查询
SCHEMA_SEARCH_TIDE, # 潮汐查询
SCHEMA_SEARCH_TYPHOON, # 台风查询
SCHEMA_SEARCH_NOTES, # 笔记检索
]
ping_03(海启星企业助手):
# app/ping_03/PingRouter03.py
tools = [
SCHEMA_SEARCH_KB, # 知识库检索(RAG)
SCHEMA_QUERY_PRODUCT, # 产品方案查询
SCHEMA_GET_QUOTE, # 报价查询
]
当前状态:✅ 已全面采用 Function Calling
Skills 是 Anthropic 在 2024 年提出的概念,核心思想是:把复杂工具链封装为可复用的"技能包",让 AI 可以像人类"学习技能"一样掌握新能力。
与 Function Calling 的区别:
| 维度 | Function Calling | Skills |
|---|---|---|
| 粒度 | 单个函数 | 完整工作流(多步 + 多工具) |
| 封装度 | 低(只定义输入输出) | 高(包含内部逻辑、错误处理、状态管理) |
| 复用性 | 低(每次重新定义) | 高(一次定义,多处复用) |
| 学习成本 | 低(看 schema 就能懂) | 中(需要理解技能内部流程) |
1. 技能封装(多步工作流)
# 伪代码示例
class QueryNationalSiteSkill:
"""查询国保单位的完整技能(封装多步逻辑)"""
def __init__(self):
self.name = "query_national_site"
self.description = "查询国保单位,支持省份/批次/名称组合筛选"
def execute(self, province=None, batch=None, name=None):
# 第 1 步:参数验证与归一化
province = self.normalize_province(province) # "广东" → "广东省"
# 第 2 步:查询数据库
sites = search_sites(province=province, batch=batch, name=name)
# 第 3 步:数据后处理(截断、格式化)
formatted = self.format_results(sites)
# 第 4 步:返回结果
return formatted
def normalize_province(self, province):
"""省份名归一化"""
if not province:
return province
if not province.endswith("省"):
return province + "省"
return province
def format_results(self, sites):
"""格式化结果"""
# ... 复杂逻辑
return formatted_sites
2. 技能注册与发现
# 技能注册中心
SKILL_REGISTRY = {
"query_national_site": QueryNationalSiteSkill(),
"query_typhoon_skill": QueryTyphoonSkill(),
"analyze_data_skill": AnalyzeDataSkill(),
}
# LLM 看到的不是底层函数,而是高层技能
skill_schemas = [
skill.get_schema() for skill in SKILL_REGISTRY.values()
]
3. 技能组合(Skill Chaining)
# 复杂技能可以组合多个子技能
class AnalyzeProvinceTourismSkill:
"""分析某省旅游资源(组合多个子技能)"""
def execute(self, province):
# 调用子技能 1:查国保单位
sites = SKILL_REGISTRY["query_national_site"].execute(province=province)
# 调用子技能 2:查天气
weather = SKILL_REGISTRY["query_weather"].execute(province=province)
# 调用子技能 3:生成报告
report = SKILL_REGISTRY["generate_report"].execute(
sites=sites,
weather=weather
)
return report
当前状态:❌ 尚未采用
潜在应用场景:
潮汐分析技能: ```python class AnalyzeTideSkill: """分析某站点潮汐特征(组合查询 + 计算 + 可视化)""" def execute(self, station_name, date_range): # 1. 查潮汐数据 data = query_tide_data(station_name, date_range)
# 2. 计算统计指标(最高潮位、最低潮位、平均潮差)
stats = calculate_statistics(data)
# 3. 生成可视化图表
chart = generate_tide_chart(data)
return {"stats": stats, "chart": chart}
```
台风路径分析技能: ```python class AnalyzeTyphoonPathSkill: """分析台风路径特征(多步分析)""" def execute(self, typhoon_name): # 1. 查台风基本信息 info = get_typhoon_detail(typhoon_name)
# 2. 分析路径特征(经过省份、登陆点、最大风力)
path_analysis = analyze_path(info)
# 3. 对比历史相似台风
similar = find_similar_typhoons(info)
return {"info": info, "path": path_analysis, "similar": similar}
```
引入时机:当工具数量 > 20 个且出现大量重复逻辑时
MCP(Model Context Protocol) 是 Anthropic 在 2024 年 11 月提出的开放协议,目标是标准化 AI 应用与外部数据源/工具的连接方式。
核心思想:
"MCP 就像是 AI 应用的 USB-C 接口 —— 一个标准协议连接所有数据源和工具。"
类比理解:
| 技术 | 类比 | 解决的问题 |
|---|---|---|
| Function Calling | 函数调用 | LLM 如何调用单个函数 |
| Skills | 技能包 | 如何组织复杂工作流 |
| MCP | USB-C 接口 | 如何标准化连接所有外部资源 |
MCP 三组件:
┌─────────────────────────────────────────┐
│ MCP Host(AI 应用) │
│ 例如:Claude Desktop、Cursor、自研系统 │
└──────────────┬──────────────────────────┘
│
│ MCP Protocol(标准协议)
│
┌──────────────┴──────────────────────────┐
│ MCP Server(资源提供者) │
│ 例如:GitHub、Google Drive、SQLite、API │
└─────────────────────────────────────────┘
1. MCP Host(主机)
2. MCP Server(服务器)
3. MCP Protocol(协议)
1. 资源暴露(Resources)
# MCP Server 示例:暴露 SQLite 数据库
from mcp.server import Server
app = Server("national-sites-db")
@app.list_resources()
async def list_resources():
return [
Resource(
uri="sqlite://db/national_sites.db/NationalHistoricalandCulturalSites",
name="国保单位数据库",
description="全国重点文物保护单位完整数据",
mimeType="application/sqlite"
)
]
@app.read_resource()
async def read_resource(uri):
if "national_sites.db" in uri:
# 返回数据库内容
return query_database()
2. 工具暴露(Tools)
@app.list_tools()
async def list_tools():
return [
Tool(
name="search_sites",
description="搜索国保单位",
inputSchema={
"type": "object",
"properties": {
"province": {"type": "string"},
"batch": {"type": "string"}
}
}
)
]
@app.call_tool()
async def call_tool(name, arguments):
if name == "search_sites":
return search_sites(**arguments)
3. 提示词模板(Prompts)
@app.list_prompts()
async def list_prompts():
return [
Prompt(
name="analyze_typhoon",
description="分析台风特征的提示词模板",
arguments=[
PromptArgument(name="typhoon_name", required=True)
]
)
]
@app.get_prompt()
async def get_prompt(name, arguments):
if name == "analyze_typhoon":
return PromptResult(
messages=[
{"role": "user", "content": f"请分析台风 {arguments['typhoon_name']} 的路径特征、登陆点、最大风力等信息"}
]
)
当前状态:❌ 尚未采用
未来应用场景:
```python # 把所有数据库统一为 MCP Server mcp_servers = { "national-sites": "sqlite://db/national_sites.db", "tide-hk": "sqlite://db/tidehk.db", "typhoon": "sqlite://db/typhoon_all_data.db", "ping-notes": "sqlite://db/ping.db", "hqx-kb": "sqlite://db/hqx.db", }
# ping_02/ping_03 作为 MCP Host 连接 host = MCPHost() host.connect("national-sites") host.connect("tide-hk") # ... 动态发现所有可用资源 ```
python
# 把 extern/notes/ 目录暴露为 MCP Resource
@app.list_resources()
async def list_resources():
return [
Resource(
uri="file://extern/notes/人工智能/RAG/",
name="AI 学习笔记",
description="BYP 的人工智能学习笔记目录",
mimeType="text/markdown"
)
]
python
# 把 chaoxibiao.net API 封装为 MCP Server
@app.list_tools()
async def list_tools():
return [
Tool(
name="fetch_realtime_tide",
description="获取实时潮汐数据",
inputSchema={
"station_name": {"type": "string"}
}
)
]
引入时机:当需要跨系统共享数据或接入第三方工具时
| 维度 | Function Calling | Skills | MCP |
|---|---|---|---|
| 提出者 | OpenAI(2023) | Anthropic(2024) | Anthropic(2024) |
| 核心定位 | LLM 调用单个函数 | 封装复杂工作流 | 标准化连接外部资源 |
| 标准化程度 | ✅ 高(OpenAI 兼容协议) | ❌ 低(各厂商自实现) | ✅ 高(开放标准) |
| 粒度 | 函数级 | 工作流级 | 系统级 |
| 学习成本 | 低 | 中 | 高 |
| 生态成熟度 | ✅ 高(主流模型都支持) | ⚠️ 中(Claude 生态) | ⚠️ 低(早期阶段) |
| 适用场景 | 简单工具调用 | 复杂业务逻辑 | 跨系统数据共享 |
2023 ──────────────────────────────────────── 2024 ──────────────────────────── 2025+
│ │ │
▼ ▼ ▼
Function Calling Skills MCP
(单轮工具调用) (复杂工作流封装) (标准化连接协议)
│ │ │
└────────────────────────────────────────────┴──────────────────────────────────┘
│
▼
三者融合(未来趋势)
Function Calling(底层调用)
+
Skills(业务封装)
+
MCP(标准连接)
=
完整的 AI 智能体架构
✅ 必须用:Function Calling
待优化:Function Calling + ReAct
⚠️ 建议引入:Skills
触发条件: - 工具数量 > 20 个 - 出现大量重复逻辑(如参数归一化、数据格式化) - 需要组合多个工具完成复杂任务
实施步骤: 1. 识别可复用的工作流(如潮汐分析、台风路径分析) 2. 封装为 Skill 类(包含内部逻辑、错误处理) 3. 注册到 SKILL_REGISTRY 4. LLM 看到的是 Skill schema,而非底层函数
🔮 未来可选:MCP
触发条件: - 需要跨系统共享数据(如 ping_02 访问 tidehk.db) - 需要接入第三方工具(如 GitHub、Google Drive) - 需要标准化数据访问层
实施步骤: 1. 把各数据库封装为 MCP Server 2. ping_02/ping_03 作为 MCP Host 连接 3. 动态发现可用资源,按需调用
是否需要 LLM 调用工具?
├─ 是 → Function Calling(必选)
│ │
│ 工具数量是否 > 20?
│ ├─ 否 → 保持 Function Calling
│ └─ 是 → 引入 Skills 封装复杂逻辑
│
└─ 否 → 不需要
是否需要跨系统共享数据?
├─ 是 → 引入 MCP 标准化连接
└─ 否 → 暂不需要
A:
两者可以配合使用:
MCP Server 暴露工具
↓
MCP Host(ping_02)连接并发现工具
↓
把工具转为 Function Calling schema
↓
LLM 通过 Function Calling 调用
A:可以,且推荐这样做:
# MCP Server 提供底层工具
@app.list_tools()
async def list_tools():
return [search_sites_tool, query_tide_tool]
# Skills 封装复杂工作流
class AnalyzeTideSkill:
def execute(self, station):
# 调用 MCP 工具
tide_data = mcp_host.call_tool("query_tide", {"station": station})
# 复杂逻辑
stats = calculate_statistics(tide_data)
return stats
# LLM 看到的是 Skill,而非底层 MCP 工具
A:
📝 笔记创建:2026-02-09
🔄 基于 ping_02 / ping_03 实际开发经验与行业技术趋势分析