0Pricing
AI Prompt Engineering · Lektion

Vergleichende Bewertung: A vs. B

Prompts für Paarvergleiche, um Ausgaben ohne absolute Bewertung zu ordnen.

Vergleichende Bewertung: A vs. B ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 3 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.

Was ist paarweise Evaluation (A vs. B)?

Paarweise Evaluation (auch vergleichendes Bewerten genannt) legt dem Judge zwei Antworten auf dieselbe Frage vor und fragt, welche besser ist. Statt eine einzelne Antwort von 1 bis 5 zu bewerten, trifft der Judge eine relative Entscheidung: A ist besser, B ist besser oder beide sind gleichwertig.

Dieser Ansatz umgeht einige Verzerrungen der absoluten Bewertung und liefert häufig zuverlässigere Ranglisten als absolute Bewertungen einzelner Antworten.

Einfacher Prompt für einen paarweisen Judge

Ein einfacher paarweiser Judge fragt, welche Antwort besser ist und warum. Entscheidend ist, eine Auswahl zu erzwingen – lassen Sie den Judge den Vergleich nicht mit einem vagen „Beide sind gut“ vermeiden.

import anthropic
import json

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

PAIRWISE_PROMPT = (
    'Given the same question, compare these two responses and decide which is better.\n\n'
    'Question: {question}\n\n'
    'Response A:\n{response_a}\n\n'
    'Response B:\n{response_b}\n\n'
    'Which response is better? You must pick A, B, or TIE (use TIE only if '
    'they are truly equal in all meaningful ways).\n\n'
    'Return JSON: {{"winner": "A" or "B" or "TIE", '
    '"reason": "<one sentence explaining why the winner is better>"}}'
)

