🔵 工具调用
🟣 函数执行
🟡 API 集成
🟢 Agent 编排
🔴 能力扩展

工具调用、函数执行与外部能力扩展

从封闭模型到开放工具的智能进化

🔵 工具调用 Function Calling
Tool Use
结构化输出
🟣 函数执行 代码解释器
沙箱执行
结果解析
🟡 API 集成 REST/GraphQL
Webhook
第三方服务
🟢 Agent 编排 ReAct 规划
多 Agent 协作
任务分解
🔴 能力扩展 插件系统
自定义工具
无限扩展
作者 超级代码智能体
版本 能力扩展版 · 第一版
出版日期 2026 年 3 月
全书规模 五编十七章
学科跨度 工具·函数·API·Agent·扩展

📖 全书目录

第一编 工具调用基础与框架

序言:能力扩展——从封闭模型到开放工具的智能进化

能力扩展是智能进化的关键:能够调用外部工具,执行代码函数,集成 API 服务,编排多 Agent 协作,实现无限能力扩展。然而,传统大语言模型长期受限于"封闭性":只能生成文本,无法执行操作,知识截止训练时间,不能与外部世界交互。工具调用、函数执行与外部能力扩展的兴起正在引发一场智能进化:让 AI 系统从"文本生成者"进化为"行动执行者",从"封闭模型"进化为"开放平台",从"单一能力"进化为"无限扩展"

本书的核心论点:能力扩展体系通过 Function Calling 实现结构化输出、通过代码解释器实现安全执行、通过 API 集成连接外部服务、通过 ReAct 规划实现智能编排、通过插件系统实现无限扩展,五层协同,构建能调用工具、会执行代码、善集成 API、可编排 Agent、无限扩展的全能智能系统。

能力扩展革命的兴起

从 OpenAI Function Calling 到 LangChain Tools,从代码解释器到 ReAct Agent,从 MCP 协议到多 Agent 协作,工具调用技术快速演进。然而,真正的能力扩展面临独特挑战:

  • 工具选择:如何让模型准确选择并调用合适的工具?
  • 安全执行:如何在沙箱中安全执行任意代码?
  • 错误处理:如何优雅处理 API 失败、超时、异常?
  • 复杂编排:如何规划多步骤任务,协调多 Agent 协作?
"能力扩展不是简单的 API 调用,而是一种智能范式的根本转变。从'文本生成'到'行动执行',从'封闭模型'到'开放平台',从'单一能力'到'无限扩展'。这种转变让 AI 系统从'被动回答者'走向'主动执行者'。"
—— 本书核心洞察

本书结构

第一编 工具调用基础与框架:阐述 Function Calling 本质与原理、工具定义与 Schema 设计、主流框架对比等基础知识。

第二编 函数执行与代码解释器:深入剖析代码解释器架构、沙箱安全执行、多语言支持、结果解析与错误处理等核心技术。

第三编 API 集成与外部服务:详细探讨 REST/GraphQL API 集成、Webhook 与事件驱动、第三方服务对接、API 安全与认证等集成技术。

第四编 Agent 能力扩展与编排:涵盖 ReAct 规划与推理、多 Agent 协作、任务分解与编排、工具选择与优化等编排方法。

第五编 应用案例与未来:分析真实生产案例,展望未来趋势,提供持续学习的资源指引。

"从 Function Calling 到代码解释器,从 API 集成到 Agent 编排,从单一工具到无限扩展,能力扩展体系正在重塑 AI 系统的智能范式。未来的 AI 将更具行动力、更善协作、更接近人类的执行能力。"
—— 本书结语预告

—— 作者

2026 年 3 月 9 日 于数字世界

谨以此书献给所有在工具调用与能力扩展一线构建 AI 系统的研究者和工程师们

第 1 章 Function Calling 本质与原理

1.1 Function Calling 核心概念

Function Calling(函数调用)是大语言模型与外部工具交互的核心机制。通过定义结构化的函数 Schema,模型可以输出符合 JSON Schema 的工具调用请求,而非纯文本响应。这使得 LLM 从"文本生成器"转变为"任务执行者",能够调用天气 API、执行数据库查询、发送电子邮件等实际操作。

Function Calling 核心价值:结构化输出(JSON Schema)、意图识别(从自然语言到函数参数)、工具解耦(模型与工具分离)、可组合性(多工具链式调用)。

1.2 Function Calling 完整实现

Function Calling Python 实现

Function Calling 框架完整实现
import json
import requests
from typing import Dict, List, Any, Callable, Optional
from dataclasses import dataclass, asdict
from enum import Enum
import inspect
from abc import ABC, abstractmethod

