用于强化学习微调的奖励函数

奖励函数会在强化学习微调期间为每个模型响应进行数值评分。奖励信号是强化学习的优化对象,因此其质量直接决定了调优质量。所有奖励都会被剪裁到 [-1, 1] 范围内;超出该范围的任何值都会被剪裁。

本页介绍了每种受支持的奖励类型、设计奖励的推荐做法,以及如何在启动调优作业之前验证奖励配置。强化学习微调支持以下奖励类型:

您还可以使用复合奖励将这四种奖励中的任意一种与每个得分手的权重相结合。

已知限制

以下超时时间适用于每种奖励类型:

奖励类型 超时
字符串匹配 无严格的超时时间
代码执行 每次调用 evaluate 方法时,100 秒
基于 Gemini 的自动评估器 等待 LLM 评分响应时,超时时间为 1 分钟
Cloud Run 每个触发器的超时时间为 5 分钟

在 Google Cloud 控制台中配置奖励

在Google Cloud 控制台中的模型 > 调优下创建强化学习微调作业时,您可以在奖励配置步骤中配置单个奖励或复合奖励:

  1. 输入奖励名称,然后从下拉菜单中选择奖励类型:

    • 字符串匹配奖励:配置解析类型(例如正则表达式提取)、匹配操作(例如完全匹配)和目标表达式,以及正确答案和错误答案的奖励。
    • 基于 LLM 的奖励:提供自动评分器提示,并配置如何解析和评分自动评分器的输出。
    • 基于 Python 函数的奖励:直接在内嵌编辑器中输入自定义 Python 评估代码,或上传 Python 文件。
    • 通过 Cloud Run 实现完全自定义的奖励:提供 Cloud Run 服务的 URI。
  2. 为奖励卡指定奖励权重。

  3. 点击完成。

  4. 如需配置复合奖励,请点击 + 添加其他奖励(最多 16 项奖励)。每个折叠的奖励卡片都会显示其配置的权重,而表单会显示总权重摘要。

字符串匹配奖励

API 规范:ReinforcementTuningStringMatchRewardScorer

字符串匹配奖励是一种便捷的配置,可用于根据已知的标准答案评估模型生成的回答。这对于数学问题等任务特别有用,因为每个问题都有已知的正确答案。

由于模型可能会在得出最终答案之前输出思维链推理或其他字词,而您希望将最终答案与标准答案进行比较,因此字符串匹配得分计算器支持使用正则表达式提取来处理模型生成的输出的解析器函数。然后,您需要定义如何将通过正则表达式提取的模型回答与标准答案进行比较。标准答案通过 references 中的一个字段提供,您可以在创建训练文件和验证文件时在每个示例中填充该字段。

如需了解配置架构,请参阅 ReinforcementTuningStringMatchRewardScorer API 规范。如需详细了解 references 字段,请参阅调整数据集页面。

基于 Gemini 的自动评估器奖励

API 规范:ReinforcementTuningAutoraterScorer

基于 Gemini 的自动评估器奖励是一种便捷的配置,可用于根据 LLM 作为评判工具的反馈来评估模型生成的回答。例如,您可能希望模型以某种语气输出回答,而语气由自动评估器(LLM-as-a-judge)决定。

此奖励支持两种模式:

  • 自动评估器可以直接输出一个数值分数,用作强化学习反馈。
  • 自动评估器可以输出可解析并与预定义模式进行比较的判定。

自动评分器还可以输出其思维链推理,因此您可以像解析字符串匹配奖励一样解析回答的某个部分。例如,自动评分器可以输出 blahblahblah <answer>Yes</answer> 或 blahblahblah <answer>No</answer>,您可以创建一个解析函数来提取 <answer> 和 </answer> 之间的自动评分器响应。然后,您可以将自动评分器输出与预定义的表达式进行比较,该表达式将 Yes 映射到 +1 分数,并将任何不匹配的值(例如 No)映射到 -1 分数。

以下示例自动评分器配置会过滤以获取 <answer> 标记之间的文本,并将 Yes 映射到 +1,将任何其他值映射到 -1:

{
  "autoraterResponseParseConfig": {
    "parseType": "REGEX_EXTRACT",
    "regexExtractExpression": "<answer>(.*?)</answer>"
  },
  "exactMatchScorer": {
    "expression": "Yes",
    "correctAnswerReward": 1.0,
    "wrongAnswerReward": -1.0
  }
}

代码执行奖励

API 规范:ReinforcementTuningCodeExecutionRewardScorer

借助代码执行奖励配置,您可以提供用户定义的 Python 代码来评估模型回答,而无需设置 Cloud Run 服务。实现一个具有以下签名的 evaluate 函数:

def evaluate(example: dict[str, Any], response: dict[str, Any]) -> float:
  ...

该函数接收:

  • example:采用 ProtoJSON 格式的 ReinforcementTuningExample(即与训练或验证数据集中的一行格式相同,但键必须采用驼峰式命名法)。系统指令 (example.get("systemInstruction")) 和参考答案 (example.get("references")) 也包含在 example 中,前提是它们已在训练或验证数据集中设置。
  • response:采用 ProtoJSON 格式(即键必须采用驼峰式大小写)的 Content,与 Gemini 模型的在线预测响应相同。

该函数必须返回一个浮点数,然后将其剪裁到 [-1, 1] 范围内。

实现示例:

