0Pricing
AI Prompt Engineering · Lektion

Kalibrierung und Bias bei LLM-Judges

Positionsbias und Ausführlichkeitsbias erkennen und in Judge-Prompts abschwächen.

Kalibrierung und Bias bei LLM-Judges ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.

Warum die Kalibrierung des Judges wichtig ist

Ein LLM-Judge, der eine bestimmte Art von Antwort systematisch höher bewertet, als sie es verdient, führt zu irreführenden Evaluationsergebnissen. Sie könnten ein schlechteres Modell ausliefern, weil der Judge dessen ausführlichen Stil bevorzugt – und nicht dessen tatsächliche Qualität.

Kalibrierung bedeutet, dass die Bewertungen des Judges die tatsächliche Qualität korrekt widerspiegeln. Ein kalibrierter Judge stimmt in messbarem Umfang mit menschlichen Bewertenden überein und bevorzugt nicht systematisch ein bestimmtes, von der Qualität unabhängiges Merkmal.

Positionsbias: Vertiefung

Positionsbias ist die stärkste und am gründlichsten untersuchte Verzerrung bei LLM-Judges. Bei paarweisen Vergleichen bevorzugen Judges in 60–65 % der Fälle die erste Option, unabhängig von ihrer Qualität. Das entspricht einer Münze, die in 60 % der Fälle Kopf zeigt – bei großen Stichproben ist das signifikant.

Die Verzerrung besteht, weil LLMs darauf trainiert sind, Fortsetzungen zu erzeugen: Wenn sie zuerst „Antwort A:“ sehen, werden sie bereits auf A eingestimmt, bevor sie B lesen.

import anthropic

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

def measure_position_bias(question, n_pairs=20):
    """
    Measure position bias by comparing IDENTICAL responses.
    If both responses are the same, wins should be 50/50.
    Any deviation from 50/50 is pure position bias.
    """
    response = 'Machine learning is a subset of AI that learns from data.'
    first_wins = 0

    for _ in range(n_pairs):
        prompt = (
            f'Which response is better?\nQ: {question}\n'
            f'Response A: {response}\n'
            f'Response B: {response}\n'
            f'Reply with A or B.'
        )
        r = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=5,
            messages=[{'role': 'user', 'content': prompt}]
        )
        if 'A' in r.content[0].text:
            first_wins += 1

    bias = first_wins / n_pairs
    print(f'First-position win rate with IDENTICAL responses: {bias:.0%}')
    print(f'Expected (no bias): 50%')
    print(f'Measured bias: {(bias - 0.5) * 100:+.0f}%')
    return bias

Ausführlichkeitsbias: Vertiefung

Ausführlichkeitsbias führt dazu, dass Judges längere Antworten bevorzugen, selbst wenn kürzere Antworten genauer und vollständiger sind. Untersuchungen zeigen, dass LLM-Judges längere Antworten bei paarweisen Vergleichen 1,5- bis 2-mal häufiger als „besser“ bewerten, wenn die Inhaltsqualität gleich gehalten wird.

Diese Verzerrung geht wahrscheinlich auf Trainingsdaten zurück, in denen menschliche Bewertende Länge ebenfalls mit Qualität gleichsetzen.

import anthropic

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

def measure_verbosity_bias(question, correct_answer):
    """
    Compare a concise correct answer against a verbose one with filler.
    A good judge should prefer the concise version or call it a tie.
    """
    concise = correct_answer
    verbose = (
        f'That is a great question! I am happy to help. '
        f'{correct_answer} '
        f'I hope this comprehensive explanation addresses all your needs. '
        f'Please feel free to ask if you need any further clarification!'
    )

    for label, resp in [('Concise', concise), ('Verbose', verbose)]:
        prompt = (
            f'Rate this response 1-5 for quality.\n'
            f'Q: {question}\nA: {resp}\n'
            f'Return only a number 1-5.'
        )
        r = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=5,
            messages=[{'role': 'user', 'content': prompt}]
        )
        score = r.content[0].text.strip()
        print(f'{label} response score: {score}')
        print(f'  ({len(resp.split())} words)')

Selbstpräferenz-Bias: Vertiefung

Claude-Judges bewerten von Claude erzeugte Antworten im Durchschnitt höher. GPT-4-Judges bewerten von GPT-4 erzeugte Antworten höher. Dies wurde in mehreren unabhängigen Studien nachgewiesen.

