Function Calling与MCP

1. 工具调用(Function Calling)

1.1 开发者编写工具函数 (The Definition)

这是第一步,你得给模型"装备"技能。你不仅需要写好代码,还得写好一份说明书

  • 代码实现:实际运行的 Python/JS 函数。
  • JSON Schema 描述:模型看不见你的源代码,它只能看到一份关于函数的描述(名称、功能、参数类型)。

例子:如果你想让模型能查天气,你需要定义:

  • 名称get_weather
  • 描述:"获取指定城市的实时天气"
  • 参数city (string)

1.2 编写系统提示词 (The Protocol)

你需要告诉模型,它现在拥有了这些"超能力",以及调用的暗号

虽然现在的 GPT-4 或 Gemini 都有内置的 tools 接口,但在底层或早期,这都是通过提示词完成的。

提示词示例:"如果你发现用户的问题需要查询实时信息,请不要直接回答。请输出以下格式:Action: [函数名], Args: [参数]。"

1.3 模型输出特定格式 (The Thought)

当用户问:"上海现在几度?"时,模型会意识到自己不知道实时天气,但它发现手里有一个 get_weather 的工具。

  • 模型不会编造答案(理想情况下)。
  • 它会进入"中继状态":输出一段非人类阅读的结构化文本,例如:
JSON{ "call": "get_weather", "parameters": {"city": "Shanghai"} }

1.4 开发者编写解析代码 (The Executor)

这是最关键的桥接步骤。模型本身并没有运行代码的权限,运行权限在你的服务器上手里。

  1. 拦截输出:你的程序监听到模型的返回结果。
  2. 解析:识别出这是一个工具请求,提取出函数名和参数。
  3. 执行:你的程序在本地或通过 API 真正去运行 get_weather("Shanghai")
  4. 获取结果:比如得到结果 {"temp": "18°C", "condition": "Sunny"}

1.5 结果回传与最终生成 (The Final Answer)

现在你有了结果,但用户还没看到。你需要把这个结果再次喂给模型,就像在对话记录里追加一条记录:

  • 用户:上海现在几度?
  • 模型(请求):调用 get_weather(city="Shanghai")
  • 系统(反馈):工具返回结果是 18°C,晴
  • 模型(最终):"上海现在的气温是 18°C,天气晴朗。"

2. MCP(Model Context Protocol)

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 提出的一个标准,旨在为大型语言模型(LLM)提供一种标准化的方式来访问外部工具和数据源。

目的:解决开发者在构建智能体式应用时,需要为每个应用重复编写代码来集成不同工具(如 Slack, GitHub, Google Drive 等)的痛点。

2.1 MCP 的核心组件

2.2 客户端 (Clients)

  • 角色:希望访问外部工具或数据的应用程序。
  • 示例:Cursor, Claude Desktop, Windsurf。
  • 功能:向 MCP 服务器发送请求,获取数据或执行操作。

2.3 服务器 (Servers)

  • 角色:提供工具和数据源的软件服务。
  • 示例:Slack, Google Drive, GitHub, PostgreSQL。
  • 功能:接收来自客户端的请求,并将其转换为对原始工具 API 的调用,然后将结果返回给客户端。
  • 来源:部分服务器由服务提供商开发,但也有大量第三方开发者贡献。

3. Skills

  • 工具 (Tool):侧重于单一、原子的功能。例如:read_file()
  • 技能 (Skill):侧重于解决具体问题的能力。例如:code_reviewer()。这个技能内部可能调用了读文件、语法分析、逻辑比较、生成报告等多个原子工具。

一个完整的技能通常由以下四个部分组成:

  1. 能力描述:告诉模型这个技能"是什么"以及"什么时候用"。这是模型决策的关键,描述越精准,模型误调用的概率就越低。
  2. 参数规范:严格定义输入格式。例如,"分析财务报表"技能需要:year (integer), company_name (string), report_type (enum)。
  3. 执行逻辑:工具背后的代码实现。它可以是简单的 API 调用,也可以是一个复杂的 Python 脚本或多步流转的 MCP 请求。
  4. 结果解析器:将工具返回的原始数据(往往是杂乱的 JSON 或报文)转化为模型易于理解的摘要或结构化上下文。
目录