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:
-
Gerando uma resposta de modelo para cada prompt
-
Anexando o turno do assistente (resposta gerada) à matriz de mensagens
-
Adicionar um
idcampo 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 * 64simultâ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:InvokeModelpermissã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/*" } ] }