

# RFT 評価
<a name="nova-rft-evaluation"></a>

## RFT 評価とは?
<a name="nova-rft-eval-what-is"></a>

RFT 評価では、強化学習トレーニングの前、最中、または後にカスタム報酬関数を使用してモデルのパフォーマンスを評価できます。事前定義されたメトリクスを使用する標準評価とは異なり、RFT 評価では、特定の要件に基づいてモデル出力をスコアリングする Lambda 関数を通じて独自の成功基準を定義できます。

## RFT で評価する理由
<a name="nova-rft-eval-why"></a>

RL ファインチューニングプロセスで以下を実現できたかどうかを判断するには、評価が不可欠です。
+ 特定のユースケースと人間の価値観とのモデルアライメントを改善
+ 主要なタスクでモデル機能を維持または改善
+ 事実性の低下、冗長性の向上、他のタスクのパフォーマンスの低下などの意図しない副作用を回避
+ 報酬関数で定義されたカスタム成功基準を充足

## RFT 評価を使用するタイミング
<a name="nova-rft-eval-when"></a>

RFT 評価は、以下のシナリオで使用します。
+ RFT トレーニング前: 評価データセットにベースラインメトリクスを確立する
+ RFT トレーニング中: 中間チェックポイントでトレーニングの進行状況をモニタリングする
+ RFT トレーニング後: 最終モデルが要件を満たしていることを確認する
+ モデルの比較: 一貫した報酬基準を使用して複数のモデルバージョンを評価する

**注記**  
ドメイン固有のカスタムメトリクスが必要な場合は、RFT 評価を使用します。汎用評価 (精度、Perplexity、BLEU) には、標準的な評価方法を使用します。

## データ形式の要件
<a name="nova-rft-eval-data-format"></a>

### 入力データ構造
<a name="nova-rft-eval-input-structure"></a>

RFT 評価入力データは、OpenAI 強化ファインチューニング形式に従う必要があります。各例は、以下を含む JSON オブジェクトです。
+ `messages` – `system` および `user` ロールとの会話ターンの配列
+ `reference_answer` – 報酬関数がスコアリングに使用する、期待される出力またはグラウンドトゥルースデータ

### データ形式の例
<a name="nova-rft-eval-data-example"></a>

```
{  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "type": "text",  
          "text": "Solve for x. Return only JSON like {\"x\": <number>}. Equation: 2x + 5 = 13"  
        }  
      ]  
    }  
  ],  
  "reference_answer": {  
    "x": 4  
  }  
}
```

### 現在の制限事項
<a name="nova-rft-eval-limitations"></a>
+ テキストのみ: マルチモーダル入力 (画像、音声、動画) はサポートされていません
+ シングルターン会話: シングルユーザーメッセージのみをサポート (マルチターンダイアログなし)
+ JSON 形式: 入力データは JSONL 形式である必要があります (1 行あたり 1 つの JSON オブジェクト)
+ モデル出力: 指定されたモデルによって生成された補完結果に対して評価が実行されます

## 評価レシピの準備
<a name="nova-rft-eval-recipe"></a>

### サンプルノートブック
<a name="nova-rft-eval-sample-notebook"></a>

