0Pricing
AI Prompt Engineering · Leçon

Prompts d’évaluation fondés sur une grille

Critères d’évaluation structurés : exactitude, fluidité, pertinence et sécurité (échelles de 1 à 5).

Prompts d’évaluation fondés sur une grille est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.

Qu’est-ce que la notation fondée sur une grille ?

La notation fondée sur une grille fournit à l’évaluateur LLM un ensemble structuré de critères, avec des définitions explicites pour chaque niveau de notation. Au lieu de demander « quelle est la qualité de cette réponse ? », vous demandez « quelle note cette réponse obtient-elle pour chacune de ces dimensions précises ? »

Les grilles réduisent les biais, améliorent la cohérence et rendent les résultats de l’évaluation interprétables et exploitables.

Anatomie d’une grille de notation

Une grille bien conçue comporte trois éléments :

  1. Noms des critères : quelles dimensions évaluer (Exactitude, Exhaustivité, Clarté)
  2. Repères de notation : définitions explicites de ce que chaque note signifie pour le critère concerné
  3. Poids ou priorité : les critères qui comptent le plus pour ce cas d’utilisation

Chaque élément rend le travail de l’évaluateur plus encadré et reproductible.

Invite utilisant une grille à trois critères

Voici un modèle concret d’invite utilisant une grille pour évaluer les réponses d’une IA selon leur exactitude, leur exhaustivité et leur clarté. L’évaluateur renvoie un JSON structuré contenant une note pour chaque critère.

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)

Notation pondérée

Tous les critères n’ont pas la même importance. Pour un agent conversationnel d’assistance clientèle, l’utilité compte davantage que le style littéraire. La notation pondérée vous permet d’exprimer ces priorités dans le calcul de la note 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}
)

Critère : exactitude factuelle

L’exactitude factuelle est le critère le plus important pour les tâches qui reposent fortement sur les connaissances. Une grille dédiée à l’exactitude demande à l’évaluateur de vérifier spécifiquement les faits erronés, les informations obsolètes et les affirmations non étayées.

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])

Critère : exhaustivité

L’exhaustivité vérifie si la réponse traite toutes les parties d’une question à plusieurs volets. Ce critère détecte les réponses qui répondent à la première question mais ignorent la question de suivi, ou qui donnent des réponses générales alors que des précisions étaient demandées.

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])

Critère : clarté

L’évaluation de la clarté vérifie la lisibilité, la structure et le fait que la réponse transmet effectivement son sens au public cible. Ce critère détecte les réponses techniquement correctes mais mal expliquées.

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])

Grilles spécifiques à la tâche

Les grilles génériques d’exactitude, d’exhaustivité et de clarté sont largement applicables, mais les grilles spécifiques à la tâche donnent de meilleurs résultats pour les cas d’utilisation spécialisés. Personnalisez les critères afin qu’ils correspondent à ce qui compte réellement pour votre application.

# 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')

Évaluation de la cohérence de la grille

Évaluez la cohérence de votre grille en envoyant cinq fois la même réponse, avec une formulation de l’invite légèrement différente, puis en vérifiant si les notes restent stables. Une variance élevée signifie que la grille manque de précisions.

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

Renvoyer du JSON depuis l’évaluateur

Demandez toujours aux évaluateurs utilisant une grille de renvoyer un JSON structuré. Les notes deviennent ainsi lisibles par une machine, l’agrégation automatisée est possible et l’évaluateur ne peut pas dissimuler des nuances importantes dans du texte libre que votre chaîne de traitement ignorerait.

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

Itérer sur la conception de la grille

Les grilles doivent être affinées progressivement pour être performantes. Commencez par une grille simple à trois critères, exécutez-la sur 20 à 30 cas d’évaluation, puis comparez les résultats aux notes humaines. Affinez les définitions des critères là où l’évaluateur et les humains sont le plus souvent en désaccord.

Les besoins d’affinement les plus courants sont les suivants : le critère d’exactitude est trop large (séparez l’exactitude factuelle et la cohérence logique), le critère de clarté confond lisibilité et concision (séparez-les), ou le niveau de note 3 est mal défini (la plupart des réponses s’y regroupent de manière ambiguë).

Vérification des connaissances : repères de notation

Pourquoi une grille de notation doit-elle inclure des descriptions explicites de la signification de chaque niveau de note (repères de notation) ?

Récapitulatif : invites de notation fondées sur une grille

La notation fondée sur une grille évalue les réponses selon plusieurs critères nommés (Exactitude, Exhaustivité, Clarté), avec des repères de notation explicites qui définissent la signification de chaque niveau. Les repères réduisent l’inflation des notes et améliorent la cohérence. Utilisez la notation pondérée pour donner la priorité aux critères qui comptent le plus pour votre cas d’utilisation. Les grilles spécifiques à la tâche (assistance, code, création) sont plus performantes que les grilles génériques pour les applications spécialisées. Renvoyez toujours un JSON depuis l’évaluateur afin d’obtenir des résultats lisibles par une machine. Vérifiez la cohérence de la grille en exécutant plusieurs fois la même évaluation — un écart-type élevé signale une grille trop peu précise qui doit être affinée.

Questions Fréquemment Posées

La leçon « Prompts d’évaluation fondés sur une grille » est-elle gratuite ?

Oui — le texte complet de « Prompts d’évaluation fondés sur une grille » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Prompts d’évaluation fondés sur une grille » ?

Critères d’évaluation structurés : exactitude, fluidité, pertinence et sécurité (échelles de 1 à 5). Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?

Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Prompts d’évaluation fondés sur une grille » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?

Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Utiliser un LLM pour évaluer les sorties d’un LLM
  2. Prompts d’évaluation fondés sur une grille
  3. Évaluation comparative : A ou B
  4. Étalonnage et biais des évaluateurs LLM
← Retour à AI Prompt Engineering