Der Mechanismus: Jedes Modell hat einen charakteristischen Stil – Satzstruktur, Muster der Verwendung von Absicherungen und Wortwahl. Dasselbe Modell erkennt und bevorzugt seinen eigenen Stil.

import anthropic
import openai

anthropic_client = anthropic.Anthropic(api_key='sk-ant-...')
openai_client = openai.OpenAI(api_key='sk-...')

def test_self_preference(question):
    # Generate one response per model
    claude_answer = anthropic_client.messages.create(
        model='claude-opus-4-5', max_tokens=100,
        messages=[{'role': 'user', 'content': question}]
    ).content[0].text

    gpt_answer = openai_client.chat.completions.create(
        model='gpt-4o', max_tokens=100,
        messages=[{'role': 'user', 'content': question}]
    ).choices[0].message.content

    judge_prompt = (
        f'Which response is better?\nQ: {question}\n'
        f'Response A: {claude_answer}\n'
        f'Response B: {gpt_answer}\n'
        f'Reply: A or B'
    )

    # Claude judges the comparison
    claude_verdict = anthropic_client.messages.create(
        model='claude-opus-4-5', max_tokens=5,
        messages=[{'role': 'user', 'content': judge_prompt}]
    ).content[0].text.strip()

    print(f'Claude judge verdict: {claude_verdict}')
    print('(A=Claude response, B=GPT response)')
    print('Self-preference: did Claude prefer its own response?')

Gegenmaßnahme 1: Reihenfolge vertauschen

Die effektivste Einzelmaßnahme gegen Positionsbias: Führen Sie jeden paarweisen Vergleich zweimal mit vertauschter Reihenfolge durch und verwenden Sie nur konsistente Ergebnisse. Implementieren Sie dies als Standardfunktion, die alle Evaluationen durchlaufen.

import anthropic
import json

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

def debiased_compare(question, response_a, response_b, label_a='A', label_b='B'):
    def single_pass(first, second, first_label, second_label):
        prompt = (
            f'Q: {question}\n\n'
            f'{first_label}: {first}\n\n'
            f'{second_label}: {second}\n\n'
            f'Which is better? Reply with {first_label}, {second_label}, or TIE.'
        )
        r = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=10,
            messages=[{'role': 'user', 'content': prompt}]
        )
        return r.content[0].text.strip()

    # Pass 1: A first
    p1 = single_pass(response_a, response_b, label_a, label_b)
    # Pass 2: B first — but labels stay the same (we just swap presentation order)
    p2 = single_pass(response_b, response_a, label_b, label_a)

    # Normalize p2: if judge said label_b in pass 2, that means they preferred first-shown
    # Need to map back: if p2 = label_b, the 'first' won; if p2 = label_a, the 'second' won
    if p1 == p2 and p1 != 'TIE':
        return p1, 'Consistent result'
    else:
        return 'TIE', f'Inconsistent: pass1={p1}, pass2={p2}'

winner, reason = debiased_compare(
    'What is Docker?',
    'Docker is a containerization platform.',
    'Docker allows you to package applications into containers for consistent deployment.'
)
print(f'{winner}: {reason}')

Gegenmaßnahme 2: Mehrere unterschiedliche Judges

Selbstpräferenz-Bias lässt sich reduzieren, indem mehrere unterschiedliche Modelle als Judges eingesetzt und ihre Urteile zusammengeführt werden. Wenn Claude, GPT-4 und Gemini alle übereinstimmen, ist das Ergebnis deutlich vertrauenswürdiger als das Urteil eines einzelnen Modells.

import anthropic
import openai

anthropic_client = anthropic.Anthropic(api_key='sk-ant-...')
openai_client = openai.OpenAI(api_key='sk-...')

def multi_model_pairwise(question, response_a, response_b):
    results = {}

    # Judge 1: Claude
    r1 = anthropic_client.messages.create(
        model='claude-opus-4-5', max_tokens=5,
        messages=[{'role': 'user', 'content':
            f'Q: {question}\nA: {response_a}\nB: {response_b}\n'
            f'Which is better? Reply A, B, or TIE.'
        }]
    )
    results['Claude'] = r1.content[0].text.strip()

    # Judge 2: GPT-4o
    r2 = openai_client.chat.completions.create(
        model='gpt-4o', max_tokens=5,
        messages=[{'role': 'user', 'content':
            f'Q: {question}\nA: {response_a}\nB: {response_b}\n'
            f'Which is better? Reply A, B, or TIE.'
        }]
    )
    results['GPT4o'] = r2.choices[0].message.content.strip()

    print(f'Claude judge: {results["Claude"]}')
    print(f'GPT-4o judge: {results["GPT4o"]}')

    # Aggregate: majority vote
    votes = list(results.values())
    if votes.count('A') >= 2: return 'A'
    if votes.count('B') >= 2: return 'B'
    return 'TIE'

