Amazon Nova 模型的強化微調 (RFT) - Amazon Bedrock

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon Nova 模型的強化微調 (RFT)

概觀

什麼是 RFT?

強化微調 (RFT) 透過訓練意見回饋訊號來改善模型效能,這些訊號是可測量的分數或獎勵,指出模型的效能,而不是確切的正確答案。與從輸入輸出對中學習的監督式微調不同,RFT 使用獎勵函數來評估模型回應,並反覆最佳化模型以最大化這些獎勵。此方法在定義確切的正確輸出具有挑戰性時表現卓越,但您可以可靠地測量回應品質。

何時使用 RFT

當您可以定義明確、可衡量的成功條件,但難以提供確切正確的訓練輸出時,請使用 RFT。它非常適合:

  • 品質是主觀或多面向的任務 (創造性寫入、程式碼最佳化、複雜推理)

  • 具有多個有效解決方案的案例,其中有些解決方案明顯優於其他解決方案

  • 需要反覆改進、個人化或遵守複雜業務規則的應用程式

  • 收集高品質標籤範例昂貴或不切實際的案例

最佳使用案例

RFT 在可以客觀測量輸出品質,但難以預先定義最佳回應的網域中表現卓越:

  • 數學問題解決和程式碼產生

  • 科學推理和結構化資料分析

  • 需要step-by-step推理或多迴轉問題解決的任務

  • 應用程式平衡多個目標 (準確性、效率、風格)

  • 可透過執行結果或效能指標以程式設計方式驗證成功的案例

支援的模型

Amazon Nova Lite 2.0

資料格式

RFT 訓練資料必須遵循 OpenAI 強化微調格式。每個訓練範例都是 JSON 物件,其中包含:

  • 使用 systemuser角色進行對話輪換的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 資料格式支援核心結構描述需求之外的自訂欄位 (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 訓練任務筆記本範本來啟動訓練任務。如需詳細資訊,請參閱建立訓練任務

訓練容器

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/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 記憶體)

使用微調的模型

訓練完成後,最終模型檢查點會儲存到您指定的輸出位置。檢查點路徑可在訓練日誌和輸出 Amazon S3 位置 (在筆記本output_s3_uri中由 定義) 中的 manifest.json 檔案中使用。

限制和最佳實務

限制

  • Lambda 逾時 – 獎勵函數必須在 15 分鐘內完成 (防止失控程序和管理成本)

  • 僅限單轉 – 不支援多轉對話

  • 資料需求 – 需要足夠的多樣性;難以獲得稀疏獎勵 (不到 5% 的正面範例)

  • 運算成本 – 比監督式微調更昂貴

最佳實務

  • 從小開始 – 從 100-200 個範例開始,驗證獎勵函數正確性,並根據結果逐步擴展

  • 訓練前評估 – 在 RFT 之前測試基準模型效能。如果獎勵持續為 0%,請先使用 SFT 建立基本功能。如果獎勵大於 95%,RFT 可能不必要。

  • 監控訓練 – 追蹤平均獎勵分數和分佈。注意過度擬合 (訓練獎勵增加,而驗證獎勵減少)。尋找相關的模式,例如獎勵穩定低於 0.15、隨時間增加獎勵差異,以及驗證效能下降。

  • 最佳化獎勵函數 – 在幾秒鐘 (而非幾分鐘) 內執行、將外部 API 呼叫降至最低、使用高效演算法、實作適當的錯誤處理,並利用 Lambda 的平行擴展

  • 反覆運算策略 – 如果獎勵未改善,請調整獎勵函數設計、增加資料集多樣性、新增更多具代表性的範例,並確認獎勵訊號清晰一致