強化學習微調的獎勵函式

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

本頁面說明各項支援的獎勵類型、設計獎勵的建議做法,以及如何驗證獎勵設定,再啟動微調工作。強化學習微調支援下列獎勵類型:

您也可以使用複合獎勵,將這四種獎勵與每個評分者的權重結合。

已知限制

以下逾時時間適用於各獎勵類型:

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

在 Cloud de Confiance 控制台中設定獎勵

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

  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
}

設定 IAM 權限

  • 您必須具備 Cloud Run 服務的 roles/run.admin 權限,才能授予其他 IAM 權限。
  • 您必須授予 Gemini Enterprise Agent Platform Secure Fine Tuning Service Agent (service-PROJECT_NUMBER@gcp-sa-vertex-tune.s3ns-system.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

微調作業的成本可能很高,因此獎勵對於微調作業的成效至關重要。建議您先驗證獎勵設定,再啟動微調工作:

  • 在Cloud de Confiance 控制台中測試獎勵的有效性和穩定性,或呼叫 ValidateReinforcementTuningRewardAPI。細微錯誤 (例如剖析錯誤、未處理的極端情況或無效的程式碼片段) 可能會導致獎勵和微調失效。
  • 在資料集樣本上,使用自訂獎勵執行評估。如果資料集中的獎勵太難 (幾乎一律為 0) 或太簡單 (幾乎一律為 1),增強式學習就無法順利學習。

在 Cloud de Confiance 控制台中驗證

在「建立調整後的模型」精靈的「測試獎勵 (選用)」步驟中:

  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 替換為 Cloud de Confiance by S3NS 專案 ID。

後續步驟