Nova 2.0 上的 RFT
RFT 训练数据遵循 OpenAI 对话格式。每个训练样本都是一个 JSON 对象,包含消息、参考答案及可选的工具定义。本节提供相关的指导说明,帮助您了解如何为 Nova 2.0 上的 RFT 准备有效训练数据。
数据格式与结构
每个训练样本都是一个 JSON 对象,其中包含:
-
messages:使用系统、用户和可选的助手角色进行的对话轮次数组
-
reference_answer:用于奖励计算的预期输出或评测标准
-
tools(选填):可供模型使用的函数定义数组
-
id(选填):用于跟踪和去重的唯一标识符
每个样本需单独占一行,JSONL 文件中每行对应一个 JSON 对象。
以下示例是一个化学问题,其参考答案包含真实值:
{ "id": "chem-001", "messages": [ { "role": "system", "content": "You are a helpful chemistry assistant" }, { "role": "user", "content": "Predict hydrogen bond donors and acceptors for this SMILES: CCN(CC)CCC(=O)c1sc(N)nc1C" } ], "reference_answer": { "donor_bond_counts": 2, "acceptor_bond_counts": 4, "explanation": "Calculated using Lipinski's rule of five: N-H groups (2 donors), N and O atoms with lone pairs (4 acceptors)" } }
注意
reference_answer 包含使用领域特定规则计算得出的真实值。奖励函数会将模型的预测值与这些参考值进行比较,以计算奖励分数。
以下示例是一个包含求解步骤的数学问题:
{ "id": "math-001", "messages": [ { "role": "system", "content": "You are a math tutor" }, { "role": "user", "content": "Solve: 2x + 5 = 13" } ], "reference_answer": { "solution": "x = 4", "steps": ["2x = 13 - 5", "2x = 8", "x = 4"] } }
以下示例显示了工具使用及预期行为:
{ "id": "tool-001", "messages": [ { "role": "system", "content": "You are a helpful game master assistant" }, { "role": "user", "content": "Generate a strength stat for a warrior character. Apply a +2 racial bonus modifier." } ], "tools": [ { "type": "function", "function": { "name": "StatRollAPI", "description": "Generates character stats by rolling 4d6, dropping the lowest die result, and applying a modifier.", "parameters": { "type": "object", "properties": { "modifier": { "description": "An integer representing the modifier to apply to the total of the stat roll.", "type": "integer" } }, "required": ["modifier"] } } } ], "reference_answer": { "tool_called": "StatRollAPI", "tool_parameters": { "modifier": 2 }, "expected_behavior": "Call StatRollAPI with modifier=2 and return the calculated stat value" } }
字段描述
字段 |
说明 |
附加说明 |
必需 |
|---|---|---|---|
id |
此 RFT 样本的唯一标识符 |
字符串(例如 sample-001):用于追踪与去重。 |
否 |
消息 |
定义提示和上下文的聊天消息有序列表 |
对象数组:模型按顺序查看列表。通常而言,列表以系统消息开头,然后是用户。 |
是 |
messages[].role |
消息发送方 |
常用值:system、user(其他上下文中也可能出现 assistant) |
否 |
messages[].content |
消息文本内容 |
纯字符串:对系统而言,此为指令;对用户而言,此为任务或输入。 |
否 |
工具 |
在本示例中模型可用的工具规范 |
数组:每个项目均定义了工具的界面与元数据。类型可能包括 function 或 internal。 |
否 |
reference_answer |
本示例的预期模型输出 |
字符串或对象(取决于任务):作为评测或培训所用的目标。 |
否 |
注意
任何其他自定义字段(例如 task_id、difficulty_level、context_data)均未经过验证,将作为元数据传递给奖励函数。
超参数指导
根据训练方法,建议采用如下超参数:
常规:
-
epoch:1
-
学习率(lr):1e – 7
-
生成次数:8
-
最大新词元数:8192
-
批处理大小:256
LoRA(低秩适应):
-
LoRA 秩:32
注意
请根据数据集规模和验证性能调整这些值。监控训练指标以防止过拟合。
其它属性
将 additionalProperties 设置为 true 后,即可在核心架构要求之外添加自定义字段,从而灵活提供奖励函数正常评测所需的任意数据。
常见附加字段
您可以包含以下类型的附加字段:
元数据:
-
task_id:用于跟踪的唯一标识符
-
difficulty_level:问题复杂度指示器
-
domain:主题领域或类别
-
expected_reasoning_steps:解题过程中的步骤数
评测标准:
-
evaluation_criteria:具体评分规则
-
custom_scoring_weights:不同维度的相对权重
-
context_data:问题背景信息
-
external_references:相关文档或资源链接
包含其他属性的示例
以下示例包含自定义元数据字段:
{ "id": "algebra_001", "messages": [ { "role": "system", "content": "You are a math tutor" }, { "role": "user", "content": "Solve: 2x + 5 = 13" } ], "reference_answer": { "solution": "x = 4", "steps": ["2x = 13 - 5", "2x = 8", "x = 4"] }, "task_id": "algebra_001", "difficulty_level": "easy", "domain": "algebra", "expected_reasoning_steps": 3 }
数据集规模建议
起步要求
建议采用以下最小数据集规模:
-
至少 100 个训练样本
-
至少 100 个评测样本
优先使用高质量的输入数据,以及能够在模型响应上一致执行的可靠奖励函数。
评测优先的方法
在投入大规模 RFT 训练之前,请先评测模型的基线性能:
-
性能优异(奖励大于 95%):无需进行 RFT,模型表现足够好
-
性能极差(奖励为 0%):先切换到 SFT,建立基本能力
-
性能中等:适合采用 RFT 训练
这种“评测优先”的方法可确保奖励函数无缺陷,并判断 RFT 是否适用于自己的使用案例。从小规模数据起步,有助于您熟悉 RFT 工作流程,尽早发现并解决问题,在扩容前验证方案,并测试奖励函数的可靠性。验证通过后,即可扩展到更大规模的数据集,进一步提升模型性能。
有效训练数据的特征
清晰性与一致性
优质的 RFT 样本需要清晰、无歧义的输入数据,以便能够针对不同的模型输出进行准确的奖励计算。数据中应避免以下干扰:
-
格式不一致
-
标签或指令相互矛盾
-
提示词含义模糊
-
参考答案互相冲突
任何歧义都会误导训练过程,导致模型学习到非预期的行为。
多样性
数据集应覆盖生产环境中的各类使用案例,确保模型在真实环境中表现稳健。包含:
-
各种问题类型与难度级别
-
不同的输入格式和边界情况
-
来自所有预期场景的代表性样本
这种多样性有助于防止过拟合,并确保模型能够妥善处理不熟悉的输入。
奖励函数注意事项
设计奖励函数,实现高效训练:
-
在几秒钟内执行完毕(而非几分钟)
-
使用 Lambda 实现高效并行
-
返回一致且可靠的分数
-
妥善处理不同类型的模型输出
快速且可扩展的奖励函数可支持快速迭代,并在大规模实验中实现高成本效益。