0Pricing
AI Prompt Engineering · Lezione

Prompt di valutazione basati su rubriche

Criteri di valutazione strutturati: accuratezza, fluidità, pertinenza e sicurezza (scale da 1 a 5)

Prompt di valutazione basati su rubriche è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.

Che cos'è la valutazione basata su rubriche

La valutazione basata su rubriche fornisce al giudice LLM un insieme strutturato di criteri con definizioni esplicite per ogni livello di punteggio. Invece di chiedere «quanto è buona questa risposta?», chieda «come si colloca questa risposta rispetto a ciascuna di queste dimensioni specifiche?»

Le rubriche riducono i bias, aumentano la coerenza e rendono i risultati della valutazione interpretabili e utilizzabili.

Anatomia di una rubrica di valutazione

Una rubrica ben progettata ha tre componenti:

  1. Nomi dei criteri: quali dimensioni valutare (accuratezza, completezza, chiarezza)
  2. Ancoraggi dei punteggi: definizioni esplicite del significato di ogni punteggio per quel criterio
  3. Peso o priorità: quali criteri sono più importanti per questo caso d'uso

Ogni componente rende il lavoro del giudice più vincolato e riproducibile.

Un prompt con tre criteri di valutazione

Di seguito è riportato un modello concreto di prompt con rubrica per valutare le risposte dell'AI in base ad accuratezza, completezza e chiarezza. Il giudice restituisce JSON strutturato con punteggi per ciascun criterio.

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

RUBRIC_PROMPT = (
    'Score this response on a scale of 1-5 for each criterion:\n\n'
    'ACCURACY: Is the response factually correct?\n'
    '  1=Contains significant factual errors\n'
    '  3=Mostly correct with minor inaccuracies\n'
    '  5=Completely accurate with no errors\n\n'
    'COMPLETENESS: Did it answer everything asked?\n'
    '  1=Missed most of the question\n'
    '  3=Answered the main question but missed sub-parts\n'
    '  5=Addressed every part of the question\n\n'
    'CLARITY: Is it easy to understand?\n'
    '  1=Confusing, hard to follow\n'
    '  3=Understandable but could be clearer\n'
    '  5=Exceptionally clear and well-organized\n\n'
    'Question: {question}\n'
    'Response: {response}\n\n'
    'Return JSON: {{"accuracy": N, "completeness": N, "clarity": N, '
    '"overall": N, "notes": "one sentence"}}'
)

def rubric_judge(question, response):
    prompt = RUBRIC_PROMPT.format(question=question, response=response)
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=200,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return json.loads(r.content[0].text)

result = rubric_judge(
    question='What is a REST API?',
    response='A REST API is a way for applications to communicate over HTTP.'
)
print(result)

Valutazione ponderata

Non tutti i criteri hanno la stessa importanza. Per un bot di assistenza clienti, l'utilità è più importante dello stile letterario. La valutazione ponderata consente di esprimere queste priorità nel calcolo del punteggio finale.

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

def weighted_rubric_judge(question, response, weights):
    """
    weights: dict of criterion -> weight (should sum to 1.0)
    Example: {'accuracy': 0.5, 'completeness': 0.3, 'clarity': 0.2}
    """
    RUBRIC = (
        'Score this response 1-5 on:\n'
        'Accuracy: Is it factually correct?\n'
        'Completeness: Does it cover the full question?\n'
        'Clarity: Is it easy to understand?\n\n'
        'Q: {q}\nA: {a}\n\n'
        'Return JSON: {{"accuracy":N,"completeness":N,"clarity":N}}'
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=100,
        messages=[{'role': 'user', 'content': RUBRIC.format(q=question, a=response)}]
    )
    scores = json.loads(r.content[0].text)

    # Calculate weighted average
    weighted_score = sum(
        scores[criterion] * weight
        for criterion, weight in weights.items()
        if criterion in scores
    )
    print(f'Individual scores: {scores}')
    print(f'Weighted score: {weighted_score:.2f}/5')
    return weighted_score

weighted_rubric_judge(
    'How do I reverse a string in Python?',
    'Use slicing: s[::-1]',
    weights={'accuracy': 0.5, 'completeness': 0.3, 'clarity': 0.2}
)

Criterio: accuratezza fattuale

L'accuratezza fattuale è il criterio più importante per le attività basate sulla conoscenza. Una rubrica specifica per l'accuratezza istruisce il giudice a verificare in particolare la presenza di fatti errati, informazioni obsolete e affermazioni non supportate.

