Funções de recompensa para ajuste do aprendizado por reforço

Uma função de recompensa pontua numericamente cada resposta do modelo durante o ajuste fino de aprendizado por reforço. O indicador de recompensa é o que o aprendizado por reforço otimiza. Portanto, a qualidade dele determina diretamente a qualidade do ajuste. Todas as recompensas são ajustadas ao intervalo [-1, 1]. Qualquer valor fora desse intervalo é ajustado.

Esta página descreve cada tipo de recompensa compatível, as práticas recomendadas para criar recompensas e como validar uma configuração de recompensa antes de iniciar um job de ajuste. O ajuste do aprendizado por reforço é compatível com os seguintes tipos de recompensa:

Também é possível combinar qualquer uma dessas quatro opções com ponderações por pontuador usando uma recompensa composta.

Restrições conhecidas

Os tempos limites a seguir se aplicam por tipo de recompensa:

Tipo de recompensa Tempo limite
Correspondência de strings Sem tempo limite estrito
Execução de código 100 segundos para cada chamada de método evaluate
Avaliador automático baseado no Gemini Tempo limite de 1 minuto ao aguardar uma resposta de classificação do LLM
Cloud Run Tempo limite de 5 minutos para cada acionador

Configurar recompensas no console do Cloud de Confiance

Ao criar um job de ajuste fino de aprendizado por reforço no consoleCloud de Confiance em Modelos > Ajuste, a etapa Configuração de recompensa permite configurar recompensas únicas ou compostas:

  1. Insira um Nome da recompensa e escolha um Tipo de recompensa no menu suspenso:

    • Recompensa de correspondência de string: configure um Tipo de análise (como extração de expressão regular), uma Operação de correspondência (como Correspondência exata) e uma Expressão de destino, além de recompensas para respostas certas e erradas.
    • Recompensa baseada em LLM: forneça um comando de autorrevisão e configure como a saída do autorrevisor é analisada e pontuada.
    • Recompensa baseada em função Python: insira o código de avaliação personalizado do Python diretamente no editor inline ou faça upload de um arquivo Python.
    • Recompensa totalmente personalizável via Cloud Run: forneça o URI do seu serviço do Cloud Run.
  2. Especifique um Peso da recompensa para o card de recompensa.

  3. Clique em Concluído.

  4. Para configurar uma recompensa composta, clique em + Adicionar outra recompensa (até 16 recompensas). Cada card de recompensa recolhido mostra o peso configurado, e o formulário exibe o resumo do peso total.

Recompensa de correspondência de strings

Especificação da API: ReinforcementTuningStringMatchRewardScorer

A recompensa de correspondência de strings é uma configuração conveniente para avaliar respostas geradas pelo modelo em relação a informações empíricas conhecidas. Ela é particularmente útil para tarefas como perguntas de matemática, em que cada pergunta tem uma resposta correta conhecida.

Como o modelo pode gerar linha de raciocínio ou outras palavras antes de chegar à resposta final que você quer comparar com as informações empíricas, o avaliador de correspondência de strings oferece suporte a uma função de análise que processa a saída gerada pelo modelo usando uma extração de expressão regular. Em seguida, você define como comparar a resposta do modelo extraída por regex com as informações empíricas. A informação empírica é fornecida por um campo em references, que você preenche em cada exemplo ao criar os arquivos de treinamento e validação.

Para o esquema de configuração, consulte a especificação da API ReinforcementTuningStringMatchRewardScorer. Para detalhes sobre o campo references, consulte a página Conjunto de dados de ajuste.

Recompensa do avaliador automático baseado no Gemini

Especificação da API: ReinforcementTuningAutoraterScorer

A recompensa do avaliador automático baseado no Gemini é uma configuração conveniente para avaliar respostas geradas por modelos com base no feedback do LLM como juiz. Por exemplo, talvez você queira que um modelo gere respostas em um determinado tom, que é decidido por um avaliador automático (LLM como um juiz).

Essa recompensa é compatível com dois padrões:

  • O autoavaliador pode gerar diretamente uma pontuação numérica que é usada como feedback de aprendizado por reforço.
  • O autorrater pode gerar uma avaliação que é analisada e comparada com padrões predefinidos.

O avaliador automático também pode gerar o raciocínio de linha de raciocínio. Assim, você pode analisar uma seção da resposta da mesma forma que a recompensa de correspondência de strings. Por exemplo, um avaliador automático pode gerar blahblahblah <answer>Yes</answer> ou blahblahblah <answer>No</answer>, e você pode criar uma função de análise para extrair a resposta do avaliador automático entre <answer> e </answer>. Em seguida, compare a saída do avaliador automático com uma expressão predefinida que mapeia Yes para uma pontuação +1 e qualquer valor não correspondente (como No) para uma pontuação -1.

O exemplo de configuração de avaliador automático a seguir filtra para extrair o texto entre tags <answer> e mapeia Yes para +1 e qualquer outro valor para -1:

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

Recompensa de execução de código

Especificação da API: ReinforcementTuningCodeExecutionRewardScorer

Com a configuração de recompensa de execução de código, você fornece código Python definido pelo usuário para avaliar as respostas do modelo sem configurar um serviço do Cloud Run. Implemente uma função evaluate com a seguinte assinatura:

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

A função recebe:

  • example: um ReinforcementTuningExample no formato ProtoJSON (ou seja, o mesmo formato de uma linha no conjunto de dados de treinamento ou validação, exceto que as chaves precisam estar em camel case). As instruções do sistema (example.get("systemInstruction")) e as referências (example.get("references")) também são incluídas em example, desde que estejam definidas no conjunto de dados de treinamento ou validação.
  • response: um Content no formato ProtoJSON (ou seja, as chaves precisam estar em camel case), que é o mesmo que a resposta de previsão on-line para modelos do Gemini.

