模型的钢筋微调 (RFT) Amazon Nova - Amazon Bedrock

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

模型的钢筋微调 (RFT) Amazon Nova

概述

什么是 RFT?

强化微调 (RFT) 通过训练反馈信号(可衡量的分数或表示模型表现的奖励)而不是精确的正确答案来提高模型性能。与从输入输出对中学习的监督微调不同,RFT 使用奖励函数来评估模型响应,并迭代优化模型以最大限度地提高这些奖励。当定义准确的正确输出具有挑战性时,这种方法非常出色,但您可以可靠地测量响应质量。

何时使用 RFT

当您可以定义清晰、可衡量的成功标准,但难以为培训提供准确正确的输出时,请使用 RFT。它非常适合:

  • 质量是主观或多方面的任务(创意写作、代码优化、复杂推理)

  • 有多种有效解决方案的场景,其中一些解决方案明显优于其他解决方案

  • 需要迭代改进、个性化或遵守复杂业务规则的应用程序

  • 收集带有标签的高质量样本昂贵或不切实际的情况

最佳用例

在可以客观测量输出质量但很难预先定义最佳响应的领域,RFT 表现出色:

  • 数学问题解决和代码生成

  • 科学推理和结构化数据分析

  • 需要 step-by-step推理或多轮解决问题的任务

  • 平衡多个目标(准确性、效率、风格)的应用程序

  • 可以通过执行结果或性能指标以编程方式验证成功的场景

支持的模型

Amazon Nova精简版 2.0

数据格式

RFT 训练数据必须遵循 OpenAI 强化微调格式。每个训练示例都是一个 JSON 对象,其中包含:

  • 一个messages包含对话轮流使用systemuser角色的数组

  • 包含用于计算奖励的预期产出或评估标准的reference_answer字段

注意

当前限制:仅限文本。RFT 不支持多模态输入。

示例:数学问题

{ "id": "sample-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"] } }

reference_answer字段包含您的奖励函数用来对模型的响应进行评分的预期输出或评估标准。它不仅限于结构化输出,还可以包含任何有助于您的奖励功能评估质量的格式。

数据集大小建议

起点

  • 至少 100 个训练示例

  • 至少 100 个评估示例

评价为先的方法

在投资大规模 RFT 训练之前,请评估模型的基线性能:

  • 高性能(奖励大于 95%)— 可能没有必要 RFT,因为您的模型已经表现良好

  • 表现非常差(奖励为0%)— 首先切换到SFT以建立基本能力

  • 性能适中 — RFT 可能是合适的

从一个小数据集开始,你可以验证你的奖励功能没有错误,确认 RFT 是适合你的用例的方法,尽早发现和修复问题,并在扩大规模之前测试工作流程。

有效训练数据的特征

清晰度和一致性

好的RFT示例需要清晰、明确的输入数据,以便能够对不同的模型输出进行准确的奖励计算。避免数据中的噪音,包括格式不一致、标签或说明相互矛盾、提示模棱两可以及参考答案相互矛盾。任何歧义都会误导训练过程并导致模型学习意外行为。

多样性

您的数据集应捕获各种各样的生产用例,以确保强大的现实世界性能。包括不同的输入格式和边缘案例,绘制来自日志和用户分析的实际生产使用模式,对用户类型、地理区域和季节变化进行采样,并包括从简单到复杂问题的难度级别。

奖励功能注意事项

设计奖励功能,实现高效训练。它应该在几秒钟(而不是几分钟)内执行,有效地与之并行AWS Lambda,返回一致、可靠的分数,并优雅地处理不同类型的模型输出。快速、可扩展的奖励功能可实现快速迭代和具有成本效益的实验。

其它属性

RFT 数据格式支持超出核心架构要求的自定义字段(messagesreference_answer)。这种灵活性使您可以添加奖励功能所需的任何其他数据,以便进行适当的评估。

注意

