

# 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>

评测对于判断强化微调过程是否实现以下目标至关重要：
+ 提升模型与您特定使用案例及人类价值偏好的对齐程度
+ 维持或提升模型在核心任务上的能力
+ 避免产生非预期副作用，例如事实准确性下降、内容冗余度增加或其他任务性能退化
+ 满足由奖励函数定义的自定义成功标准

## 何时使用 RFT 评测
<a name="nova-rft-eval-when"></a>

在以下场景中使用 RFT 评测：
+ RFT 训练之前：在评测数据集上建立基线指标
+ RFT 训练期间：使用中间检查点监控训练进度
+ RFT 训练之后：验证最终模型是否符合您的要求
+ 模型对比：采用一致的奖励标准对多个模型版本进行评测

**注意**  
如需领域专属的自定义评估指标，请使用 RFT 评测。对于通用评测（准确率、困惑度、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 格式（每行一个 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>

两个预设的奖励函数（`prime_code` 和 `prime_math`）可用作 Lambda 层，以便与 RFT Lambda 函数集成。

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

这些预设函数提供开箱即用的评测能力，适用于：
+ `prime_code`：代码生成和正确性评测
+ `prime_math`：数学推理和问题求解评测

### 快速设置
<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，并添加 AWSSDKPandas-Python312 以获取 numpy 依赖项）。

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

**主要特征**
+ 从 Markdown 代码块中自动提取代码
+ 函数检测与基于调用的测试
+ 带超时保护的测试用例执行
+ 语法验证与编译检查
+ 包含回溯信息的详细错误报告

### 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`：指标标识符（例如 accuracy、fluency）
  + `value`：指标得分（通常为 0.0 到 1.0）
  + `type`：Metric（用于报告）或 Reward（用于训练）

## 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>

评测作业会以 JSONL 格式将结果输出到指定的 S3 位置。每行包含一个样本的评测结果：

```
{  
  "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（最佳），具体取决于实现逻辑
+ 用途：以单一数值概括整体性能
+ 应用场景：模型对比、跟踪训练过程中的效果提升

**各项指标**
+ 指标类型：用于分析的参考性指标
+ 奖励类型：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 → Lambda 调用的 IAM 权限
+ 查看 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 训练迭代
+ 持续监控：定期使用新数据重新评测