

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

# 使用 Amazon Nova 模型進行強化微調 (RFT)
<a name="nova-reinforcement-fine-tuning"></a>

## 概觀
<a name="nova-rft-overview"></a>

**什麼是 RFT？**

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

**何時使用 RFT**

當您可以定義明確、可衡量的成功條件，但難以為訓練提供確切正確的輸出時，請使用 RFT。它非常適合：
+ 品質是主觀或多面向的任務 （創造性寫入、程式碼最佳化、複雜推理）
+ 具有多個有效解決方案的案例，其中有些解決方案明顯優於其他解決方案
+ 需要反覆改進、個人化或遵守複雜業務規則的應用程式
+ 收集高品質標籤範例昂貴或不切實際的案例

**最佳使用案例**

RFT 在可以客觀測量輸出品質，但難以預先定義最佳回應的網域中表現卓越：
+ 數學問題解決和程式碼產生
+ 科學推理和結構化資料分析
+ 需要step-by-step推理或多迴轉問題解決的任務
+ 應用程式平衡多個目標 （準確性、效率、風格）
+ 可透過執行結果或效能指標以程式設計方式驗證成功的案例

**支援的模型**

Nova Lite 2.0

## 資料格式概觀
<a name="nova-rft-data-format"></a>

RFT 訓練資料必須遵循 OpenAI 強化微調[格式](https://platform.openai.com/docs/api-reference/fine-tuning/reinforcement-input)。每個訓練範例都是 JSON 物件，其中包含：
+ 使用 `system`和 `user`角色進行對話輪換的`messages`陣列
+ `reference_answer` 包含預期輸出或評估條件的欄位，以進行獎勵計算

**目前限制**
+ 僅文字

### 資料格式範例
<a name="nova-rft-data-examples"></a>

每個範例應該位於 JSONL 檔案中的單一行上，每行一個 JSON 物件。

------
#### [ Chemistry problem ]

```
{
  "id": "chem-01",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful chemistry assistant"
    },
    {
      "role": "user",
      "content": "Calculate the molecular weight of caffeine (C8H10N4O2)"
    }
  ],
  "reference_answer": {
    "molecular_weight": 194.19,
    "unit": "g/mol",
    "calculation": "8(12.01) + 10(1.008) + 4(14.01) + 2(16.00) = 194.19"
  }
}
```

------
#### [ Math problem ]

```
{
  "id": "sample-001",  // Optional
  "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"]
  }
}
```

------
#### [ Code problem ]

```
{
  "id": "code-002",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful programming assistant"
    },
    {
      "role": "user",
      "content": "Write a Python function that reverses a string without using built-in reverse methods"
    }
  ],
  "reference_answer": {
    "code": "def reverse_string(s):  \n    result = ''  \n    for i in range(len(s) - 1, -1, -1):  \n        result += s[i]  \n    return result",
    "test_cases": [
      {
        "input": "hello",
        "expected_output": "olleh"
      },
      {
        "input": "",
        "expected_output": ""
      },
      {
        "input": "a",
        "expected_output": "a"
      },
      {
        "input": "Python123",
        "expected_output": "321nohtyP"
      }
    ],
    "all_tests_pass": true
  }
}
```

------

`reference_answer` 欄位包含預期輸出或評估條件，您的獎勵函數會用來對模型的回應進行評分。它不限於結構化輸出，它可以包含任何格式，協助您的獎勵函數評估品質。

## 資料集大小建議
<a name="nova-rft-dataset-size"></a>

**起點**
+ 最少 100 個訓練範例
+ 最少 100 個評估範例

**評估優先方法**

在投資大規模 RFT 訓練之前，請評估模型的基準效能：
+ **高效能 (>95% 獎勵）** – RFT 可能不必要，您的模型已表現良好
+ **非常差的效能 (0% 獎勵）** – 首先切換到 SFT 以建立基本功能
+ **中等效能** – RFT 可能是適當的

從小型資料集開始，您可以：
+ 驗證您的獎勵函數沒有錯誤
+ 確認 RFT 是適合您使用案例的正確方法
+ 及早識別和修正問題
+ 在向上擴展之前測試工作流程

驗證後，您可以擴展到更大的資料集，以進一步改善效能。

## 有效訓練資料的特性
<a name="nova-rft-effective-data"></a>

**清晰度和一致性**

良好的 RFT 範例需要清晰、不明確的輸入資料，以便在不同的模型輸出間進行準確的獎勵計算。避免資料中的雜訊，包括：
+ 不一致的格式
+ 矛盾的標籤或指示
+ 模棱兩可的提示
+ 衝突的參考答案

任何模棱兩可的情況都會誤導訓練程序，並導致模型學習非預期的行為。

**多樣性**

您的資料集應擷取生產使用案例的完整多樣性，以確保強大的實際效能。包括：
+ 不同的輸入格式和邊緣案例
+ 從日誌和使用者分析映射實際的生產使用模式
+ 使用者類型、地理區域和季節性變化的範例
+ 包含從簡單到複雜問題的難度等級

**獎勵函數考量事項**

設計您的獎勵函數以進行高效訓練：
+ 在幾秒鐘內執行 （非分鐘）
+ 使用 Lambda 有效平行化
+ 傳回一致、可靠的分數
+ 正常處理不同類型的模型輸出

快速、可擴展的獎勵函數可實現快速迭代和經濟實惠的實驗。

## 其他屬性
<a name="nova-rft-additional-properties"></a>

RFT 資料格式支援核心結構描述需求之外的自訂欄位 (`messages` 和 `reference_answer`)。此彈性可讓您新增獎勵函數進行適當評估所需的任何其他資料。

**注意**  
您不需要在配方中設定此 - 資料格式本質上支援其他欄位。只要將它們包含在訓練資料 JSON 中，它們就會在 `metadata` 欄位中傳遞給您的獎勵函數。

**常見的其他屬性**

中繼資料欄位範例：
+ `task_id` – 用於追蹤的唯一識別符
+ `difficulty_level` – 問題複雜性指標
+ `domain` – 主題區域或類別
+ `expected_reasoning_steps` – 解決方案中的步驟數量

**具有其他屬性的範例**

```
{
  "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
}
```

這些額外的欄位會在評估期間傳遞給您的獎勵函數，以根據您的特定使用案例量身打造複雜的評分邏輯。

## 訓練組態
<a name="nova-rft-training-config"></a>

**範例配方**

```
# Note:
# This recipe can run on p5.48xlarge and p5en.48xlarge instance types.
run:
  name: "my-rft-run"                           # Unique run name (appears in logs/artifacts).
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: nova-lite-2/prod
  data_s3_path: s3://<bucket>/<data file>      # Training dataset in JSONL;
  replicas: 4
  reward_lambda_arn: arn:aws:lambda:<region>:<account-id>:function:<function-name>

  ## MLFlow configs
  mlflow_tracking_uri: "" # Required for MLFlow
  mlflow_experiment_name: "my-rft-experiment" # Optional for MLFlow. Note: leave this field non-empty
  mlflow_run_name: "my-rft-run" # Optional for MLFlow. Note: leave this field non-empty

## SMTJ GRPO Training specific configs
training_config:
  max_length: 8192                              # Context window (tokens) for inputs+prompt;
  global_batch_size: 16                         # Total samples per optimizer step across all replicas (16/32/64/128/256).
  reasoning_effort: high                        # Enables reasoning mode high / low / or null for non-reasoning

  rollout:                                      # How responses are generated for GRPO/advantage calc.
    advantage_strategy:
      number_generation: 2                      # N samples per prompt to estimate advantages (variance vs cost).
    generator:
      max_new_tokens: 6000                      # Cap on tokens generated per sample
      set_random_seed: true                     # Seed generation for reproducibility across runs.
      temperature: 1                            # Softmax temperature;
      top_k: 1                                  # Sample only from top-K logits
    rewards:
      preset_reward_function: null              # Usage of preset reward functions [exact_match]
      api_endpoint:
        lambda_arn: arn:aws:lambda:<region>:<account-id>:function:<function-name>
        lambda_concurrency_limit: 12             # Max concurrent Lambda invocations (throughput vs. throttling).

  trainer:
    max_steps: 2                                 # Steps to train for. One Step = global_batch_size
    save_steps: 5
    test_steps: 1

    # RL parameters
    ent_coeff: 0.0                              # A bonus added to the policy loss that rewards higher-output entropy.
    kl_loss_coef: 0.001                         # Weight on the KL penalty between the actor (trainable policy) and a frozen reference model

    optim_config:                    # Optimizer settings
        lr: 5e-5                       # Learning rate
        weight_decay: 0.0              # L2 regularization strength (0.0–1.0)
        adam_beta1: 0.9
        adam_beta2: 0.95

    peft:                            # Parameter-efficient fine-tuning (LoRA)
        peft_scheme: "lora"            # Enable LoRA for PEFT
        lora_tuning:
            alpha: 32
            lora_plus_lr_ratio: 64.0     # LoRA+ learning rate scaling factor (0.0–100.0)
```

## 使用 LLM 做為判斷的 RFT 訓練
<a name="nova-rft-llm-judge"></a>

### 概觀
<a name="nova-rft-llm-judge-overview"></a>

大型語言模型 LLMs) 在強化微調 (RFT) 工作流程中逐漸被用作判斷，提供引導模型最佳化的自動獎勵訊號。在此方法中，LLM 會根據指定的條件評估模型輸出，無論是評估正確性、品質、風格遵循或語意相等性，並指派推動強化學習程序的獎勵。

這對於傳統獎勵函數難以以程式設計方式定義的任務特別有用，例如判斷不同的表示法 （例如 "1/3"、"0.333" 和 "1/3") 是否在語義上相等，或評估一致性和相關性等細微品質。透過使用以 LLM 為基礎的判斷做為獎勵函數，您可以將 RFT 擴展到複雜的網域，而不需要大量的人工註釋，因此除了傳統對齊問題之外，可在各種使用案例中快速迭代和持續改善模型。

### 合理模式選擇
<a name="nova-rft-reasoning-mode"></a>

**可用模式**
+ none – 無推理 （省略 reasoning\$1effort 欄位）
+ 低 - 最低推理開銷
+ 高 – 最大推理功能 （指定 reasoning\$1effort 時預設為預設值）

**注意**  
RFT 沒有媒體選項。如果組態中沒有 reasoning\$1effort 欄位，則會停用推理。啟用推理時，您應該將 `max_new_tokens`設定為 32768，以容納延伸推理輸出。

**何時使用每個模式**

使用高推理：
+ 複雜的分析任務
+ 數學問題解決
+ 多步驟邏輯扣除
+ step-by-step思考可增加價值的任務

不使用 （省略 reasoning\$1effort) 或低推理：
+ 簡單事實查詢
+ 直接分類
+ 速度和成本最佳化
+ 直接的問答