final = multi_model_pairwise(
    'Explain recursion.',
    'A function that calls itself.',
    'Recursion is when a function solves a problem by solving a smaller version of the same problem.'
)
print(f'Final verdict: {final}')

Gegenmaßnahme 3: Anweisungen gegen übermäßige Ausführlichkeit

Weisen Sie den Judge direkt an, Ausführlichkeit abzuwerten und Prägnanz zu belohnen. Dadurch wird der Ausführlichkeitsbias ausgeglichen, der längere Antworten sonst besser erscheinen lässt.

ANTI_VERBOSITY_JUDGE = (
    'Evaluate this response. Apply these corrections for known judge biases:\n\n'
    'VERBOSITY CORRECTION: Do NOT rate a response higher simply because it is longer. '
    'A concise, accurate 20-word answer is better than a 200-word answer that says the same thing. '
    'Actively penalize unnecessary padding, filler phrases like "Great question!", '
    'and repetition.\n\n'
    'LENGTH PENALTY: If the response contains introductory filler, closing remarks, '
    'or restates the question, subtract 1 point from your score.\n\n'
    'Question: {question}\n'
    'Response: {response}\n\n'
    'Score 1-5 (apply verbosity correction above):'
)

# This instruction significantly reduces verbosity inflation in practice
print('Anti-verbosity instructions reduce the length-quality conflation')

Kalibrierung anhand menschlicher Bewertender

Der Goldstandard für die Kalibrierung eines Judges: Vergleichen Sie die Bewertungen Ihres LLM-Judges auf einem Kalibrierungsdatensatz mit den Bewertungen menschlicher Bewertender. Messen Sie die Übereinstimmung und ermitteln Sie systematische Abweichungen.

import anthropic
import json
from scipy import stats  # pip install scipy

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

def calibrate_judge(calibration_set):
    """
    calibration_set: list of dicts with:
    {'question': str, 'response': str, 'human_score': float}
    """
    llm_scores = []
    human_scores = []

    for item in calibration_set:
        prompt = (
            f'Rate this response 1-5.\n'
            f'Q: {item["question"]}\nA: {item["response"]}\n'
            f'Return only a number.'
        )
        r = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=5,
            messages=[{'role': 'user', 'content': prompt}]
        )
        try:
            llm_score = float(r.content[0].text.strip())
        except ValueError:
            llm_score = 3.0  # Default on parse error

        llm_scores.append(llm_score)
        human_scores.append(item['human_score'])

    correlation, p_value = stats.pearsonr(llm_scores, human_scores)
    print(f'LLM-Human correlation: {correlation:.3f} (p={p_value:.4f})')
    print(f'LLM mean score: {sum(llm_scores)/len(llm_scores):.2f}')
    print(f'Human mean score: {sum(human_scores)/len(human_scores):.2f}')
    return correlation

Systematische Verzerrungsmuster erkennen

Analysieren Sie die Ausgaben Ihres Judges über verschiedene Antwortkategorien hinweg, um systematische Verzerrungen zu erkennen. Bewertet der Judge Antworten eines bestimmten Modells durchgehend höher? Benachteiligt er Antworten zu bestimmten Themen?

import json
from collections import defaultdict

def analyze_judge_bias(log_file='pairwise_log.jsonl'):
    """
    Analyze pairwise logs to detect systematic bias.
    """
    wins_by_label = defaultdict(int)
    total_by_label = defaultdict(int)

    with open(log_file) as f:
        for line in f:
            entry = json.loads(line)
            winner = entry['winner']
            label_a = entry['label_a']
            label_b = entry['label_b']

            if winner == 'A':
                wins_by_label[label_a] += 1
            elif winner == 'B':
                wins_by_label[label_b] += 1

            total_by_label[label_a] += 1
            total_by_label[label_b] += 1

    print('Win rate by model:')
    for label in sorted(total_by_label):
        total = total_by_label[label]
        wins = wins_by_label[label]
        print(f'  {label}: {wins}/{total} = {wins/total:.0%}')

    # Flag if any model wins >60% — likely systematic bias
    for label in total_by_label:
        rate = wins_by_label[label] / total_by_label[label]
        if rate > 0.65 or rate < 0.35:
            print(f'WARNING: {label} win rate {rate:.0%} suggests systematic bias')