def evaluate(example, response) -> float:
  response_str = response.get("parts", [])[0]["text"]
  references = example.get("references", {})

  if response_str == references.get("concise_answer"):
    return 1.0
  return -1.0

受支持的库

除了 Python 标准库之外,代码执行沙盒中还提供以下 Python 库:

  • cv2
  • matplotlib
  • mpmath
  • numpy
  • pandas
  • seaborn
  • sklearn
  • statsmodels
  • sympy

超时和资源限制

每次 evaluate 调用都有 100 秒的超时时间。超时的通话会重试多次。如果多次重试后,调用仍超时,则该样本将从奖励计算中舍弃。

我们强烈建议您使用 ValidateReinforcementTuningReward API 测试代码(请参阅验证奖励配置),并争取在 100 秒内完成代码执行,以获得最佳性能。

代码执行环境每次调用提供 1 个 CPU 和 1 GB 内存。

通过 Cloud Run 实现完全自定义的奖励

API 规范:ReinforcementTuningCloudRunRewardScorer

借助 Cloud Run 奖励配置,您可以实现完全可自定义的评分逻辑。您的 Cloud Run 服务必须实现以下 HTTP 合约。

HTTP 方法: POST

请求正文 (application/json):

{
  "example": { "object(RLFTExample)" },
  "response": { "object(Content)" },
  "metadata": {
    "step": int,
    "tuningJobId": int64
  }
}

example 是 ProtoJSON 格式的 ReinforcementTuningExample,response 是 ProtoJSON 格式的 Content。

响应正文 (application/json):

{
  "reward": float,
  "...": {}
}

示例请求

{
  "example": {
    "contents": [
      {
        "role": "user",
        "parts": [
          { "text": "What is the capital of France?" }
        ]
      }
    ],
    "references": {
      "answer": "Paris"
    }
  },
  "response": {
    "parts": [
      { "text": "London" }
    ]
  },
  "metadata": {
    "step": 1,
    "tuningJobId": 123456789
  }
}

示例响应

{
  "reward": -1.0
}

设置 IAM 权限

  • 您需要对 Cloud Run 服务拥有 roles/run.admin 权限,才能向其授予其他 IAM 权限。
  • 必须向 Gemini Enterprise Agent Platform Secure Fine Tuning Service Agent (service-PROJECT_NUMBER@gcp-sa-vertex-tune.) 授予调用 Cloud Run 服务的权限(例如,通过在 IAM 中授予 roles/run.invoker)。

超时和重试

Cloud Run 服务处理每个奖励计算请求的时间上限为 300 秒。如果出现请求错误,服务会先使用指数退避算法(例如,在 2 秒、4 秒、8 秒、16 秒和 32 秒后)重试,然后再放弃。如果重试所有次数后仍未返回有效响应,则将相应奖励标记为 NaN。

奖励设计建议

以下各部分介绍了设计奖励函数的最佳实践,这些函数可为强化学习微调生成校准良好的信号。

奖励比例

每项奖励都必须在 [-1, 1] 的范围内。超出此范围的奖励值会被剪裁。

什么样的奖励才算好

  • 与预期结果一致,并根据人类偏好进行了适当的校准。
  • 清晰且一致。例如,模型很难从高方差的自动评分器奖励中有效地学习。
  • 可应对无效输出。例如,当模型生成无效输出时,奖励应能够返回较低的值,而不是崩溃并返回 NaN,以便调优作业知道这些是需要优化的不良生成结果。如果超过 80% 的奖励调用出现错误(RPC 错误,返回 NaN),系统会自动停止调优作业。
  • 旨在防止奖励被黑客入侵。避免出现以下配置:模型可以利用漏洞来获得高奖励,但实际上性能并不好。

验证奖励配置

API 规范:ValidateReinforcementTuningReward

调优作业的费用可能很高,而奖励对于确保调优作业的有效性至关重要。建议您在启动调优作业之前验证奖励配置:

  • 在Google Cloud 控制台中或通过调用 ValidateReinforcementTuningReward API 测试奖励的有效性和稳健性。小错误(例如解析错误、未处理的极端情况或无效的代码段)可能会导致您的奖励和调整失效。
  • 使用自定义奖励对部分数据集执行评估。如果数据集的奖励过难(奖励几乎总是 0)或过于简单(奖励几乎总是 1),强化学习就无法很好地学习。

在 Google Cloud 控制台中验证

在创建经调优的模型向导的测试奖励(可选)步骤中:

  1. 在训练示例编辑器中,输入包含 systemInstruction、contents 和 references 的 JSON 数据集示例行。
  2. 在模型回答示例字段中,输入回答示例,或点击根据训练示例生成,让基础模型生成回答示例。
  3. 点击测试,根据示例评估您的奖励配置。
  4. 查看显示的状态横幅和总体得分。点击查看单项奖励信息(或查看综合奖励的单项得分和调试信息),打开侧边抽屉式导航栏,然后检查单项奖励得分、错误消息和调试日志。

使用 REST API 进行验证

ValidateReinforcementTuningReward API 需要一个 sampleResponse(类型为 Content,通常从 Gemini 模型输出中获取)、一个 RLFTExample 以及 singleRewardConfig 或 compositeRewardConfig 中的一个。 如果返回的结果包含错误或 NaN,则说明奖励设置存在问题,您需要在运行实际的调优作业之前解决该问题。

curl -i -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://us-central1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/tuningJobs:validateReinforcementTuningReward" \
  -d @validate_reward_request.json

请将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

后续步骤