**成本和效能權衡**

較高的推理模式會增加：
+ 訓練時間和成本
+ 推論延遲和成本
+ 複雜推理任務的模型功能

### 驗證您的 LLM 判斷
<a name="nova-rft-validating-judge"></a>

在生產環境中部署 LLM-as-a-judge 之前，請驗證判斷模型的評估是否符合人類判斷。這包括：
+ 針對您任務的代表性範例，測量 LLM 判斷者與人工評估者之間的協議率
+ 確保 LLM 與人類的協議符合或超過人類之間的協議費率
+ 識別判斷模型中的潛在偏差
+ 建立對獎勵訊號引導模型朝預期方向的信心

此驗證步驟有助於確保自動化評估程序會產生符合您生產品質標準的模型。

### LLM 判斷的 Lambda 組態
<a name="nova-rft-lambda-config"></a>

使用 LLM 做為判斷，是使用 Lambda 函數進行強化學習與可驗證獎勵 (RLVR) 的延伸。在 Lambda 函數中，您可以呼叫 Amazon Bedrock 中託管的其中一個模型。

**重要的組態需求：**


| Configuration | 需求 | 詳細資訊 | 
| --- | --- | --- | 
| Amazon Bedrock 輸送量 | 足夠的配額 | 確保所使用的 Amazon Bedrock 模型的輸送量配額足以滿足您的訓練工作負載 | 
| Lambda 逾時 | 延長逾時 | 將 Lambda 函數逾時設定為最長 15 分鐘。預設設定為 3 秒，這不足以回應 Amazon Bedrock 模型 | 
| Lambda 並行 | 並行增加 | Lambda 會在訓練期間平行叫用。增加並行以最大化可用輸送量 | 
| 配方組態 | 比對 Lambda 設定 | 必須在配方中設定並行限制 | 