class ToolParameterType(Enum):
    """工具参数类型"""
    STRING = "string"
    NUMBER = "number"
    INTEGER = "integer"
    BOOLEAN = "boolean"
    ARRAY = "array"
    OBJECT = "object"

@dataclass
class ToolParameter:
    """工具参数定义"""
    name: str
    type: ToolParameterType
    description: str
    required: bool = True
    enum: Optional[List[Any]] = None
    default: Optional[Any] = None

@dataclass
class ToolSchema:
    """工具 Schema 定义"""
    name: str
    description: str
    parameters: List[ToolParameter]
    
    def to_openai_format(self) -> Dict:
        """转换为 OpenAI Function Calling 格式"""
        properties = {}
        required = []
        
        for param in self.parameters:
            prop = {
                "type": param.type.value,
                "description": param.description
            }
            if param.enum:
                prop["enum"] = param.enum
            if param.default is not None:
                prop["default"] = param.default
            
            properties[param.name] = prop
            
            if param.required:
                required.append(param.name)
        
        return {
            "type": "function",
            "function": {
                "name": self.name,
                "description": self.description,
                "parameters": {
                    "type": "object",
                    "properties": properties,
                    "required": required
                }
            }
        }

class Tool(ABC):
    """工具基类"""
    
    def __init__(self, schema: ToolSchema):
        self.schema = schema
    
    @abstractmethod
    def execute(self, **kwargs) -> Any:
        """执行工具"""
        pass
    
    def validate_input(self, **kwargs) -> bool:
        """验证输入参数"""
        for param in self.schema.parameters:
            if param.required and param.name not in kwargs:
                raise ValueError(f"Missing required parameter: {param.name}")
            
            if param.name in kwargs:
                value = kwargs[param.name]
                expected_type = param.type.value
                
                # 简单类型检查
                if expected_type == "string" and not isinstance(value, str):
                    raise TypeError(f"Parameter {param.name} must be string")
                elif expected_type in ["number", "integer"] and not isinstance(value, (int, float)):
                    raise TypeError(f"Parameter {param.name} must be number")
                elif expected_type == "boolean" and not isinstance(value, bool):
                    raise TypeError(f"Parameter {param.name} must be boolean")
                
                # Enum 检查
                if param.enum and value not in param.enum:
                    raise ValueError(f"Parameter {param.name} must be one of {param.enum}")
        
        return True

class WeatherTool(Tool):
    """天气查询工具示例"""
    
    def __init__(self, api_key: str):
        schema = ToolSchema(
            name="get_current_weather",
            description="Get the current weather in a given location",
            parameters=[
                ToolParameter(
                    name="location",
                    type=ToolParameterType.STRING,
                    description="The city and state, e.g. San Francisco, CA",
                    required=True
                ),
                ToolParameter(
                    name="unit",
                    type=ToolParameterType.STRING,
                    description="Temperature unit",
                    required=False,
                    enum=["celsius", "fahrenheit"],
                    default="celsius"
                )
            ]
        )
        super().__init__(schema)
        self.api_key = api_key
    
    def execute(self, **kwargs) -> Dict:
        """执行天气查询"""
        self.validate_input(**kwargs)
        
        location = kwargs.get("location")
        unit = kwargs.get("unit", "celsius")
        
        # 模拟 API 调用(实际应调用真实天气 API)
        # response = requests.get(
        #     f"https://api.weather.com/v1/current?q={location}&units={unit}",
        #     headers={"Authorization": f"Bearer {self.api_key}"}
        # )
        # return response.json()
        
        # 模拟响应
        return {
            "location": location,
            "temperature": 22 if unit == "celsius" else 72,
            "unit": unit,
            "condition": "Sunny",
            "humidity": 65,
            "wind_speed": 12
        }

