Funzioni di ricompensa per l'ottimizzazione del reinforcement learning

Una funzione di ricompensa assegna un punteggio numerico a ogni risposta del modello durante l'ottimizzazione dell'apprendimento per rinforzo. Il segnale di ricompensa è ciò che l'apprendimento per rinforzo ottimizza, quindi la sua qualità determina direttamente la qualità della messa a punto. Tutti i premi vengono ritagliati nell'intervallo [-1, 1]; qualsiasi valore al di fuori di questo intervallo viene ritagliato.

Questa pagina descrive ogni tipo di premio supportato, le pratiche consigliate per la progettazione dei premi e come convalidare una configurazione dei premi prima di avviare un job di ottimizzazione. L'ottimizzazione del reinforcement learning supporta i seguenti tipi di ricompensa:

Puoi anche combinare uno qualsiasi di questi quattro con i pesi per marcatore utilizzando un premio composito.

Limitazioni note

I seguenti timeout si applicano per tipo di premio:

Tipo di premio Timeout
Corrispondenza stringhe Nessun timeout rigido
Eseguire il codice 100 secondi per ogni chiamata al metodo evaluate
Strumento di valutazione automatica basato su Gemini Timeout di 1 minuto durante l'attesa di una risposta di valutazione dell'LLM
Cloud Run Timeout di 5 minuti per ogni trigger

Configura i premi nella console Cloud de Confiance

