Reward-Funktionen für die Abstimmung für Reinforcement Learning

Eine Belohnungsfunktion bewertet jede Modellantwort während der Feinabstimmung durch Reinforcement Learning numerisch. Das Belohnungssignal ist das, worauf die Optimierung beim Reinforcement Learning abzielt. Seine Qualität bestimmt also direkt die Qualität der Abstimmung. Alle Prämien werden auf den Bereich [-1, 1] begrenzt. Alle Werte außerhalb dieses Bereichs werden begrenzt.

Auf dieser Seite werden die einzelnen unterstützten Belohnungstypen, empfohlene Vorgehensweisen für das Entwerfen von Belohnungen und das Validieren einer Belohnungskonfiguration beschrieben, bevor Sie einen Abstimmungsjob starten. Bei der Feinabstimmung für Reinforcement Learning werden die folgenden Arten von Belohnungen unterstützt:

Sie können auch eine beliebige dieser vier Optionen mit gewichteten Ergebnissen kombinieren, indem Sie eine zusammengesetzte Prämie verwenden.

Bekannte Einschränkungen

Die folgenden Zeitlimits gelten pro Prämientyp:

Belohnungstyp Zeitüberschreitung
Stringübereinstimmung Kein strenges Zeitlimit
Code-Ausführung 100 Sekunden für jeden evaluate-Methodenaufruf
Gemini-basierter Autorater 1-minütige Zeitüberschreitung beim Warten auf eine LLM-Bewertungsantwort
Cloud Run 5‑Minuten-Zeitüberschreitung für jeden Trigger

Prämien in der Cloud de Confiance Console konfigurieren

Wenn Sie in derCloud de Confiance -Konsole unter Modelle > Feinabstimmung einen Job zur Feinabstimmung für das bestärkende Lernen erstellen, können Sie im Schritt Belohnungskonfiguration einzelne oder zusammengesetzte Belohnungen konfigurieren:

  1. Geben Sie einen Namen für die Prämie ein und wählen Sie im Drop-down-Menü einen Prämientyp aus:

    • Belohnung für String-Abgleich: Konfigurieren Sie einen Parsertyp (z. B. Extraktion regulärer Ausdrücke), einen Abgleichsvorgang (z. B. Genaue Übereinstimmung) und einen Ausdruck sowie Belohnungen für richtige und falsche Antworten.
    • LLM-basierte Belohnung: Geben Sie einen Autorater-Prompt an und konfigurieren Sie, wie die Ausgabe des Autoraters geparst und bewertet wird.
    • Auf Python-Funktion basierende Belohnung: Geben Sie benutzerdefinierten Python-Bewertungscode direkt in den Inline-Editor ein oder laden Sie eine Python-Datei hoch.
    • Vollständig anpassbare Belohnung über Cloud Run: Geben Sie den URI Ihres Cloud Run-Dienstes an.
  2. Geben Sie ein Gewicht für die Prämie für die Prämienkarte an.

  3. Klicken Sie auf Fertig.

  4. Wenn Sie eine zusammengesetzte Belohnung konfigurieren möchten, klicken Sie auf + Weitere Belohnung hinzufügen (bis zu 16 Belohnungen). Auf jeder minimierten Prämienkarte wird das konfigurierte Gewicht angezeigt. Im Formular sehen Sie die Zusammenfassung des Gesamtgewichts.

Belohnung für Stringübereinstimmung

API-Spezifikation: ReinforcementTuningStringMatchRewardScorer

Die Belohnung für String-Abgleich ist eine praktische Konfiguration zum Bewerten von modellgenerierten Antworten anhand bekannter Ground Truths. Das ist besonders nützlich für Aufgaben wie mathematische Fragen, bei denen jede Frage eine bekannte Ground-Truth-Antwort hat.

Da das Modell möglicherweise Chain-of-Thought-Begründungen oder andere Wörter ausgibt, bevor es die endgültige Antwort erreicht, die Sie mit der Grundwahrheit vergleichen möchten, unterstützt der String-Matching-Scorer eine Parserfunktion, die die vom Modell generierte Ausgabe mithilfe eines regulären Ausdrucks verarbeitet. Anschließend definieren Sie, wie die mit regulären Ausdrücken extrahierte Modellantwort mit Ihrer Grundwahrheit verglichen werden soll. Die Grundwahrheit wird über ein Feld in references bereitgestellt, das Sie in jedem Beispiel beim Erstellen Ihrer Trainings- und Validierungsdateien ausfüllen.

Das Konfigurationsschema finden Sie in der ReinforcementTuningStringMatchRewardScorer API-Spezifikation. Weitere Informationen zum Feld references finden Sie auf der Seite Abstimmungs-Dataset.

Belohnung für den Gemini-basierten Autorater

API-Spezifikation: ReinforcementTuningAutoraterScorer

