Agent工具调用能力训练:Function Calling微调与工具选择2026教程

Agent工具调用能力训练:Function Calling微调与工具选择2026教程

工具调用(Function Calling)是Agent智能体的核心技能,它让大语言模型能够突破纯文本生成的局限,通过调用外部工具(REST API、数据库、搜索引擎等)来完成真实世界任务。2026年,随着OpenAI Agents SDK和各类工具调用框架的成熟,Agent工具调用能力的训练已形成从SFT监督微调到RLVR强化学习的完整技术路径。本教程将深入讲解工具定义、训练数据构建、评估指标和部署集成的全流程。

一、工具调用概述

Function Calling让Agent从"会说"变为"会做"。当用户请求"查询我的订单状态"时,Agent不是凭空生成回答,而是调用 get_order(id) 工具获取真实数据后再组织回答。工具调用涉及三个核心环节:工具选择(从多个工具中选出正确的)、参数填充(从用户输入中提取参数)、调用执行(实际运行工具并获取结果)。训练的目标就是让模型在这三个环节上达到高准确率。

@function_tool
装饰器定义工具
FileSearch
文档检索工具
SFT+RLVR
两阶段训练
92%+
工具选择准确率

二、工具定义方法

OpenAI Agents SDK提供了简洁的工具定义方式。使用 @function_tool 装饰器可以将任意Python函数自动转换为Agent可调用的工具,函数签名和docstring会被自动解析为工具的JSON Schema描述。同时SDK也提供内置的 FileSearchTool 用于文档语义检索。

from agents import Agent, Runner, function_tool, FileSearchTool

# 方式1:使用装饰器定义REST API工具
@function_tool
def get_order(order_id: str) -> str:
    """根据订单ID查询订单状态和物流信息。
    
    Args:
        order_id: 订单编号,格式如 ORD-2026-001
    """
    response = requests.get(f"https://api.shop.com/orders/{order_id}")
    return response.json()

@function_tool
def search_products(query: str, max_results: int = 5) -> list:
    """搜索商品并返回匹配结果列表。
    
    Args:
        query: 搜索关键词
        max_results: 最大返回数量,默认5条
    """
    return product_db.search(query, limit=max_results)

# 方式2:使用内置FileSearchTool进行文档检索
file_tool = FileSearchTool(
    vector_store_id="vs_abc123",
    max_num_results=5,
    include_search_results=True
)

# 创建Agent并注册工具
agent = Agent(
    name="客服助手",
    model="gpt-4o-2026",
    instructions="你是一个电商客服Agent,可以查询订单和搜索商品。",
    tools=[get_order, search_products, file_tool]
)

result = Runner.run_sync(agent, "帮我查一下订单ORD-2026-001的状态")
print(result.final_output)

工具类型适用场景定义方式参数来源
FileSearchTool文档知识检索vector_store_id配置自动语义搜索
@function_toolREST API调用装饰器+函数签名LLM从对话提取
数据库查询工具结构化数据查询自定义SQL封装LLM生成查询条件
ComputerUseTool浏览器/桌面操作SDK内置工具屏幕截图分析

三、SFT格式训练

SFT(Supervised Fine-Tuning)阶段的核心目标是让模型学会工具调用的正确格式。训练数据由"用户输入-工具调用-工具返回-最终回答"四元组构成,模型通过模仿学习掌握何时发起调用、如何组织JSON参数、如何利用返回结果。使用LoRA微调可以大幅降低训练成本,典型配置为 rank=16, alpha=32, learning_rate=2e-5。

# SFT训练数据格式示例(JSONL)
{"messages": [
  {"role": "user", "content": "查一下ORD-2026-001到哪了"},
  {"role": "assistant", "content": null,
   "tool_calls": [{"id": "call_001", "type": "function",
     "function": {"name": "get_order",
       "arguments": "{\"order_id\": \"ORD-2026-001\"}"}}]},
  {"role": "tool", "tool_call_id": "call_001",
   "content": "{\"status\": \"已发货\", \"location\": \"北京转运中心\"}"},
  {"role": "assistant", "content": "您的订单ORD-2026-001已发货,目前到达北京转运中心,预计明天送达。"}
]}

# LoRA训练配置
training_args = {
    "lora_rank": 16,
    "lora_alpha": 32,
    "lora_dropout": 0.05,
    "learning_rate": 2e-5,
    "num_train_epochs": 3,
    "per_device_train_batch_size": 8,
    "gradient_accumulation_steps": 4,
    "warmup_ratio": 0.1
}

四、RLVR选择优化

RLVR(Reinforcement Learning with Verifiable Rewards)是SFT之后的关键优化阶段。与传统RLHF不同,RLVR使用可验证的奖励信号:工具调用是否选中了正确工具、参数是否完全匹配、调用是否成功执行,这些都可以通过程序自动验证,无需人工标注偏好数据。典型配置使用GRPO算法,kl_coeff=0.05,temperature=0.7。

def compute_tool_reward(prediction, ground_truth):
    """RLVR可验证奖励函数"""
    reward = 0.0
    # 奖励1:工具选择正确 (+0.5)
    if prediction["tool_name"] == ground_truth["tool_name"]:
        reward += 0.5
    # 奖励2:参数完全匹配 (+0.3)
    if prediction["arguments"] == ground_truth["arguments"]:
        reward += 0.3
    # 奖励3:调用成功执行 (+0.2)
    if execute_tool(prediction) is not None:
        reward += 0.2
    # 惩罚:调用了不存在的工具 (-0.5)
    if prediction["tool_name"] not in TOOL_REGISTRY:
        reward -= 0.5
    return reward