ACCURACY_RUBRIC = (
    'Evaluate FACTUAL ACCURACY of the following response.\n\n'
    'Score 1-5:\n'
    '1 = Multiple factual errors that fundamentally mislead the reader\n'
    '2 = At least one significant factual error (wrong date, number, or core fact)\n'
    '3 = Factually correct but includes minor imprecisions or over-generalizations\n'
    '4 = Factually correct with appropriate hedging of uncertain claims\n'
    '5 = Factually precise, no errors, and correctly acknowledges uncertainty where present\n\n'
    'Check specifically for:\n'
    '- Wrong dates, statistics, or numerical values\n'
    '- Misattributed quotes or inventions\n'
    '- Outdated information presented as current\n'
    '- Claims stated with false confidence (should be hedged)\n\n'
    'Q: {question}\nA: {response}\n\n'
    'Score and list any errors found:'
)
print(ACCURACY_RUBRIC[:400])

Criterio: completezza

La completezza verifica se la risposta affronta ogni parte di una domanda composta da più parti. Questo criterio individua le risposte che rispondono alla prima domanda ma ignorano quella successiva, oppure che forniscono risposte di alto livello quando erano stati richiesti dettagli specifici.

COMPLETENESS_RUBRIC = (
    'Evaluate COMPLETENESS of this response.\n\n'
    'First, list every distinct question or requirement in the original query.\n'
    'Then, check whether the response addressed each one.\n\n'
    'Score 1-5:\n'
    '1 = Only addressed 0-20% of what was asked\n'
    '2 = Addressed 20-50% — missed major components\n'
    '3 = Addressed 50-80% — answered main question but missed sub-parts\n'
    '4 = Addressed 80-95% — minor omissions only\n'
    '5 = Addressed 100% — every requirement was met\n\n'
    'Q: {question}\nA: {response}\n\n'
    'Requirements checklist and completeness score:'
)

# This rubric forces the judge to decompose the question first,
# which is much more reliable than asking 'was it complete?'
print(COMPLETENESS_RUBRIC[:400])

Criterio: chiarezza

La valutazione della chiarezza verifica la leggibilità, la struttura e l'effettiva capacità della risposta di comunicare il proprio significato al pubblico di riferimento. Questo criterio individua le risposte tecnicamente corrette ma spiegate male.

CLARITY_RUBRIC = (
    'Evaluate CLARITY of this response for a {audience} audience.\n\n'
    'Score 1-5:\n'
    '1 = Incomprehensible — cannot extract meaning\n'
    '2 = Very hard to follow — excessive jargon, poor structure\n'
    '3 = Understandable with effort — some confusing parts\n'
    '4 = Clear and well-organized — easy to read\n'
    '5 = Exceptionally clear — ideal structure, appropriate vocabulary, '
    'no unnecessary complexity\n\n'
    'Consider:\n'
    '- Is the vocabulary appropriate for the audience?\n'
    '- Is the response logically organized?\n'
    '- Are sentences a readable length?\n'
    '- Is the main point stated early and clearly?\n\n'
    'Q: {question}\nA: {response}\n\n'
    'Clarity score and key issues:'
)

# Parameterize the audience for context-aware clarity assessment
print(CLARITY_RUBRIC.format(
    audience='non-technical business stakeholder',
    question='What is an API?',
    response='REST APIs use HTTP to transfer data between client and server.'
)[:300])

Rubriche specifiche per il compito

Le rubriche generiche basate su accuratezza, completezza e chiarezza funzionano in molti contesti, ma quelle specifiche per il compito producono valutazioni migliori nei casi d'uso specializzati. Personalizzi i criteri in base a ciò che conta davvero per la Sua applicazione.

# Customer support response rubric
SUPPORT_RUBRIC = (
    'Evaluate this customer support response:\n\n'
    'EMPATHY (1-5): Does it acknowledge the customer emotion?\n'
    'RESOLUTION (1-5): Does it provide a clear solution or next step?\n'
    'TONE (1-5): Is it professional, warm, and not condescending?\n'
    'EFFICIENCY (1-5): Does it avoid unnecessary words or boilerplate?\n\n'
    'Customer message: {customer_message}\n'
    'Support response: {support_response}\n\n'
    'Scores and notes (JSON):'
)

# Code review rubric
CODE_REVIEW_RUBRIC = (
    'Evaluate this code explanation:\n\n'
    'CORRECTNESS (1-5): Is the code technically correct?\n'
    'EDGE_CASES (1-5): Does it handle edge cases (empty input, errors)?\n'
    'EFFICIENCY (1-5): Is it reasonably efficient (no obvious O(n^2) where O(n) is easy)?\n'
    'READABILITY (1-5): Is the code easy to read and understand?\n\n'
    'Task: {task}\n'
    'Code: {code}\n\n'
    'Scores and notes (JSON):'
)
print('Specialized rubrics produce better signal for your domain')

Verifica della coerenza della rubrica

Verifichi la coerenza della rubrica inviando la stessa risposta cinque volte con formulazioni del prompt leggermente diverse e controllando che i punteggi rimangano stabili. Una varianza elevata indica che la rubrica non è definita in modo sufficiente.