Quando crei un job di ottimizzazione dell'apprendimento per rinforzo nella consoleCloud de Confiance in Modelli > Ottimizzazione, il passaggio Configurazione della ricompensa ti consente di configurare ricompense singole o composite:

  1. Inserisci un Nome premio e scegli un Tipo di premio dal menu a discesa:

    • Ricompensa per la corrispondenza di stringhe: configura un Tipo di analisi (ad esempio l'estrazione di espressioni regolari), un'Operazione di corrispondenza (ad esempio Corrispondenza esatta) e un'Espressione di destinazione, insieme alle ricompense per le risposte corrette e sbagliate.
    • Premio basato su LLM: fornisci un prompt per lo strumento di valutazione automatica e configura la modalità di analisi e assegnazione del punteggio dell'output dello strumento di valutazione automatica.
    • Premio basato su funzione Python: inserisci il codice di valutazione Python personalizzato direttamente nell'editor incorporato o carica un file Python.
    • Premio completamente personalizzabile tramite Cloud Run: fornisci l'URI del tuo servizio Cloud Run.
  2. Specifica un Peso del premio per la scheda del premio.

  3. Fai clic su Fine.

  4. Per configurare un premio composito, fai clic su + Aggiungi un altro premio (fino a 16 premi). Ogni scheda premio compressa mostra il peso configurato e il modulo mostra il riepilogo del peso totale.

Premio per la corrispondenza di stringhe

Specifica API: ReinforcementTuningStringMatchRewardScorer

La ricompensa per la corrispondenza delle stringhe è una configurazione conveniente per valutare le risposte generate dal modello rispetto a dati di fatto noti. È particolarmente utile per attività come domande di matematica, in cui ogni domanda ha una risposta di riferimento nota.

Poiché il modello potrebbe restituire un ragionamento chain-of-thought o altre parole prima di raggiungere la risposta finale che vuoi confrontare con i dati di riferimento, lo strumento di valutazione della corrispondenza delle stringhe supporta una funzione di analisi che elabora l'output generato dal modello utilizzando un'estrazione di espressioni regolari. Poi definisci come confrontare la risposta del modello estratta con l'espressione regolare con i dati empirici reali. I dati di riferimento vengono forniti tramite un campo in references, che compili in ogni esempio quando crei i file di training e convalida.

Per lo schema di configurazione, consulta la specifica dell'API ReinforcementTuningStringMatchRewardScorer. Per informazioni dettagliate sul campo references, consulta la pagina Set di dati di ottimizzazione.

Premio per lo strumento di valutazione automatica basato su Gemini

Specifica API: ReinforcementTuningAutoraterScorer

La ricompensa di valutazione automatica basata su Gemini è una configurazione conveniente per valutare le risposte generate dal modello rispetto al feedback di LLM-as-a-judge. Ad esempio, potresti voler che un modello restituisca risposte con un determinato tono, deciso da uno strumento di valutazione automatica (LLM-as-a-judge).

Questo premio supporta due pattern:

  • Lo strumento di valutazione automatica può restituire direttamente un punteggio numerico che viene utilizzato come feedback di apprendimento per rinforzo.
  • Il sistema di valutazione automatica può generare un giudizio che viene analizzato e confrontato con pattern predefiniti.

L'autorater può anche restituire la sua chain-of-thought, quindi puoi analizzare una sezione della risposta nello stesso modo della ricompensa per la corrispondenza delle stringhe. Ad esempio, un sistema di classificazione automatica può restituire blahblahblah <answer>Yes</answer> o blahblahblah <answer>No</answer> e puoi creare una funzione di analisi per estrarre la risposta del sistema di classificazione automatica tra <answer> e </answer>. Puoi quindi confrontare l'output dell'autorater con un'espressione predefinita che mappa Yes a un punteggio +1 e qualsiasi valore non corrispondente (ad esempio No) a un punteggio -1.

La seguente configurazione di valutazione automatica filtra per ottenere il testo tra i tag <answer> e mappa Yes a +1 e qualsiasi altro valore a -1:

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

Premio per l'esecuzione del codice

Specifica API: ReinforcementTuningCodeExecutionRewardScorer

La configurazione della ricompensa per l'esecuzione del codice ti consente di fornire codice Python definito dall'utente per valutare le risposte del modello senza configurare un servizio Cloud Run. Implementa una funzione evaluate con la seguente firma:

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

La funzione riceve:

  • example: un ReinforcementTuningExample in formato ProtoJSON (ovvero lo stesso formato di una riga nel set di dati di addestramento o di convalida, tranne per il fatto che le chiavi devono essere in camel case). Anche le istruzioni di sistema (example.get("systemInstruction")) e i riferimenti (example.get("references")) sono inclusi in example, a condizione che siano impostati nel set di dati di addestramento o convalida.
  • response: un Content in formato ProtoJSON (ovvero le chiavi devono essere in camel case), che è lo stesso della risposta alla previsione online per i modelli Gemini.

La funzione deve restituire un valore float, che viene poi troncato all'intervallo [-1, 1].

Esempio di implementazione:

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

Librerie supportate

Oltre alla libreria standard di Python, all'interno della sandbox di esecuzione del codice sono disponibili le seguenti librerie Python:

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

Timeout e limiti delle risorse

Ogni chiamata evaluate ha un timeout di 100 secondi. Le chiamate con timeout vengono riprovate più volte. Se la chiamata continua a scadere dopo diversi tentativi, il campione viene escluso dal calcolo della ricompensa.

Ti consigliamo vivamente di testare il codice con l'API ValidateReinforcementTuningReward (vedi Convalida di una configurazione di premi) e di fare in modo che l'esecuzione del codice termini ben prima di 100 secondi per ottenere prestazioni ottimali.

L'ambiente di esecuzione del codice fornisce 1 CPU e 1 GB di memoria per invocazione.

Premio completamente personalizzabile tramite Cloud Run

Specifica API: ReinforcementTuningCloudRunRewardScorer

La configurazione dei premi Cloud Run consente di implementare una logica di punteggio completamente personalizzabile. Il tuo servizio Cloud Run deve implementare il seguente contratto HTTP.

Metodo HTTP: POST

Corpo della richiesta (application/json):

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

example è un ReinforcementTuningExample in formato ProtoJSON e response è un Content in formato ProtoJSON.

Corpo della risposta (application/json):

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

Esempio di richiesta

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

Esempio di risposta

{
  "reward": -1.0
}

Configurare le autorizzazioni IAM

  • Devi disporre dell'autorizzazione roles/run.admin sul servizio Cloud Run per concedergli autorizzazioni IAM aggiuntive.
  • Al service agent del servizio di perfezionamento sicuro di Gemini Enterprise Agent Platform (service-PROJECT_NUMBER@gcp-sa-vertex-tune.s3ns-system.iam.gserviceaccount.com) deve essere concessa l'autorizzazione (ad esempio, concedendo roles/run.invoker in IAM) per richiamare il tuo servizio Cloud Run.

Timeout e nuovi tentativi

Il servizio Cloud Run ha a disposizione un massimo di 300 secondi per elaborare ogni richiesta di calcolo della ricompensa. In caso di errori di richiesta, il servizio ritenta con backoff esponenziale (ad esempio, dopo 2, 4, 8, 16 e 32 secondi) prima di arrendersi. Se non viene restituita alcuna risposta valida dopo aver esaurito tutti i tentativi, la ricompensa viene contrassegnata come NaN.

Suggerimenti per la progettazione dei premi

Le sezioni seguenti descrivono le best practice per la progettazione di funzioni di ricompensa che producono indicatori ben calibrati per la messa a punto del reinforcement learning.

Scala dei premi

Ogni singolo premio deve essere nella scala di [-1, 1]. I valori delle ricompense al di fuori di questo intervallo vengono troncati.

Quali sono le caratteristiche di un buon premio

  • In linea con il risultato desiderato e ben calibrato con le preferenze umane.
  • Chiaro e coerente. Ad esempio, per il modello è difficile apprendere in modo efficace da una ricompensa di valutazione automatica con varianza elevata.
  • Resistente a output non validi. Ad esempio, la ricompensa deve essere in grado di restituire un valore basso anziché arrestarsi in modo anomalo e restituire NaN quando il modello genera output non validi, in modo che il job di ottimizzazione sappia che si tratta di generazioni errate da evitare. Se più dell'80% delle invocazioni della ricompensa restituisce errori (errore RPC, restituzione di NaN), il job di ottimizzazione viene interrotto automaticamente.
  • Progettato per impedire l'hacking dei premi. Evita configurazioni in cui il modello può sfruttare scappatoie per ottenere una ricompensa elevata senza prestazioni realmente buone.

Convalidare una configurazione della ricompensa

Specifica API: ValidateReinforcementTuningReward

I lavori di ottimizzazione possono essere costosi e le ricompense sono fondamentali per renderli efficaci. Ti consigliamo di convalidare la configurazione della ricompensa prima di avviare un job di ottimizzazione:

  • Verifica la validità e l'affidabilità della tua ricompensa nella consoleCloud de Confiance o chiamando l'API ValidateReinforcementTuningReward. Piccoli errori, come errori di analisi, casi limite non gestiti o snippet di codice non validi, possono invalidare la tua ricompensa e la tua ottimizzazione.
  • Esegui una valutazione con la ricompensa personalizzata su un campione del tuo set di dati. L'apprendimento per rinforzo non funziona bene quando la ricompensa è troppo difficile (le ricompense sono quasi sempre 0) o troppo semplice (le ricompense sono quasi sempre 1) per il set di dati.

Convalida nella console Cloud de Confiance

Nel passaggio Test reward (Optional) (Test della ricompensa (facoltativo)) della procedura guidata Crea un modello ottimizzato:

  1. Nell'editor Esempio di addestramento, inserisci una riga di esempio del set di dati JSON contenente systemInstruction, contents e references.
  2. Nel campo Risposta del modello di esempio, inserisci una risposta di esempio o fai clic su Genera dall'esempio di addestramento per fare in modo che il modello di base generi una risposta di esempio.
  3. Fai clic su Test per valutare la configurazione della ricompensa rispetto al campione.
  4. Esamina il banner di stato risultante e il punteggio complessivo. Fai clic su Visualizza informazioni sulle singole ricompense (o Visualizza punteggi individuali e informazioni di debug per le ricompense composite) per aprire il riquadro a scomparsa ed esaminare i punteggi per ricompensa, i messaggi di errore e i log di debug.

Convalida utilizzando l'API REST

L'API ValidateReinforcementTuningReward prevede un sampleResponse (di tipo Content, in genere ottenuto dall'output di un modello Gemini), un RLFTExample e uno tra singleRewardConfig o compositeRewardConfig. Se il risultato restituito contiene un errore o NaN, significa che c'è qualcosa che non va nella configurazione della ricompensa e che devi risolvere prima di eseguire il job di ottimizzazione effettivo.

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

Sostituisci PROJECT_ID con l'ID progetto Cloud de Confiance by S3NS .

Passaggi successivi