ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

《AI Agent原理与实战》2026版 第30课 Function Calling 微调(SFT)

《AI Agent原理与实战》2026版 第30课 Function Calling 微调(SFT)

本文收录于专栏《AI Agent原理与实战》2026版—— 专栏系统覆盖 AI Agent 的记忆、工具、插件与实战,点击订阅可跟踪后续更新。

本课定位:进入研究向纵深:当 prompt 优化到头,模型本身能不能更强?本课讲工具调用微调——数据构造三路径、LoRA 全链路(国产基座 Qwen/GLM)、"何时微调 vs 不微调"决策表。动手派可略读,自建模型团队必修。

阶段 6|训练与评估 | 来源:课程自研补充

关键字:Function Calling微调、SFT监督微调、LoRA、训练数据构造、开源基座、工具调用训练、模型微调、Qwen GLM

本节目录

  • 30.1 为什么工具调用需要专门训练
  • 30.2 训练数据构造:三条来源路径
  • 30.3 微调流程:LoRA 全链路(Windows 优先)
  • 30.4 何时微调 vs 不微调:决策表

概念讲解

30.1 为什么工具调用需要专门训练

第 7 课讲过工具调用的 API 层机制:把工具的 JSON Schema 告诉模型,模型输出结构化调用请求。这条链路对前沿大模型是"开箱可用"的,但对两个群体始终是短板:

  1. 小模型(7B 级开源基座):没见过足够多工具调用格式的训练数据,输出 JSON 合法率、参数类型遵从率、多轮编排能力都明显掉队。
  2. 前沿模型的多轮场景:多步工具编排(先查 A,用 A 的结果再调 B,中途发现无关请求要克制不调用)至今远未解决。截至检索日(2026-10),Berkeley Function-Calling Leaderboard(BFCL)v3 的多轮多步类目,榜首 Kimi K2 Thinking 约 50.6%、GPT-5.2 约 43.8%(basedagi 汇总 2026-05-15 快照,非官方渠道,【待核实:以 gorilla.cs.berkeley.edu 官方榜为准】)——一半的多轮工具任务做不对,这就是微调仍有的空间。

SFT(Supervised Fine-Tuning,监督微调)的定位:把"调用格式 + 决策习惯"烧进模型参数,让 7B 小模型在特定工具集上逼近大模型的表现。

30.2 训练数据构造:三条来源路径

路径成本质量代表工作
人工标注极高(一条多轮对话 30-60 分钟)最高只适合做种子集与评测集
强模型蒸馏中中(继承幻觉,需过滤)用 DeepSeek/GLM 等 API 模型批量生成再人工抽检
自动合成管线低中高(取决于验证闸门)APIGen(Salesforce)、ToolACE(华为诺亚)、Hammer

合成管线是公开生态的主流,三个标杆(两个国产):

  • APIGen(arXiv:2406.18518,Salesforce):从 3,673 个真实 API 端点出发,管线三道闸门——查询生成、真实沙箱执行调用验证、答案核对——产出 6 万条可验证样本,即 xLAM 数据集(HuggingFace:Salesforce/xlam-function-calling-60k)。
  • ToolACE(arXiv:2409.00920,华为诺亚方舟实验室等,ICLR 2025):自进化合成出 26,507 个 API 池(真实 + 合成),对话由多 agent 交互生成,双层验证(规则检查 + 模型检查)把关,覆盖单调用、并行调用、依赖调用、不该调用四类情形。ToolACE-8B 在 BFCL 上达到与 GPT-4 系列相当的水平,工具相关性判别 89.17%。
  • Hammer(arXiv:2410.04587,国产端侧函数调用模型系列,【待核实:出品团队归属,一般资料称美团系,引用前请核对论文作者单位】):主攻"鲁棒性"——发现现有模型容易被工具命名误导(换个函数名就乱调),用增强数据集提升对无关函数的敏感度 + **函数遮蔽(function masking)**技术训练,小模型在跨 benchmark 泛化上拿到 SOTA。对端侧 agent(第 27 课场景)有直接参考价值。

数据格式的核心是 chat template + loss masking:工具 Schema 放在 system/工具区,assistant 的 tool_call 段是学习目标,只有 assistant 生成段计算 loss,prompt 侧(含工具定义)不算——否则模型会浪费容量去背工具文档。

数据配比经验:纯工具数据会把模型训成"见问题就想调工具"。ToolACE 论文实测,混入通用指令数据后模型通用基准几乎不降;工程上常用工具:通用 = 1:1 到 1:3,并保留 10-15% 的"不该调用"负样本(对应 BFCL 的 irrelevance 类目)。(配比区间是社区经验值,非某篇论文的精确结论)

30.3 微调流程:LoRA 全链路(Windows 优先)

LoRA(Low-Rank Adaptation)一句话:冻结基座权重,在旁路注入低秩矩阵 A×B 训练;ToolACE 在 LLaMA-3.1-8B 上作用于全部线性层,rank=16、alpha=32。

基座选谁——国内可下载、License 友好的 7B 级开放模型菜单:

基座出品特点LLaMA-Factory 模板
Qwen2.5-7B-Instruct阿里工具调用生态最成熟,xLAM/Hammer 多以它为基座qwen
GLM-4-9B-Chat智谱仓库zai-org/glm-4-9b-chat(128K,原生 function calling)。注意:2025-04 的 0414 版官方说明未做 agent 能力增强(主打翻译批量),工具调用微调建议用原版 chat(2026-10 检索官方 README)glm4(待核实:以 LLaMA-Factory 当前 template 列表为准)
MiMo-7B-SFT小米为推理而生(见第 31 课),SFT 检查点已开源无专用模板(【待核实:需自定义或等社区支持】)
Llama-3.1-8B-InstructMetaToolACE 原配基座,文献对照用llama3
选基座 → 数据转换(xLAM→sharegpt) → LoRA训练(单卡24GB, Windows可) → 合并权重 → 评测(BFCL 或自建集, before/after)

硬件现实:7-8B 模型 LoRA + bf16 + flash-attention,单张 24GB 消费级 GPU 可训(batch 1-2 + 梯度累积);全参数微调 8B 则需要 4×A100 80GB 级别。

Windows 环境说明(LLaMA-Factory 官方支持 Windows,本课未实测,命令为 2026-10 检索的官方文档口径):

# Windows 10/11 + Miniconda + 单张 24GB NVIDIA 卡conda create-n llamafactory python=3.10-y conda activate llamafactory git clone--depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install-e".[torch,metrics]"pip install bitsandbytes--upgrade# Windows 轮子已官方支持llamafactory-cliwebui# 浏览器图形界面, 免命令行

Linux/macOS 流程相同(Linux 去掉 bitsandbytes 特殊处理,macOS 无 CUDA 只适合 0.5B-1.5B 教学)。

30.4 何时微调 vs 不微调:决策表

先穷尽便宜手段——按第 8 课 ACI 规范重写工具描述,收益经常大于微调;再加 few-shot 示例;再考虑换更强的 API 模型(DeepSeek/GLM/MiniMax 的 API 都原生支持 function calling,月费远低于一次训练)。都走不通,再看触发器:

微调触发器说明
本地/边缘部署延迟、成本、数据不出域(参见第 27 课)
私有 API 格式特殊内部工具与公开生态差异大,大模型也没见过
格式稳定性JSON 合法率必须接近 100%,prompt 压不住
高频重复模式固定工具集 + 固定话术,可压缩进参数

不微调的信号:工具集频繁变更(每次换工具都要重训)、高质量数据积累不足 1000 条、没有评测集(没有 before/after 数字,微调收益无法证明)。隐性成本:基座每次升级要重训、评测集要持续维护、bad case 回归测试。

案例实战 A:数据转换 + LoRA 训练命令【未实测】

目标:把 xLAM 数据的一个子集转成 LLaMA-Factory 格式,对 Qwen2.5-7B-Instruct(或 GLM-4-9B)做工具调用 LoRA 微调。

步骤 1:数据转换(Windows/Linux 通用,纯标准库)

xLAM 每条含query / answers / tools。这里只取单工具、单轮样本做入门(多轮依赖调用建议直接用 ToolACE 开源数据,其已按调用模式分好类):

# conv_xlam2lf.py — xLAM -> LLaMA-Factory sharegpt 格式【未实测】importjson,random out=[]withopen("xlam_60k.jsonl",encoding="utf-8")asf:# HF datasets 导出的 jsonlforlineinf:d=json.loads(line)ifisinstance(d["tools"],str):d["tools"]=json.loads(d["tools"])iflen(d["tools"])!=1:# 入门: 只取单工具样本continuetool=d["tools"][0]out.append({"conversations":[{"from":"human","value":d["query"]},{"from":"function_call",# LLaMA-Factory 约定角色名"value":json.dumps({"name":tool["name"],"arguments":d["answers"][0]},ensure_ascii=False)},],"tools":json.dumps(d["tools"],ensure_ascii=False),})random.seed(42);random.shuffle(out)json.dump(out[:10000],open("fc_xlam.json","w",encoding="utf-8"),ensure_ascii=False,indent=1)print(f"写入 fc_xlam.json:{min(len(out),10000)}条")

在 LLaMA-Factory 的data/dataset_info.json注册:

"fc_xlam":{"file_name":"fc_xlam.json","formatting":"sharegpt","columns":{"messages":"conversations","tools":"tools"}}

步骤 2:LoRA 训练(命令行或 WebUI 等价配置)

# LLaMA-Factory >= 0.9【未实测】llamafactory-cli train\--model_name_or_pathQwen/Qwen2.5-7B-Instruct\--stagesft--do_train--templateqwen\--datasetfc_xlam--dataset_dirdata\--finetuning_typelora--lora_targetall\--lora_rank16--lora_alpha32--lora_dropout0.05\--per_device_train_batch_size1--gradient_accumulation_steps16\--learning_rate1.0e-4--num_train_epochs2--cutoff_len4096\--bf16--output_dirsaves/qwen25-7b-fc-lora\--logging_steps10--save_steps200