A função precisa retornar um ponto flutuante, que é cortado para o intervalo [-1, 1].

Exemplo de implementação:

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 permitidas

Além da biblioteca padrão do Python, as seguintes bibliotecas do Python estão disponíveis no sandbox de execução de código:

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

Tempos limite e limites de recursos

Cada chamada de evaluate tem um tempo limite de 100 segundos. As chamadas com tempo esgotado são repetidas várias vezes. Se a chamada continuar excedendo o tempo limite após várias tentativas, a amostra será descartada do cálculo da recompensa.

Recomendamos testar seu código com a API ValidateReinforcementTuningReward (consulte Validar uma configuração de recompensa) e buscar uma execução de código que termine bem antes de 100 segundos para ter o melhor desempenho.

O ambiente de execução de código fornece 1 CPU e 1 GB de memória por invocação.

Recompensa totalmente personalizável via Cloud Run

Especificação da API: ReinforcementTuningCloudRunRewardScorer

Com a configuração de recompensa do Cloud Run, é possível implementar uma lógica de pontuação totalmente personalizável. Seu serviço do Cloud Run precisa implementar o seguinte contrato HTTP.

Método HTTP:POST

Corpo da solicitação (application/json):

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

example é um ReinforcementTuningExample no formato ProtoJSON, e response é um Content no formato ProtoJSON.

Corpo da resposta (application/json):

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

Exemplo de solicitação

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

Exemplo de resposta

{
  "reward": -1.0
}

Configurar permissões do IAM

  • Você precisa da permissão roles/run.admin no serviço do Cloud Run para conceder outras permissões do IAM a ele.
  • O agente de serviço de ajuste refinado seguro da plataforma de agentes do Gemini Enterprise (service-PROJECT_NUMBER@gcp-sa-vertex-tune.s3ns-system.iam.gserviceaccount.com) precisa receber permissão (por exemplo, concedendo roles/run.invoker no IAM) para invocar seu serviço do Cloud Run.

Tempo limite e tentativas

O tempo máximo permitido para o serviço do Cloud Run processar cada solicitação de cálculo de recompensa é de 300 segundos. Em erros de solicitação, o serviço tenta de novo com espera exponencial (por exemplo, após 2, 4, 8, 16 e 32 segundos) antes de desistir. Se nenhuma resposta válida for retornada após esgotar todas as tentativas, a recompensa será marcada como NaN.

Recomendações de design de recompensas

As seções a seguir descrevem as práticas recomendadas para projetar funções de recompensa que produzem indicadores bem calibrados para o ajuste de aprendizado por reforço.

Escala de recompensa

Cada recompensa precisa estar na escala de [-1, 1]. Valores de recompensa fora desse intervalo são cortados.

O que faz uma recompensa ser boa

  • Alinhado ao resultado desejado e bem calibrado com a preferência humana.
  • Claro e consistente. Por exemplo, é difícil para o modelo aprender de forma eficaz com uma recompensa de avaliador automático de alta variância.
  • Resistente a saídas inválidas. Por exemplo, a recompensa precisa retornar um valor baixo em vez de falhar e retornar NaN quando o modelo gera saídas inválidas. Assim, o job de ajuste sabe que essas são gerações ruins para otimizar. Se mais de 80% das suas invocações de recompensa apresentarem erros (erro de RPC, retorno de NaN), o job de ajuste será interrompido automaticamente.
  • Criado para evitar a invasão de recompensas. Evite configurações em que o modelo possa explorar brechas para alcançar uma recompensa alta sem um desempenho realmente bom.

Validar uma configuração de recompensa

Especificação da API: ValidateReinforcementTuningReward

Os jobs de ajuste podem ser caros, e as recompensas são cruciais para que eles sejam eficazes. Recomendamos validar a configuração de recompensa antes de iniciar um job de ajuste:

  • Teste a validade e a robustez da sua recompensa no consoleCloud de Confiance ou chamando a API ValidateReinforcementTuningReward. Pequenos erros, como erros de análise, casos extremos não tratados ou snippets de código inválidos, podem invalidar sua recompensa e seu ajuste.
  • Faça uma avaliação com a recompensa personalizada em uma amostra do seu conjunto de dados. O aprendizado por reforço não funciona bem quando a recompensa é muito difícil (as recompensas são quase sempre 0) ou muito simples (as recompensas são quase sempre 1) para o conjunto de dados.

Validar no console do Cloud de Confiance

Na etapa Testar recompensa (opcional) do assistente Criar um modelo ajustado:

  1. No editor Exemplo de treinamento, insira uma linha de exemplo de conjunto de dados JSON que contenha systemInstruction, contents e references.
  2. No campo Exemplo de resposta do modelo, insira uma resposta de exemplo ou clique em Gerar com base no exemplo de treinamento para que o modelo de base gere uma resposta de exemplo.
  3. Clique em Testar para avaliar sua configuração de recompensa em relação à amostra.
  4. Revise o banner de status e a pontuação geral. Clique em Ver informações de recompensa individual (ou Ver pontuações individuais e informações de depuração para recompensas compostas) para abrir o painel lateral e inspecionar pontuações, mensagens de erro e registros de depuração por recompensa.

Validar usando a API REST

A API ValidateReinforcementTuningReward espera um sampleResponse (do tipo Content, geralmente obtido de uma saída do modelo do Gemini), um RLFTExample e um de singleRewardConfig ou compositeRewardConfig. Se o resultado retornado contiver um erro ou NaN, há algo errado com a configuração de recompensa que precisa ser corrigido antes de executar o job 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

Substitua PROJECT_ID pelo ID do projeto Cloud de Confiance by S3NS .

A seguir