Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
RFT-Auswertung
Anmerkung
Die Bewertung über Remote-Belohnungsfunktionen in Ihrer eigenen AWS Umgebung ist nur verfügbar, wenn Sie Nova Forge-Kunde sind.
Wichtig
Das rl_env Konfigurationsfeld wird ausschließlich zur Evaluierung verwendet, nicht für Schulungen. Während des Trainings konfigurieren Sie die Belohnungsfunktionen mithilfe einer reward_lambda_arn (Single-Turn) oder einer BYOO-Infrastruktur mit rollout.delegate: true (Multi-Turn).
Was ist RFT-Evaluierung?
Mit der RFT-Evaluierung können Sie die Leistung Ihres Modells mithilfe benutzerdefinierter Belohnungsfunktionen vor, während oder nach dem Reinforcement-Learning-Training bewerten. Im Gegensatz zu Standardbewertungen, die vordefinierte Metriken verwenden, können Sie mit RFT Evaluation Ihre eigenen Erfolgskriterien mithilfe einer Lambda-Funktion definieren, die Modellergebnisse auf der Grundlage Ihrer spezifischen Anforderungen bewertet.
Warum mit RFT evaluieren?
Die Bewertung ist entscheidend, um festzustellen, ob der RL-Feinabstimmungsprozess Folgendes beinhaltet:
-
Verbesserte Abstimmung des Modells auf Ihren spezifischen Anwendungsfall und Ihre menschlichen Werte
-
Beibehaltung oder Verbesserung der Modellfunktionen bei wichtigen Aufgaben
-
Vermeidung unbeabsichtigter Nebenwirkungen wie verringerte Sachlichkeit, erhöhte Ausführlichkeit oder Leistungseinbußen bei anderen Aufgaben
-
Hat Ihre benutzerdefinierten Erfolgskriterien erfüllt, wie sie in Ihrer Belohnungsfunktion definiert sind
Wann sollte die RFT-Evaluierung verwendet werden
Verwenden Sie RFT Evaluation in diesen Szenarien:
-
Vor dem RFT-Training: Legen Sie Basiskennzahlen für Ihren Bewertungsdatensatz fest
-
Während des RFT-Trainings: Überwachen Sie den Trainingsfortschritt mit Zwischenstationen
-
Nach dem RFT-Training: Stellen Sie sicher, dass das endgültige Modell Ihren Anforderungen entspricht
-
Modelle vergleichen: Evaluieren Sie mehrere Modellversionen anhand einheitlicher Prämienkriterien
Anmerkung
Verwenden Sie RFT Evaluation, wenn Sie benutzerdefinierte, domänenspezifische Metriken benötigen. Verwenden Sie für allgemeine Bewertungsmethoden (Genauigkeit, Verwirrung, BLEU) die Standardauswertungsmethoden.
Themen
Datenformatanforderungen
Struktur der Eingabedaten
Die Eingabedaten der RFT-Bewertung müssen dem OpenAI Reinforcement Fine-Tuning-Format entsprechen. Jedes Beispiel ist ein JSON-Objekt, das Folgendes enthält:
-
messages: Eine Reihe von Konversationswechseln mitsystemund Rollenuser -
Optionale weitere Metadaten, z. B. reference_answer
Beispiel für ein Datenformat
Das folgende Beispiel zeigt das erforderliche Format:
{ "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Solve for x. Return only JSON like {\"x\": <number>}. Equation: 2x + 5 = 13" } ] } ], "reference_answer": { "x": 4 } }
Derzeitige Einschränkungen
Die folgenden Einschränkungen gelten für die RFT-Evaluierung:
-
Nur Text: Es werden keine multimodalen Eingaben (Bilder, Audio, Video) unterstützt
-
Single-Turn-Konversationen: Unterstützt nur Einzelbenutzernachrichten (keine Multi-Turn-Dialoge)
-
JSON-Format: Die Eingabedaten müssen im JSONL-Format vorliegen (ein JSON-Objekt pro Zeile)
-
Modellausgaben: Die Auswertung erfolgt anhand der generierten Vervollständigungen aus dem angegebenen Modell
Vorbereitung Ihres Bewertungsrezepts
Beispiel für eine Rezeptkonfiguration
Das folgende Beispiel zeigt ein vollständiges RFT-Evaluierungsrezept:
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>
Voreingestellte Belohnungsfunktionen
Wir haben 2 voreingestellte Belohnungsfunktionen (prime_code, prime_math) aus der Open-Source-Verl-Bibliothek
-Übersicht
out-of-the-boxDiese voreingestellten Funktionen bieten Evaluierungsmöglichkeiten für:
-
prime_code: Codegenerierung und Korrektheitsbewertung
-
prime_math: Mathematisches Denken und Bewertung der Problemlösung
Quick Setup
Um voreingestellte Belohnungsfunktionen zu verwenden:
-
Laden Sie die Lambda-Schicht aus den nova-custom-eval-sdk Versionen herunter
-
Veröffentlichen Sie die Lambda-Schicht mit AWS CLI:
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 -
Fügen Sie die Ebene zu Ihrer Lambda-Funktion in der AWS Konsole hinzu (Wählen Sie die Ebene preset-function-layer aus der benutzerdefinierten Ebene aus und fügen Sie AWSSDKPandas-Python 312 für numpy-Abhängigkeiten hinzu)
-
Importieren und in Ihrem Lambda-Code verwenden:
from prime_code import compute_score # For code evaluation from prime_math import compute_score # For math evaluation
prime_code-Funktion
Zweck: Evaluiert Aufgaben zur Python-Codegenerierung, indem Code anhand von Testfällen ausgeführt und die Richtigkeit gemessen wird.
Beispiel für ein Eingabedatensatzformat aus der Auswertung:
{"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"]}}
Hauptmerkmale:
-
Automatische Codeextraktion aus Markdown-Codeblöcken
-
Funktionserkennung und anrufbasiertes Testen
-
Ausführung von Testfällen mit Timeout-Schutz
-
Syntaxvalidierung und Kompilierungsprüfungen
-
Detaillierte Fehlerberichterstattung mit Tracebacks
prime_math-Funktion
Zweck: Evaluiert die Fähigkeiten zum mathematischen Denken und zur Problemlösung mit Unterstützung symbolischer Mathematik.
Eingabeformat:
{"messages":[{"role":"user","content":"What is the derivative of x^2 + 3x?."}],"reference_answer":"2*x + 3"}
Die wichtigsten Funktionen:
-
Symbolische mathematische Bewertung mit SymPy
-
Mehrere Antwortformate (LaTeX, Klartext, symbolisch)
-
Mathematische Äquivalenzprüfung
-
Normalisierung und Vereinfachung von Ausdrücken
Best Practices
Folgen Sie diesen bewährten Methoden, wenn Sie voreingestellte Belohnungsfunktionen verwenden:
-
Verwenden Sie in Testfällen die richtigen Datentypen (Ganzzahlen im Vergleich zu Zeichenketten, boolesche Werte im Vergleich zu „True“)
-
Stellen Sie bei Codeproblemen klare Funktionssignaturen bereit
-
Schließen Sie Grenzfälle in Testeingaben ein (Null, negative Zahlen, leere Eingaben)
-
Formatieren Sie mathematische Ausdrücke konsistent in Referenzantworten
-
Testen Sie Ihre Belohnungsfunktion vor der Bereitstellung mit Beispieldaten
Erstellen Sie Ihre Belohnungsfunktion
Lambda-ARN
Sie müssen sich für den Lambda-ARN auf das folgende Format beziehen:
"arn:aws:lambda:*:*:function:*SageMaker*"
Wenn das Lambda dieses Benennungsschema nicht hat, schlägt der Job mit dem folgenden Fehler fehl:
[ERROR] Unexpected error: lambda_arn must contain one of: ['SageMaker', 'sagemaker', 'Sagemaker'] when running on SMHP platform (Key: lambda_arn)
Struktur der Lambda-Funktion
Ihre Lambda-Funktion empfängt Stapel von Modellausgaben und gibt Prämienwerte zurück. Im Folgenden finden Sie ein Beispiel für eine Implementierung:
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
Lambda-Anforderungsformat
Ihre Lambda-Funktion empfängt Daten in diesem Format:
[ { "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." } } ]
Anmerkung
Die Nachrichtenstruktur umfasst das verschachtelte content Array, das dem Eingabedatenformat entspricht. Die letzte Nachricht mit Rolle nova_assistant enthält die vom Modell generierte Antwort.
Lambda-Antwortformat
Ihre Lambda-Funktion muss Daten in diesem Format zurückgeben:
[ { "id": "sample-001", "aggregate_reward_score": 0.75, "metrics_list": [ { "name": "accuracy", "value": 0.85, "type": "Metric" }, { "name": "fluency", "value": 0.90, "type": "Reward" } ] } ]
Antwortfelder:
-
id: Muss mit der eingegebenen Proben-ID übereinstimmen -
aggregate_reward_score: Gesamtpunktzahl (normalerweise 0,0 bis 1,0) -
metrics_list: Array einzelner Metriken mit:-
name: Kennzahl der Metrik (z. B. „Genauigkeit“, „Fließfähigkeit“) -
value: Metrischer Wert (typischerweise 0,0 bis 1,0) -
type: Entweder „Metrik“ (für Berichte) oder „Belohnung“ (wird in Schulungen verwendet)
-
IAM-Berechtigungen
Erforderliche Berechtigungen
Ihre SageMaker KI-Ausführungsrolle muss über Berechtigungen zum Aufrufen Ihrer Lambda-Funktion verfügen. Fügen Sie diese Richtlinie zu Ihrer SageMaker KI-Ausführungsrolle hinzu:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:region:account-id:function:function-name" } ] }
Lambda-Ausführungsrolle
Die Ausführungsrolle Ihrer Lambda-Funktion benötigt grundlegende Lambda-Ausführungsberechtigungen:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }
Zusätzliche Berechtigungen: Wenn Ihre Lambda-Funktion auf andere AWS Dienste zugreift (z. B. Amazon S3 für Referenzdaten, DynamoDB für die Protokollierung), fügen Sie diese Berechtigungen der Lambda-Ausführungsrolle hinzu.
Ausführung des Evaluierungsjobs
-
Bereiten Sie Ihre Daten vor
-
Formatieren Sie Ihre Bewertungsdaten gemäß den Anforderungen an das Datenformat
-
Laden Sie Ihre JSONL-Datei auf Amazon S3 hoch:
s3://your-bucket/eval-data/eval_data.jsonl
-
-
Konfiguriere dein Rezept
Aktualisieren Sie das Beispielrezept mit Ihrer Konfiguration:
-
Stellen Sie
model_name_or_pathden Standort Ihres Modells ein -
Stellen
lambda_arnSie Ihre Belohnungsfunktion ARN ein -
Stellen
output_s3_pathSie den gewünschten Ausgabeort ein -
Passen Sie die
inferenceParameter nach Bedarf an
Speichern Sie das Rezept unter
rft_eval_recipe.yaml -
-
Führen Sie die Evaluierung aus
Führen Sie den Evaluierungsjob mit dem mitgelieferten Notizbuch aus: Evaluationsnotizbuch für das Modell Nova
-
Überwachen Sie den Fortschritt
Überwachen Sie Ihre Bewertungsaufgabe durch:
-
SageMaker KI-Konsole: Überprüfen Sie den Auftragsstatus und die Protokolle
-
CloudWatch Protokolle: Detaillierte Ausführungsprotokolle anzeigen
-
Lambda Logs: Probleme mit der Belohnungsfunktion debuggen
-
Evaluierungsergebnisse verstehen
Ausgabeformat
Der Bewertungsjob gibt die Ergebnisse im JSONL-Format an Ihrem angegebenen Amazon S3 S3-Standort aus. Jede Zeile enthält die Bewertungsergebnisse für eine Probe:
{ "id": "sample-001", "aggregate_reward_score": 0.75, "metrics_list": [ { "name": "accuracy", "value": 0.85, "type": "Metric" }, { "name": "fluency", "value": 0.90, "type": "Reward" } ] }
Anmerkung
Die Ausgabe des RFT-Evaluierungsjobs ist identisch mit dem Lambda Response-Format. Der Bewertungsservice durchläuft die Antwort Ihrer Lambda-Funktion unverändert und gewährleistet so die Konsistenz zwischen Ihren Belohnungsberechnungen und den Endergebnissen.
Interpretation der Ergebnisse
Gesamter Prämienwert:
-
Bereich: In der Regel 0,0 (am schlechtesten) bis 1,0 (am besten), hängt jedoch von Ihrer Implementierung ab
-
Zweck: Eine einzelne Zahl, die die Gesamtleistung zusammenfasst
-
Verwendungszweck: Modelle vergleichen, Verbesserungen im Vergleich zu Schulungen verfolgen
Individuelle Metriken:
-
Metriktyp: Informationsmetriken für die Analyse
-
Art der Belohnung: Metriken, die während des RFT-Trainings verwendet wurden
-
Interpretation: Höhere Werte bedeuten im Allgemeinen eine bessere Leistung (es sei denn, Sie entwerfen inverse Metriken)
Leistungsmaßstäbe
Was unter „guter“ Leistung zu verstehen ist, hängt von Ihrem Anwendungsfall ab:
Punktebereich |
Interpretation |
Action |
|---|---|---|
0,8 - 1,0 |
Ausgezeichnet |
Modell bereit für den Einsatz |
0,6 - 0,8 |
Gut |
Geringfügige Verbesserungen können von Vorteil sein |
0,4 - 0,6 |
Fair |
Signifikante Verbesserung erforderlich |
0,0-0,4 |
Schlecht |
Überprüfen Sie die Trainingsdaten und die Belohnungsfunktion |
Wichtig
Dies sind allgemeine Richtlinien. Definieren Sie Ihre eigenen Schwellenwerte auf der Grundlage der Geschäftsanforderungen, der Leistung des Basismodells, der domänenspezifischen Einschränkungen und der Kosten-Nutzen-Analyse von Weiterbildungsmaßnahmen.