# GRPO训练配置
rlvr_config = {
    "algorithm": "GRPO",
    "kl_coeff": 0.05,
    "temperature": 0.7,
    "num_rollouts": 8,
    "max_tool_calls_per_episode": 5,
    "reward_shaping": "linear"
}

五、评估指标

工具调用评估需要多维度指标体系。工具选择准确率衡量模型是否选中正确工具;参数填充正确率衡量JSON参数是否与标注一致;调用成功率衡量端到端执行是否无报错。此外还有端到端任务完成率,这是最终的业务指标。建议构建包含500+测试用例的held-out评估集,覆盖单工具调用、多工具调用、工具组合调用等场景。

评估指标计算方式目标值测试集规模
工具选择准确率正确工具/总调用次数≥92%500用例
参数填充正确率参数完全匹配/总数≥88%500用例
调用成功率无报错执行/总调用≥95%300用例
端到端完成率任务成功/总任务数≥85%200用例

六、训练数据构建

高质量的训练数据是工具调用训练的基础。每条数据需包含:工具描述(name、description、parameters schema)、正确调用示例(用户意图到工具调用的映射)、错误调用对比(常见错误模式及纠正)。建议使用GPT-4o生成初版数据,再由人工审核修正,最终数据量建议SFT阶段5000-10000条,RLVR阶段2000-5000条。

# 工具描述Schema定义
tool_schema = {
    "name": "get_order",
    "description": "根据订单ID查询订单状态和物流信息",
    "parameters": {
        "type": "object",
        "properties": {
            "order_id": {
                "type": "string",
                "description": "订单编号,格式如ORD-2026-001"
            }
        },
        "required": ["order_id"]
    }
}

# 错误调用对比数据(用于负样本训练)
error_cases = [
    # 错误:参数格式不对
    {"input": "查订单001", "wrong_call": {"order_id": "001"},
     "correct_call": {"order_id": "ORD-2026-001"},
     "explanation": "订单ID需包含完整前缀ORD-2026-"},
    # 错误:选错工具
    {"input": "搜一下红色手机壳", "wrong_tool": "get_order",
     "correct_tool": "search_products",
     "explanation": "搜索商品应使用search_products而非get_order"}
]

七、部署集成

训练完成后,模型部署需要考虑工具注册管理、调用超时控制、错误重试机制和调用日志审计。建议使用工具注册表模式统一管理所有可用工具,部署时设置单次调用超时为10秒、最大重试次数为2次、单轮对话最大工具调用次数为5次,防止无限循环调用。

# 部署配置
deployment_config = {
    "max_tool_calls_per_turn": 5,
    "tool_call_timeout": 10,       # 秒
    "max_retries": 2,
    "retry_backoff": "exponential", # 指数退避
    "log_tool_calls": True,
    "rate_limit": "100/min"        # 每用户每分钟最多100次调用
}

# 工具注册表
TOOL_REGISTRY = {
    "get_order": {"handler": get_order, "auth_required": True},
    "search_products": {"handler": search_products, "auth_required": False},
    "file_search": {"handler": file_tool, "auth_required": True}
}

八、常见问题FAQ

Q1:SFT训练后工具选择准确率不够高怎么办?

Agent工具调用能力训练:Function Calling微调与工具选择2026教程

SFT阶段准确率通常在75%-85%,若不达标可从三方面优化:增加训练数据中的负样本比例(错误调用对比),确保工具描述docstring清晰明确,适当增加训练轮数(3-5轮)。若仍不足,应进入RLVR阶段使用可验证奖励进一步优化,通常可提升5-10个百分点。

Agent工具调用能力训练:Function Calling微调与工具选择2026教程

Q2:@function_tool和FileSearchTool应该怎么选?

选择依据是数据来源:如果需要调用REST API获取实时数据(订单、库存、天气),使用@function_tool封装API函数;如果需要检索本地文档知识库(产品手册、FAQ),使用FileSearchTool配合向量存储。两者可以共存于同一个Agent中,模型会根据用户意图自动选择。

Q3:RLVR和RLHF在工具调用训练中有什么区别?

RLHF需要人工标注偏好数据对(哪个回答更好),成本高且主观性强;RLVR使用程序化验证(工具是否选对、参数是否匹配、调用是否成功)作为奖励信号,完全自动化且客观准确。对于工具调用这类有明确正确答案的任务,RLVR明显优于RLHF。

Q4:工具数量很多时模型容易选错怎么办?

当工具超过15个时建议使用工具路由(Tool Routing):先用一个轻量模型对用户意图分类,缩小工具候选范围到3-5个,再交给主模型选择。同时在训练数据中增加多工具场景的负样本,让模型学会区分相似工具的细微差别。

Q5:训练数据需要多少条才够?

SFT阶段建议5000-10000条,覆盖所有工具的单工具调用和多工具组合调用场景,正负样本比例约7:3。RLVR阶段建议2000-5000条可验证任务。每个工具至少需要200条正样本才能保证模型充分学习其使用模式。

Agent工具调用能力训练教程 | 2026版 | 技术持续更新中