1 万条 × 2 epoch,24GB 卡预计 2-4 小时量级(视样本长度)。GLM-4-9B 只需换--model_name_or_path zai-org/glm-4-9b-chat --template glm4(模板**【待核实】**,GLM-4-9B-0414 不推荐,见上表注)。训练后llamafactory-cli export合并 LoRA 权重。

复现环境说明:本案例未在本课程环境实测(需 24GB GPU + 数小时训练)。命令为 LLaMA-Factory 与 xLAM 的公开接口;版本变更以两者官方文档为准。LoRA 微调不含 vLLM 依赖,Windows 原生可跑通;若后续要做 RL(第 31 课)再迁 WSL2。

案例实战 B:微调前先跑评测——一个"不该微调"的真实判定【已实测 2026-10】

决策表说"没有评测集就不要微调"。我们用第 32 课案例 B 的实测数据走一遍完整判定:

  • 对象:GLM-4.7-flash(Ollama 本地部署,19GB MoE),8 题工具调用评测 × 3 轮;
  • 实测结果:24/24 全 PASS,mean_reward=1.000(详见第 32 课);
  • 判定:基线已满分 → 按 §四决策表,微调无必要——任何微调收益上限为零,还会引入通用能力回退的风险。正确动作是把工程精力投到工具描述与多轮编排(第 8/7 课);
  • 反例预告:同一套评测脚本换多轮依赖调用题(先查 A 用结果再调 B)后,前沿模型 pass^1 也会落到 50-60% 区间(BFCL 多轮榜佐证)——那时微调才有发挥空间。

这套"评测先行 → 数据说话 → 再决定训练"的流程,就是第 30-32 课三课的内在主线:SFT(本课)解决"见过",RL(第 31 课)解决"试错",评测(第 32 课)决定"值不值"。

小结

  • 工具调用微调的收益集中在:小模型、私有工具、格式稳定性、边缘部署四个场景;其余情况 prompt 优化优先——GLM-4.7-flash 基线满分的实测就是"不微调"的活例子。
  • 数据是主战场:APIGen(真实 API 沙箱验证)、ToolACE(华为诺亚,自进化合成+双层闸门)、Hammer(函数遮蔽抗误导)三条管线各有侧重。
  • loss masking 只算 assistant 段;工具:通用数据 1:1~1:3 配比,保留 10-15% 不该调用负样本(经验值)。
  • LoRA r=16/α=32 作用于全部线性层是公开可复用的设定;7B 单卡 24GB 可训;LLaMA-Factory Windows 原生支持,基座菜单优先国产(Qwen/GLM-4/MiMo)。
  • 微调前先建评测集,用 before/after 证明收益(参见第 32 课)。

交叉引用:工具调用机制参见第 7 课《工具调用模式》;工具描述优先于微调参见第 8 课《工具设计与 ACI 工程规范》;本地化部署动机参见第 27 课《部署、扩展与本地化运行》;SFT 之后的进阶路线参见第 31 课《Agentic RL》;评测脚本与实测数据参见第 32 课《Agent 评估与未来展望》。

扩展阅读

🌐 网络提示:github.com 需代理(clone 可走 ghproxy 加速、push 优先 SSH);huggingface.co 走镜像:export HF_ENDPOINT=https://hf-mirror.com;学术站 arxiv.org 境内多可直连(慢),其余评测/规范站需代理;pip 安装建议加清华镜像-i https://pypi.tuna.tsinghua.edu.cn/simple。详见总纲附录《国内网络访问与国产适配指南》。

  • APIGen:自动函数调用数据管线(arXiv:2406.18518,https://arxiv.org/abs/2406.18518)
  • ToolACE:自进化合成 + 双层验证(arXiv:2409.00920,ICLR 2025,https://arxiv.org/abs/2409.00920)
  • Hammer:端侧鲁棒函数调用(arXiv:2410.04587,https://arxiv.org/abs/2410.04587)
  • xLAM 函数调用数据集(https://huggingface.co/datasets/Salesforce/xlam-function-calling-60k)
  • BFCL Berkeley Function-Calling Leaderboard(https://gorilla.cs.berkeley.edu/leaderboard.html)
  • LLaMA-Factory(https://github.com/hiyouga/LLaMA-Factory,README 含 Windows 安装节)

我的专栏

蛋白 / 抗体 / 多肽 / 核酸分子模拟 / 动力学 / 对接药物 / 设计 / 案例AI / Agent / 大模型
开源蛋白结构预测分子模拟基础小分子药物设计案例AI Agent系列
开源蛋白生成方法实践分子动力学模拟-Amber蛋白药物设计案例化学大模型
开源多肽设计模型分子动力学模拟-Gromacs多肽药物设计案例《AI Agent原理与实战》
开源多肽性质预测分子动力学模拟-OpenMM开源小分子生成设计CADD中的机器学习模型
DNA/RNA药物设计結合自由能高效计算配置《MCP 入门实战》
siRNA药物设计模型UCSF DOCK系列我胡师兄说药《AI入门实战2026》
ASO药物设计模型rDock系列 LeDock系列 gnina系列《经典机器学习实战》
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进