先这样答
多轮对话的训练数据要表示成带角色的消息序列,并把工具调用、工具返回和状态变化都放进序列。每条消息都标明角色。角色包括 system、user、assistant 和 tool。最终答案也作为 assistant 消息放在序列中。
工具调用和工具返回要拆成独立消息。模型先输出 assistant 的工具调用消息,再接入 tool 的返回消息。工具返回不参与损失计算,但要保留在上下文里。这样模型训练时能看到工具结果,并根据结果继续生成回答。
记忆更新和任务进度等状态变化也要进入消息序列。模型需要从前面的消息中跟踪状态,再处理后续问题。训练多轮数据时,只对 assistant 轮计算损失,system、user 和 tool 消息不计算损失。还要专门构造包含指代和省略的难例,检查模型能否结合前文理解当前表达。
面试官会怎么追问
-
「为什么工具返回要放进上下文,却不参与损失计算?」 工具返回是模型后续回答需要参考的信息,所以必须放进上下文。训练目标只计算 assistant 轮,工具返回本身不作为模型要生成的内容。
-
「工具调用在数据里应该怎么放?」 工具调用要作为独立消息插入消息序列,并标明对应角色。工具返回也要作为独立消息插入,之后模型再根据返回结果生成 assistant 消息。
-
「多轮对话里的状态变化怎么训练?」 记忆更新和任务进度要写进消息序列。这样模型能看到状态如何变化,并学习跟踪状态。指代和省略还要专门构造难例。
回答的坑
-
只保留用户问题和最终答案,会丢掉工具结果与状态变化,模型无法学习完整的多轮过程。
-
把 tool 返回也算进损失,会把上下文信息和模型需要生成的 assistant 内容混在一起。
同系列的题