class CalculatorTool(Tool):
    """计算器工具示例"""
    
    def __init__(self):
        schema = ToolSchema(
            name="calculate",
            description="Perform mathematical calculations",
            parameters=[
                ToolParameter(
                    name="expression",
                    type=ToolParameterType.STRING,
                    description="Mathematical expression to evaluate, e.g. '2 + 2 * 3'",
                    required=True
                )
            ]
        )
        super().__init__(schema)
    
    def execute(self, **kwargs) -> Dict:
        """执行计算"""
        self.validate_input(**kwargs)
        
        expression = kwargs.get("expression")
        
        # 安全计算(避免 eval 风险)
        try:
            # 使用 ast 安全解析
            import ast
            import operator
            
            operators = {
                ast.Add: operator.add,
                ast.Sub: operator.sub,
                ast.Mult: operator.mul,
                ast.Div: operator.truediv,
                ast.Pow: operator.pow,
                ast.USub: operator.neg
            }
            
            def eval_expr(node):
                if isinstance(node, ast.Num):
                    return node.n
                elif isinstance(node, ast.BinOp):
                    left = eval_expr(node.left)
                    right = eval_expr(node.right)
                    return operators[type(node.op)](left, right)
                elif isinstance(node, ast.UnaryOp):
                    operand = eval_expr(node.operand)
                    return operators[type(node.op)](operand)
                else:
                    raise TypeError(f"Unsupported operation: {type(node)}")
            
            tree = ast.parse(expression, mode='eval')
            result = eval_expr(tree.body)
            
            return {
                "expression": expression,
                "result": result,
                "success": True
            }
        except Exception as e:
            return {
                "expression": expression,
                "error": str(e),
                "success": False
            }

class FunctionCaller:
    """
    Function Calling 执行器
    
    核心流程:
    1. 注册工具(定义 Schema)
    2. LLM 生成工具调用请求
    3. 解析并验证调用
    4. 执行工具
    5. 返回结果给 LLM
    """
    
    def __init__(self):
        self.tools: Dict[str, Tool] = {}
    
    def register_tool(self, tool: Tool):
        """注册工具"""
        self.tools[tool.schema.name] = tool
        print(f"Registered tool: {tool.schema.name}")
    
    def get_tools_schema(self) -> List[Dict]:
        """获取所有工具的 Schema(用于 LLM 调用)"""
        return [tool.schema.to_openai_format() for tool in self.tools.values()]
    
    def execute_tool_call(self, tool_name: str, arguments: Dict) -> Any:
        """
        执行工具调用
        
        Args:
            tool_name: 工具名称
            arguments: 参数字典
        
        Returns:
            工具执行结果
        """
        if tool_name not in self.tools:
            raise ValueError(f"Unknown tool: {tool_name}. Available tools: {list(self.tools.keys())}")
        
        tool = self.tools[tool_name]
        
        try:
            result = tool.execute(**arguments)
            return {
                "success": True,
                "tool": tool_name,
                "result": result
            }
        except Exception as e:
            return {
                "success": False,
                "tool": tool_name,
                "error": str(e)
            }
    
    def process_llm_response(self, llm_response: Dict) -> Any:
        """
        处理 LLM 响应(包含工具调用)
        
        Args:
            llm_response: LLM 响应,格式如:
            {
                "role": "assistant",
                "tool_calls": [
                    {
                        "id": "call_123",
                        "function": {
                            "name": "get_current_weather",
                            "arguments": '{"location": "Beijing"}'
                        }
                    }
                ]
            }
        
        Returns:
            工具执行结果列表
        """
        if "tool_calls" not in llm_response or not llm_response["tool_calls"]:
            return None
        
        results = []
        
        for tool_call in llm_response["tool_calls"]:
            tool_name = tool_call["function"]["name"]
            arguments_str = tool_call["function"]["arguments"]
            
            # 解析参数
            try:
                arguments = json.loads(arguments_str)
            except json.JSONDecodeError as e:
                results.append({
                    "success": False,
                    "tool": tool_name,
                    "error": f"Invalid JSON arguments: {e}"
                })
                continue
            
            # 执行工具
            result = self.execute_tool_call(tool_name, arguments)
            result["call_id"] = tool_call.get("id")
            results.append(result)
        
        return results


# 使用示例
if __name__ == "__main__":
    # 创建 Function Caller
    caller = FunctionCaller()
    
    # 注册工具
    weather_tool = WeatherTool(api_key="demo_key")
    calculator_tool = CalculatorTool()
    
    caller.register_tool(weather_tool)
    caller.register_tool(calculator_tool)
    
    print("\n=== 已注册工具 Schema ===")
    for schema in caller.get_tools_schema():
        print(json.dumps(schema, indent=2))
    
    print("\n=== 模拟 LLM 工具调用 ===")
    
    # 模拟 LLM 响应(工具调用)
    llm_response = {
        "role": "assistant",
        "tool_calls": [
            {
                "id": "call_001",
                "function": {
                    "name": "get_current_weather",
                    "arguments": json.dumps({"location": "Beijing, China", "unit": "celsius"})
                }
            },
            {
                "id": "call_002",
                "function": {
                    "name": "calculate",
                    "arguments": json.dumps({"expression": "2 + 2 * 3"})
                }
            }
        ]
    }
    
    # 处理 LLM 响应
    results = caller.process_llm_response(llm_response)
    
    print("\n=== 工具执行结果 ===")
    for result in results:
        print(f"\n工具:{result['tool']}")
        print(f"调用 ID: {result.get('call_id')}")
        print(f"成功:{result['success']}")
        if result['success']:
            print(f"结果:{json.dumps(result['result'], indent=2, ensure_ascii=False)}")
        else:
            print(f"错误:{result.get('error')}")
    
    print("\n关键观察:")
    print("1. Function Calling 将自然语言转换为结构化函数调用")
    print("2. Schema 定义:工具名称、描述、参数(类型、必填、枚举)")
    print("3. 执行流程:LLM 生成调用 → 解析验证 → 执行工具 → 返回结果")
    print("4. 错误处理:参数验证、执行异常、JSON 解析错误")
    print("5. 可扩展性:轻松添加新工具,无需修改 LLM")

