

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.

# Bewertungsmethoden definieren
<a name="advanced-prompt-optimization-evaluation"></a>

## -Übersicht
<a name="advanced-prompt-optimization-evaluation-overview"></a>

Wählen Sie EINE Bewertungsmethode pro Prompt-Vorlage aus, oder lassen Sie alle optionalen Bewertungsfelder für den Systemstandard weg. Verschiedene Vorlagen in demselben Job können unterschiedliche Methoden verwenden. Die Bewertung steuert die zeitnahe Optimierung. Definieren Sie daher Ihre Methode und Ihre Kriterien so genau wie möglich.
+ [Standardauswertung](#advanced-prompt-optimization-evaluation-default)
+ [Lenkungskriterien](#advanced-prompt-optimization-evaluation-steering)
+ [Benutzerdefiniert LLM-as-a-judge](#advanced-prompt-optimization-evaluation-llmj)
+ [Benutzerdefinierter Lambda-Evaluator](#advanced-prompt-optimization-evaluation-lambda)

## Tipps zum Datensatz
<a name="advanced-prompt-optimization-evaluation-dataset-tips"></a>
+ **Mischen Sie einfache und schwierige Beispiele ** — passen Sie dem an, was Sie in der realen Welt sehen. All-easy Daten werden nicht zur Aufforderung, sich zu verbessern, drängen; reine Daten lassen nichts übrig, woraus man lernen könnte.
+ **Behandeln Sie die Fälle, die Ihnen wichtig sind ** — das System verallgemeinert über das hinaus, was es sieht, aber eine repräsentative Datenverteilung hilft dabei, besser auf reale Eingaben zu verallgemeinern.
+ **Testen Sie nach der zeitnahen Optimierung die Daten, die der Optimierer noch nicht gesehen hat, mit einem ausgestreckten Datensatz ** — so wird bestätigt, dass die Gewinne real sind und nicht nur auswendig gelernt wurden.

## Standardauswertung
<a name="advanced-prompt-optimization-evaluation-default"></a>

Lassen Sie alle optionalen Bewertungsfelder (`steeringCriteria`,`customLLMJConfig`,`evaluationMetricLambdaArn`) aus. Der Service verwendet ein integriertes generisches System, das auf Anthropic Claude Sonnet 4.6 LLM-as-judge basiert und drei Standardkriterien bewertet: Genauigkeit der Antworten, Vollständigkeit der Antworten und Ausdrucksqualität. Anhand der Aufforderung, der Antwort des Zielmodells und einer Referenzantwort bewertet der Juror jede Dimension. Anschließend weist er der Aufgabe dynamisch die entsprechende Gewichtung zu und berechnet eine gewichtete Gesamtpunktzahl.

Wir empfehlen, Ihre eigene Bewertungsmethode zu definieren, um optimale Ergebnisse zu erzielen.

### Standardmäßige vom System bereitgestellte Richteraufforderung
<a name="advanced-prompt-optimization-evaluation-default-prompt"></a>

Im Folgenden finden Sie die vollständige vom System bereitgestellte Richteraufforderung, die bei der Standardbewertung mit Anthropic Claude Sonnet 4.6 verwendet wurde:

```
Please act as an impartial judge and evaluate the quality of an answer to a user question, with the help of a reference answer.

You will be given:
(1) a user question, enclosed in <user_question></user_question> tags
(2) an answer, enclosed in <answer></answer> tags
(3) a reference answer, enclosed in <reference_answer></reference_answer> tags

## Universal Evaluation Dimensions

Evaluate the answer across these core dimensions:

**(1) Answer Accuracy:**
examines correctness, consistency, and factuality alignment between the <answer> and the <user_question>;
examines if the <answer> contains irrelevant or wrongful information/hallucination.

**(2) Answer Completeness:**
examines if the <answer> is fully addressing the <user_question>;
examines if the <answer> is good at relevance/informativeness: selection of important/key content from <user_question>

**(3) Expression Quality:**
examines if the <answer> is concise at answering the <user_question>.
NOTE that unless there is special instruction, more concise <answer> is always better,
and explanation or rational is strictly NOT needed - THIS IS THE MOST IMPORTANT!
examines the alignment on instruction following, e.g., if the <answer> adheres
to both explicit guidelines and implicit guidelines (like few-shot examples) in the <user_question>;

## Scoring Rubric

For each dimension, assign one score:
- **3 points**: Fully satisfies the dimension requirements
- **2 points**: Mostly satisfies with minor issues or gaps
- **1 point**: Partially satisfies but has notable limitations
- **0 points**: Does not satisfy the dimension requirements

## Evaluation Process
1. First, identify the task type from the user question
2. Consider any additional criteria provided
3. Score each dimension independently
4. Determine appropriate weights and calculate final weighted score

## Dimension Weighting and Final Scoring

**Weight Determination Process:**
Assign weights (must sum to 1.0) based on:
- Explicit weights in evaluation_criteria (if provided)
- Task analysis and question requirements (if no explicit weights)
- Default weights (Answer Accuracy: 0.35, Answer Completeness: 0.30, Expression Quality: 0.35) as fallback

**Weight Guidelines:**
- **High Accuracy Weight (0.4-0.6)**: Factual questions, multiple choice, technical problems
- **High Completeness Weight (0.4-0.6)**: Complex explanatory tasks, multi-part questions
- **High Expression Weight (0.4-0.6)**: Creative tasks, presentation-focused questions, format-specific requirements
{custom_eval_weight_guideline}

**Overall Score Calculation:**
Overall = (Answer_Accuracy x Weight_A) + (Answer_Completeness x Weight_C) + (Expression_Quality x Weight_E)

## Output Format

Provide your evaluation in this exact format:
<Task_Analysis>Brief analysis of task type and appropriate weight rationale</Task_Analysis>
<Weights>Answer Accuracy: 0.XX, Answer Completeness: 0.XX, Expression Quality: 0.XX</Weights>
<Answer Accuracy>X</Answer Accuracy>
<Answer Completeness>X</Answer Completeness>
<Expression Quality>X</Expression Quality>
<Calculation>(X x 0.XX) + (X x 0.XX) + (X x 0.XX) = X.XX</Calculation>
<Overall>X.XX</Overall>
<Justification>
**Answer Accuracy**: [Evaluate factual accuracy, alignment with reference answer, absence of errors/hallucinations, and logical consistency]
**Answer Completeness**: [Assess whether all aspects of the question are addressed, necessary information is included, and content stays relevant]
**Expression Quality**: [Examine formatting/style adherence, appropriate detail level, communication clarity, and instruction following]
**Weight Application**: [Explain how the chosen weights reflect the task requirements and impact the final score]
</Justification>

---

## Current Evaluation Task

<user_question>
{prompt}
</user_question>
<answer>
{prediction}
</answer>
<reference_answer>
{gold}
</reference_answer>

Based on the above guidelines and criteria, provide your evaluation:
```

## Lenkungskriterien
<a name="advanced-prompt-optimization-evaluation-steering"></a>

Lenkungskriterien sind kurze Deskriptoren in natürlicher Sprache, die die Richtung der Optimierung vorgeben.
+ **Format**: `"steeringCriteria": ["string1", "string2"]`
+ **Was sie sein können: ** Alles von einem einzelnen Wort bis hin zu einigen Sätzen mit qualitativen oder quantitativen Beschreibungen, wie die Modellreaktion aussehen soll.
+ **Limit: ** Bis zu 5 pro Prompt-Vorlage.

**Beispiel:**

```
"steeringCriteria": ["PROFESSIONAL", "CONCISE"]
```

## Benutzerdefiniert LLM-as-a-judge
<a name="advanced-prompt-optimization-evaluation-llmj"></a>

Stellen Sie eine vollständige Rubrik mit einer von Ihnen definierten Bewertungsskala bereit. Ihre benutzerdefinierte Richter-Eingabeaufforderung wird mit der System-Richter-Aufforderung des Dienstes zusammengeführt und stärker gewichtet.

### Konfiguration
<a name="advanced-prompt-optimization-evaluation-llmj-config"></a>
+ **Format: plus ** `"customLLMJConfig": {"customLLMJPrompt": "...", "customLLMJModelId": "..."}` `"customEvaluationMetricLabel": "My Metric"`
+ **Verfügbare Richtermodelle: ** anthropic.claude-opus-4-6-v1, anthropic.claude-sonnet-4-5-20250929-v 1:0, anthropic.claude-sonnet-4-6
+ **Platzhalter in Ihrer Richter-Eingabeaufforderung: **
  + `{{prompt}}`: Die vollständig gerenderte Aufforderung (Vorlage für Eingabeaufforderung plus Bewertungsmuster in Kombination)
  + `{{response}}`: die Modellausgabe
  + `{{referenceResponse}}`: die grundlegende Wahrheit
+ **Bewertung: ** Definieren Sie Ihre Bewertungsskala so, dass eine höhere Zahl besser ist. Der Service normalisiert alle Ergebnisse für die Endergebnisse.
+ Wenn Sie mehrere Rubriken haben, führen Sie sie zu einer einzigen Richter-Eingabeaufforderung zusammen.

### Bewährte Methoden für das Verfassen von Aufforderungen für Richter
<a name="advanced-prompt-optimization-evaluation-llmj-best"></a>

Verwenden Sie eine klar definierte Rubrik mit expliziten Bewertungskriterien und konkreten Beispielen für jede Bewertungsstufe. Verankern Sie jede Rubrikebene eher mit Verhaltensbeschreibungen als mit subjektiven Adjektiven. Fügen Sie mindestens ein praktisches Beispiel hinzu, das eine nicht perfekte Punktzahl zeigt, um den Richter davon abzuhalten, standardmäßig hohe Bewertungen zu erhalten. Weisen Sie das Modell an, vor der numerischen Bewertung eine schriftliche Begründung vorzulegen. Erwägen Sie, bestimmte Dimensionen unabhängig voneinander zu bewerten, bevor Sie eine Gesamtpunktzahl zuweisen. Die vertrauenswürdigsten und hilfreichsten LLM-as-a-judge Evaluatoren sind in der Regel diejenigen, bei denen Sie den Antworten des Richtermodells zustimmen. Daher kann es hilfreich sein, eine Bewertung zu verwenden, die Sie bereits überprüft haben.

### Wie Ihr benutzerdefinierter Judge-Prompt zur Laufzeit mit dem System-Prompt zusammengeführt wird
<a name="advanced-prompt-optimization-evaluation-llmj-merge"></a>

Wenn Sie eine eigene LLM-as-a-judge Bewertungsaufforderung angeben, wird diese mit einer generischen, vom Service bereitgestellten Richter-Prompt zusammengeführt. Die Aufforderung enthält spezifische Anweisungen zur Formatierung und andere bewährte Methoden, die den Optimierungsprozess unterstützen. Ihre benutzerdefinierte Eingabeaufforderung wird bei der endgültigen Beurteilung stärker gewichtet als die allgemeinen Kriterien. Insbesondere der Service:
+ Extrahiert die Absicht aus Ihrer benutzerdefinierten Eingabeaufforderung
+ Normalisiert die Skala so, dass sie der Systemrubrik 0 bis 3 entspricht
+ Fügt sie als benannte Dimension in die CUSTOM\_CRITERIA\_DESCRIPTION-Tags ein
+ Verfälscht die Gewichtungsanweisungen, um dem benutzerdefinierten Kriterium eine erhöhte Bedeutung zu geben (0,3 bis 0,6)
+ Fügt Prioritätsregeln hinzu, die besagen, dass benutzerdefinierte Kriterien Konflikte mit anderen Dimensionen überschreiben
+ Behält die ursprüngliche Semantik Ihrer Bewertung bei

**Beispiel: ** Sie können die folgende benutzerdefinierte LLM-as-a-judge Aufforderung zur Bewertung von Treue angeben:

```
You are given a task in some context (Input), and a candidate answer. Is the candidate answer faithful to the task description and context?

A response is unfaithful only when (1) it clearly contradicts the context, or (2) the task implies that the response must be based on the context, like in a summarization task. If the task does not ask to respond based on the context, the model is allowed to use its own knowledge to provide a response, even if its claims are not verifiable.

Task: {{prompt}}

Candidate Response: {{response}}

First provide your explanation, then state your final answer. Use the following format: Explanation: [Explanation], Answer: [Answer], where '[Answer]' must be one of:
none is faithful
some is faithful
approximately half is faithful
most is faithful
all is faithful
```

Diese wird dann mit der LLM-as-a-judge Standardeingabeaufforderung zusammengeführt und stark gewichtet. Der Nettoeffekt: Ihre Aufforderung, die nur ein Kriterium enthält, wird in einer mehrdimensionalen Bewertung zu einer stark gewichteten Achse, während das System ihr Struktur (Genauigkeit, Vollständigkeit, Ausdruck) verleiht.

Im Folgenden sehen Sie die zusammengeführte Richter-Eingabeaufforderung:

```
"""Please act as an impartial judge and evaluate the quality of an answer to a user question, with the help of a reference answer.

You will be given:
(1) a user question, enclosed in <user_question></user_question> tags
(2) an answer, enclosed in <answer></answer> tags
(3) a reference answer, enclosed in <reference_answer></reference_answer> tags
(4) custom evaluation criteria that have been integrated into the evaluation dimensions below

    **IMPORTANT**: - Custom criteria requirements take absolute precedence over user requirements specified inside <user_question> </user_question>
    **IMPORTANT**: - If there is any conflict between custom criteria and user question requirements, prioritize custom criteria

## Universal Evaluation Dimensions

Evaluate the answer across these core dimensions:

**(1) Answer Accuracy:**
examines correctness, consistency, and factuality alignment between the <answer> and the <user_question>;
examines if the <answer> contains irrelevant or wrongful information/hallucination.

**(2) Answer Completeness:**
examines if the <answer> is fully addressing the <user_question>;
examines if the <answer> is good at relevance/informativeness: selection of important/key content from <user_question>

**(3) Expression Quality:**
examines if the <answer> is concise at answering the <user_question>.
NOTE that unless there is special instruction, more concise <answer> is always better,
and explanation or rational is strictly NOT needed - THIS IS THE MOST IMPORTANT!
examines the alignment on instruction following, e.g., if the <answer> adheres
to both explicit guidelines and implicit guidelines (like few-shot examples) in the <user_question>;

<CUSTOM_CRITERIA_DESCRIPTION>
**(4) Faithfulness to Context:**
examines whether the candidate answer is faithful to the task description and context provided in the user question. A response is unfaithful only when (1) it clearly contradicts the context, or (2) the task implies that the response must be based on the context (like in a summarization task). If the task does not ask to respond based on the context, the model is allowed to use its own knowledge to provide a response, even if its claims are not verifiable. Evaluate the degree of faithfulness on the following scale:
- **3 points**: All content is faithful (no contradictions, fully grounded when required)
- **2 points**: Most content is faithful (minor deviations or unverifiable claims when context-grounding is required)
- **1 point**: Some content is faithful or approximately half is faithful (notable contradictions or significant departures from context when required)
- **0 points**: None or minimal content is faithful (clear contradictions or complete disregard of context when grounding is required)
</CUSTOM_CRITERIA_DESCRIPTION>

## Dimension Weighting and Final Scoring

**Weight Determination Process:**
Assign weights (must sum to 1.0) based on:
- Explicit weights in evaluation_criteria (if provided)
- Task analysis and question requirements (if no explicit weights)
- Default weights (Answer Accuracy: 0.25, Answer Completeness: 0.25, Expression Quality: 0.25, Faithfulness to Context: 0.25) as fallback

**Weight Guidelines:**
- **High Accuracy Weight (0.3-0.5)**: Factual questions, multiple choice, technical problems
- **High Completeness Weight (0.3-0.5)**: Complex explanatory tasks, multi-part questions
- **High Expression Weight (0.3-0.5)**: Creative tasks, presentation-focused questions, format-specific requirements
- [*IMPORTANT*] **High Custom Criteria Weight**: The custom criteria (Faithfulness to Context) should always be *prioritized*. Assign it significant weight (0.3-0.6) and adjust other weights accordingly.

**Overall Score Calculation:**
Overall = (Answer_Accuracy x Weight_A) + (Answer_Completeness x Weight_C) + (Expression_Quality x Weight_E) + (Faithfulness_to_Context x Weight_F)

## Current Evaluation Task

<user_question>
{prompt}
</user_question>
<answer>
{prediction}
</answer>
<reference_answer>
{gold}
</reference_answer>

Based on the above guidelines and criteria, provide your evaluation:"""
```

## Benutzerdefinierter Lambda-Evaluator
<a name="advanced-prompt-optimization-evaluation-lambda"></a>

Bringen Sie Ihre eigene Bewertungsfunktion als Lambda-Funktion mit.

### Konfiguration
<a name="advanced-prompt-optimization-evaluation-lambda-config"></a>

Geben Sie den Lambda-ARN in Ihrer JSONL-Eingabedatei für jede Prompt-Vorlage an, die ihn verwenden soll. Sie geben auch das `customEvaluationMetricLabel` Feld an, um Ihre Metrik zu benennen:

```
"evaluationMetricLambdaArn": "arn:aws:lambda:us-west-2:123456789012:function:my-eval-function",
"customEvaluationMetricLabel": "My Custom Metric"
```

Wenn Sie den Job über die API erstellen, ist in der `CreateAdvancedPromptOptimizationJob` Anfrage selbst keine zusätzliche Evaluierungskonfiguration erforderlich. Die Bewertungsmethode wird pro Vorlage anhand der JSONL-Eingabedatei bestimmt.

### Lambda-Anforderungen
<a name="advanced-prompt-optimization-evaluation-lambda-reqs"></a>
+ Einzelne `.py` Datei mit dem gesamten Code
+ Der Handler ist auf gesetzt `lambda_function.lambda_handler`
+ Muss die `compute_score(preds, golds)` Rückgabe implementieren `{"score": float, "scores": [float, ...]}`
+ Der `golds` Parameter enthält die `referenceResponse` Werte. Wenn Sie `referenceResponse` in Ihrem Eingabedatensatz nichts angegeben haben, müssen Sie Ihre `compute_score` Funktion nicht übergeben`golds`.
+ Stürzt nie ab; gibt bei Fehlern 0,0 zurück, anstatt Ausnahmen auszulösen
+ Ziehen Sie kontinuierliche Werte (0,0 bis 1,0) den binären Werten vor, um die Konvergenz 0/1 bei der Optimierung zu beschleunigen
+ Die Werte müssen nicht auf [0, 1] beschränkt sein.
+ Die Punktzahlen müssen einer „Höher ist besser“ -Skala folgen. Dies ist eine Voraussetzung, damit die Optimierung korrekt funktioniert.
+ Stellen Sie das Timeout für große Batches auf maximal 15 Minuten (900 s) ein, um vorzeitige Timeouts zu vermeiden
+ Fügen Sie eine ressourcenbasierte Richtlinie hinzu, mit der Sie Ihr Lambda aufrufen können `bedrock.amazonaws.com`

### Tipps zur Lambda-Metrik
<a name="advanced-prompt-optimization-evaluation-lambda-metric-tips"></a>
+ **Schreiben Sie einen eindeutigen Docstring auf `compute_score` ** — der Docstring wird extrahiert und dem System als Beschreibung der Metrik angezeigt. Erklären Sie, was die Punktzahl bedeutet und was eine hohe Punktzahl von einer niedrigen Punktzahl unterscheidet.
+ **Schreiben Sie Ihren Metrikcode klar und deutlich ** — der vollständige Quellcode wird vom System gelesen. Kommentare, Variablennamen und lesbare Logik helfen dem System, Ihre Absicht zu verstehen und besseres Feedback zu generieren.
+ **Bevorzugen Sie kontinuierliche Ergebnisse gegenüber binären Ergebnissen 0/1 ** — der Optimierer maximiert den Durchschnittswert aller Stichproben. Kontinuierliche Abstufungen (z. B. partielle Punktzahlen) geben ein weicheres Signal, dem man folgen kann, als Alles-oder-Nichts-Ergebnisse.
+ **Geben Sie strukturierte Details zurück, nicht nur eine Zahl**. Wenn Sie ein Diktat mit Unterpunktzahlen oder Diagnosefeldern zurückgeben, erhält das System mehr Informationen darüber, warum eine Prognose schlecht abgeschnitten hat, was zu gezielteren Verbesserungen führt.
+ **Gibt beschreibende Meldungen mit Ersatzwerten zurück ** — wenn Sie einen Fallback-Wert von 0,0 zurückgeben, fügen Sie dem Ergebnisdiktat ein Diagnosefeld hinzu (z. B.). `{"score": 0.0, "error": "JSON parse failed on line 3"}` Das System liest diese Meldungen, um zu verstehen, warum eine Vorhersage schlecht abgeschnitten hat, und generiert gezielteres Feedback.
+ **Verifizieren Sie Ihre Bewertung ** — bewerten Sie einige offensichtlich schlechte Ergebnisse, um zu bestätigen, dass Ihre Kennzahl sie benachteiligt. Wenn eine triviale Antwort gut abschneidet, findet der Optimierer diese Abkürzung.

### Lambda-Vorlage
<a name="advanced-prompt-optimization-evaluation-lambda-template"></a>

```
"""
APO Custom Metric Lambda - Minimal Template
Handler: lambda_function.lambda_handler
"""
import logging
from typing import List, Dict, Any

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def compute_score(preds: List[str], golds: List[str]) -> Dict[str, Any]:
    """
    Score predictions against ground truths.

    Args:
        preds: Model outputs (one per sample)
        golds: Expected answers (one per sample)

    Returns:
        Must contain:
          "score": float  - aggregate score (higher is better)
          "scores": list[float] - per-instance scores
    """
    # --- REPLACE THIS with your scoring logic ---
    scores = []
    for pred, gold in zip(preds, golds):
        # Example: exact match (case-insensitive)
        scores.append(1.0 if pred.strip().lower() == gold.strip().lower() else 0.0)

    return {
        "score": sum(scores) / len(scores) if scores else 0.0,
        "scores": scores,
    }


def lambda_handler(event, context):
    """
    Lambda entry point. APO service sends:
      event = {"preds": ["output1", ...], "golds": ["truth1", ...]}
    """
    logger.info(f"Received {len(event.get('preds', []))} predictions")

    try:
        preds = event.get("preds", [])
        golds = event.get("golds", [])

        if not preds:
            return {"score": 0.0, "scores": []}

        return compute_score(preds, golds)

    except Exception as e:
        logger.error(f"Error: {e}", exc_info=True)
        return {"score": 0.0, "scores": [0.0] * len(event.get("preds", [])), "error": str(e)}
```

In den AWS Beispielen GitHub finden Sie detailliertere Beispiele, einschließlich Boilerplate-Code für die Fehlerbehandlung und die Eingabevalidierung von Lambda-Funktionen.