

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Definire i metodi di valutazione
<a name="advanced-prompt-optimization-evaluation"></a>

## Panoramica di
<a name="advanced-prompt-optimization-evaluation-overview"></a>

Scegliete UN metodo di valutazione per modello di prompt o omettete tutti i campi di valutazione opzionali come impostazione predefinita del sistema. Modelli diversi nello stesso job possono utilizzare metodi diversi. La valutazione guida l'ottimizzazione tempestiva, quindi definisci il metodo e i criteri nel modo più preciso possibile.
+ [Valutazione predefinita](#advanced-prompt-optimization-evaluation-default)
+ [Criteri di guida](#advanced-prompt-optimization-evaluation-steering)
+ [Personalizzato LLM-as-a-judge](#advanced-prompt-optimization-evaluation-llmj)
+ [Valutatore Lambda personalizzato](#advanced-prompt-optimization-evaluation-lambda)

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

Omettete tutti i campi di valutazione opzionali (`steeringCriteria`,`customLLMJConfig`,`evaluationMetricLambdaArn`). Il servizio utilizza un generico integrato LLM-as-judge basato su Anthropic Claude Sonnet 4.6 che valuta tre criteri predefiniti: precisione della risposta, completezza della risposta e qualità dell'espressione. In base al prompt, alla risposta del modello di destinazione e a una risposta di riferimento, l'arbitro assegna un punteggio per dimensione e assegna dinamicamente i pesi appropriati all'attività, quindi produce un punteggio complessivo ponderato.

Ti consigliamo di definire il tuo metodo di valutazione per ottenere i migliori risultati.

### Prompt predefinito dell'arbitro fornito dal sistema
<a name="advanced-prompt-optimization-evaluation-default-prompt"></a>

Di seguito è riportato il prompt completo fornito dal sistema e utilizzato nella valutazione predefinita di Anthropic Claude Sonnet 4.6:

```
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:
```

## Criteri di guida
<a name="advanced-prompt-optimization-evaluation-steering"></a>

I criteri di orientamento sono brevi descrittori in linguaggio naturale che guidano la direzione dell'ottimizzazione.
+ **Format**: `"steeringCriteria": ["string1", "string2"]`
+ **Cosa possono essere:** qualsiasi cosa, da una singola parola a poche frasi con descrizioni qualitative o quantitative di come si desidera che sia la risposta del modello.
+ **Limite:** fino a 5 per modello di prompt.

**Esempio**:

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

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

Fornisci una rubrica completa con una scala di valutazione da te definita. Il prompt personalizzato dell'arbitro viene unito al sistema judge prompt del servizio e viene attribuito un peso maggiore.

### Configurazione
<a name="advanced-prompt-optimization-evaluation-llmj-config"></a>
+ **Formato: plus** `"customLLMJConfig": {"customLLMJPrompt": "...", "customLLMJModelId": "..."}` `"customEvaluationMetricLabel": "My Metric"`
+ **Modelli di giudici disponibili:** anthropic.claude-opus-4-6-v1, anthropic.claude-sonnet-4-5-20250929-v 1:0, anthropic.claude-sonnet-4-6
+ **I segnaposti nel tuo arbitro richiedono:**
  + `{{prompt}}`: il prompt completamente renderizzato (modello di prompt più esempi di valutazione combinati)
  + `{{response}}`: l'output del modello
  + `{{referenceResponse}}`: la verità fondamentale
+ **Punteggio:** definisci la tua scala di valutazione in modo che un numero più alto sia migliore. Il servizio normalizza tutti i punteggi per i risultati finali.
+ Se hai più rubriche, uniscile in un'unica richiesta del giudice.

### Le migliori pratiche per scrivere le istruzioni dei giudici
<a name="advanced-prompt-optimization-evaluation-llmj-best"></a>

Usa una rubrica chiaramente definita con criteri di punteggio espliciti ed esempi concreti di ogni livello di punteggio. Ancorate ogni livello di rubrica a descrizioni comportamentali anziché aggettivi soggettivi. Includi almeno un esempio funzionante che mostri un punteggio non perfetto per calibrare il giudice dall'impostazione predefinita ai punteggi alti. Chiedi al modello di fornire una giustificazione scritta prima del punteggio numerico. Valuta la possibilità di valutare dimensioni specifiche in modo indipendente prima di assegnare un punteggio complessivo. I LLM-as-a-judge valutatori più affidabili e disponibili sono in genere quelli che concordano con le risposte fornite dal modello arbitrale, quindi può essere utile utilizzare una valutazione già esaminata.

### In che modo il prompt del giudice personalizzato viene unito al prompt di sistema in fase di esecuzione
<a name="advanced-prompt-optimization-evaluation-llmj-merge"></a>

Quando fornite un prompt personalizzato per la LLM-as-a-judge valutazione, questo viene unito a un prompt generico fornito dal servizio che contiene istruzioni specifiche sulla formattazione e altre best practice che favoriscono il progresso dell'ottimizzazione. Nel giudizio finale, al prompt personalizzato del giudice viene attribuito un peso maggiore rispetto ai criteri generici. Nello specifico, il servizio:
+ Estrae l'intento dal prompt personalizzato
+ Normalizza la scala in modo che corrisponda alla rubrica da 0 a 3 del sistema
+ La inserisce come dimensione denominata all'interno dei tag CUSTOM\_CRITERIA\_DESCRIPTION
+ Modifica le istruzioni di ponderazione per attribuire al criterio personalizzato un'importanza elevata (da 0,3 a 0,6)
+ Aggiunge regole di precedenza in base alle quali i criteri personalizzati prevalgono sui conflitti con altre dimensioni
+ Conserva la semantica originale della valutazione

**Esempio:** puoi fornire il seguente LLM-as-a-judge prompt personalizzato per valutare la fedeltà:

```
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
```

Questo viene quindi unito al LLM-as-a-judge prompt predefinito e gli viene assegnato un peso elevato. L'effetto finale: in una valutazione multidimensionale, il prompt di fedeltà a criterio singolo diventa un asse fortemente ponderato, mentre il sistema aggiunge una struttura (Precisione, Completezza, Espressione) attorno ad esso.

Di seguito è riportato il prompt risultante dalla fusione dei giudici:

```
"""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:"""
```

## Valutatore Lambda personalizzato
<a name="advanced-prompt-optimization-evaluation-lambda"></a>

Usa la tua funzione di punteggio come funzione Lambda.

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

Specificate l'ARN Lambda nel file JSONL di input per ogni modello di prompt che dovrebbe utilizzarlo. Fornisci anche il `customEvaluationMetricLabel` campo per assegnare un nome alla metrica:

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

Quando crei il lavoro tramite l'API, non è necessaria alcuna configurazione di valutazione aggiuntiva nella `CreateAdvancedPromptOptimizationJob` richiesta stessa. Il metodo di valutazione è determinato per modello dal file JSONL di input.

### Requisiti Lambda
<a name="advanced-prompt-optimization-evaluation-lambda-reqs"></a>
+ Un unico `.py` file con tutto il codice
+ Handler impostato su `lambda_function.lambda_handler`
+ Deve implementare `compute_score(preds, golds)` la restituzione `{"score": float, "scores": [float, ...]}`
+ Il `golds` parametro contiene i `referenceResponse` valori. Se non l'hai fornito `referenceResponse` nel set di dati di input, non è necessario inserire `golds` la `compute_score` funzione.
+ Non si arresta mai in modo anomalo; restituisce 0,0 in caso di errori invece di generare eccezioni
+ Preferisci punteggi continui (da 0,0 a 1,0) rispetto a quelli binari 0/1 per una convergenza di ottimizzazione più rapida
+ Imposta il timeout su un massimo di 15 minuti (900 s) per lotti di grandi dimensioni per evitare timeout anticipati
+ Aggiungi una politica basata sulle risorse che consente di richiamare la tua `bedrock.amazonaws.com` Lambda

### Modello Lambda
<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)}
```

Consulta gli AWS Samples GitHub per esempi più dettagliati, tra cui codice boilerplate per la gestione degli errori e la convalida dell'input della funzione Lambda.