Funciones de recompensa para el ajuste del aprendizaje por refuerzo

Una función de recompensa califica numéricamente cada respuesta del modelo durante el ajuste con aprendizaje por refuerzo. El indicador de recompensa es el que se usa para optimizar el aprendizaje por refuerzo, por lo que su calidad determina directamente la calidad del ajuste. Todas las recompensas se ajustan al rango [-1, 1]. Cualquier valor fuera de ese rango se ajusta.

En esta página, se describe cada tipo de recompensa admitido, las prácticas recomendadas para diseñar recompensas y cómo validar una configuración de recompensas antes de iniciar un trabajo de ajuste. El ajuste del aprendizaje por refuerzo admite los siguientes tipos de recompensas:

También puedes combinar cualquiera de estos cuatro con pesos por evaluador usando una recompensa compuesta.

Restricciones conocidas

Se aplican los siguientes tiempos de espera por tipo de recompensa:

Tipo de recompensa Tiempo de espera
Coincidencia de cadenas Sin tiempo de espera estricto
Ejecución de código 100 segundos por cada llamada de método evaluate
Calificador automático basado en Gemini Se agotó el tiempo de espera de 1 minuto mientras se esperaba una respuesta de calificación del LLM
Cloud Run Tiempo de espera de 5 minutos para cada activador

Configura recompensas en la consola de Cloud de Confiance

Cuando creas un trabajo de ajuste de aprendizaje por refuerzo en la consola deCloud de Confiance en Modelos > Ajuste, el paso Configuración de la recompensa te permite configurar recompensas únicas o compuestas:

  1. Ingresa un Nombre de recompensa y elige un Tipo de recompensa en el menú desplegable:

    • Recompensa por concordancia de cadena: Configura un Tipo de análisis (como la extracción de expresiones regulares), una Operación de concordancia (como Concordancia exacta) y una Expresión objetivo, junto con recompensas por respuestas correctas e incorrectas.
    • Recompensa basada en LLM: Proporciona una instrucción de autorratificación y configura cómo se analiza y califica el resultado del autorratificador.
    • Recompensa basada en funciones de Python: Ingresa el código de evaluación personalizado de Python directamente en el editor intercalado o sube un archivo de Python.
    • Recompensa completamente personalizable a través de Cloud Run: Proporciona el URI de tu servicio de Cloud Run.
  2. Especifica un Peso de recompensa para la tarjeta de recompensa.

  3. Haz clic en Listo.

  4. Para configurar una recompensa compuesta, haz clic en + Agregar otra recompensa (hasta 16 recompensas). Cada tarjeta de recompensa contraída muestra su peso configurado, y el formulario muestra el resumen del peso total.

Recompensa por coincidencia de cadena

Especificación de la API: ReinforcementTuningStringMatchRewardScorer

La recompensa por coincidencia de cadenas es una configuración conveniente para evaluar las respuestas generadas por el modelo en comparación con las verdades fundamentales conocidas. Es particularmente útil para tareas como preguntas de matemáticas, en las que cada pregunta tiene una respuesta correcta conocida.

Dado que el modelo puede generar un razonamiento de cadena de pensamientos o incluir otras palabras antes de llegar a la respuesta final que deseas comparar con la verdad fundamental, el evaluador de coincidencias de cadenas admite una función de análisis que procesa el resultado generado por el modelo con una extracción de expresión regular. Luego, defines cómo comparar la respuesta del modelo extraída con regex con tu verdad fundamental. La verdad fundamental se proporciona a través de un campo en references, que completas en cada ejemplo cuando creas tus archivos de entrenamiento y validación.

Para ver el esquema de configuración, consulta la especificación de la API de ReinforcementTuningStringMatchRewardScorer. Para obtener detalles sobre el campo references, consulta la página Conjunto de datos de ajuste.

Recompensa del calificador automático basado en Gemini

Especificación de la API: ReinforcementTuningAutoraterScorer

La recompensa del evaluador automático basado en Gemini es una configuración conveniente para evaluar las respuestas generadas por el modelo en función de los comentarios del LLM como juez. Por ejemplo, es posible que desees que un modelo genere respuestas con un tono determinado, en el que el tono lo decida un evaluador automático (LLM como juez).