## 建立和執行任務
<a name="nova-rft-creating-jobs"></a>

**啟動訓練任務**

使用 SageMaker 訓練任務筆記本範本： [https://docs.aws.amazon.com/sagemaker/latest/dg/nova-fine-tuning-training-job.html#nova-model-training-jobs-notebook](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-fine-tuning-training-job.html#nova-model-training-jobs-notebook)

**執行個體需求**

容器同時支援 Full-Rank 和 LoRA 訓練：
+ **LoRA 訓練** – 2/4/6/8 × p5.48xlarge 或 p5en.48xlarge 執行個體
+ **全執行訓練** – 2/4/6/8 × p5.48xlarge 執行個體 （必要）

## 監控訓練
<a name="nova-rft-monitoring"></a>

訓練日誌包含每個步驟的全方位指標。金鑰指標類別：

**獎勵指標**
+ `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 記憶體

## 使用微調的模型
<a name="nova-rft-using-models"></a>

訓練完成後，最終模型檢查點會儲存到您指定的輸出位置。檢查點路徑可用於：
+ 訓練日誌
+ `manifest.json` 輸出 Amazon S3 位置中的 檔案 （由 在您的筆記本`output_s3_uri`中定義）

## 限制和最佳實務
<a name="nova-rft-limitations"></a>

**限制**
+ **Lambda 逾時** – 獎勵函數必須在 15 分鐘內完成 （防止失控程序和管理成本）
+ **僅限單轉** – 不支援多轉對話
+ **資料需求** – 需要足夠的多樣性；難以獲得稀疏獎勵 (<5% 的正面範例）
+ **運算成本** – 比監督式微調更昂貴
+ **無多模態資料** – 僅支援文字資料類型

**最佳實務**

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

**訓練前評估**
+ 在 RFT 之前測試基準模型效能
+ 如果獎勵持續為 0%，請先使用 SFT 建立基本功能
+ 如果獎勵 >95%，RFT 可能不必要

**監控訓練**
+ 追蹤平均獎勵分數和分佈
+ 注意過度擬合 （訓練獎勵增加，同時驗證獎勵減少）
+ 尋找相關的模式：
  + 獎勵穩定低於 0.15
  + 隨時間增加獎勵差異
  + 降低驗證效能

**最佳化獎勵函數**
+ 在幾秒鐘內執行 （非分鐘）
+ 將外部 API 呼叫降至最低
+ 使用高效演算法
+ 實作適當的錯誤處理
+ 利用 Lambda 的平行擴展

**反覆運算策略**

如果獎勵未改善：
+ 調整獎勵函數設計
+ 增加資料集多樣性
+ 新增更多代表性範例
+ 驗證獎勵訊號是否清晰且一致

## 進階功能：Nova Forge
<a name="nova-rft-advanced"></a>

對於需要超出標準 RFT 限制之進階功能的使用者，Nova Forge 可作為付費訂閱服務方案使用：
+ 多迴轉對話支援
+ 以 >15 分鐘的執行時間獎勵函數
+ 其他演算法和調校選項
+ 自訂訓練配方修改
+ State-of-the-art技術

Nova Forge 在 SageMaker HyperPod 上執行，旨在支援企業客戶建置自己的前沿模型。

## 有用的命令和秘訣
<a name="nova-rft-useful-commands"></a>

提供[可觀測性指令碼](https://github.com/aws-samples/amazon-nova-samples/tree/main/customization/SageMakerUilts/SageMakerJobsMonitoring)的集合，以協助監控訓練任務的狀態和進度。

可用的指令碼包括：
+ 啟用電子郵件通知以進行訓練任務狀態更新
+ 根據任務組態取得訓練時間預估
+ 針對進行中的任務，取得預期訓練需要多久的近似值

**安裝**

**注意**  
請務必在使用下列任何指令碼之前重新整理您的 AWS 登入資料。

```
pip install boto3
git clone https://github.com/aws-samples/amazon-nova-samples.git
cd amazon-nova-samples/customization/SageMakerUilts/SageMakerJobsMonitoring/
```

**基本用量**

```
# Enabling email notifications for training job status updates
python enable_sagemaker_job_notifs.py --email test@amazon.com test2@gmail.com --region us-east-1 --platform SMTJ

Creating resources........
Please check your email for a subscription confirmation email, and click 'Confirm subscription' to start receiving job status email notifications!
You'll receive the confirmation email within a few minutes.
```

```
# Obtaining training time estimates based on job configurations
python get_training_time_estimate.py
```

```
# Obtaining approximations for how long training is expected to take for in-progress jobs
python get-training-job-progress.py --region us-east-1 --job-name my-training-job --num-dataset-samples 1000
```

如需其他詳細資訊和範例，請參閱[此處](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/SageMakerUilts/SageMakerJobsMonitoring/README.md)。