import anthropic
import json
import statistics

client = anthropic.Anthropic(api_key='sk-ant-...')

def test_rubric_consistency(rubric_prompt, question, response, n_trials=5):
    scores = []
    for i in range(n_trials):
        r = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=100,
            messages=[{'role': 'user', 'content': rubric_prompt.format(
                question=question, response=response
            )}]
        )
        try:
            data = json.loads(r.content[0].text)
            overall = data.get('overall', sum(data.values()) / len(data))
            scores.append(overall)
        except Exception:
            scores.append(None)

    valid = [s for s in scores if s is not None]
    if valid:
        print(f'Scores: {valid}')
        print(f'Mean: {statistics.mean(valid):.2f}')
        print(f'Std dev: {statistics.stdev(valid):.2f}')
        if statistics.stdev(valid) > 0.5:
            print('WARNING: High variance — rubric may be underspecified')

    return valid

Restituire JSON dal giudice

Chieda sempre ai giudici basati su rubriche di restituire JSON strutturato. In questo modo i punteggi possono essere elaborati automaticamente, è possibile aggregarli in modo automatizzato e si impedisce al giudice di nascondere sfumature importanti in testo libero che la pipeline ignora.

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

def structured_rubric_judge(question, response):
    prompt = (
        'Score this response 1-5 on three criteria and return JSON.\n\n'
        'Q: {q}\nA: {a}\n\n'
        'Return ONLY this JSON structure (no other text):\n'
        '{{\n'
        '  "accuracy": <1-5>,\n'
        '  "completeness": <1-5>,\n'
        '  "clarity": <1-5>,\n'
        '  "overall": <1-5>,\n'
        '  "primary_issue": "<what most needs improvement>",\n'
        '  "primary_strength": "<what the response does best>"\n'
        '}}'
    ).format(q=question, a=response)

    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=200,
        messages=[{'role': 'user', 'content': prompt}]
    )

    text = r.content[0].text.strip()
    # Strip markdown code fences if present
    if text.startswith('###'):
        text = text.split('###')[1]
        if text.startswith('json'):
            text = text[4:]
    return json.loads(text.strip())

result = structured_rubric_judge(
    'Explain big O notation.',
    'Big O describes algorithm time complexity.'
)
print(json.dumps(result, indent=2))

Iterare sulla progettazione della rubrica

Le rubriche richiedono iterazioni per funzionare bene. Inizi con una rubrica semplice a tre criteri, la esegua su 20-30 casi di test e confronti i risultati con le valutazioni umane. Affini le definizioni dei criteri nei punti in cui il giudice e i valutatori umani sono maggiormente in disaccordo.

Esigenze di perfezionamento comuni: il criterio Accuratezza è troppo ampio (lo divida in accuratezza fattuale e coerenza logica), il criterio Chiarezza confonde leggibilità e brevità (li separi) oppure il livello di punteggio 3 non è definito con sufficiente precisione (la maggior parte delle risposte si concentra lì in modo ambiguo).

Verifica delle conoscenze: ancoraggi dei punteggi

Perché una rubrica di valutazione dovrebbe includere descrizioni esplicite del significato di ogni livello di punteggio (ancoraggi dei punteggi)?

Riepilogo: prompt per la valutazione basata su rubriche

La valutazione basata su rubriche valuta le risposte secondo più criteri denominati (accuratezza, completezza, chiarezza), con ancoraggi espliciti che definiscono il significato di ogni livello di punteggio. Gli ancoraggi riducono l'inflazione dei punteggi e aumentano la coerenza. Utilizzi la valutazione ponderata per dare priorità ai criteri più importanti per il Suo caso d'uso. Le rubriche specifiche per il compito (assistenza, codice, creatività) superano quelle generiche nelle applicazioni specializzate. Restituisca sempre JSON dal giudice per ottenere risultati leggibili automaticamente. Verifichi la coerenza della rubrica eseguendo più volte la stessa valutazione: una deviazione standard elevata segnala una rubrica definita in modo insufficiente, che richiede un perfezionamento.

Domande Frequenti

La lezione «Prompt di valutazione basati su rubriche» è gratuita?

Sì — il testo completo di «Prompt di valutazione basati su rubriche» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.

Cosa imparerò in «Prompt di valutazione basati su rubriche»?

Criteri di valutazione strutturati: accuratezza, fluidità, pertinenza e sicurezza (scale da 1 a 5) Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Prompt Engineering?

Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Prompt di valutazione basati su rubriche»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?

Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Uso degli LLM per valutare gli output degli LLM
  2. Prompt di valutazione basati su rubriche
  3. Valutazione comparativa: A contro B
  4. Calibrazione e bias nei giudici LLM
← Torna a AI Prompt Engineering