Esta recompensa admite dos patrones:

  • El evaluador automático puede generar directamente una puntuación numérica que se utiliza como comentarios del aprendizaje por refuerzo.
  • El evaluador automático puede generar una evaluación que se analiza y compara con patrones predefinidos.

El evaluador automático también puede generar su razonamiento de cadena de pensamiento, por lo que puedes analizar una sección de la respuesta de la misma manera que la recompensa de coincidencia de cadenas. Por ejemplo, un evaluador automático puede generar blahblahblah <answer>Yes</answer> o blahblahblah <answer>No</answer>, y puedes crear una función de análisis para extraer la respuesta del evaluador automático entre <answer> y </answer>. Luego, puedes comparar el resultado del evaluador automático con una expresión predefinida que asigne Yes a una puntuación de +1 y cualquier valor no coincidente (como No) a una puntuación de -1.

En el siguiente ejemplo de configuración del evaluador automático, se filtran los datos para obtener el texto entre las etiquetas <answer> y se asigna Yes a +1 y cualquier otro valor a -1:

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

Recompensa por ejecución de código

Especificación de la API: ReinforcementTuningCodeExecutionRewardScorer

La configuración de recompensa por ejecución de código te permite proporcionar código de Python definido por el usuario para evaluar las respuestas del modelo sin configurar un servicio de Cloud Run. Implementa una función evaluate con la siguiente firma:

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

La función recibe lo siguiente:

  • example: Un ReinforcementTuningExample en formato ProtoJSON (es decir, el mismo formato que una línea en el conjunto de datos de entrenamiento o validación, excepto que las claves deben estar en formato camel case). Las instrucciones del sistema (example.get("systemInstruction")) y las referencias (example.get("references")) también se incluyen en example, siempre que se establezcan en el conjunto de datos de entrenamiento o validación.
  • response: Un objeto Content en formato ProtoJSON (es decir, las claves deben estar en formato camel case), que es el mismo que la respuesta de predicción en línea para los modelos de Gemini.

La función debe devolver un número de punto flotante, que luego se limita al rango [-1, 1].

Ejemplo de implementación:

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

Bibliotecas compatibles

Además de la biblioteca estándar de Python, las siguientes bibliotecas de Python están disponibles dentro del entorno de pruebas de ejecución de código:

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

Tiempos de espera y límites de recursos

Cada llamada a evaluate tiene un tiempo de espera de 100 segundos. Se reintentan las llamadas con tiempo de espera agotado varias veces. Si la llamada sigue agotando el tiempo de espera después de varios reintentos, la muestra se descarta del cálculo de recompensas.

Te recomendamos que pruebes tu código con la API de ValidateReinforcementTuningReward (consulta Cómo validar una configuración de recompensa) y que intentes que la ejecución del código finalice en menos de 100 segundos para obtener el mejor rendimiento.

El entorno de ejecución de código proporciona 1 CPU y 1 GB de memoria por invocación.

Recompensa completamente personalizable a través de Cloud Run

Especificación de la API: ReinforcementTuningCloudRunRewardScorer

La configuración de recompensas de Cloud Run te permite implementar una lógica de puntuación completamente personalizable. Tu servicio de Cloud Run debe implementar el siguiente contrato HTTP.

Método HTTP: POST

Cuerpo de la solicitud (application/json):

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

example es un ReinforcementTuningExample en formato ProtoJSON, y response es un Content en formato ProtoJSON.

Cuerpo de la respuesta (application/json):

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

Ejemplo de solicitud

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

Respuesta de ejemplo

{
  "reward": -1.0
}

Configura los permisos de IAM

  • Necesitas el permiso roles/run.admin en tu servicio de Cloud Run para otorgarle permisos de IAM adicionales.
  • Se debe otorgar permiso al agente de servicio de ajuste fino seguro de Gemini Enterprise Agent Platform (service-PROJECT_NUMBER@gcp-sa-vertex-tune.s3ns-system.iam.gserviceaccount.com) (por ejemplo, otorgando roles/run.invoker en IAM) para invocar tu servicio de Cloud Run.

