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á.
Avaliação do RFT
nota
A avaliação por meio de funções remotas de recompensa em seu próprio AWS ambiente só está disponível se você for cliente da Nova Forge.
Importante
O campo rl_env de configuração é usado exclusivamente para avaliação, não para treinamento. Durante o treinamento, você configura as funções de recompensa usando a infraestrutura reward_lambda_arn (turno único) ou BYOO com rollout.delegate: true (vários turnos).
O que é avaliação RFT?
A Avaliação RFT permite que você avalie o desempenho do seu modelo usando funções de recompensa personalizadas antes, durante ou após o treinamento de aprendizado por reforço. Ao contrário das avaliações padrão que usam métricas predefinidas, o RFT Evaluation permite que você defina seus próprios critérios de sucesso por meio de uma função Lambda que pontua os resultados do modelo com base em seus requisitos específicos.
Por que avaliar com o RFT?
A avaliação é crucial para determinar se o processo de ajuste fino do RL tem:
-
Alinhamento aprimorado do modelo com seu caso de uso específico e valores humanos
-
Recursos de modelo mantidos ou aprimorados nas principais tarefas
-
Efeitos colaterais não intencionais evitados, como redução da factualidade, aumento da verbosidade ou degradação do desempenho em outras tarefas
-
Atendeu aos seus critérios de sucesso personalizados, conforme definido por sua função de recompensa
Quando usar a avaliação RFT
Use a avaliação de RFT nesses cenários:
-
Antes do treinamento de RFT: estabeleça métricas básicas em seu conjunto de dados de avaliação
-
Durante o treinamento RFT: monitore o progresso do treinamento com pontos de verificação intermediários
-
Após o treinamento de RFT: valide se o modelo final atende aos seus requisitos
-
Comparando modelos: avalie várias versões do modelo usando critérios de recompensa consistentes
nota
Use a Avaliação RFT quando precisar de métricas personalizadas e específicas do domínio. Para avaliação de propósito geral (precisão, perplexidade, BLEU), use métodos de avaliação padrão.
Tópicos
Requisitos de formato de dados
Estrutura de dados de entrada
Os dados de entrada da avaliação do RFT devem seguir o formato OpenAI Reinforcement Fine-Tuning. Cada exemplo é um objeto JSON contendo:
-
messages: Conjunto de turnos de conversaçãosysteme funçõesuser -
Outros metadados opcionais, por exemplo, reference_answer
Exemplo de formato de dados
O exemplo a seguir mostra o formato necessário:
{ "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Solve for x. Return only JSON like {\"x\": <number>}. Equation: 2x + 5 = 13" } ] } ], "reference_answer": { "x": 4 } }
Limitações atuais
As seguintes limitações se aplicam à avaliação do RFT:
-
Somente texto: não há suporte para entradas multimodais (imagens, áudio, vídeo)
-
Conversas em um único turno: suporta apenas mensagens de um único usuário (sem diálogos com vários turnos)
-
Formato JSON: os dados de entrada devem estar no formato JSONL (um objeto JSON por linha)
-
Saídas do modelo: a avaliação é realizada nas conclusões geradas a partir do modelo especificado
Preparando sua receita de avaliação
Configuração da receita de amostra
O exemplo a seguir mostra uma receita completa de avaliação de RFT:
run: name: nova-lite-rft-eval-job model_type: amazon.nova-lite-v1:0:300k model_name_or_path: s3://escrow_bucket/model_location # [MODIFIABLE] S3 path to your model or model identifier replicas: 1 # [MODIFIABLE] For SageMaker Training jobs only; fixed for HyperPod jobs data_s3_path: "" # [REQUIRED FOR HYPERPOD] Leave empty for SageMaker Training jobs output_s3_path: "" # [REQUIRED] Output artifact S3 path for evaluation results evaluation: task: rft_eval # [FIXED] Do not modify strategy: rft_eval # [FIXED] Do not modify metric: all # [FIXED] Do not modify # Inference Configuration inference: max_new_tokens: 8196 # [MODIFIABLE] Maximum tokens to generate top_k: -1 # [MODIFIABLE] Top-k sampling parameter top_p: 1.0 # [MODIFIABLE] Nucleus sampling parameter temperature: 0 # [MODIFIABLE] Sampling temperature (0 = deterministic) top_logprobs: 0 # Evaluation Environment Configuration (NOT used in training) rl_env: reward_lambda_arn: arn:aws:lambda:<region>:<account_id>:function:<reward-function-name>
Funções de recompensa predefinidas
Disponibilizamos 2 funções de recompensa predefinidas (prime_code, prime_math) da biblioteca verl
Visão geral do
Essas funções predefinidas fornecem recursos out-of-the-box de avaliação para:
-
prime_code: Geração de código e avaliação de exatidão
-
prime_math: Raciocínio matemático e avaliação da resolução de problemas
Configuração rápida
Para usar funções de recompensa predefinidas:
-
Publique a camada Lambda usando a CLI AWS :
aws lambda publish-layer-version \ --layer-name preset-function-layer \ --description "Preset reward function layer with dependencies" \ --zip-file fileb://universal_reward_layer.zip \ --compatible-runtimes python3.9 python3.10 python3.11 python3.12 \ --compatible-architectures x86_64 arm64 -
Adicione a camada à sua função Lambda no AWS console ( preset-function-layerselecione a camada personalizada e também adicione AWSSDKPandas-Python 312 para dependências numéricas)
-
Importe e use em seu código Lambda:
from prime_code import compute_score # For code evaluation from prime_math import compute_score # For math evaluation
função prime_code
Objetivo: avalia as tarefas de geração de código em Python executando o código em casos de teste e medindo a exatidão.
Exemplo de formato de conjunto de dados de entrada a partir da avaliação:
{"messages":[{"role":"user","content":"Write a function that returns the sum of two numbers."}],"reference_answer":{"inputs":["3\n5","10\n-2","0\n0"],"outputs":["8","8","0"]}} {"messages":[{"role":"user","content":"Write a function to check if a number is even."}],"reference_answer":{"inputs":["4","7","0","-2"],"outputs":["True","False","True","True"]}}
Principais atributos:
-
Extração automática de código de blocos de código markdown
-
Detecção de funções e testes baseados em chamadas
-
Execução de casos de teste com proteção de tempo limite
-
Verificações de validação e compilação de sintaxe
-
Relatórios detalhados de erros com rastreamentos
função prime_math
Objetivo: avalia o raciocínio matemático e as capacidades de resolução de problemas com suporte matemático simbólico.
Formato de entrada:
{"messages":[{"role":"user","content":"What is the derivative of x^2 + 3x?."}],"reference_answer":"2*x + 3"}
Principais atributos:
-
Avaliação matemática simbólica usando SymPy
-
Vários formatos de resposta (LaTeX, texto simples, simbólico)
-
Verificação de equivalência matemática
-
Normalização e simplificação da expressão
Práticas recomendadas
Siga estas melhores práticas ao usar funções de recompensa predefinidas:
-
Use tipos de dados adequados em casos de teste (inteiros versus strings, booleanos versus “True”)
-
Forneça assinaturas de funções claras em problemas de código
-
Inclua casos extremos nas entradas de teste (zero, números negativos, entradas vazias)
-
Formate expressões matemáticas de forma consistente nas respostas de referência
-
Teste sua função de recompensa com dados de amostra antes da implantação
Criando sua função de recompensa
ARN da Lambda
Você deve consultar o seguinte formato para o ARN do Lambda:
"arn:aws:lambda:*:*:function:*SageMaker*"
Se o Lambda não tiver esse esquema de nomenclatura, o trabalho falhará com este erro:
[ERROR] Unexpected error: lambda_arn must contain one of: ['SageMaker', 'sagemaker', 'Sagemaker'] when running on SMHP platform (Key: lambda_arn)
Estrutura da função Lambda
Sua função Lambda recebe lotes de resultados do modelo e retorna pontuações de recompensa. Abaixo está um exemplo de implementação:
from typing import List, Any import json import re from dataclasses import asdict, dataclass @dataclass class MetricResult: """Individual metric result.""" name: str value: float type: str @dataclass class RewardOutput: """Reward service output.""" id: str aggregate_reward_score: float metrics_list: List[MetricResult] def lambda_handler(event, context): """ Main lambda handler """ return lambda_grader(event) def lambda_grader(samples: list[dict]) -> list[dict]: """ Core grader function """ scores: List[RewardOutput] = [] for sample in samples: print("Sample: ", json.dumps(sample, indent=2)) # Extract components idx = sample.get("id", "no id") if not idx or idx == "no id": print(f"ID is None/empty for sample: {sample}") ground_truth = sample.get("reference_answer") if "messages" not in sample: print(f"Messages is None/empty for id: {idx}") continue if ground_truth is None: print(f"No answer found in ground truth for id: {idx}") continue # Get model's response (last turn is assistant turn) last_message = sample["messages"][-1] if last_message["role"] != "nova_assistant": print(f"Last message is not from assistant for id: {idx}") continue if "content" not in last_message: print(f"Completion text is empty for id: {idx}") continue model_text = last_message["content"] # --- Actual scoring logic (lexical overlap) --- ground_truth_text = _extract_ground_truth_text(ground_truth) # Calculate main score and individual metrics overlap_score = _lexical_overlap_score(model_text, ground_truth_text) # Create two separate metrics as in the first implementation accuracy_score = overlap_score # Use overlap as accuracy fluency_score = _calculate_fluency(model_text) # New function for fluency # Create individual metrics metrics_list = [ MetricResult(name="accuracy", value=accuracy_score, type="Metric"), MetricResult(name="fluency", value=fluency_score, type="Reward") ] ro = RewardOutput( id=idx, aggregate_reward_score=overlap_score, metrics_list=metrics_list ) print(f"Response for id: {idx} is {ro}") scores.append(ro) # Convert to dict format result = [] for score in scores: result.append({ "id": score.id, "aggregate_reward_score": score.aggregate_reward_score, "metrics_list": [asdict(metric) for metric in score.metrics_list] }) return result def _extract_ground_truth_text(ground_truth: Any) -> str: """ Turn the `ground_truth` field into a plain string. """ if isinstance(ground_truth, str): return ground_truth if isinstance(ground_truth, dict): # Common patterns: { "explanation": "...", "answer": "..." } if "explanation" in ground_truth and isinstance(ground_truth["explanation"], str): return ground_truth["explanation"] if "answer" in ground_truth and isinstance(ground_truth["answer"], str): return ground_truth["answer"] # Fallback: stringify the whole dict return json.dumps(ground_truth, ensure_ascii=False) # Fallback: stringify anything else return str(ground_truth) def _tokenize(text: str) -> List[str]: # Very simple tokenizer: lowercase + alphanumeric word chunks return re.findall(r"\w+", text.lower()) def _lexical_overlap_score(model_text: str, ground_truth_text: str) -> float: """ Simple lexical overlap score in [0, 1]: score = |tokens(model) ∩ tokens(gt)| / |tokens(gt)| """ gt_tokens = _tokenize(ground_truth_text) model_tokens = _tokenize(model_text) if not gt_tokens: return 0.0 gt_set = set(gt_tokens) model_set = set(model_tokens) common = gt_set & model_set return len(common) / len(gt_set) def _calculate_fluency(text: str) -> float: """ Calculate a simple fluency score based on: - Average word length - Text length - Sentence structure Returns a score between 0 and 1. """ # Simple implementation - could be enhanced with more sophisticated NLP words = _tokenize(text) if not words: return 0.0 # Average word length normalized to [0,1] range # Assumption: average English word is ~5 chars, so normalize around that avg_word_len = sum(len(word) for word in words) / len(words) word_len_score = min(avg_word_len / 10, 1.0) # Text length score - favor reasonable length responses ideal_length = 100 # words length_score = min(len(words) / ideal_length, 1.0) # Simple sentence structure check (periods, question marks, etc.) sentence_count = len(re.findall(r'[.!?]+', text)) + 1 sentence_ratio = min(sentence_count / (len(words) / 15), 1.0) # Combine scores fluency_score = (word_len_score + length_score + sentence_ratio) / 3 return fluency_score
Formato de solicitação Lambda
Sua função Lambda recebe dados neste formato:
[ { "id": "sample-001", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Do you have a dedicated security team?" } ] }, { "role": "nova_assistant", "content": [ { "type": "text", "text": "As an AI developed by Company, I don't have a dedicated security team in the traditional sense. However, the development and deployment of AI systems like me involve extensive security measures, including data encryption, user privacy protection, and other safeguards to ensure safe and responsible use." } ] } ], "reference_answer": { "compliant": "No", "explanation": "As an AI developed by Company, I do not have a traditional security team. However, the deployment involves stringent safety measures, such as encryption and privacy safeguards." } } ]
nota
A estrutura da mensagem inclui a content matriz aninhada, correspondente ao formato dos dados de entrada. A última mensagem com função nova_assistant contém a resposta gerada pelo modelo.
Formato de resposta Lambda
Sua função Lambda deve retornar dados neste formato:
[ { "id": "sample-001", "aggregate_reward_score": 0.75, "metrics_list": [ { "name": "accuracy", "value": 0.85, "type": "Metric" }, { "name": "fluency", "value": 0.90, "type": "Reward" } ] } ]
Campos de resposta:
-
id: deve corresponder ao ID da amostra de entrada -
aggregate_reward_score: Pontuação geral (normalmente 0,0 a 1,0) -
metrics_list: Conjunto de métricas individuais com:-
name: Identificador métrico (por exemplo, “precisão”, “fluência”) -
value: Pontuação métrica (normalmente 0,0 a 1,0) -
type: “Métrica” (para relatórios) ou “Recompensa” (usada no treinamento)
-
permissões do IAM
Permissões obrigatórias
Sua função de execução de SageMaker IA deve ter permissões para invocar sua função Lambda. Adicione essa política à sua função de execução de SageMaker IA:
{ "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, Amazon S3 para dados de referência, DynamoDB para registro), adicione essas permissões à função de execução do Lambda.
Executando o trabalho de avaliação
-
Prepare seus dados
-
Formate seus dados de avaliação de acordo com os requisitos de formato de dados
-
Faça o upload do seu arquivo JSONL para o Amazon S3:
s3://your-bucket/eval-data/eval_data.jsonl
-
-
Configure sua receita
Atualize a receita de amostra com sua configuração:
-
model_name_or_pathDefina a localização do seu modelo -
lambda_arnDefina para sua função de recompensa ARN -
output_s3_pathDefina o local de saída desejado -
Ajuste
inferenceos parâmetros conforme necessário
Salve a receita como
rft_eval_recipe.yaml -
-
Execute a avaliação
Execute o trabalho de avaliação usando o notebook fornecido: caderno de avaliação do modelo Nova
-
Monitore o progresso
Monitore seu trabalho de avaliação por meio de:
-
SageMaker AI Console: verifique o status e os registros do trabalho
-
CloudWatch Registros: veja registros de execução detalhados
-
Lambda Logs: Depurar problemas na função de recompensa
-
Entendendo os resultados da avaliação
Formato de saída
O trabalho de avaliação gera resultados para a localização especificada do Amazon S3 no formato JSONL. Cada linha contém os resultados da avaliação de uma amostra:
{ "id": "sample-001", "aggregate_reward_score": 0.75, "metrics_list": [ { "name": "accuracy", "value": 0.85, "type": "Metric" }, { "name": "fluency", "value": 0.90, "type": "Reward" } ] }
nota
O RFT Evaluation Job Output é idêntico ao formato Lambda Response. O serviço de avaliação passa pela resposta da função Lambda sem modificação, garantindo a consistência entre seus cálculos de recompensa e os resultados finais.
Como interpretar os resultados do
Pontuação de recompensa agregada:
-
Intervalo: normalmente 0,0 (pior) a 1,0 (melhor), mas depende da sua implementação
-
Objetivo: número único resumindo o desempenho geral
-
Uso: Compare modelos, acompanhe a melhoria em relação ao treinamento
Métricas individuais:
-
Tipo de métrica: métricas informativas para análise
-
Tipo de recompensa: métricas usadas durante o treinamento de RFT
-
Interpretação: valores mais altos geralmente indicam melhor desempenho (a menos que você crie métricas inversas)
Benchmarks de desempenho
O que constitui um desempenho “bom” depende do seu caso de uso:
Intervalo de pontuação |
Interpretação |
Ação |
|---|---|---|
0,8 - 1,0 |
Excelente |
Modelo pronto para implantação |
0,6 - 0,8 |
Boa |
Pequenas melhorias podem ser benéficas |
0,4 - 0,6 |
Razoável |
É necessária uma melhoria significativa |
0,0 - 0,4 |
Pobre |
Revise os dados de treinamento e a função de recompensa |
Importante
Essas são diretrizes gerais. Defina seus próprios limites com base nos requisitos de negócios, no desempenho do modelo básico, nas restrições específicas do domínio e na análise de custo-benefício do treinamento adicional.