Implementando funções de recompensa - SageMaker IA da Amazon

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Implementando funções de recompensa

Visão geral do

A função de recompensa (também chamada de pontuador ou avaliador) é o componente principal que avalia as respostas do modelo e fornece sinais de feedback para o treinamento. Ela deve ser implementada como uma função Lambda que aceita respostas do modelo e retorna pontuações de recompensa.

Formato da interface

Sua função de recompensa deve aceitar e devolver dados no seguinte formato:

Amostra de entrada de amostra para treinamento

{ "messages": [ { "role": "user", "content": "Do you have a dedicated security team?" } ], "reference_answer": { "compliant": "No", "explanation": "As an AI developed by Company, I do not have a traditional security team..." } }

Exemplo de carga útil para a recompensa lambda

O contêiner transforma automaticamente seus dados antes de enviá-los para sua função Lambda da seguinte forma:

  1. Gerando uma resposta de modelo para cada prompt

  2. Anexando o turno do assistente (resposta gerada) à matriz de mensagens

  3. Adicionar um id campo exclusivo para rastreamento

Sua função Lambda receberá dados nesse formato transformado:

{ "id": "123", "messages": [ { "role": "user", "content": "Do you have a dedicated security team?" }, { "role": "assistant", "content": "As an AI developed by Amazon, I don not have a dedicated security team..." } ], # Following section will be same as your training dataset sample "reference_answer": { "compliant": "No", "explanation": "As an AI developed by Company, I do not have a traditional security team..." } }

Contrato Reward Lambda

def lambda_handler(event, context): return lambda_grader(event) def lambda_grader(samples: list[dict]) -> list[dict]: """ Args: samples: List of dictionaries in OpenAI format Example input: { "id": "123", "messages": [ { "role": "user", "content": "Do you have a dedicated security team?" }, { "role": "assistant", "content": "As an AI developed by Company, I don nott have a dedicated security team..." } ], # This section will be same as your training dataset "reference_answer": { "compliant": "No", "explanation": "As an AI developed by Company, I do not have a traditional security team..." } } Returns: List of dictionaries with reward scores: { "id": str, # Same id as input sample "aggregate_reward_score": float, # Overall score for the sample "metrics_list": [ # OPTIONAL: Component scores { "name": str, # Name of the component score "value": float, # Value of the component score "type": str # "Reward" or "Metric" } ] } """

Campos de entrada e saída

Campos de entrada

Campo Description Notas adicionais
id Identificador exclusivo para a amostra Ecoou de volta na saída. Formato de string
mensagens Histórico de bate-papo solicitado no formato OpenAI Matriz de objetos de mensagem
mensagens [] .role Palestrante da mensagem Valores comuns: “usuário”, “assistente”, “sistema”
mensagens [] .content Conteúdo de texto da mensagem String simples
**metadados Informações de formato livre para auxiliar na avaliação Objeto; campos opcionais transmitidos dos dados de treinamento

Campos de saída

Campo Description Notas adicionais
id Mesmo identificador da amostra de entrada Deve corresponder à entrada
pontuação agregada de recompensa Pontuação geral da amostra Flutuação (por exemplo, 0,0—1,0 ou intervalo definido pela tarefa)
lista_de_métricas Pontuações de componentes que compõem o agregado Matriz de objetos métricos

Restrições técnicas

  • Limite de tempo limite — 15 minutos de tempo máximo de execução por invocação do Lambda

  • Simultaneidade — Deve lidar com solicitações rollout_worker_replicas * 64 simultâneas

  • Confiabilidade — Deve implementar o tratamento adequado de erros e retornar pontuações válidas de forma consistente

  • Desempenho — Otimize para uma execução rápida (segundos, não minutos) para permitir um treinamento eficiente

Práticas recomendadas

  • Minimize as chamadas externas de API

  • Use algoritmos e estruturas de dados eficientes

  • Implemente a lógica de repetição para falhas transitórias

  • Cache de cálculos reutilizáveis

  • Teste minuciosamente antes do treinamento para garantir uma execução sem erros

Usando funções de recompensa personalizadas

Implemente funções de recompensa personalizadas quando você tiver critérios de avaliação específicos da tarefa:

  • Defina critérios de avaliação — Determine o que constitui uma boa resposta para sua tarefa

  • Implementar a função Lambda — Crie uma função Lambda seguindo o formato da interface

  • Teste localmente — valide se sua função retorna as pontuações corretas para entradas de amostra

  • Implante em AWS — implante seu Lambda e anote o ARN

  • Configurar receita — Adicione o ARN do Lambda ao campo da sua receita reward_lambda_arn

  • Teste com um pequeno conjunto de dados — execute o RFT com o mínimo de dados para verificar a integração

permissões do IAM

Permissões obrigatórias

Sua função SageMaker de execução deve ter permissões para invocar sua função Lambda. Adicione essa política à sua função SageMaker de execução:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:region:account-id:function:function-name" } ] }

Função de execução do Lambda

A função de execução da sua função Lambda precisa de permissões básicas de execução do Lambda:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }

