Agent工具调用能力训练:Function Calling微调与工具选择2026教程
工具调用(Function Calling)是Agent智能体的核心技能,它让大语言模型能够突破纯文本生成的局限,通过调用外部工具(REST API、数据库、搜索引擎等)来完成真实世界任务。2026年,随着OpenAI Agents SDK和各类工具调用框架的成熟,Agent工具调用能力的训练已形成从SFT监督微调到RLVR强化学习的完整技术路径。本教程将深入讲解工具定义、训练数据构建、评估指标和部署集成的全流程。
一、工具调用概述
Function Calling让Agent从"会说"变为"会做"。当用户请求"查询我的订单状态"时,Agent不是凭空生成回答,而是调用 get_order(id) 工具获取真实数据后再组织回答。工具调用涉及三个核心环节:工具选择(从多个工具中选出正确的)、参数填充(从用户输入中提取参数)、调用执行(实际运行工具并获取结果)。训练的目标就是让模型在这三个环节上达到高准确率。
二、工具定义方法
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)
三、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评估集,覆盖单工具调用、多工具调用、工具组合调用等场景。
六、训练数据构建
高质量的训练数据是工具调用训练的基础。每条数据需包含:工具描述(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训练后工具选择准确率不够高怎么办?
SFT阶段准确率通常在75%-85%,若不达标可从三方面优化:增加训练数据中的负样本比例(错误调用对比),确保工具描述docstring清晰明确,适当增加训练轮数(3-5轮)。若仍不足,应进入RLVR阶段使用可验证奖励进一步优化,通常可提升5-10个百分点。
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版 | 技术持续更新中


