強化學習微調的獎勵函式

在強化學習微調期間,獎勵函式會為每項模型回覆評分。獎勵信號是強化學習的最佳化目標,因此其品質會直接決定調整品質。所有獎勵都會限制在 [-1, 1] 範圍內,超出該範圍的值都會遭到截斷。

本頁面說明支援的獎勵類型、設計獎勵的最佳做法,以及如何在啟動調整工作前驗證獎勵設定。強化學習微調支援下列獎勵類型:

您也可以使用複合獎勵,結合最多 16 個這類獎勵函式,並為每個評分器設定權重。

已知限制

以下是各獎勵類型的逾時時間:

獎勵類型 逾時
字串比對 沒有嚴格的逾時限制
執行程式碼 每 evaluate 方法呼叫 100 秒
以 Gemini 為基礎的自動評分工具 等待 LLM 評分回應時,逾時時間為 1 分鐘
Cloud Run 每個觸發條件的逾時時間為 5 分鐘

在 Google Cloud 控制台中設定獎勵

在 Google Cloud 控制台的「Models」(模型)>「Tuning」(調整) 下方建立強化學習微調工作時,您可以在「Reward configuration」(獎勵設定) 步驟 中設定單一或複合獎勵:

  1. 輸入「Reward name」(獎勵名稱),然後從下拉式選單中選擇「Reward type」(獎勵類型):

    • 字串比對獎勵:設定「剖析類型」 (例如規則運算式擷取)、「比對作業」 (例如「完全比對」) 和目標「運算式」,以及正確和錯誤答案的獎勵。
    • 透過 LLM 提供回饋:提供自動評分工具提示,並設定自動評分工具輸出內容的剖析和評分方式。
    • 透過 Python 函式提供回饋:直接在內嵌編輯器中輸入自訂 Python 評估程式碼,或上傳 Python 檔案。
    • 透過 Cloud Run 隨意自訂回饋:提供 Cloud Run 服務的 URI。
  2. 指定獎勵卡片的獎勵權重。

  3. 按一下「完成」。

  4. 如要設定複合獎勵,請按一下「+ 新增其他獎勵」 (最多 16 項獎勵)。每張收合的獎勵卡都會顯示設定的權重,表單則會顯示總權重摘要。

字串比對回饋

API 規格:ReinforcementTuningStringMatchRewardScorer

字串比對獎勵是便利的設定,可根據已知的基準真相評估模型生成的回覆。這項功能特別適用於數學問題等工作,因為每個問題都有已知的基準真相答案。

模型可能會先輸出思維鏈提示推論或其他字詞,才會產生最終答案,因此字串比對評分器支援剖析器函式,可使用規則運算式擷取功能處理模型生成的輸出內容,並與基準真相進行比對。接著,您需要定義如何比較 regex 擷取的模型回覆與基準真相。基準真相是透過 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-<var>PROJECT_NUMBER</var>@gcp-sa-vertex-tune.iam.gserviceaccount.com) 必須具備權限 (例如在 IAM 中授予 roles/run.invoker),才能叫用 Cloud Run 服務。

逾時和重試

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. 在「Training Example」(訓練範例) 編輯器中,輸入包含 systemInstruction、contents 和 references 的 JSON 資料集範例行。
  2. 在「Sample model response」(模型回覆範例) 欄位中輸入回覆範例,或按一下「Generate from Training Example」(根據訓練範例生成),讓基礎模型生成回覆範例。
  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。

後續步驟