
面试题:大模型的FunctionCalling如何训练得到?
主要来说,Function Calling 的训练主要涉及数据构造、模型架构适配、多阶段微调等关键环节。
主要开源方案可以参考Llama3.1或者Qwen-Agent,基本上在Llama3的技术报告( https://arxiv.org/pdf/2407.21783) 中就可以知道FunctionCalling的实现路径。
以下是Llama3的技术报告里面如何用二阶段训练来提升Function Calling的准确性。
一、数据预处理
Llama3设计了一套多阶段数据筛选策略,通过质量评估与内容优化提升训练数据价值:
1. 主题分级体系
- 构建基于Llama 3 8B的层级分类系统,首先将数据划分为"数学推理"等宏观类别;
- 在顶层分类下建立细粒度子类别(如"几何与三角学"),形成树状知识结构。
2. 多维质量评估
- 混合评估模型:结合奖励模型(RM)与Llama质量判别器
通用文本:准确性、指令合规性、表达规范(三级评分)
编程数据:错误识别度、需求匹配度(二级评分)
- RM筛选:保留评分前25%的高质量样本
- 智能质量检测:通过Llama 3进行多维度评估
- 采用联合筛选机制,保留至少一个评估体系认证的高质量样本
3. 难度量化建模
- 复杂性双因素评估:
意图密度分析(Instag):通过Llama 3 70B标记对话意图数量
难度分级系统:基于三阶难度评分框架(简易/中等/复杂)
- 生成综合难度指标:意图数量 × 人工难度分级
4. 语义优化处理
- 特征聚类:采用RoBERTa构建对话语义向量空间
- 分级去重策略:
按质量×难度综合得分降序排列
动态相似度阈值过滤(余弦相似度<0.85)
贪婪选择算法保留最具代表性的样本
该方案通过质量-难度联合建模与语义空间优化,在保证数据多样性的前提下,显著提升训练数据的有效信息密度。
实证研究表明,该方法可使模型在复杂推理任务上的准确率提升17%,同时减少28%的训练收敛时间。
二、训练流程
构建数据集
主要是将函数名、参数类型、功能说明等以结构化文本输入模型(如JSON格式)。
[
{"role": "user", "content": "查询北京明天天气"},
{"role": "assistant", "tool_calls": [{"name": "get_weather", "arguments": {"location": "北京"}}]},
{"role": "tool", "name": "get_weather", "content": "{\"temperature\": 22}"},
{"role": "assistant", "content": "北京明天气温22℃"}
]
其中,tool这一层就是给大模型当做参数判断逻辑输入,模拟调度获取天气接口
后返回最终结果。
二阶段训练
- 预训练阶段:模型在通用语料库上进行基础语言建模训练,未涉及工具调用能力;
- 后训练微调(Post-Training):
合成数据生成:通过预训练模型生成包含函数调用的对话数据,例如模拟用户提问和对应的工具调用参数;
人工标注迭代:标注员逐步标注复杂场景,例如从单轮工具调用过渡到多轮交互,并加入异常参数处理样本(如无效参数、多工具选择等)。
三、训练方法
- 监督微调(SFT)
- 使用标注数据对模型进行指令微调,强化其对工具调用的格式理解和参数生成能力。(示例:模型输入包含工具定义的Prompt,输出需严格匹配函数名及参数格式。)
- 强化学习(RLHF/DPO)
- 对工具调用的准确性和结果整合能力进行偏好排序,例如标注员对模型的工具调用决策打分,优化模型生成质量。
- 多任务学习
同时训练模型完成常规对话和工具调用任务,避免单一任务过拟合。 在报告中,Llama发现 PPO 没有 DPO 好,所以只用了 DPO,在preference data 中,有5.89%是和reasoning以及tool相关的。
本文转载自沐白AI笔记,作者:杨沐白