Tiempos de espera y reintentos

Se permite un máximo de 300 segundos para que el servicio de Cloud Run procese cada solicitud de cálculo de recompensas. En caso de errores de solicitud, el servicio reintenta la solicitud con una retirada exponencial (por ejemplo, después de 2, 4, 8, 16 y 32 segundos) antes de abandonar. Si no se devuelve ninguna respuesta válida después de agotar todos los reintentos, la recompensa se marca como NaN.

Recomendaciones de diseño de recompensas

En las siguientes secciones, se describen las prácticas recomendadas para diseñar funciones de recompensa que produzcan indicadores bien calibrados para el ajuste del aprendizaje por refuerzo.

Escala de recompensas

Cada recompensa debe estar en la escala de [-1, 1]. Los valores de recompensa fuera de este rango se recortan.

Qué hace que una recompensa sea buena

  • Alineado con el resultado deseado y bien calibrado con las preferencias humanas.
  • Clara y coherente Por ejemplo, al modelo le resulta difícil aprender de manera eficaz a partir de una recompensa del calificador automático con una varianza alta.
  • Es robusto ante resultados no válidos. Por ejemplo, la recompensa debería poder devolver un valor bajo en lugar de fallar y devolver NaN cuando el modelo genera resultados no válidos, de modo que el trabajo de ajuste sepa que se trata de generaciones incorrectas que se deben optimizar. Si más del 80% de las invocaciones de recompensas generan errores (error de RPC, que devuelve NaN), el trabajo de ajuste se detiene automáticamente.
  • Diseñado para evitar el hackeo de recompensas. Evita las configuraciones en las que el modelo pueda aprovechar las lagunas para obtener una recompensa alta sin un rendimiento realmente bueno.

Valida una configuración de recompensa

Especificación de la API: ValidateReinforcementTuningReward

Los trabajos de ajuste pueden ser costosos, y las recompensas son fundamentales para que tu trabajo de ajuste sea eficaz. Te recomendamos que valides la configuración de la recompensa antes de iniciar un trabajo de ajuste:

  • Prueba la validez y la solidez de tu recompensa en la consola deCloud de Confiance o llamando a la API de ValidateReinforcementTuningReward. Los errores pequeños, como los errores de análisis, los casos extremos no controlados o los fragmentos de código no válidos, pueden invalidar tu recompensa y tu ajuste.
  • Realiza una evaluación con la recompensa personalizada en una muestra de tu conjunto de datos. El aprendizaje por refuerzo no puede aprender bien cuando la recompensa es demasiado difícil (las recompensas son casi siempre 0) o demasiado sencilla (las recompensas son casi siempre 1) para el conjunto de datos.

Valida en la consola de Cloud de Confiance

En el paso Probar recompensa (opcional) del asistente Crear un modelo ajustado, haz lo siguiente:

  1. En el editor Ejemplo de entrenamiento, ingresa una línea de muestra del conjunto de datos JSON que contenga systemInstruction, contents y references.
  2. En el campo Sample model response, ingresa una respuesta de muestra o haz clic en Generate from Training Example para que el modelo base genere una respuesta de muestra.
  3. Haz clic en Probar para evaluar la configuración de la recompensa en comparación con la muestra.
  4. Revisa el banner de estado resultante y la puntuación general. Haz clic en Ver información de recompensas individuales (o Ver puntuaciones individuales e información de depuración para las recompensas compuestas) para abrir el panel lateral y consultar las puntuaciones por recompensa, los mensajes de error y los registros de depuración.

Validación con la API de REST

La API de ValidateReinforcementTuningReward espera un sampleResponse (de tipo Content, que suele obtenerse de un resultado del modelo de Gemini), un RLFTExample y uno de singleRewardConfig o compositeRewardConfig. Si el resultado devuelto contiene un error o NaN, significa que hay algún problema con la configuración de la recompensa que debes solucionar antes de ejecutar el trabajo de ajuste real.

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

Reemplaza PROJECT_ID por el ID del proyecto de Cloud de Confiance by S3NS .

¿Qué sigue?