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

在强化学习微调期间,奖励函数会为每个模型回答进行数值评分。奖励信号是强化学习的优化目标,因此其质量直接决定了调优质量。所有奖励都会被限制在 [-1, 1] 范围内;超出该范围的任何值都会被截断。

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

您还可以使用复合奖励,将最多 16 个此类奖励函数与每个评分器的权重组合在一起。

已知限制

以下是每种奖励类型的超时时间:

奖励类型 超时
字符串匹配 无严格超时
代码执行 每次 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 作为评判者)决定。

此奖励支持两种模式:

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

自动评分器还可以输出其思维链推理,因此您可以像解析字符串匹配奖励一样解析回答的某个部分。例如,自动评分器可以输出 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
}

设置 Identity and Access Management 权限

如需允许调优作业调用 Cloud Run 服务,请配置以下 IAM 权限:

  • 您需要对 Cloud Run 服务拥有 roles/run.admin 权限,才能向其授予其他 IAM 权限。
  • 必须向 Gemini Enterprise Agent Platform Secure Fine Tuning Service Agent (service-<var>PROJECT_NUMBER</var>@gcp-sa-vertex-tune.iam.gserviceaccount.com) 授予调用 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

请将 <var>PROJECT_ID</var> 替换为您的 Google Cloud 项目 ID。

后续步骤