1.3 Function Calling 工作流程

从意图到行动

Function Calling 的完整工作流程包含五个关键步骤:

  • 步骤 1:工具定义:定义工具 Schema(名称、描述、参数)
  • 步骤 2:LLM 推理:LLM 分析用户意图,选择工具并生成参数
  • 步骤 3:调用解析:解析 LLM 输出的 JSON,验证参数
  • 步骤 4:工具执行:执行实际工具(API 调用、代码执行等)
  • 步骤 5:结果返回:将结果返回给 LLM,生成最终响应
"Function Calling 的革命性在于'意图到行动'的转化:用户说'北京天气如何',LLM 识别意图→调用天气 API→返回结果。这不仅是技术突破,更是智能范式的转变:从'被动回答'到'主动执行'。"
—— OpenAI (2023)

1.4 本章小结

本章深入探讨了 Function Calling 本质与原理。关键要点:

  • Function Calling:结构化输出、意图识别、工具解耦
  • Schema 设计:名称、描述、参数(类型、必填、枚举)
  • 执行流程:工具定义→LLM 推理→调用解析→工具执行→结果返回
  • 错误处理:参数验证、执行异常、JSON 解析
  • 可扩展性:轻松添加新工具

第 16 章 生产案例分析

16.1 案例一:智能客服自动化系统

背景与挑战

  • 背景:某大型电商平台,日均客服咨询 50 万+,人工成本高昂
  • 挑战
    • 复杂查询:订单状态、物流跟踪、退款进度需调用多个 API
    • 多轮对话:用户问题常需多轮澄清才能确定意图
    • 工具选择:10+ 个后端服务(订单、物流、支付、库存等)
    • 错误处理:API 超时、数据不一致、权限验证
    • 安全要求:用户隐私数据保护、操作审计

工具调用解决方案

  • Function Calling 架构
    • 定义 15+ 个工具:查询订单、跟踪物流、发起退款、修改地址等
    • Schema 设计:详细参数描述、必填验证、枚举约束
    • 多工具链式调用:查询订单→跟踪物流→计算退款
  • ReAct Agent 规划
    • 推理(Reasoning):分析用户意图,规划工具调用顺序
    • 行动(Acting):执行工具调用,收集结果
    • 观察(Observation):根据结果决定下一步行动
    • 多轮对话:自动澄清模糊意图("您想查询哪个订单?")
  • API 集成层
    • 统一 API 网关:认证、限流、日志
    • 重试机制:指数退避、熔断器
    • 数据缓存:高频查询(订单状态)缓存 5 分钟
  • 安全与审计
    • 用户认证:JWT Token 验证
    • 权限控制:用户只能访问自己的订单
    • 操作审计:记录所有工具调用(谁、何时、做了什么)

实施成果

  • 自动化率
    • 简单查询(订单状态、物流):92% 自动解决
    • 中等复杂(退款申请、地址修改):78% 自动解决
    • 复杂问题(投诉、纠纷):35% 自动解决,转人工
    • 总体自动化率:68%
  • 效率提升
    • 平均响应时间:从 3 分钟(人工)降至 8 秒(自动)
    • 并发处理:单系统支持 10000+ 并发对话
    • 24/7 服务:全天候无间断
  • 成本优化
    • 人工客服需求:减少 65%
    • 年节省人力成本:1.2 亿元
    • 客户满意度:从 78% 提升至 89%
  • 商业价值:年节省 1.2 亿 + 满意度提升 + 转化率 +15%

16.2 案例二:数据分析 Agent 平台

