你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
强化微调(RFT)是一种通过基于奖励的过程训练推理模型(如 o4-mini)的技术,而不是仅依赖于标记的数据。 通过使用反馈或“奖励”来指导学习,RFT 可帮助模型开发更好的推理和解决问题技能,尤其是在需要标记的示例有限或复杂行为的情况下。
流程
强化微调(RFT)的过程类似于监督微调(SFT),存在一些显著差异:
- 不支持数据准备系统消息,训练数据中的最终消息不是 消息,而是参考答案。
assistant
- 模型选择: 仅 o4-mini 支持 RFT。
- 分级程序定义: RFT 要求使用 评分员 对微调模型的质量进行评分,并指导学习。 可以使用字符串检查、文本相似度或基于模型的评分器,也可将它们与多评分器结合使用。
- 训练: 包括其他参数:
eval_samples
、eval_interval
、reasoning_effort
和compute_multiplier
。 还可以选择暂停和恢复作业,允许暂停训练、检查检查点,并仅在需要进一步训练时才继续。 - 评估:除了准确性和损失外,RFT 还返回平均奖励和分析错误,以及平均令牌。
在整个训练过程中,平台循环访问数据集,为每个提示生成多个响应。 这些响应随后由评分器评估,并根据收到的分数应用策略梯度更新。 此周期重复,直到完全处理训练数据或作业在指定的检查点处停止,最终导致模型针对所需指标进行微调。
但是,尽管存在这些差异,但 SFT 和 RFT 之间有许多共同点:数据准备是关键;可以通过 Foundry UI 启动无服务器训练作业;我们支持标准和全局标准部署。
训练和评估文件形成要求
需要训练文件和验证文件才能运行 o4-mini RFT。 o4-mini 使用新格式的数据进行强化微调。 这些应该是 jsonl 格式的文件,就像用于监督微调(SFT)的那种文件。
文件的每一行都应包含消息字段,与 SFT 存在一些差异。
- 系统消息不受支持
- 最终消息必须来自用户,而不是助理(SFT 的情况也如此)
Tools
、response_formats
已被支持- 不支持图像/多模式数据
JSONL 数据文件中的每个行都应包含消息数组,以及对模型输出进行评分所需的任何其他字段。 此值必须是有效的 JSON 对象(例如字典或列表;特定类型和结构依赖于所选的评分器)。
训练数据示例
如果我们给模型一个谜题,让它以所需的 RFT 训练格式来解决,则如下所示:
"messages": [
{
"role": "user",
"content": "You are a helpful assistant. Your task is to solve the following logic and puzzle quiz:\n\n2. In the expression 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 = 100, replace the asterisks with arithmetic operation signs to obtain a correct equation."
}
],
"solution": "Solution. 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 \\cdot 9 = 100.\n\nEvaluation. 12 points for the correct solution.",
"final_answer": "1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 \\cdot 9 = 100"
}
我们已将上述文本从单个行 jsonl
展开,因此可以看到预期的字段:消息、角色、内容和 final_answer
。
RFT 的数据集大小
从一个小型数据集开始,该数据集包含几十到几百个示例,以在转向更大的数据集之前评估 RFT 的有效性。 出于安全原因,训练集必须经历自动筛选过程,该过程在启动微调作业时启动,而不是在文件上传时启动。 文件成功通过筛选后,可以反复使用它,而不会延迟。
高质量的示例至关重要,即使在数量有限的情况下也是如此。 筛选后,数据量增加是有利的,前提是数据保持高质量。 较大的数据集允许使用较大的批大小,这通常可增强训练稳定性。
训练文件最多可以包含 50,000 个示例,而测试数据集最多可以包含 1,000 个示例。 这两种类型的数据集都受到自动筛选的约束
创建微调作业
可以在 Azure AI Foundry 中为 o4 微型 RFT 创建训练作业,就像微调任何其他模型一样:在受支持的区域中选择 微调 并选择 o4-mini 作为基本模型。
超参数选择
强化方法的超参数部分支持所有常规训练超参数(例如学习速率、纪元数和批大小),以及三个新的超参数:
超参数名称 | 价值 | DESCRIPTION |
---|---|---|
Eval_samples : |
1-10 | 评估期间要使用的样本数。 验证集奖励指标针对每个数据点的不同样本取平均值。 默认值为 5。 |
Eval_interval |
1-25 | 在提供的验证文件上执行评估之间的训练步骤数。 默认值为 1。 |
Compute-multiplier |
0.5 -3.0 | 训练期间用于探索搜索空间的计算量的乘数。 数字增加将导致每个实例生成的样本数增加。 数字太小可能导致欠拟合,太大则容易过拟合。 |
Reasoning_effort |
低、中、高 | 模型应在推理中投入的努力程度。 默认设置为中等工作量。 如果性能不佳,请考虑增加推理工作量。 |
注释
如果提供了方法,将忽略顶级超参数字段。 如果要同时设置常规训练参数和强化训练参数,请同时在强化超参数部分设置这两个参数。
小窍门
所有这些值都是可选的,我们建议用户在调整超参数之前使用默认值启动你的第一个作业。
评分员
RFT 是唯一的,因为它使用评分员来评估模型响应的质量,以教模型推理。 与 SFT 不同,最终消息不是来自助理 , 而是对模型进行采样,并在每个样本上使用评分员来评分其质量。 然后,我们基于这些分数进行训练,以提高模型性能。
实际上,评分函数是将训练文件中的参考答案与样本响应进行比较的功能。
评分者:
- 返回介于 0 和 1 之间的浮点数。 为答案提供模型部分分数而不是二进制 0/1 可能会有所帮助。
- 评分器被表示为 JSON(如下所示)
支持的评分器
我们支持三种类型的评分员:字符串检查、文本相似性、模型评分者。 多评分器还提供一个选项,支持组合使用评分器。
字符串检查评分器
使用这些基本字符串操作返回 0
或 1
。
规范:
{
"type": "string_check",
"name": string,
"operation": "eq" | "ne" | "like" | "ilike",
"input": string,
"reference": string,
}
支持的操作:
eq
:如果输入与引用匹配(区分大小写),则返回 1;否则返回 0neq
:如果输入与引用不匹配(区分大小写),则返回 1;否则返回 0like
:如果输入包含引用(区分大小写),则返回 1;否则返回 0ilike
:如果输入包含引用(不区分大小写),则返回 1;否则返回 0
文本相似性
若要评估模型生成的输出与引用的接近程度,请使用各种评估指标评分。
规范:
{
"type": "text_similarity",
"name": string,
"input": string,
"reference": string,
"pass_threshold": number,
"evaluation_metric": "fuzzy_match" | "bleu" | "gleu" | "meteor" | "rouge_1" | "rouge_2" | "rouge_3" | "rouge_4" | "rouge_5" | "rouge_l"
}
支持的操作:
bleu
– 计算字符串之间的BLEU分数Fuzzy_match
- 使用 rapidfuzz 的模糊字符串匹配gleu
- 计算字符串之间的 google BLEU 分数meteor
- 计算字符串之间的 METEOR 分数rouge-*
- 由 rouge python 库定义
评分模型
这是模型分级程序,你可以使用 LLM 对训练输出进行评分。
我们作为评分器模型支持的模型包括:
gpt-4o-2024-08-06
o3-mini-2025-01-31
{
"type": "score_model",
"name": string,
"input": Message[],
"model": string,
"pass_threshold": number,
"range": number[],
"sampling_params": {
"seed": number,
"top_p": number,
"temperature": number,
"max_completions_tokens": number,
"reasoning_effort": "low" | "medium" | "high"
}
}
若要使用评分模型评分程序,输入是聊天消息的列表,每个消息都包含角色和内容。 分级器的输出将被截断为给定范围,对于所有非数值输出,默认为 0。
多评分器
多分级对象将多个评分者的输出组合在一起,以生成单个分数。
{
"type": "multi",
"graders": dict[str, Grader],
"calculate_output": string,
"invalid_grade": float
}
支持的操作:
运算符:
+
(新增)-
(减法)*
(乘法)/
(除法)^
(电源)
功能:
min
max
abs
floor
ceil
exp
sqrt
log
使用 UX 时,可以根据需要编写提示并生成有效的评分标准和JSON格式的响应格式。 评分器是提交微调作业时必须输入的字段。 响应格式是可选的。
重要
要生成正确的评分器架构,需要仔细创作提示。 你可能会发现,你前几次尝试会生成无效的架构,或者没有创建能够正确处理训练数据的架构。 评分器是提交微调作业时必须输入的必填字段。 响应格式是可选的。
下面是每个类别的示例评分器:
string-check-grader - 使用简单的字符串操作返回 0 或 1。
示例:
{
"name": "string_check_sample_grader",
"type": "string_check",
"input": "{{item.reference_answer}}",
"reference": "{{sample.output_text}}",
"operation": "eq"
}
文本相似性 - 评估模型生成的输出与引用的接近程度(使用各种评估指标评分)。
{
"name": "text_similarity_sample_grader",
"type": "text_similarity",
"input": "{{item.reference_answer}}",
"reference": "{{sample.output_text}}", "evaluation_metric":"fuzzy_match"
}
评分模型 - 这是模型评分器,你可以使用 LLM 对训练输出进行评分。
我们支持的评分器模型是 gpt-4o-2024-08-06
和 o3-mini-2025-01-31
。
{
"name": "score_model_sample_grader",
"type": "score_model",
"input": [ {
"role": "user",
"content": "Score\nhow close the reference answer is to the model answer. You will be comparing these\ntwo as JSON objects that contain 2 keys, \"extracted_text\" and\n\"clause_type\". Score 1.0 if they are both the same, 0.5 if one is\nthe same, and 0.0 if neither are the same. Return just a floating point\nscore\n\n Reference answer: {\"extracted_text\": \n{{item.extracted_text}}, \"clause_type\": {{item.clause_type}}}\n\n\nModel answer: {{sample.output_json}}"}],
"model": "gpt-4o-2024-08-06",
"sampling_params": {"seed": 42}
}
多评分器 - 多评分器对象将多评分器的输出相组合来生成一个分数。
{
"name":"sample_multi_grader",
"type":"multi",
"graders":{"ext_text_similarity":{"name":"ext_text_similarity",
"type":"text_similarity",
"input":"{{sample.output_json.ext_text}}",
"reference":"{{item.ext_text}}",
"evaluation_metric":"fuzzy_match"},
"clause_string_check":{"name":"clause_string_check",
"type":"string_check",
"input":"{{sample.output_json.clause_type}}",
"operation":"eq",
"reference":"{{item.clause_type}}"}},
"calculate_output":"0.5 * ext_text_similarity + 0.5 * clause_string_check"
}
注释
:目前不支持将 multi
与模型评分器作为子评分器结合使用。 只有 Multi
和 text_Similarity
支持 string_check
评分器。
作为可选字段的响应格式示例:
如果我们需要训练数据示例中所用的相同谜题问题的响应,则可以添加响应格式,如下所示,字段“解决方案”和“最终答案”在结构化输出中共享。
{
"type": "json_schema",
"name": "puzzles_assistant",
"schema": {
"type" : "object",
"properties": {
"solution": {
"type": "string",
"title": "solution"
},
"final_answer": {
"type": "string",
"title": "final_answer"
}
},
"required": [
"solution",
"final_answer"
],
"additionalProperties": false
},
"strict": true
}
训练进度和结果
RFT 作业通常运行时间较长,可能需要长达 24 小时,具体取决于参数选择。 可以在 AI Foundry 门户的两个微调视图中跟踪进度。 你将看到作业的状态与正常微调作业的状态相同(“已排队”、“正在运行”、“成功”)。
还可以在训练运行时查看结果文件,以了解进度以及训练是否按预期进行。
新功能:暂停和恢复
在训练期间,可以查看日志和 RFT 指标,并根据需要暂停作业(如果指标未聚合,或者如果你觉得模型没有按正确的速度学习,选择不正确的评分者等)。 暂停训练作业后,将创建可部署的检查点,供你进一步推断或恢复作业以完成。 暂停操作仅适用于已训练至少一个步骤且处于“正在运行”状态的作业。
训练支出限制
由于RFT任务可能会导致较高的培训成本,一旦任务的总培训成本(培训成本+评分成本)达到5000美元时,我们将自动暂停该任务。 用户可以部署最新的检查点或恢复训练作业。 如果用户决定恢复作业,则作业的计费将继续,随后不会再对培训作业施加任何价格限制。
解释训练结果
对于强化微调作业,主要指标是每步骤奖励指标。 这些指标显示您的模型在训练数据上的表现如何。 它们由你在作业配置中定义的评分员计算。
奖励指标
以下是两个单独的顶级奖励指标:
train_reward_mean
:从当前步骤中的所有数据点获取的样本的平均奖励。 由于每个步骤中的特定数据点会随着每个步骤而发生更改,因此不同步骤中的train_reward_mean值不直接比较,并且特定值可能会从步骤到步骤大幅波动。valid_reward_mean
:从验证集中所有数据点获取的样本的平均奖励,这是一个更稳定的指标。
小窍门
应始终使用模型测试推理。 如果选择了不适当的评分者,则平均奖励可能不反映模型的性能。 查看模型中的示例输出,以确保它们的格式正确且有意义。 检查模型的预测是否与地面真相一致,以及描述性分析是否提供合理的解释。
推理令牌
通过 train_reasoning_tokens_mean
和 valid_reasoning_tokens_mean
指标来观察模型随时间变化的行为。 这些指标是模型用于响应训练数据集和验证数据集中的提示的平均推理令牌数。 您还可以在微调控制台中查看平均推理标记数量。
小窍门
通常,在训练期间,模型将大幅更改用于响应提示的平均推理令牌数。 这是模型在响应奖励信号时正在更改其行为的迹象。 该模型可能学会使用较少的推理令牌来实现相同的奖励,或者可能学会使用更多推理令牌来实现更高的奖励。
评估结果
在微调作业完成时,你应能够基于验证集上的平均奖励值对模型的性能有一个初步的了解。 但是,模型可能已过度拟合训练数据,或者已学会对评分器进行奖励破解,这使得它获得高分,但实际上并不正确。
通过检查与微调任务相关联的评估,可以更快捷地了解模型的行为。 具体而言,请密切关注为最终训练步骤进行的运行,以查看最终模型的行为。 还可以使用 evals 产品将最终运行与早期运行进行比较,并查看模型在训练过程中的行为是如何变化的。
部署和使用 o4-mini RFT 模型
可以通过 UI 或 REST API 部署微调模型,就像任何其他微调模型一样。
可以通过触发暂停操作来部署已完成的微调任务,或是自动或手动创建的任何间歇性检查点。 若要了解有关使用Chat Playground进行模型部署和测试的详细信息,请参阅微调部署。
使用模型时,请确保使用与训练期间相同的说明和结构。 这会使模型保持分布状态,并确保在推理期间看到与训练期间遇到的问题相同的性能。
最佳做法
评分器选择
你的评分员用于强化学习:选择错误的评分员意味着你的奖励将无效,你的微调不会产生预期的结果。
下面是关于选择评分器的一些基本规则:
如果有 简短、具体的答案 (如数字、布尔响应或多重选择),请选择与 评分器匹配的字符串。
如果你有 可在多个条件上评分的复杂响应,请使用多评分员。 这样,你可以对响应的不同方面进行评分,并将其合并到聚合中。
请考虑将评分器分解成多个步骤,并提供部分分数,以引导模型推理在正确的方向,确保评分稳定且与偏好一致。 在提示中提供展示优秀、中等和较差答案的少量示例。
当代码无法满足需求时,使用 LLM 作为判断。 对于丰富、公开的答案,请另一种语言模型进行评分。 构建 LLM 评分器时,通过 LLM 判断运行多个候选响应和基本事实来确保
测试评分器
RFT 中提供的所有评分机制都在 Azure OpenAI 评估中得到支持。 在启动训练运行之前,请使用旨在用于训练的同一个评分器针对验证数据测试 vanilla o4-mini 模型。 如果评分者分数与期望不匹配,则需要选择其他评分者。
我们还提供一个评分者检查 API,可用于检查配置的有效性。
数据准备工作
最初目标是几百个示例,并在必要时考虑扩展到大约 1,000 个示例。 数据集应根据预测的类进行均衡,以避免偏差并确保通用化。
对于提示,请确保提供清晰和详细的说明,包括指定响应格式和输出的任何约束(例如解释的最小长度,仅使用 true/false 等进行响应)。