LLM 的根本局限

GPT-4、Claude、Gemini——再强的 LLM 也只是「文本输入→文本输出」的函数。它们不能:

  • ❌ 查询实时数据(天气、股价、新闻)
  • ❌ 执行代码(计算、数据处理)
  • ❌ 访问数据库
  • ❌ 调用外部 API
  • ❌ 操作文件系统

没有工具的 LLM 是一个被关在玻璃房里的天才——能看到外面,但不能触碰任何东西。

工具调用的进化史

2022.03  ReAct 论文(推理+行动框架)
2023.06  OpenAI Function Calling(结构化工具调用)
2023.10  GPT-4V(多模态工具使用)
2024.05  Anthropic Tool Use API
2024.11  MCP 协议发布(统一工具生态)
2025.03  Computer Use(操控 GUI)
2026.01  MCP 成为行业标准

Function Calling:结构化的第一步

基本原理

让 LLM 输出结构化的 JSON,而不是自由文本:

# 定义工具
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名"},
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
                },
                "required": ["city"]
            }
        }
    }
]

# 调用 LLM
response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "北京今天多少度?"}],
    tools=tools
)

# LLM 返回结构化调用
tool_call = response.choices[0].message.tool_calls[0]
# tool_call.function.name = "get_weather"
# tool_call.function.arguments = '{"city": "北京", "unit": "celsius"}'

调用流程

用户: "北京今天多少度?"
LLM 思考: 需要查询天气
LLM 输出: {name: "get_weather", args: {city: "北京"}}
你的代码: 执行 get_weather("北京") → "28°C 晴"
LLM: "北京今天 28°C,晴天。"

MCP:统一工具生态的「USB-C」

Function Calling 的痛点:

  • 每个 LLM 厂商格式不同(OpenAI vs Anthropic vs Google)
  • 工具定义和实现耦合
  • 无法跨平台复用工具

MCP(Model Context Protocol) 解决了这些问题:

MCP 架构

┌──────────────┐     MCP协议     ┌──────────────┐
│  MCP Client  │ ←─────────────→ │  MCP Server  │
│  (LLM Agent) │   JSON-RPC      │  (工具提供方)  │
└──────────────┘                 └──────────────┘

MCP Server 示例

from mcp import Server, Tool

server = Server("my-tools")

@server.tool()
def search_web(query: str, max_results: int = 5) -> list[dict]:
    """搜索互联网内容"""
    return search_api.query(query, limit=max_results)

@server.tool()
def read_file(path: str) -> str:
    """读取本地文件"""
    with open(path) as f:
        return f.read()

@server.tool()
def execute_code(code: str, language: str = "python") -> str:
    """在沙箱中执行代码"""
    return sandbox.run(code, language=language)

server.run("stdio")  # 或 "http"

MCP 的优势

特性Function CallingMCP
跨厂商兼容
工具复用❌ 每个项目重写✅ 一次开发处处可用
动态发现❌ 预先定义✅ 运行时发现
类型安全部分✅ JSON Schema
传输协议绑定 APIstdio / HTTP / SSE

工具分类与设计原则

工具分类

类别示例特点
信息获取搜索、天气、股价只读,低风险
数据处理代码执行、SQL查询只读/读写,中风险
文件操作读写、创建、删除读写,高风险
通信发邮件、发消息不可逆,极高风险
系统操作执行命令、安装包不可逆,极高风险

设计原则

  1. 最小权限:Agent 只能访问必要的工具
  2. 沙箱隔离:代码执行在隔离环境中
  3. 人类审批:高风险操作需要人类确认
  4. 幂等性:同一工具调用多次结果一致
  5. 超时保护:防止工具调用永久阻塞
class ToolRegistry:
    def __init__(self):
        self.tools = {}
        self.permissions = {}

    def register(self, tool: Tool, risk_level: str = "low"):
        self.tools[tool.name] = tool
        self.permissions[tool.name] = risk_level

    def execute(self, name: str, args: dict, auto_approve: bool = True):
        if self.permissions[name] == "critical" and not auto_approve:
            if not self._ask_human(name, args):
                return "操作被拒绝"

        tool = self.tools[name]
        try:
            result = tool.run(**args, timeout=30)
            return result
        except TimeoutError:
            return "工具执行超时"
        except Exception as e:
            return f"工具执行失败: {e}"

Computer Use:操控 GUI 的终极工具

2025 年 Computer Use 的出现,让 Agent 可以像人类一样操作电脑:

  • 截屏 → 视觉理解 → 鼠标/键盘操作 → 验证结果
  • 可以操作任何有 GUI 的软件
  • 本质上是「万能工具」——如果人类能用,Agent 也能用
# Computer Use 的工作循环
while not task_done:
    screenshot = capture_screen()
    action = llm.analyze(screenshot, task)
    # action 可能是: click(x,y), type("text"), press("Enter"), scroll(direction)
    execute_action(action)

结语

工具调用是 Agent 从「聊天机器人」进化为「数字工人」的分水岭。从 Function Calling 到 MCP,从 API 调用到 Computer Use,工具在不断打破 LLM 的边界。

在硅基 AGI 的愿景中,一个强大的 Agent 应该像人类一样——会思考,也会动手。工具就是它的双手。


更多 Agent 技术原理拆解,请关注 硅基 AGI · guijiagi.com

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。