function-call怎么训练的,预料如何构建
第一部分:预料(数据集)的构建
首先,我会强调高质量的数据集是成功训练一个优秀的函数调用模型的基石。数据集的构建主要包含以下几个关键点:
-
数据格式与结构:
-
对话格式: 通常采用对话形式,包含多个轮次,并明确定义不同角色的发言,如 system, user, 和 assistant。
-
函数定义 (Tools): 在对话开始或需要时,通过 system prompt 或特定的 tools 字段,向模型提供一份可供调用的函数列表。这份列表通常使用 JSON Schema 的格式来定义,清晰地描述每个函数的名称、功能、参数(包括类型、是否必需等)。
-
预期的函数调用: 当 assistant 需要调用函数时,其回复需要是一个特定格式的、结构化的输出(如JSON),包含要调用的函数名和具体的参数值。
-
-
数据集的多样性和覆盖面:
为了让模型具备强大的泛化能力,预料需要覆盖各种复杂场景:-
简单调用: 单轮对话中,用户意图明确,对应单个函数调用。
-
多函数选择: 模型需要在一系列可选的工具中,根据用户意图选择最合适的一个。[1][5] 例如,用户问“帮我订一张去巴黎的机票或酒店”,模型需要能决策是调用机票预订还是酒店预订的函数。
-
多轮对话依赖: 函数的调用依赖于前面几轮对话的上下文信息。
-
并行函数调用: 在某些场景下,需要同时调用多个函数。例如,“帮我预订去东京的机票,并订一个在新宿的酒店”。
-
处理信息不全的情况: 当用户提供的信息不足以调用函数时,模型需要能主动反问用户,以获取缺失的参数。
-
无需调用 (No-Call) 的场景: 数据集中还必须包含大量用户意图不需要调用任何函数,模型仅需利用自身知识就能回答的例子。这可以防止模型在任何情况下都强行调用函数。
-
-
数据的来源:
-
人工标注: 精准度高,但成本昂贵且耗时。
-
利用现有数据集: 可以使用一些公开的函数调用数据集,如 glaiveai/glaive-function-calling-v2 等,作为基础或进行二次开发。
-
合成数据 (Synthetic Data): 使用更强大的 LLM(如 GPT-4)来自动生成高质量的训练数据是一种高效且流行的方法。我们可以给出函数定义和一些种子案例 (seed examples),让大模型生成更多样化的用户查询和对应的函数调用。
-
第二部分:模型的训练过程
构建好预料后,下一步就是模型的训练。这个过程主要是对一个预训练好的大语言模型(Base Model)进行微调(Fine-Tuning)。
-
选择基础模型:
-
首先需要选择一个合适的基础模型。选择时会考虑模型的规模、性能、上下文长度以及对目标任务的适应性。有时会参考一些行业内的评测榜单,比如 Berkeley Function Call Leaderboard。
-
-
微调技术:
-
全量微调 (Full Fine-Tuning): 调整模型的所有参数。效果可能最好,但计算资源消耗巨大。
-
参数高效微调 (PEFT): 这是目前更主流的方法,特别是对于非常大的模型。
-
LoRA (Low-Rank Adaptation): 这是一种非常流行的技术。它通过在模型原有的大权重矩阵旁边,增加两个较小的、“低秩”的矩阵(适配器),在训练时只更新这两个小矩阵的参数。这样做的好处是:
-
高效: 显著减少需要训练的参数数量,大大降低了显存需求和训练时间。
-
便捷: 训练产物(适配器权重)非常小,易于存储和部署。
-
-
-
-
训练目标:
-
模型训练的核心目标是让模型学会在看到用户的输入和可用的函数定义后,能够生成一个符合预设格式的、正确的函数调用请求。
-
训练过程中,模型会学习从对话历史中理解用户的意图,并将其映射到正确的函数和参数上。
-
模型本身只负责生成文本(即函数调用的JSON),真正的函数执行是由外部应用代码来完成的。
-
第三部分:面试中的关键考量与补充
在回答完主要流程后,可以补充一些关键点来展示您更深层次的思考:
-
数据平衡的重要性: 要确保数据集中不同函数的调用是相对平衡的,避免模型偏向于频繁调用某个特定函数。
-
评估 (Evaluation): 在构建训练集的同时,也应构建一个独立的评估集,用来客观地衡量模型的性能。评估指标可以包括:函数选择的正确率、参数抽取的准确率以及对于“无需调用”场景的判断能力。
-
模型与代码的解耦: 强调 LLM 的角色是“决策者”——决定调用哪个函数和传递什么参数。而函数的具体实现和执行逻辑则在应用程序代码中,这是一个清晰的责任划分。
-
挑战与难点: 可以提及在实际操作中可能遇到的挑战,例如如何处理结构非常复杂的函数、如何保证生成参数的准确性、以及如何有效处理用户的模糊或不完整指令等。这会显得你不仅懂理论,还有实践思考。