def pairwise_judge(question, response_a, response_b):
    prompt = PAIRWISE_PROMPT.format(
        question=question,
        response_a=response_a,
        response_b=response_b
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=150,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return json.loads(r.content[0].text)

result = pairwise_judge(
    'What is machine learning?',
    'Machine learning is a subset of AI.',
    'Machine learning is a method of data analysis that automates model building.'
)
print(result)

Reihenfolge zufällig variieren, um Positionsbias zu reduzieren

Positionsbias führt dazu, dass Judges die erste Option bevorzugen. Um ihn zu neutralisieren, führen Sie jeden Vergleich zweimal durch: einmal mit A an erster Stelle und einmal mit B an erster Stelle. Zählen Sie nur dann einen Gewinner, wenn beide Reihenfolgen zum selben Ergebnis führen. Bei unterschiedlichen Ergebnissen erklären Sie die Antworten für gleichwertig oder leiten Sie den Fall zur menschlichen Prüfung weiter.

import anthropic
import json
import random

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

def debiased_pairwise_judge(question, response_a, response_b):
    def single_comparison(first, second, first_label, second_label):
        prompt = (
            f'Question: {question}\n\n'
            f'Response {first_label}:\n{first}\n\n'
            f'Response {second_label}:\n{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()

    # Run A-first
    result_ab = single_comparison(response_a, response_b, 'A', 'B')
    # Run B-first
    result_ba = single_comparison(response_b, response_a, 'B', 'A')

    if result_ab == 'A' and result_ba == 'A':
        return 'A', 'Consistent: A wins in both orderings'
    elif result_ab == 'B' and result_ba == 'B':
        return 'B', 'Consistent: B wins in both orderings'
    else:
        return 'TIE', f'Inconsistent: {result_ab} then {result_ba} — position bias detected'

winner, reason = debiased_pairwise_judge(
    'Explain a hash table.',
    'A hash table maps keys to values.',
    'A hash table is a data structure using a hash function to store key-value pairs for O(1) lookup.'
)
print(f'Winner: {winner} — {reason}')

Paarweise Evaluation anhand mehrerer Kriterien

Bitten Sie den Judge, die Antworten anhand spezifischer Dimensionen zu vergleichen, statt nur zu fragen: „Welche ist insgesamt besser?“ Ein dimensionsspezifischer paarweiser Vergleich liefert verwertbare Erkenntnisse darüber, warum eine Antwort bevorzugt wird.

import anthropic
import json

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

DIMENSIONAL_PAIRWISE = (
    'Compare Response A and Response B on each dimension.\n\n'
    'Question: {question}\n\n'
    'Response A: {response_a}\n\n'
    'Response B: {response_b}\n\n'
    'For each dimension, say A, B, or TIE:\n'
    '1. ACCURACY: Which is more factually correct?\n'
    '2. COMPLETENESS: Which answers the question more fully?\n'
    '3. CLARITY: Which is easier to understand?\n'
    '4. CONCISENESS: Which avoids unnecessary length?\n\n'
    'Return JSON: {{"accuracy":"A/B/TIE", "completeness":"A/B/TIE", '
    '"clarity":"A/B/TIE", "conciseness":"A/B/TIE", "overall":"A/B/TIE"}}'
)

def dimensional_compare(question, a, b):
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=200,
        messages=[{'role': 'user', 'content': DIMENSIONAL_PAIRWISE.format(
            question=question, response_a=a, response_b=b
        )}]
    )
    return json.loads(r.content[0].text)

result = dimensional_compare(
    'How does HTTPS work?',
    'HTTPS encrypts web traffic using SSL/TLS.',
    'HTTPS secures HTTP using TLS. The browser and server perform a handshake, exchange certificates, and establish an encrypted channel for all data transfer.'
)
print(result)

Ein Turnier aufbauen: Jeder gegen jeden

Wenn Sie mehr als zwei Antworten vergleichen, verwenden Sie ein Round-Robin-Turnier: Jede Antwort wird mit jeder anderen Antwort verglichen. Die Antwort mit den meisten Siegen erhält den ersten Rang.

from itertools import combinations
from collections import defaultdict

def round_robin_tournament(question, responses):
    """
    responses: list of (label, text) tuples
    Returns ranking by win count.
    """
    wins = defaultdict(int)
    ties = defaultdict(int)

    # Every pair compared once
    for (label_a, text_a), (label_b, text_b) in combinations(responses, 2):
        winner, reason = debiased_pairwise_judge(question, text_a, text_b)

        if winner == 'A':
            wins[label_a] += 1
        elif winner == 'B':
            wins[label_b] += 1
        else:  # TIE
            ties[label_a] += 1
            ties[label_b] += 1

        print(f'{label_a} vs {label_b}: {winner}')

    # Rank by wins, then ties
    ranking = sorted(
        responses,
        key=lambda x: (wins[x[0]], ties[x[0]]),
        reverse=True
    )
    print('\nFinal ranking:')
    for i, (label, _) in enumerate(ranking, 1):
        print(f'{i}. {label}: {wins[label]} wins, {ties[label]} ties')
    return ranking

Elo-Bewertung für eine kontinuierliche Rangliste

Verwenden Sie für Evaluationen in großem Maßstab Elo-Bewertungen statt eines Round-Robin-Turniers. Jede Antwort startet mit 1000 Punkten. Nach jedem Vergleich erhält der Gewinner Punkte und der Verlierer verliert Punkte – abhängig davon, wie überraschend das Ergebnis war. Nach vielen Vergleichen ergeben die Elo-Werte eine zuverlässige globale Rangliste.

import math

def elo_update(rating_a, rating_b, winner, k=32):
    """
    Update Elo ratings after a match.
    winner: 'A' (A won), 'B' (B won), 'TIE' (draw)
    Returns (new_rating_a, new_rating_b)
    """
    expected_a = 1 / (1 + 10 ** ((rating_b - rating_a) / 400))
    expected_b = 1 - expected_a

    if winner == 'A':
        score_a, score_b = 1, 0
    elif winner == 'B':
        score_a, score_b = 0, 1
    else:  # TIE
        score_a, score_b = 0.5, 0.5

    new_a = rating_a + k * (score_a - expected_a)
    new_b = rating_b + k * (score_b - expected_b)
    return new_a, new_b

# Simulate ratings for 4 model variants
ratings = {'ModelA': 1000, 'ModelB': 1000, 'ModelC': 1000, 'ModelD': 1000}

# After running many pairwise comparisons:
ratings['ModelA'], ratings['ModelB'] = elo_update(ratings['ModelA'], ratings['ModelB'], 'A')
ratings['ModelC'], ratings['ModelD'] = elo_update(ratings['ModelC'], ratings['ModelD'], 'TIE')

ranking = sorted(ratings.items(), key=lambda x: x[1], reverse=True)
for model, score in ranking:
    print(f'{model}: {score:.0f}')

Wann paarweise und wann absolut bewerten?

Verwenden Sie die paarweise Evaluation, wenn:

  • Sie mehrere Modelle oder Prompt-Varianten rangieren möchten
  • Absolute Bewertungsschwellen schwer zu definieren sind
  • Sie Ausgaben vergleichen, die beide „gut“, aber auf unterschiedliche Weise gut sind

Verwenden Sie die absolute Bewertung (anhand einer Bewertungsrubrik), wenn:

  • Sie eine Bestehensgrenze benötigen („Ist diese Antwort gut genug?“)
  • Sie pro Anfrage nur eine Antwort evaluieren
  • Sie Bewertungen auf Kriterienebene zur Fehlersuche benötigen

Paarweise Evaluation mit Stichproben in großem Maßstab

Alle Paare für N Antworten zu vergleichen erfordert N*(N-1)/2 Vergleiche – O(N^2). Verwenden Sie für große N Stichproben: Vergleichen Sie jede Antwort mit K zufällig ausgewählten Gegenspielern statt mit allen anderen. So lässt sich die tatsächliche Rangliste bei deutlich geringeren Kosten annähern.

import random
from collections import defaultdict

def sampled_tournament(question, responses, k_opponents=5):
    """
    Compare each response against k random opponents.
    More efficient than full round-robin for large N.
    """
    wins = defaultdict(int)
    n = len(responses)

    for i, (label, text) in enumerate(responses):
        # Sample k random opponents (not self)
        opponent_indices = random.sample(
            [j for j in range(n) if j != i],
            min(k_opponents, n - 1)
        )
        for j in opponent_indices:
            opp_label, opp_text = responses[j]
            winner, _ = debiased_pairwise_judge(question, text, opp_text)
            if winner == 'A':
                wins[label] += 1
            elif winner == 'B':
                wins[opp_label] += 1

    ranking = sorted(responses, key=lambda x: wins[x[0]], reverse=True)
    for i, (label, _) in enumerate(ranking, 1):
        print(f'{i}. {label}: {wins[label]} wins')
    return ranking

Unterschiedliche Ergebnisse interpretieren

Wenn sich zwei Reihenfolgen widersprechen (A gewinnt in der Reihenfolge A–B, B gewinnt in der Reihenfolge B–A), deutet das auf einen tatsächlich grenzwertigen Vergleich hin – nicht lediglich auf Positionsbias. Diese Grenzfälle verdienen eine eingehendere Analyse.

import anthropic
import json

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

def deep_analyze_tie(question, response_a, response_b):
    """When A vs B is a genuine tie, ask the judge to explain strengths of each."""
    analysis_prompt = (
        f'These two responses to the same question are closely matched in quality.\n\n'
        f'Question: {question}\n\n'
        f'Response A: {response_a}\n\n'
        f'Response B: {response_b}\n\n'
        f'Analyze both:\n'
        f'1. What does A do better than B?\n'
        f'2. What does B do better than A?\n'
        f'3. For what audience or context would you prefer A?\n'
        f'4. For what audience or context would you prefer B?'
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=400,
        messages=[{'role': 'user', 'content': analysis_prompt}]
    )
    return r.content[0].text

analysis = deep_analyze_tie(
    'Explain async/await in Python.',
    'Async/await allows non-blocking code execution.',
    'Async/await lets you write asynchronous code that looks synchronous, '
    'using the asyncio event loop to handle I/O without blocking.'
)
print(analysis[:300])

Paarweise Ergebnisse protokollieren

Protokollieren Sie alle Ergebnisse paarweiser Vergleiche, um eine durchsuchbare Übersicht darüber aufzubauen, welche Antworten unter welchen Bedingungen andere Antworten schlagen. Diese Daten sind für Regressionstests und zum Verständnis von Modellverbesserungen im Zeitverlauf wertvoll.

import json
import datetime

def logged_pairwise(question, response_a, response_b,
                    label_a='A', label_b='B', log_file='pairwise_log.jsonl'):
    winner, reason = debiased_pairwise_judge(question, response_a, response_b)

    entry = {
        'timestamp': datetime.datetime.utcnow().isoformat(),
        'question': question[:100],  # Truncate for storage
        'label_a': label_a,
        'label_b': label_b,
        'winner': winner,
        'reason': reason,
        'response_a_length': len(response_a.split()),
        'response_b_length': len(response_b.split()),
    }

    with open(log_file, 'a') as f:
        f.write(json.dumps(entry) + '\n')

    print(f'{label_a} vs {label_b}: {winner} — {reason}')
    return winner

logged_pairwise(
    'What is SQL?',
    'SQL is a database query language.',
    'SQL (Structured Query Language) is used to query and manage relational databases.',
    label_a='ModelV1',
    label_b='ModelV2'
)

Paarweise Evaluation vs. absolute Bewertung: Abwägungen

Paarweise Evaluation und die absolute Bewertung anhand einer Bewertungsrubrik sind sich ergänzende, keine konkurrierenden Ansätze. Verwenden Sie beide gemeinsam: die absolute Bewertung, um eine minimale Qualitätsgrenze festzulegen, und den paarweisen Vergleich, um Kandidaten oberhalb dieser Grenze zu rangieren.

Die zentrale Abwägung: Die paarweise Evaluation erfordert für N Antworten O(N^2) Vergleiche, während die absolute Bewertung O(N) Vergleiche erfordert. Bei großen Datenmengen werden daher stichprobenbasierte paarweise Vergleiche oder Elo-Bewertungen notwendig.

Wissenscheck: Positionsbias bei paarweiser Evaluation reduzieren

Wie lässt sich Positionsbias bei der paarweisen LLM-Evaluation am effektivsten reduzieren?

Zusammenfassung: Vergleichendes Bewerten A vs. B

Bei der paarweisen Evaluation wird gefragt, welche von zwei Antworten besser ist, statt jede auf einer absoluten Skala zu bewerten. Um Positionsbias zu kontrollieren, führen Sie jeden Vergleich zweimal mit vertauschter Reihenfolge durch und akzeptieren Sie nur konsistente Ergebnisse. Verwenden Sie für N Antworten bei kleinen N ein Round-Robin-Turnier (alle Paare) und bei großen N Turniere mit Stichproben. Elo-Bewertungen erzeugen aus zahlreichen paarweisen Vergleichen kontinuierliche Ranglisten. Verwenden Sie dimensionsbezogene paarweise Bewertungen (Genauigkeit, Vollständigkeit und Klarheit getrennt), um verwertbare diagnostische Erkenntnisse zu erhalten. Protokollieren Sie alle Ergebnisse für Regressionstests und Trendanalysen über verschiedene Modellversionen hinweg.

Häufig gestellte Fragen

Ist die Lektion „Vergleichende Bewertung: A vs. B“ kostenlos?

Ja — der vollständige Text von „Vergleichende Bewertung: A vs. B“ 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 „Vergleichende Bewertung: A vs. B“?

Prompts für Paarvergleiche, um Ausgaben ohne absolute Bewertung zu ordnen. 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 3 von 4.

Wie lange dauert die Lektion „Vergleichende Bewertung: A vs. B“?

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