您无需在食谱中对此进行配置。数据格式本质上支持其他字段。只需将它们包含在您的训练数据 JSON 中,它们就会传递给您的metadata现场奖励函数。

常见的附加属性

  • task_id— 用于跟踪的唯一标识符

  • difficulty_level— 问题复杂度指标

  • domain— 主题领域或类别

  • expected_reasoning_steps— 解决方案中的步骤数

这些额外字段将在评估期间传递给您的奖励函数,从而实现针对您的特定用例量身定制的复杂评分逻辑。

带有其他属性的示例

Chemistry problem
{ "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 } }

reference_answer字段包含您的奖励函数用来对模型的响应进行评分的预期输出或评估标准。它不仅限于结构化输出,还可以包含任何有助于您的奖励功能评估质量的格式。

Math problem with metadata
{ "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 }

实现奖励功能

奖励函数以 Lambda 函数的形式实现,用于评估模型响应并返回数值分数。Lambda 函数接收 OpenAI 格式的消息和真实情况,并且必须以字典形式返回分数。

IAM 权限

确保您的 SageMaker AI 执行角色具有 Lambda 函数的InvokeFunction权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-reward-function-lambda" } ] }

设计指南

在编写奖励函数时,请执行以下操作:

  • 对回复进行排名 — 给最佳答案一个明显更高的分数

  • 使用一致的检查 — 评估任务完成情况、格式遵守情况、安全性和合理的长度

  • 保持稳定的缩放比例 — 保持分数标准化且不可被利用

接口格式

您的奖励函数必须接受并返回以下格式的数据。

输入结构

[{ "id": "123", "messages": [ { "role": "user", "content": "Do you have a dedicated security team?" }, { "role": "assistant", "content": "As an AI developed by Amazon, I don not have a dedicated security team..." } ], "metadata": { "reference_answer": { "compliant": "No", "explanation": "As an AI developed by Company, I do not have a traditional security team..." }, "my_key": "sample-001" } }]

输出结构

[{ "id": "123", "aggregate_reward_score": 0.85, "metrics_list": [ { "name": "accuracy", "value": 0.9, "type": "Reward" }, { "name": "policy_compliance", "value": 0.8, "type": "Metric" } ] }]

示例 Lambda 函数

from typing import List import json from dataclasses import asdict, dataclass @dataclass class RewardOutput: """Reward service output.""" id: str aggregate_reward_score: float def lambda_handler(event, context): """Main lambda handler""" return lambda_grader(event) def lambda_grader(samples: list[dict]) -> list[dict]: """Core grader function""" scores: List[RewardOutput] = [] for sample in samples: idx = sample["id"] ground_truth = sample.get("metadata", {}).get("reference_answer") if "messages" not in sample: print(f"Messages is None/empty for id: {idx}") ro = RewardOutput(id=idx, aggregate_reward_score=0.0) scores.append(ro) continue if ground_truth is None: print(f"No answer found in ground truth for id: {idx}") ro = RewardOutput(id=idx, aggregate_reward_score=0.0) scores.append(ro) continue # Get model's response (last turn is assistant turn) last_message = sample["messages"][-1] assert last_message["role"] == "assistant", "Last message must be from assistant" model_text = last_message["content"] ground_truth_text = _extract_ground_truth_text(ground_truth) if model_text.lower() == ground_truth_text.lower(): score = 1.0 else: score = 0.0 ro = RewardOutput(id=idx, aggregate_reward_score=score) scores.append(ro) return [asdict(score) for score in scores] def _extract_ground_truth_text(ground_truth) -> str: """Turn the ground_truth field into a plain string.""" if isinstance(ground_truth, str): return ground_truth if isinstance(ground_truth, dict): if "explanation" in ground_truth and isinstance(ground_truth["explanation"], str): return ground_truth["explanation"] if "answer" in ground_truth and isinstance(ground_truth["answer"], str): return ground_truth["answer"] return json.dumps(ground_truth, ensure_ascii=False) return str(ground_truth)

训练配置

使用 SageMaker AI Training Job 笔记本模板开始训练作业。有关更多信息,请参阅创建训练作业

训练容器

708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-RFT-latest

实例要求

该容器同时支持全等级和 LoRa 训练:

  • LoRa 训练 — 2/4/6/8 × p5.48xlarge 或 p5en.48xlarge 实例

  • 满等级训练 — 2/4/6/8 × vv48xlarge 实例(必填)

推理模式选择

可用模式

  • none— 没有推理(省略字reasoning_effort段)

  • low— 最小的推理开销

  • high— 最大推理能力(指定reasoning_effort时默认)

注意

RFT 没有中等选项。如果您的配置中没有该reasoning_effort字段,则会禁用推理。启用推理后,应设置为 32768 max_new_tokens 以适应扩展推理输出。

何时使用每种模式

high推理用于复杂的分析任务、数学问题解决、多步逻辑推断以及 step-by-step思维可以增加价值的任务。

使用none(省略reasoning_effort)或low推理进行简单的事实查询、直接分类、速度和成本优化以及直截了当的问答。

成本和性能权衡取舍

更高的推理模式会增加训练时间和成本、推理延迟和成本,以及复杂推理任务的建模能力。

监控训练

训练日志包括每个步骤的全面指标。关键指标类别包括:

  • 奖励指标critic/rewards/meancritic/rewards/maxcritic/rewards/min(奖励分配)和val-score/rewards/mean@1(验证奖励)

  • 模型行为actor/entropy(政策差异;越高等于探索性越强)

  • 训练运行状况actor/pg_loss(策略梯度损失)、actor/pg_clipfrac(剪辑更新的频率)和actor/grad_norm(梯度幅度)

  • 响应特征prompt_length/meanprompt_length/maxprompt_length/min(输入令牌统计信息)response_length/mean、、response_length/maxresponse_length/min(输出令牌统计信息)和response/aborted_ratio(不完整生成率;0 等于全部完成)

  • 性能-perf/throughput(训练吞吐量)、perf/time_per_step(每个训练步骤的时间)和timing_per_token_ms/*(每个令牌的处理时间)

  • 资源使用情况perf/max_memory_allocated_gbperf/max_memory_reserved_gb(GPU 内存)和perf/cpu_memory_used_gb(CPU 内存)

使用经过微调的模型

训练完成后,最终的模型检查点将保存到您指定的输出位置。检查点路径可在训练日志中找到,manifest.json文件位于输出 Amazon S3 位置(由您的笔记本output_s3_uri中定义)。

限制和最佳实践

限制

  • Lambda 超时 — 奖励功能必须在 15 分钟内完成(防止流程失控并管理成本)

  • 仅限单回合 — 不支持多回合对话

  • 数据要求 — 需要足够的多样性;为奖励稀少而苦苦挣扎(正面例子不到 5%)

  • 计算成本 — 比监督微调更昂贵

最佳实践

  • 从小处着手 — 从 100-200 个示例开始,验证奖励功能的正确性,然后根据结果逐步缩放

  • 训练前评估 — 在 RFT 之前测试基准模型性能。如果奖励始终为0%,请先使用SFT来建立基本能力。如果奖励大于95%,则可能没有必要进行RFT。

  • 监控培训-跟踪平均奖励分数和分配。注意是否过度拟合(训练奖励增加,而验证奖励减少)。寻找令人担忧的模式,例如奖励稳定在0.15以下、奖励差异随着时间的推移而增加以及验证绩效下降。

  • 优化奖励函数 — 在几秒钟(而不是几分钟)内执行,尽量减少外部 API 调用,使用高效算法,实施适当的错误处理,并利用 Lambda 的并行扩展

  • 迭代策略 — 如果奖励没有改善,请调整奖励功能设计,增加数据集的多样性,添加更多具有代表性的示例,并验证奖励信号是否清晰一致