完全な例については、「[評価ノートブック](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-evaluation.html#nova-model-evaluation-notebook)」を参照してください。

### サンプルレシピ設定
<a name="nova-rft-eval-sample-recipe"></a>

```
run:  
  name: nova-lite-rft-eval-job    
  model_type: amazon.nova-lite-v1:0:300k    
  model_name_or_path: s3://escrow_bucket/model_location # [MODIFIABLE] S3 path to your model or model identifier  
  replicas: 1 # [MODIFIABLE] For SageMaker Training jobs only; fixed for HyperPod jobs  
  data_s3_path: "" # [REQUIRED FOR HYPERPOD] Leave empty for SageMaker Training jobs and use TrainingInput in sagemaker python SDK  
  output_s3_path: "" # [REQUIRED] Output artifact S3 path for evaluation results  
  
evaluation:  
  task: rft_eval # [FIXED] Do not modify  
  strategy: rft_eval # [FIXED] Do not modify  
  metric: all # [FIXED] Do not modify  
  
# Inference Configuration  
inference:  
  max_new_tokens: 8192 # [MODIFIABLE] Maximum tokens to generate  
  top_k: -1 # [MODIFIABLE] Top-k sampling parameter  
  top_p: 1.0 # [MODIFIABLE] Nucleus sampling parameter  
  temperature: 0 # [MODIFIABLE] Sampling temperature (0 = deterministic)  
  top_logprobs: 0 # [MODIFIABLE] Set between 1-20 to enable logprobs output  
  
# =============================================================================  
# Bring Your Own Reinforcement Learning Environment  
# =============================================================================  
rl_env:  
  reward_lambda_arn: arn:aws:lambda:<region>:<account_id>:function:<reward-function-name>
```

## プリセット報酬関数
<a name="nova-rft-eval-preset-functions"></a>

RFT Lambda 関数と簡単に統合できるように、2 つのプリセット報酬関数 (`prime_code` および `prime_math`) を Lambda レイヤーとして使用できます。

### 概要
<a name="nova-rft-eval-preset-overview"></a>

これらのプリセット関数は、複雑な設定なしで以下を評価できます。
+ `prime_code` – コードの生成と正確性の評価
+ `prime_math` – 数学的な推論と問題解決の評価

### Quick Setup
<a name="nova-rft-eval-preset-setup"></a>

1. [nova-custom-eval-sdk リリース](https://github.com/aws/nova-custom-eval-sdk/releases)から Lambda レイヤーをダウンロードします。

1. AWS コマンドラインインターフェイス (AWS CLI) を使用して Lambda レイヤーを公開する:

   ```
   aws lambda publish-layer-version \
       --layer-name preset-function-layer \
       --description "Preset reward function layer with dependencies" \
       --zip-file fileb://universal_reward_layer.zip \
       --compatible-runtimes python3.9 python3.10 python3.11 python3.12 \
       --compatible-architectures x86_64 arm64
   ```

1. AWS マネジメントコンソールで Lambda 関数にレイヤーを追加します (カスタムレイヤーから preset-function-layer を選択し、numpy の依存関係のために AWSSDKPandas-Python312 を追加します)。

1. Lambda コードで次をインポートして使用します:

   ```
   from prime_code import compute_score  # For code evaluation
   from prime_math import compute_score  # For math evaluation
   ```

### prime\_code 関数
<a name="nova-rft-eval-preset-code"></a>

テストケースに対してコードを実行し、正確性を測定することで、Python コード生成タスクを評価します。

**入力データセット形式の例**

```
{"messages":[{"role":"user","content":"Write a function that returns the sum of two numbers."}],"reference_answer":{"inputs":["3\n5","10\n-2","0\n0"],"outputs":["8","8","0"]}}
{"messages":[{"role":"user","content":"Write a function to check if a number is even."}],"reference_answer":{"inputs":["4","7","0","-2"],"outputs":["True","False","True","True"]}}
```

**主な特徴**
+ マークダウンコードブロックからの自動コード抽出
+ 関数検出と呼び出しベースのテスト
+ タイムアウト保護を受けたテストケースの実行
+ 構文の検証とコンパイルのチェック
+ トレースバックを使用した詳細なエラーレポート

### prime\_math 関数
<a name="nova-rft-eval-preset-math"></a>

シンボリック数学のサポートにより、数学的な推論と問題解決能力を評価します。

**入力形式**

```
{"messages":[{"role":"user","content":"What is the derivative of x^2 + 3x?."}],"reference_answer":"2*x + 3"}
```

**主な特徴**
+ SymPy を使用したシンボリック数学評価
+ 複数の回答形式 (LaTeX、プレーンテキスト、シンボリック)
+ 数学的同等性チェック
+ 式の正規化と簡素化

### データ形式の要件
<a name="nova-rft-eval-preset-data-format"></a>

**コード評価の場合**
+ 入力: 関数引数の配列 (適切な型: 整数、文字列など)
+ 出力: 予想される戻り値の配列 (適切な型: ブール値、数値など)
+ コード: 関数定義が明確な Python のコードである必要があります

**数学的な評価の場合**
+ 参照回答: 数式または数値
+ レスポンス: LaTeX、プレーンテキスト、またはシンボリック表記
+ 同等性: 文字列の一致だけでなく、シンボリックにチェックされている

### ベストプラクティス
<a name="nova-rft-eval-preset-best-practices"></a>
+ テストケースで適切なデータ型を使用する (整数と文字列、ブール値と「True」)
+ コードの問題で明確な関数署名を提供する
+ テスト入力にエッジケースを含める (ゼロ、負の数、空の入力)
+ 参照回答で数式を一貫してフォーマットする
+ デプロイ前にサンプルデータを使用して報酬関数をテストする

### エラー処理
<a name="nova-rft-eval-preset-error-handling"></a>

どちらの関数にも、以下の堅牢なエラー処理が含まれています。
+ 生成されたコードのコンパイルエラー
+ 実行中のランタイム例外
+ 不正な形式の入力データ
+ 無限ループのタイムアウトシナリオ
+ 無効な数式

## 報酬関数を作成する
<a name="nova-rft-eval-custom-reward"></a>

### Lambda ARN の要件
<a name="nova-rft-eval-lambda-arn"></a>

Lambda ARN は次の形式に従う必要があります。

```
"arn:aws:lambda:*:*:function:*SageMaker*"
```

Lambda にこの命名スキームがない場合、ジョブは次のエラーで失敗します:

```
[ERROR] Unexpected error: lambda_arn must contain one of: ['SageMaker', 'sagemaker', 'Sagemaker'] when running on SMHP platform (Key: lambda_arn)
```

### Lambda リクエスト形式
<a name="nova-rft-eval-lambda-request"></a>

Lambda 関数は次の形式でデータを受け取ります。

```
[  
  {  
    "id": "sample-001",  
    "messages": [  
      {  
        "role": "user",  
        "content": [  
          {  
            "type": "text",  
            "text": "Do you have a dedicated security team?"  
          }  
        ]  
      },  
      {  
        "role": "nova_assistant",  
        "content": [  
          {  
            "type": "text",  
            "text": "As an AI developed by Company, I don't have a dedicated security team..."  
          }  
        ]  
      }  
    ],  
    "reference_answer": {  
      "compliant": "No",  
      "explanation": "As an AI developed by Company, I do not have a traditional security team..."  
    }  
  }  
]
```

**注記**  
メッセージ構造には、入力データ形式に一致するネストされた `content` 配列が含まれます。ロール `nova_assistant` を含む最後のメッセージには、モデルが生成したレスポンスが含まれます。

### Lambda レスポンス形式
<a name="nova-rft-eval-lambda-response"></a>

Lambda 関数は次の形式でデータを返す必要があります。

```
[  
  {  
    "id": "sample-001",  
    "aggregate_reward_score": 0.75,  
    "metrics_list": [  
      {  
        "name": "accuracy",  
        "value": 0.85,  
        "type": "Metric"  
      },  
      {  
        "name": "fluency",  
        "value": 0.90,  
        "type": "Reward"  
      }  
    ]  
  }  
]
```

**レスポンスフィールド**
+ `id` – 入力サンプル ID と一致する必要があります
+ `aggregate_reward_score` – 総合スコア (通常は 0.0～1.0)
+ `metrics_list` – 以下を含む個々のメトリクスの配列:
  + `name` – メトリクス識別子 (「精度」、「流暢さ」など)
  + `value` – メトリクススコア (通常は 0.0～1.0)
  + `type` – 「メトリクス」 (レポート用) または「報酬」 (トレーニングに使用)

## IAM アクセス許可
<a name="nova-rft-eval-iam"></a>

### 必要なアクセス許可
<a name="nova-rft-eval-iam-required"></a>

SageMaker 実行ロールには、Lambda 関数を呼び出すためのアクセス許可が必要です。SageMaker 実行ロールにこのポリシーを追加します。

```
{  
  "Version": "2012-10-17",		 	 	   
  "Statement": [  
    {  
      "Effect": "Allow",  
      "Action": [  
        "lambda:InvokeFunction"  
      ],  
      "Resource": "arn:aws:lambda:region:account-id:function:function-name"  
    }  
  ]  
}
```

### Lambda 実行ロール
<a name="nova-rft-eval-iam-lambda"></a>

Lambda 関数の実行ロールには、基本的な Lambda 実行アクセス許可が必要です。

```
{  
  "Version": "2012-10-17",		 	 	   
  "Statement": [  
    {  
      "Effect": "Allow",  
      "Action": [  
        "logs:CreateLogGroup",  
        "logs:CreateLogStream",  
        "logs:PutLogEvents"  
      ],  
      "Resource": "arn:aws:logs:*:*:*"  
    }  
  ]  
}
```

Lambda 関数が他の AWS サービス (参照データの場合は S3、ログ記録の場合は DynamoDB など) にアクセスする場合は、それらのアクセス許可を Lambda 実行ロールに追加します。

## 評価ジョブを実行する
<a name="nova-rft-eval-execute"></a>

1. **データを準備する** – データ形式の要件に従って評価データをフォーマットし、JSONL ファイルを S3 にアップロードします: `s3://your-bucket/eval-data/eval_data.jsonl`

1. **レシピを設定する** – 設定でサンプルレシピを更新します。
   + `model_name_or_path` をモデルの場所に設定する
   + `lambda_arn` を報酬関数 ARN に設定する
   + `output_s3_path` を必要な出力場所に設定する
   + 必要に応じて `inference` パラメータを調整する

   レシピを `rft_eval_recipe.yaml` として保存する

1. **評価を実行する** – 提供されたノートブックを使用して評価ジョブを実行します: [評価ノートブック](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-evaluation.html#nova-model-evaluation-notebook)

1. **進行状況をモニタリングする** – 以下を通じて評価ジョブをモニタリングします。
   + SageMaker コンソール: ジョブのステータスとログを確認する
   + CloudWatch Logs: 詳細な実行ログを表示する
   + Lambda ログ: 報酬関数の問題をデバッグする

## 評価結果を理解する
<a name="nova-rft-eval-results"></a>

### 出力形式
<a name="nova-rft-eval-output-format"></a>

評価ジョブは、指定された S3 の場所に JSONL 形式で結果を出力します。各行には、1 つのサンプルの評価結果が含まれます。

```
{  
  "id": "sample-001",  
  "aggregate_reward_score": 0.75,  
  "metrics_list": [  
    {  
      "name": "accuracy",  
      "value": 0.85,  
      "type": "Metric"  
    },  
    {  
      "name": "fluency",  
      "value": 0.90,  
      "type": "Reward"  
    }  
  ]  
}
```

**注記**  
RFT 評価ジョブの出力は、Lambda レスポンス形式と同じです。評価サービスは、Lambda 関数の応答を変更せずにパススルーし、報酬の計算と最終結果の一貫性を確保します。

### 結果の解釈
<a name="nova-rft-eval-interpret"></a>

**報酬スコアの集計**
+ 範囲: 通常 0.0 (最悪)～1.0 (最良) ですが、実装によって異なります
+ 目的: 全体的なパフォーマンスをまとめた 1 つの数値
+ 使用法: モデルを比較し、トレーニングに対する改善を追跡する

**個々のメトリクス**
+ メトリクスタイプ: 分析のための情報メトリクス
+ 報酬タイプ: RFT トレーニング中に使用されるメトリクス
+ 解釈: 値が大きいほど一般的にパフォーマンスが向上する (逆メトリクスを設計しない限り)

### パフォーマンスベンチマーク
<a name="nova-rft-eval-benchmarks"></a>

何が「良好」なパフォーマンスとなるかは、ユースケースによって異なります。


| スコア範囲 | 解釈 | アクション | 
| --- | --- | --- | 
| 0.8～1.0 | 優秀 | デプロイの準備ができたモデル | 
| 0.6～0.8 | 良好 | 軽微な改善が有益である可能性があります | 
| 0.4～0.6 | 可 | 大幅な改善が必要 | 
| 0.0～0.4 | 不良 | トレーニングデータと報酬関数を確認する | 

**重要**  
これらは一般的なガイドラインです。ビジネス要件、ベースラインモデルのパフォーマンス、ドメイン固有の制約、さらなるトレーニングの費用対効果分析に基づいて、独自のしきい値を定義します。

## トラブルシューティング
<a name="nova-rft-eval-troubleshooting"></a>

### 一般的な問題
<a name="nova-rft-eval-common-issues"></a>


| 問題 | 原因 | ソリューション | 
| --- | --- | --- | 
| Lambda タイムアウト | 複雑な報酬計算 | Lambda タイムアウトを増やすか、関数を最適化する | 
| アクセス許可が拒否された | IAM アクセス許可がない | SageMaker ロールが Lambda を呼び出せることを確認する | 
| スコアの不整合 | 非決定的報酬関数 | 固定シードまたは決定論的ロジックを使用する | 
| 結果が欠落している | Lambda エラーがキャッチされない | Lambda で包括的なエラー処理を追加する | 

### デバッグ用チェックリスト
<a name="nova-rft-eval-debug-checklist"></a>
+ ネストされたコンテンツ配列で入力データが正しい形式に従っていることを確認する
+ Lambda ARN が正しく、関数がデプロイされていることを確認する
+ SageMaker 用の IAM アクセス許可を確認する → Lambda 呼び出し
+ CloudWatch ログで Lambda エラーを確認する
+ Lambda レスポンスが予想される形式と一致することを確認する

## ベストプラクティス
<a name="nova-rft-eval-best-practices-section"></a>
+ シンプルに開始する: 基本的な報酬関数から始めて反復する
+ Lambda を個別にテストする: 完全な評価の前に Lambda テストイベントを使用する
+ スモールデータセットで検証する: フルデータセットの前にサブセットで評価を実行する
+ バージョン管理: モデルバージョンとともに報酬関数のバージョンを追跡する
+ コストをモニタリングする: Lambda 呼び出しとコンピューティング時間がコストに影響を与える
+ 広範なログ記録: Lambda 内の出力ステートメントを使用してデバッグする
+ タイムアウトを適切に設定する: 忍耐力とコストのバランスをとる
+ メトリクスを文書化する: 各メトリクスが測定する内容を明確に定義する

## 次のステップ
<a name="nova-rft-eval-next-steps"></a>

RFT 評価を完了した後:
+ 結果が満足できる場合: モデルを本番環境にデプロイする
+ 改善が必要な場合:
  + 報酬関数を調整する
  + より多くのトレーニングデータを収集する
  + トレーニングハイパーパラメータを変更する
  + 追加の RFT トレーニングイテレーションを実行する
+ 継続的なモニタリング: 新しいデータを使用して定期的に再評価する