背景与挑战

  • 背景:某金融公司,业务人员需频繁进行数据分析,但缺乏 SQL/Python 技能
  • 挑战
    • 自然语言转 SQL:业务问题→SQL 查询→数据可视化
    • 代码执行安全:防止恶意代码、资源滥用
    • 多步骤分析:数据清洗→聚合→可视化→洞察生成
    • 错误恢复:SQL 语法错误、数据异常、超时处理
    • 结果解释:不仅返回数据,还要生成业务洞察

代码解释器方案

  • 代码解释器架构
    • 沙箱环境:Docker 容器隔离,资源限制(CPU 2 核、内存 4GB、超时 60s)
    • 多语言支持:Python(pandas、matplotlib)、SQL
    • 预装库:数据分析常用库(numpy、pandas、scikit-learn、seaborn)
  • 工具定义
    • execute_sql:执行 SQL 查询,返回 DataFrame
    • run_python_code:执行 Python 代码,支持文件 IO
    • generate_chart:生成可视化图表
    • explain_insights:生成业务洞察报告
  • ReAct 规划
    • Thought:分析用户需求,规划分析步骤
    • Action:执行 SQL 查询获取数据
    • Observation:检查数据质量、维度
    • Action:执行 Python 代码进行清洗、聚合
    • Action:生成可视化图表
    • Final Answer:生成完整分析报告
  • 错误处理
    • SQL 错误:自动修复语法、建议修正
    • 数据异常:检测空值、异常值、自动处理
    • 超时处理:60s 超时,返回部分结果
    • 安全限制:禁止网络访问、文件系统限制

实施成果

  • 分析效率
    • 简单查询(单表聚合):95% 自动完成,平均 12 秒
    • 中等分析(多表 JOIN+ 可视化):82% 自动完成,平均 45 秒
    • 复杂分析(机器学习预测):65% 自动完成,平均 2 分钟
  • 业务价值
    • 数据分析师工作量:减少 70%
    • 业务人员自助分析:从 5% 提升至 68%
    • 决策速度:从周级缩短到分钟级
  • 安全与稳定
    • 0 安全事件:沙箱隔离有效
    • 系统可用性:99.9%
    • 错误恢复率:87% 自动修复
  • 商业价值:年节省分析师成本 5000 万 + 决策效率提升 10 倍+

16.3 最佳实践总结

工具调用系统部署最佳实践

  • Schema 设计
    • 清晰命名:动词 + 名词(get_weather、calculate_tax)
    • 详细描述:包括用途、参数说明、示例
    • 参数约束:类型、必填、枚举、默认值
    • 版本管理:工具 Schema 版本化,向后兼容
  • 安全执行
    • 沙箱隔离:Docker/容器隔离代码执行
    • 资源限制:CPU、内存、超时、网络
    • 权限控制:最小权限原则、用户级隔离
    • 审计日志:记录所有工具调用
  • 错误处理
    • 参数验证:前置验证,提前报错
    • 重试机制:指数退避、熔断器
    • 降级策略:API 失败时返回缓存/默认值
    • 用户友好:错误信息转化为自然语言
  • 性能优化
    • 缓存策略:高频查询结果缓存
    • 并行执行:独立工具调用并行化
    • 流式响应:长任务流式返回中间结果
    • 批量处理:合并相似请求
  • 监控与运维
    • 指标监控:调用量、成功率、延迟、错误率
    • 告警机制:异常检测、自动告警
    • A/B 测试:工具版本对比、效果评估
    • 持续优化:基于使用数据优化工具设计
"从客服自动化到数据分析,从 Function Calling 到代码解释器,从单一工具到多 Agent 协作,能力扩展体系正在重塑 AI 系统的智能范式。未来的 AI 将更具行动力、更善协作、更接近人类的执行能力。这不仅是技术的进步,更是智能本质的进化。"
—— 本章结语

16.4 本章小结

本章分析了生产案例。关键要点:

  • 案例一:智能客服,自动化率 68%、响应 8 秒、年省 1.2 亿
  • 案例二:数据分析 Agent,自助分析 68%、决策 10 倍 +、年省 5000 万
  • 最佳实践:Schema 设计、安全执行、错误处理、性能优化、监控运维

参考文献与资源(2024-2026)

Function Calling 理论

  1. OpenAI (2026). "Function Calling API Documentation." openai.com
  2. Anthropic (2026). "Tool Use with Claude." anthropic.com

Agent 框架

  1. LangChain (2026). "LangChain Tools & Agents." langchain.com
  2. LlamaIndex (2026). "LlamaIndex Agents." llamaindex.ai

代码解释器

  1. Jupyter (2026). "Jupyter Kernel Gateway." jupyter.org
  2. E2B (2026). "Secure Code Execution Sandbox." e2b.dev