Permissões adicionais: se sua função Lambda acessar outros AWS serviços (por exemplo, S3 para dados de referência, DynamoDB para registro), adicione essas permissões à função de execução do Lambda.

Exemplo: LLM como função de recompensa para juízes

Este exemplo demonstra o uso de modelos do Amazon Bedrock como juízes para avaliar as respostas do modelo comparando-as com as respostas de referência. Esse modelo do Lambda fornece uma estrutura para os clientes implementarem chamadas para o Amazon Bedrock para solicitações de inferência para processar avaliações de juízes. A função Lambda mantém o mesmo input/output contrato que outras funções de recompensa.

Implementação

Essa função Lambda implementa um processo de avaliação em dois estágios: lambda_handler extrai as respostas do modelo e as respostas de referência das amostras recebidas e, em seguida, a função lambda_graded chama o Amazon Bedrock para pontuar a semelhança semântica entre elas. A implementação inclui tratamento robusto de erros com novas tentativas automáticas para falhas transitórias e oferece suporte a formatos flexíveis de resposta de referência (formatos de sequência de caracteres e dicionário estruturado).

Detalhes da implementação:

  • Repetir a lógica: implementa o retrocesso exponencial (1s, 2s, 4s) para limitar exceções para lidar com os limites de taxa da API Bedrock

  • Tratamento de erros: retorna a pontuação de 0,0 para avaliações com falha em vez de gerar exceções

  • Pontuação determinística: usa temperatura = 0,0 para garantir pontuações consistentes em todas as avaliações

  • Formato de referência flexível: manipula automaticamente as respostas de referência de texto e dicionário

  • Fixação de pontuação: garante que todas as pontuações estejam dentro da faixa válida [0,0, 1,0]

  • Modelo agnóstico: altere JUDGE_MODEL_ID para usar qualquer modelo Amazon Bedrock (Nova, Llama, Mistral, etc.)

