Function Calling、Skills、MCP 技术对比与选型指南

💡 核心亮点

Function Calling、Skills、MCP 是当前 AI 智能体三大主流工具调用协议,分别代表不同阶段的技术演进:

结论:Function Calling 是当前必选项,Skills 是中期优化方向,MCP 是未来生态标准。


一、Function Calling(函数调用)

核心概念

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(技能包)

核心概念

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

优势


局限性


我们项目的应用

当前状态:❌ 尚未采用

潜在应用场景:

  1. 潮汐分析技能: ```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}
    

    ```

  2. 台风路径分析技能: ```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)

核心概念

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']} 的路径特征、登陆点、最大风力等信息"}
            ]
        )

优势


局限性


我们项目的应用

当前状态:❌ 尚未采用

未来应用场景:

  1. 数据库 MCP Server(统一数据访问层):

```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") # ... 动态发现所有可用资源 ```

  1. 文件系统 MCP Server(笔记访问标准化):

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" ) ]

  1. 潮汐 API MCP Server(外部数据源封装):

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 智能体架构

五、我们项目的技术选型建议

当前阶段(2025 年)

✅ 必须用:Function Calling

待优化:Function Calling + ReAct


中期阶段(工具数量 > 20 个)

⚠️ 建议引入: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 标准化连接
  └─ 否 → 暂不需要

六、常见问题解答

Q1:Function Calling 和 MCP 的 Tools 有什么区别?

A:

两者可以配合使用:

MCP Server 暴露工具
  ↓
MCP Host(ping_02)连接并发现工具
  ↓
把工具转为 Function Calling schema
  ↓
LLM 通过 Function Calling 调用

Q2:Skills 和 MCP 能一起用吗?

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 工具

Q3:我们现在需要学 MCP 吗?

A:


七、参考资料

官方文档

实战教程

开源项目


📝 笔记创建:2026-02-09
🔄 基于 ping_02 / ping_03 实际开发经验与行业技术趋势分析

0:00 0:00

相关笔记