Fonctions de récompense pour le réglage fin par apprentissage par renforcement

Une fonction de récompense attribue un score numérique à chaque réponse du modèle lors de l'affinage par apprentissage par renforcement. Le signal de récompense est ce par rapport à quoi l'apprentissage par renforcement est optimisé. Sa qualité détermine donc directement la qualité de l'ajustement. Toutes les récompenses sont limitées à la plage [-1, 1]. Toute valeur en dehors de cette plage est limitée.

Cette page décrit chaque type de récompense compatible, les pratiques recommandées pour concevoir des récompenses et comment valider une configuration de récompense avant de lancer un job d'optimisation. Le réglage fin par apprentissage par renforcement est compatible avec les types de récompenses suivants :

Vous pouvez également combiner l'une de ces quatre récompenses avec des pondérations par scoreur à l'aide d'une récompense composite.

Restrictions connues

Les délais avant expiration suivants s'appliquent par type de récompense :

Type de récompense Timeout
Correspondance de chaîne Pas de délai d'inactivité strict
Exécution de code 100 secondes pour chaque appel de méthode evaluate
Évaluateur automatique basé sur Gemini Délai d'une minute pour la réponse de notation du LLM
Cloud Run Délai d'expiration de cinq minutes pour chaque déclencheur

Configurer des récompenses dans la console Cloud de Confiance