""" LLM Judge Lambda POC - Working implementation using Amazon Bedrock """ import json import time import boto3 bedrock_runtime = boto3.client('bedrock-runtime', region_name='us-east-1') JUDGE_MODEL_ID = "anthropic.claude-3-5-sonnet-20240620-v1:0" SYSTEM_PROMPT = "You must output ONLY a number between 0.0 and 1.0. No explanations, no text, just the number." JUDGE_PROMPT_TEMPLATE = """Compare the following two responses and rate how similar they are on a scale of 0.0 to 1.0, where: - 1.0 means the responses are semantically equivalent (same meaning, even if worded differently) - 0.5 means the responses are partially similar - 0.0 means the responses are completely different or contradictory Response A: {response_a} Response B: {response_b} Output ONLY a number between 0.0 and 1.0. No explanations.""" def lambda_graded(response_a: str, response_b: str, max_retries: int = 3) -> float: """Call Bedrock to compare responses and return similarity score.""" prompt = JUDGE_PROMPT_TEMPLATE.format(response_a=response_a, response_b=response_b) for attempt in range(max_retries): try: response = bedrock_runtime.converse( modelId=JUDGE_MODEL_ID, messages=[{"role": "user", "content": [{"text": prompt}]}], system=[{"text": SYSTEM_PROMPT}], inferenceConfig={"temperature": 0.0, "maxTokens": 10} ) print(f"Bedrock call successful: {response}") output = response['output']['message']['content'][0]['text'].strip() score = float(output) print(f"Score parsed: {score}") return max(0.0, min(1.0, score)) except Exception as e: if "ThrottlingException" in str(e) and attempt < max_retries - 1: time.sleep(2 ** attempt) else: print(f"Bedrock call failed: {e}") return None return None def lambda_handler(event, context): """AWS Lambda handler - processes samples from RFTEvalInvoker.""" try: samples = event if isinstance(event, list) else [event] results = [] for sample in samples: sample_id = sample.get("id", "unknown") messages = sample.get("messages", []) # Extract assistant response (response A) response_a = "" for msg in messages: if msg.get("role") in ["assistant", "nova_assistant"]: response_a = msg.get("content", "") break # Extract reference answer from root level (no longer in metadata) reference_answer = sample.get("reference_answer", "") # Handle both string and dict reference_answer formats if isinstance(reference_answer, dict): # If reference_answer is a dict, extract the explanation or compliant field response_b = reference_answer.get("explanation", reference_answer.get("compliant", "")) else: response_b = reference_answer if not response_a or not response_b: results.append({ "id": sample_id, "aggregate_reward_score": 0.0, "metrics_list": [{"name": "similarity_score", "value": 0.0, "type": "Metric"}] }) continue # Get similarity score score = lambda_graded(response_a, response_b) results.append({ "id": sample_id, "aggregate_reward_score": score, "metrics_list": [ { "name": "similarity_score", "value": score, "type": "Metric" } ] }) return {"statusCode": 200, "body": json.dumps(results)} except Exception as e: print(f"Error: {e}") return {"statusCode": 500, "body": json.dumps({"error": str(e)})}

Formato de entrada

O Lambda recebe o mesmo formato de entrada que outras funções de recompensa:

{ "id": "sample-001", "messages": [ { "role": "user", "content": "Do you have a dedicated security team?" }, { "role": "assistant", "content": "As an AI developed by Amazon, I don't have a dedicated security team..." } ], "reference_answer": { "compliant": "No", "explanation": "As an AI developed by Company, I do not have a traditional security team..." }, "my_custom_field": "custom_value" }

Formato de saída

{ "id": "sample-001", "aggregate_reward_score": 0.85, "metrics_list": [ { "name": "similarity_score", "value": 0.85, "type": "Metric" } ] }

Considerações de implantação

Talvez você também precise ajustar o modelo do prompt e os parâmetros de inferência com base nos recursos do modelo escolhido e no formato da API.

  • Permissões do IAM: a função de execução do Lambda deve ter bedrock:InvokeModel permissão para o modelo escolhido

  • Tempo limite: defina o tempo limite do Lambda para pelo menos 60 segundos para acomodar a latência e as novas tentativas da API Bedrock

  • Região: implante em uma região onde o modelo Bedrock escolhido esteja disponível

  • Custo: monitore o uso da API Bedrock à medida que cada avaliação faz uma chamada de API por amostra

  • Produtividade: para avaliações em grande escala, solicite maiores cotas da Bedrock para evitar limitações

Aumento da produtividade do leito rochoso

Se você sentir limitação durante a avaliação, aumente suas cotas do modelo Bedrock:

  • Navegue até o AWS console Service Quotas

  • Pesquise por “Bedrock” e selecione sua região

  • Encontre a cota para o modelo escolhido (por exemplo, “Invocações por minuto para Claude 3.5 Sonnet”)

  • Clique em “Solicitar aumento de cota” e especifique a taxa de transferência desejada

  • Forneça uma justificativa para o aumento (por exemplo, “carga de trabalho de avaliação do RFT”)

A lógica de repetição integrada do Lambda lida com a limitação ocasional, mas avaliações sustentadas de alto volume exigem aumentos de cota apropriados.

Política de IAM necessária:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "bedrock:InvokeModel" ], "Resource": "arn:aws:bedrock:*::foundation-model/*" } ] }