Die auf Gemini basierende Autorater-Belohnung ist eine praktische Konfiguration für die Bewertung von modellgenerierten Antworten anhand von LLM-as-a-Judge-Feedback. Sie möchten beispielsweise, dass ein Modell Antworten in einem bestimmten Ton ausgibt, wobei der Ton von einem Autorater (LLM als Richter) festgelegt wird.

Diese Prämie unterstützt zwei Muster:

  • Der Autorater kann direkt eine numerische Bewertung ausgeben, die als Feedback für das bestärkende Lernen verwendet wird.
  • Der Autorater kann eine Bewertung ausgeben, die geparst und mit vordefinierten Mustern verglichen wird.

Der Autorater darf auch seine Chain-of-Thought-Begründung ausgeben, sodass Sie einen Abschnitt der Antwort auf dieselbe Weise wie die String-Matching-Belohnung parsen können. Ein Autorater kann beispielsweise blahblahblah <answer>Yes</answer> oder blahblahblah <answer>No</answer> ausgeben. Sie können eine Parsing-Funktion erstellen, um die Autorater-Antwort zwischen <answer> und </answer> zu extrahieren. Anschließend können Sie die Ausgabe des automatischen Raters mit einem vordefinierten Ausdruck vergleichen, der Yes einem +1-Wert und alle nicht übereinstimmenden Werte (z. B. No) einem -1-Wert zuordnet.

Die folgende Beispielkonfiguration für die automatische Bewertung filtert, um den Text zwischen <answer>-Tags zu erhalten, und ordnet Yes +1 und alle anderen Werte -1 zu:

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

Prämie für Codeausführung

API-Spezifikation: ReinforcementTuningCodeExecutionRewardScorer

Mit der Konfiguration für die Codeausführung können Sie benutzerdefinierten Python-Code bereitstellen, um Modellantworten zu bewerten, ohne einen Cloud Run-Dienst einrichten zu müssen. Implementieren Sie eine evaluate-Funktion mit der folgenden Signatur:

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

Die Funktion empfängt:

  • example: Ein ReinforcementTuningExample im ProtoJSON-Format (d. h. dasselbe Format wie eine Zeile im Trainings- oder Validierungs-Dataset, mit der Ausnahme, dass die Schlüssel im CamelCase-Format sein müssen). Systemanweisungen (example.get("systemInstruction")) und Referenzen (example.get("references")) sind ebenfalls in example enthalten, sofern sie im Trainings- oder Validierungs-Dataset festgelegt sind.
  • response: Eine Content im ProtoJSON-Format (d. h. Schlüssel müssen im CamelCase-Format sein), die mit der Onlinevorhersageantwort für Gemini-Modelle identisch ist.

Die Funktion muss einen Gleitkommawert zurückgeben, der dann auf den Bereich [-1, 1] begrenzt wird.

Beispielimplementierung:

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

Unterstützte Bibliotheken

Zusätzlich zur Python-Standardbibliothek sind die folgenden Python-Bibliotheken in der Codeausführungssandbox verfügbar:

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

Zeitüberschreitungen und Ressourcenlimits

Jeder evaluate-Aufruf hat ein Zeitlimit von 100 Sekunden. Bei Anrufen mit Zeitüberschreitung wird der Vorgang mehrmals wiederholt. Wenn der Anruf nach mehreren Versuchen weiterhin nicht zustande kommt, wird die Stichprobe bei der Berechnung der Prämie nicht berücksichtigt.

Wir empfehlen dringend, Ihren Code mit der ValidateReinforcementTuningReward API zu testen (siehe Belohnungskonfiguration validieren). Die Codeausführung sollte aus Leistungsgründen deutlich weniger als 100 Sekunden dauern.

Die Code-Ausführungsumgebung bietet 1 CPU und 1 GB Arbeitsspeicher pro Aufruf.

Vollständig anpassbare Belohnung über Cloud Run

API-Spezifikation: ReinforcementTuningCloudRunRewardScorer

Mit der Cloud Run-Belohnungskonfiguration können Sie eine vollständig anpassbare Bewertungslogik implementieren. Ihr Cloud Run-Dienst muss den folgenden HTTP-Vertrag implementieren.

HTTP-Methode:POST

Anfragetext (application/json):

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

example ist ein ReinforcementTuningExample im ProtoJSON-Format und response ist ein Content im ProtoJSON-Format.

Antworttext (application/json):

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

Beispielanfrage

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

Beispielantwort

{
  "reward": -1.0
}

IAM-Berechtigungen einrichten

  • Sie benötigen die Berechtigung roles/run.admin für Ihren Cloud Run-Dienst, um ihm zusätzliche IAM-Berechtigungen zu gewähren.
  • Dem Gemini Enterprise Agent Platform Secure Fine Tuning-Dienst-Agenten (service-PROJECT_NUMBER@gcp-sa-vertex-tune.s3ns-system.iam.gserviceaccount.com) muss die Berechtigung zum Aufrufen Ihres Cloud Run-Dienstes erteilt werden (z. B. durch Zuweisen von roles/run.invoker in IAM).