Lorsque vous créez un job de réglage fin par apprentissage par renforcement dans la consoleCloud de Confiance sous Modèles > Réglage, l'étape Configuration des récompenses vous permet de configurer des récompenses simples ou composites :

  1. Saisissez un nom de récompense et choisissez un type de récompense dans le menu déroulant :

    • Récompense pour la correspondance de chaîne : configurez un type d'analyse (comme l'extraction d'expressions régulières), une opération de correspondance (comme Correspondance exacte) et une expression cible, ainsi que des récompenses pour les réponses correctes et incorrectes.
    • Récompense basée sur un LLM : fournissez un prompt à l'évaluateur automatique et configurez la façon dont la sortie de l'évaluateur automatique est analysée et notée.
    • Récompense basée sur une fonction Python : saisissez le code d'évaluation Python personnalisé directement dans l'éditeur intégré ou importez un fichier Python.
    • Récompense entièrement personnalisable avec Cloud Run : fournissez l'URI de votre service Cloud Run.
  2. Spécifiez un poids de récompense pour la carte de récompense.

  3. Cliquez sur OK.

  4. Pour configurer une récompense composite, cliquez sur + Ajouter une autre récompense (jusqu'à 16 récompenses). Chaque carte de récompense réduite affiche son pondération configurée, et le formulaire affiche le récapitulatif de la pondération totale.

Récompense de correspondance de chaîne

Spécification de l'API : ReinforcementTuningStringMatchRewardScorer

La récompense de correspondance de chaîne est une configuration pratique pour évaluer les réponses générées par le modèle par rapport aux vérités terrain connues. Il est particulièrement utile pour les tâches telles que les questions de mathématiques, où chaque question a une réponse de référence connue.

Étant donné que le modèle peut générer un raisonnement en chaîne de pensée ou d'autres mots avant d'atteindre la réponse finale que vous souhaitez comparer à la vérité terrain, le scoreur de correspondance de chaînes prend en charge une fonction d'analyse qui traite la sortie générée par le modèle à l'aide d'une extraction d'expression régulière. Vous définissez ensuite comment comparer la réponse du modèle extraite par expression régulière à votre vérité terrain. La vérité terrain est fournie via un champ dans references, que vous renseignez dans chaque exemple lorsque vous créez vos fichiers d'entraînement et de validation.

Pour le schéma de configuration, consultez la spécification de l'API ReinforcementTuningStringMatchRewardScorer. Pour en savoir plus sur le champ references, consultez la page Ensemble de données d'ajustement.

Récompense de l'évaluateur automatique basé sur Gemini

Spécification de l'API : ReinforcementTuningAutoraterScorer

La récompense de l'évaluateur automatique basé sur Gemini est une configuration pratique pour évaluer les réponses générées par le modèle par rapport aux commentaires du LLM en tant que juge. Par exemple, vous pouvez demander à un modèle de générer des réponses dans un certain ton, déterminé par un évaluateur automatique (LLM-as-a-judge).

Cette récompense est compatible avec deux modèles :

  • L'outil d'évaluation automatique peut générer directement un score numérique qui est utilisé comme feedback d'apprentissage par renforcement.
  • L'évaluateur automatique peut générer un jugement qui est analysé et comparé à des modèles prédéfinis.

L'évaluateur automatique est également autorisé à générer une chaîne de raisonnement. Vous pouvez donc analyser une section de la réponse de la même manière que la récompense de correspondance de chaîne. Par exemple, un évaluateur automatique peut générer blahblahblah <answer>Yes</answer> ou blahblahblah <answer>No</answer>. Vous pouvez créer une fonction d'analyse pour extraire la réponse de l'évaluateur automatique entre <answer> et </answer>. Vous pouvez ensuite comparer le résultat de l'évaluateur automatique à une expression prédéfinie qui mappe Yes à un score +1 et toute valeur non correspondante (telle que No) à un score -1.

L'exemple de configuration d'évaluation automatique suivant filtre pour obtenir le texte entre les balises <answer> et mappe Yes à +1 et toute autre valeur à -1 :

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

Récompense pour l'exécution de code

Spécification de l'API : ReinforcementTuningCodeExecutionRewardScorer

La configuration de récompense pour l'exécution de code vous permet de fournir un code Python défini par l'utilisateur pour évaluer les réponses du modèle sans configurer de service Cloud Run. Implémentez une fonction evaluate avec la signature suivante :

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

La fonction reçoit :

  • example : ReinforcementTuningExample au format ProtoJSON (c'est-à-dire le même format qu'une ligne de l'ensemble de données d'entraînement ou de validation, sauf que les clés doivent être en camel case). Les instructions système (example.get("systemInstruction")) et les références (example.get("references")) sont également incluses dans example, à condition qu'elles soient définies dans l'ensemble de données d'entraînement ou de validation.
  • response : Content au format ProtoJSON (c'est-à-dire que les clés doivent être en camel case), qui est identique à la réponse de prédiction en ligne pour les modèles Gemini.

La fonction doit renvoyer un float, qui est ensuite limité à la plage [-1, 1].

Exemple d'implémentation :

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

Bibliothèques prises en charge

En plus de la bibliothèque standard Python, les bibliothèques Python suivantes sont disponibles dans le bac à sable d'exécution du code :

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

Délai avant expiration et limites de ressources

Chaque appel evaluate dispose d'un délai d'attente de 100 secondes. Les appels ayant expiré sont réessayés plusieurs fois. Si l'appel continue d'expirer après plusieurs nouvelles tentatives, l'échantillon est exclu du calcul de la récompense.

Nous vous recommandons vivement de tester votre code avec l'API ValidateReinforcementTuningReward (voir Valider une configuration de récompense) et de faire en sorte que l'exécution du code se termine bien en moins de 100 secondes pour obtenir les meilleures performances.

L'environnement d'exécution de code fournit un processeur et 1 Go de mémoire par invocation.

Récompense entièrement personnalisable avec Cloud Run

Spécification de l'API : ReinforcementTuningCloudRunRewardScorer

La configuration des récompenses Cloud Run vous permet d'implémenter une logique d'attribution de scores entièrement personnalisable. Votre service Cloud Run doit implémenter le contrat HTTP suivant.

Méthode HTTP : POST

Corps de la requête (application/json) :

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

example est un ReinforcementTuningExample au format ProtoJSON et response est un Content au format ProtoJSON.

Corps de la réponse (application/json) :

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

Exemple de requête

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

Exemple de réponse

{
  "reward": -1.0
}

Configurer les autorisations IAM

  • Vous avez besoin de l'autorisation roles/run.admin sur votre service Cloud Run pour lui accorder des autorisations IAM supplémentaires.
  • L'agent de service Gemini Enterprise Agent Platform Secure Fine Tuning (service-PROJECT_NUMBER@gcp-sa-vertex-tune.s3ns-system.iam.gserviceaccount.com) doit disposer de l'autorisation (par exemple, en accordant roles/run.invoker dans IAM) pour appeler votre service Cloud Run.

Délais d'expiration et nouvelles tentatives

Le service Cloud Run dispose d'un délai maximal de 300 secondes pour traiter chaque demande de calcul de récompense. En cas d'erreur de requête, le service effectue des nouvelles tentatives avec un intervalle exponentiel entre les tentatives (par exemple, après 2, 4, 8, 16 et 32 secondes) avant d'abandonner. Si aucune réponse valide n'est renvoyée après épuisement de toutes les tentatives, la récompense est marquée comme NaN.

Recommandations concernant la conception des récompenses

Les sections suivantes décrivent les bonnes pratiques pour concevoir des fonctions de récompense qui produisent des signaux bien calibrés pour le réglage fin de l'apprentissage par renforcement.

Échelle de récompense

Chaque récompense doit être à l'échelle de [-1, 1]. Les valeurs de récompense en dehors de cette plage sont tronquées.

Qu'est-ce qui fait une bonne récompense ?

  • Alignés sur le résultat souhaité et bien calibrés en fonction des préférences humaines.
  • Clair et cohérent : Par exemple, il est difficile pour le modèle d'apprendre efficacement à partir d'une récompense d'évaluateur automatique à forte variance.
  • Robustesse face aux résultats non valides : Par exemple, la récompense doit pouvoir renvoyer une valeur faible plutôt que planter et renvoyer NaN lorsque le modèle génère des sorties non valides. L'opération d'optimisation sait ainsi qu'il s'agit de mauvaises générations à éviter. Si plus de 80% de vos appels de récompense génèrent des erreurs (erreur RPC, renvoi de NaN), la tâche d'optimisation est automatiquement arrêtée.
  • Conçue pour empêcher le piratage des récompenses. Évitez les configurations dans lesquelles le modèle peut exploiter des failles pour obtenir une récompense élevée sans réellement offrir de bonnes performances.

Valider une configuration de récompense

Spécification de l'API : ValidateReinforcementTuningReward

Les jobs d'optimisation peuvent être coûteux, et les récompenses sont essentielles pour que votre job d'optimisation soit efficace. Nous vous recommandons de valider la configuration de votre récompense avant de lancer un job d'optimisation :

  • Testez la validité et la robustesse de votre récompense dans la consoleCloud de Confiance ou en appelant l'API ValidateReinforcementTuningReward. De petites erreurs (par exemple, des erreurs d'analyse, des cas particuliers non traités ou des extraits de code non valides) peuvent invalider votre récompense et votre réglage.
  • Effectuez une évaluation avec la récompense personnalisée sur un échantillon de votre ensemble de données. L'apprentissage par renforcement ne peut pas bien apprendre lorsque la récompense est trop difficile (les récompenses sont presque toujours 0) ou trop simple (les récompenses sont presque toujours 1) pour l'ensemble de données.

Valider dans la console Cloud de Confiance

À l'étape Tester la récompense (facultatif) de l'assistant Créer un modèle réglé :

  1. Dans l'éditeur Exemple d'entraînement, saisissez un exemple de ligne d'ensemble de données JSON contenant systemInstruction, contents et references.
  2. Dans le champ Exemple de réponse du modèle, saisissez un exemple de réponse ou cliquez sur Générer à partir de l'exemple d'entraînement pour que le modèle de base génère un exemple de réponse.
  3. Cliquez sur Tester pour évaluer votre configuration de récompense par rapport à l'échantillon.
  4. Examinez la bannière d'état et le score global qui s'affichent. Cliquez sur Afficher les informations sur les récompenses individuelles (ou sur Afficher les scores individuels et les informations de débogage pour les récompenses composites) afin d'ouvrir le panneau latéral et d'inspecter les scores, les messages d'erreur et les journaux de débogage pour chaque récompense.

Valider à l'aide de l'API REST

L'API ValidateReinforcementTuningReward attend un sampleResponse (de type Content, généralement obtenu à partir d'une sortie de modèle Gemini), un RLFTExample et l'un des éléments suivants : singleRewardConfig ou compositeRewardConfig. Si le résultat renvoyé contient une erreur ou NaN, cela signifie que la configuration de la récompense présente un problème que vous devez résoudre avant d'exécuter le job de réglage proprement dit.

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

Remplacez PROJECT_ID par l'ID du projet Cloud de Confiance by S3NS .

Étapes suivantes