本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Nova 模型的強化微調 (RFT)
概觀
什麼是 RFT?
強化微調 (RFT) 透過訓練意見回饋訊號來改善模型效能,這些訊號是可測量的分數或獎勵,指出模型的效能,而不是確切的正確答案。與從輸入輸出對中學習的監督式微調不同,RFT 使用獎勵函數來評估模型回應,並反覆最佳化模型以最大化這些獎勵。此方法在定義確切的正確輸出具有挑戰性時表現卓越,但您可以可靠地測量回應品質。
何時使用 RFT
當您可以定義明確、可衡量的成功條件,但難以提供確切正確的訓練輸出時,請使用 RFT。它非常適合:
品質是主觀或多面向的任務 (創造性寫入、程式碼最佳化、複雜推理)
具有多個有效解決方案的案例,其中有些解決方案明顯優於其他解決方案
需要反覆改進、個人化或遵守複雜業務規則的應用程式
收集高品質標籤範例昂貴或不切實際的案例
最佳使用案例
RFT 在可以客觀測量輸出品質,但難以預先定義最佳回應的網域中表現卓越:
數學問題解決和程式碼產生
科學推理和結構化資料分析
需要step-by-step推理或多迴轉問題解決的任務
應用程式平衡多個目標 (準確性、效率、風格)
可透過執行結果或效能指標以程式設計方式驗證成功的案例
支援的模型
Amazon Nova Lite 2.0
資料格式
RFT 訓練資料必須遵循 OpenAI 強化微調格式。每個訓練範例都是 JSON 物件,其中包含:
使用
system和user角色進行對話輪換的messages陣列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 資料格式支援核心結構描述需求之外的自訂欄位 (messages 和 reference_answer)。此彈性可讓您新增獎勵函數進行適當評估所需的任何其他資料。
注意
您不需要在配方中設定此項目。資料格式本質上支援其他欄位。只要將它們包含在訓練資料 JSON 中,它們就會在 metadata 欄位中傳遞給您的獎勵函數。
常見的其他屬性
task_id– 用於追蹤的唯一識別符difficulty_level– 問題複雜性指標domain– 主題區域或類別expected_reasoning_steps– 解決方案中的步驟數量
這些額外的欄位會在評估期間傳遞給您的獎勵函數,以根據您的特定使用案例量身訂做複雜的評分邏輯。
具有其他屬性的範例
實作獎勵函數
獎勵函數會實作為評估模型回應和傳回數值分數的 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 訓練任務筆記本範本來啟動訓練任務。如需詳細資訊,請參閱建立訓練任務。
訓練容器
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 欄位,則會停用推理。啟用推理時,您應該將 max_new_tokens設定為 32768,以容納延伸推理輸出。
何時使用每個模式
針對複雜的分析任務、數學問題解決、多步驟邏輯扣除,以及step-by-step思考可增加價值的任務,使用high推理。
使用 none(省略 reasoning_effort) 或low推理簡單的事實查詢、直接分類、速度和成本最佳化,以及直接的問答。
成本和效能權衡
較高的推理模式會增加訓練時間和成本、推論延遲和成本,以及複雜推理任務的模型功能。
監控訓練
訓練日誌包含每個步驟的全方位指標。金鑰指標類別包括下列項目:
獎勵指標 –
critic/rewards/mean、critic/rewards/max、critic/rewards/min(獎勵分佈) 和val-score/rewards/mean@1(驗證獎勵)模型行為 –
actor/entropy(政策變化;較高等於更探索性)訓練運作狀態 –
actor/pg_loss(政策梯度損失)、actor/pg_clipfrac(剪輯更新的頻率) 和actor/grad_norm(梯度大小)回應特性 –
prompt_length/mean、prompt_length/max、prompt_length/min(輸入字符統計資料)response_length/mean、、response_length/max、response_length/min(輸出字符統計資料) 和response/aborted_ratio(不完整的產生率;0 等於所有已完成)效能 –
perf/throughput(訓練輸送量)、perf/time_per_step(每個訓練步驟的時間) 和timing_per_token_ms/*(每個金鑰的處理時間)資源用量 –
perf/max_memory_allocated_gb、perf/max_memory_reserved_gb(GPU 記憶體) 和perf/cpu_memory_used_gb(CPU 記憶體)
使用微調的模型
訓練完成後,最終模型檢查點會儲存到您指定的輸出位置。檢查點路徑可在訓練日誌和輸出 Amazon S3 位置 (在筆記本output_s3_uri中由 定義) 中的 manifest.json 檔案中使用。
限制和最佳實務
限制
Lambda 逾時 – 獎勵函數必須在 15 分鐘內完成 (防止失控程序和管理成本)
僅限單轉 – 不支援多轉對話
資料需求 – 需要足夠的多樣性;難以獲得稀疏獎勵 (不到 5% 的正面範例)
運算成本 – 比監督式微調更昂貴
最佳實務
從小開始 – 從 100-200 個範例開始,驗證獎勵函數正確性,並根據結果逐步擴展
訓練前評估 – 在 RFT 之前測試基準模型效能。如果獎勵持續為 0%,請先使用 SFT 建立基本功能。如果獎勵大於 95%,RFT 可能不必要。
監控訓練 – 追蹤平均獎勵分數和分佈。注意過度擬合 (訓練獎勵增加,而驗證獎勵減少)。尋找相關的模式,例如獎勵穩定低於 0.15、隨時間增加獎勵差異,以及驗證效能下降。
最佳化獎勵函數 – 在幾秒鐘 (而非幾分鐘) 內執行、將外部 API 呼叫降至最低、使用高效演算法、實作適當的錯誤處理,並利用 Lambda 的平行擴展
反覆運算策略 – 如果獎勵未改善,請調整獎勵函數設計、增加資料集多樣性、新增更多具代表性的範例,並確認獎勵訊號清晰一致