Zeitüberschreitungen und Wiederholungsversuche

Der Cloud Run-Dienst hat maximal 300 Sekunden Zeit, um jede Anfrage zur Berechnung von Prämien zu verarbeiten. Bei Anfragenfehlern wird der Dienst mit exponentiellem Backoff wiederholt (z. B. nach 2, 4, 8, 16 und 32 Sekunden), bevor er aufgibt. Wenn nach allen Wiederholungsversuchen keine gültige Antwort zurückgegeben wird, wird die Prämie als NaN markiert.

Empfehlungen für das Belohnungsdesign

In den folgenden Abschnitten werden Best Practices für das Entwerfen von Belohnungsfunktionen beschrieben, die gut abgestimmte Signale für die Feinabstimmung des Reinforcement Learning liefern.

Prämienskala

Jede einzelne Prämie muss auf der Skala von [-1, 1] liegen. Prämienwerte außerhalb dieses Bereichs werden abgeschnitten.

Was macht eine gute Belohnung aus?

  • Auf das gewünschte Ergebnis abgestimmt und gut auf menschliche Präferenzen abgestimmt.
  • Klar und konsistent: Beispielsweise ist es für das Modell schwierig, effektiv aus einer Belohnung mit hoher Varianz zu lernen.
  • Robust gegenüber ungültigen Ausgaben: Die Belohnung sollte beispielsweise einen niedrigen Wert zurückgeben können, anstatt abzustürzen und NaN zurückzugeben, wenn ungültige Ausgaben vom Modell generiert werden. So weiß der Abstimmungsjob, dass es sich um schlechte Generierungen handelt, die optimiert werden müssen. Wenn mehr als 80% Ihrer Aufrufe von Prämien fehlgeschlagen sind (RPC-Fehler, Rückgabe von NaN), wird der Optimierungsjob automatisch beendet.
  • Entwickelt, um das Erschleichen von Prämien zu verhindern. Vermeiden Sie Konfigurationen, in denen das Modell Schlupflöcher ausnutzen kann, um eine hohe Belohnung zu erzielen, ohne wirklich gute Leistungen zu erbringen.

Belohnungskonfiguration validieren

API-Spezifikation: ValidateReinforcementTuningReward

Tuning-Jobs können teuer sein. Daher sind Rewards entscheidend, um sie effektiv zu gestalten. Wir empfehlen, die Konfiguration der Belohnung vor dem Starten eines Tuning-Jobs zu validieren:

  • Testen Sie die Gültigkeit und Robustheit Ihrer Prämie in derCloud de Confiance -Konsole oder durch Aufrufen der ValidateReinforcementTuningReward-API. Kleine Fehler wie Parsing-Fehler, nicht behandelte Grenzfälle oder ungültige Code-Snippets können dazu führen, dass Ihre Belohnung und Ihr Tuning ungültig werden.
  • Führen Sie eine Bewertung mit der benutzerdefinierten Belohnung für eine Stichprobe Ihres Datasets durch. Beim bestärkenden Lernen kann das Modell nicht gut lernen, wenn die Belohnung für den Datensatz entweder zu schwierig (Belohnungen sind fast immer 0) oder zu einfach (Belohnungen sind fast immer 1) ist.

In der Cloud de Confiance -Konsole validieren

Im Schritt Testprämie (optional) des Assistenten Abgestimmtes Modell erstellen:

  1. Geben Sie im Editor Trainingsbeispiel eine Beispielzeile für ein JSON-Dataset mit systemInstruction, contents und references ein.
  2. Geben Sie im Feld Beispielantwort des Modells eine Beispielantwort ein oder klicken Sie auf Aus Trainingsbeispiel generieren, damit das Basismodell eine Beispielantwort generiert.
  3. Klicken Sie auf Test, um die Belohnungskonfiguration anhand der Stichprobe zu testen.
  4. Sehen Sie sich das resultierende Statusbanner und den Gesamtwert an. Klicken Sie auf See individual reward information (Einzelne Informationen zu Belohnungen ansehen) oder See individual scores and debug info (Einzelne Punktzahlen und Debugging-Informationen ansehen) für zusammengesetzte Belohnungen, um die Seitenleiste zu öffnen und Punktzahlen, Fehlermeldungen und Debugging-Logs für die einzelnen Belohnungen zu prüfen.

Mit der REST API validieren

Die ValidateReinforcementTuningReward API erwartet ein sampleResponse (vom Typ Content, das normalerweise aus einer Gemini-Modellausgabe stammt), ein RLFTExample und entweder singleRewardConfig oder compositeRewardConfig. Wenn das zurückgegebene Ergebnis einen Fehler oder NaN enthält, stimmt etwas mit der Einrichtung der Prämie nicht. Das müssen Sie beheben, bevor Sie den eigentlichen Optimierungsjob ausführen.

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

Ersetzen Sie dabei PROJECT_ID durch die ID Ihres Projekts in Cloud de Confiance by S3NS .

Nächste Schritte