Checkliste zur Reduzierung von Verzerrungen

Eine Checkliste, die Sie vor dem Einsatz eines LLM-Judges in der Produktion anwenden sollten:

  • Führen Sie alle paarweisen Vergleiche zweimal mit vertauschter Reihenfolge durch
  • Nehmen Sie ausdrückliche Anweisungen gegen übermäßige Ausführlichkeit in die Bewertungsrubrik auf
  • Verwenden Sie bei Evaluationen mit hohen Konsequenzen mindestens zwei unterschiedliche Modelle als Judges
  • Verankern Sie die Bewertungsstufen ausdrücklich, um Bewertungsinflation zu vermeiden
  • Kalibrieren Sie die Ergebnisse anhand menschlicher Bewertender mit einer repräsentativen Stichprobe
  • Protokollieren und überwachen Sie Gewinnraten nach Modellbezeichnung, um Drift zu erkennen
  • Fügen Sie eine strukturierte JSON-Ausgabe hinzu, damit Bewertungen nicht in Freitext verborgen werden

Prüfprotokolle und Erklärbarkeit

Ein kalibrierter Bewerter muss außerdem erklärbar sein. Wenn der Bewerter eine Antwort mit 4/5 bewertet, sollten Sie nachvollziehen können, warum — welche Kriterien erfüllt wurden und welche nicht.

Wenn der Bewerter JSON mit Bewertungen für jedes Kriterium und einer kurzen Begründung zurückgeben muss, entsteht automatisch ein Prüfprotokoll. Stakeholder können prüfen, warum bestimmte Antworten so bewertet wurden, und Sie können wiederkehrende Muster bei niedrigen Bewertungen erkennen.

Wissenscheck: Minderung der Selbstpräferenz

Welche Strategie zur Minderung von Verzerrungen adressiert die Selbstpräferenzverzerrung bei LLM-Bewertern AM DIREKTESTEN?

Zusammenfassung: Kalibrierung und Verzerrungen bei LLM-Bewertern

LLM-Bewerter weisen vier wesentliche systematische Verzerrungen auf: Positionsverzerrung (Bevorzugung der ersten Option), Ausführlichkeitsverzerrung (Bevorzugung längerer Antworten), Selbstpräferenz (Bevorzugung des eigenen Stils) und Bewertungsinflation (Häufung bei 4–5/5). Mildern Sie jede Verzerrung gezielt: Vertauschen Sie bei Positionsverzerrung die Reihenfolge, ergänzen Sie bei Ausführlichkeitsverzerrung Anweisungen gegen unnötige Ausführlichkeit, verwenden Sie bei Selbstpräferenz diverse Modellbewerter und setzen Sie bei Bewertungsinflation verankerte Bewertungsmaßstäbe ein. Kalibrieren Sie Ihren Bewerter anhand eines gelabelten Datensatzes mit menschlichen Bewertern und messen Sie die Pearson-Korrelation. Überwachen Sie die Gewinnraten nach Label im Zeitverlauf, um aufkommende Verzerrungsmuster zu erkennen, bevor sie Ihre Evaluationspipeline verfälschen.

Häufig gestellte Fragen

Ist die Lektion „Kalibrierung und Bias bei LLM-Judges“ kostenlos?

Ja — der vollständige Text von „Kalibrierung und Bias bei LLM-Judges“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Kalibrierung und Bias bei LLM-Judges“?

Positionsbias und Ausführlichkeitsbias erkennen und in Judge-Prompts abschwächen. Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Prompt Engineering zu starten?

Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Kalibrierung und Bias bei LLM-Judges“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?

Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. LLMs zur Bewertung von LLM-Ausgaben einsetzen
  2. Bewertungs-Prompts mit Rubriken
  3. Vergleichende Bewertung: A vs. B
  4. Kalibrierung und Bias bei LLM-Judges
← Zurück zu AI Prompt Engineering