0Pricing
AI Prompt Engineering · Lekcja

Używanie LLM do oceny wyników LLM

Dlaczego sędziowie LLM działają i w jakich sytuacjach zawodzą w porównaniu z oceną człowieka.

Używanie LLM do oceny wyników LLM to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.

Dlaczego warto używać LLM jako sędziego

Tradycyjne metryki oceny — BLEU, ROUGE i exact match — sprawdzają się w przypadku ustrukturyzowanych danych wyjściowych, ale zawodzą przy ocenie niuansów, takich jak użyteczność, poprawność, ton i kreatywność.

Ocena przez człowieka uwzględnia niuanse, ale jest powolna i kosztowna. LLM jako sędzia stanowi rozwiązanie pośrednie: zautomatyzowaną ocenę, która rozumie znaczenie semantyczne, kontekst i subiektywną jakość — na dużą skalę i niskim kosztem.

Dlaczego sędziowie LLM działają

Sędziowie LLM odnoszą sukces, ponieważ mają takie samo rozumienie języka jak oceniany model. Mogą ocenić:

  • Czy odpowiedź jest poprawna pod względem faktów, a nie tylko podobna leksykalnie do odpowiedzi referencyjnej
  • Czy odpowiedź jest użyteczna dla określonego celu
  • Czy ton spełnia wymagania
  • Czy podsumowanie zawiera najważniejsze punkty

Są to cechy, których nie można zmierzyć za pomocą prostych metryk dopasowania ciągów znaków.

Prosty sędzia LLM

Najprostszy sędzia LLM polega na poproszeniu modelu o ocenę odpowiedzi w skali liczbowej wraz z krótkim uzasadnieniem. To fundament, na którym opierają się wszystkie bardziej zaawansowane wzorce wykorzystania sędziego.

import anthropic
import json

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

def simple_llm_judge(question, response, criterion):
    judge_prompt = (
        f'Rate the following response on {criterion} from 1 to 5.\n\n'
        f'Question: {question}\n'
        f'Response: {response}\n\n'
        f'Return JSON: {{"score": <1-5>, "reason": "<one sentence>"}}'
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=100,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    try:
        result = json.loads(r.content[0].text)
        return result['score'], result['reason']
    except Exception:
        return None, r.content[0].text

score, reason = simple_llm_judge(
    question='What is recursion in programming?',
    response='Recursion is when a function calls itself.',
    criterion='clarity and completeness'
)
print(f'Score: {score}/5 — {reason}')

Gdzie sędziowie LLM zawodzą: stronniczość pozycji

Stronniczość pozycji: Gdy sędziemu LLM przedstawia się dwie odpowiedzi (A i B), preferuje on tę, która pojawia się jako pierwsza — niezależnie od jej jakości. Badania pokazują, że przy użyciu naiwnego promptu sędziego zjawisko to występuje w 60–70% porównań parami.

Oznacza to, że kolejność przedstawienia opcji zmienia werdykt sędziego.

import anthropic

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

def demonstrate_position_bias(question, response_a, response_b):
    def ask_judge(first, second, order):
        prompt = (
            f'Question: {question}\n\n'
            f'Response 1: {first}\n\n'
            f'Response 2: {second}\n\n'
            f'Which response is better? Reply with 1 or 2.'
        )
        r = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=10,
            messages=[{'role': 'user', 'content': prompt}]
        )
        choice = r.content[0].text.strip()
        # Map back to original labels
        if order == 'AB':
            return 'A' if choice == '1' else 'B'
        else:  # BA
            return 'B' if choice == '1' else 'A'

    result_ab = ask_judge(response_a, response_b, 'AB')
    result_ba = ask_judge(response_b, response_a, 'BA')

    print(f'Order A-B: Judge picked {result_ab}')
    print(f'Order B-A: Judge picked {result_ba}')
    if result_ab != result_ba:
        print('Position bias detected: different results!')

    return result_ab, result_ba

Gdzie sędziowie LLM zawodzą: stronniczość na rzecz rozwlekłości

Stronniczość na rzecz rozwlekłości: Sędziowie LLM mają tendencję do wyżej oceniania dłuższych i bardziej szczegółowych odpowiedzi — nawet gdy obiektywnie lepsza jest odpowiedź zwięzła. Odpowiedź, która za pomocą 400 słów mówi to, co można wyrazić w 50 słowach, często otrzymuje wyższą ocenę niż wersja zwięzła.

Aby ograniczyć to zjawisko, należy wyraźnie poinstruować sędziego, aby obniżał ocenę za niepotrzebną długość.

import anthropic

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

def length_aware_judge(question, response):
    judge_prompt = (
        f'Evaluate this response for quality. Be aware of verbosity bias: '
        f'do NOT score longer responses higher just because they are longer.\n\n'
        f'Question: {question}\n'
        f'Response: {response}\n\n'
        f'Evaluate on:\n'
        f'1. Accuracy (does it correctly answer the question?)\n'
        f'2. Conciseness (does it avoid unnecessary filler?)\n'
        f'3. Helpfulness (does it serve the user well?)\n\n'
        f'Penalize responses that add filler, repetition, or irrelevant information.\n'
        f'Score each 1-5 and provide an overall score. Return JSON.'
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=200,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    print(r.content[0].text)

Gdzie sędziowie LLM zawodzą: preferowanie własnego stylu

Stronniczość preferowania własnego stylu: Gdy Claude ocenia dwie odpowiedzi, ma tendencję do preferowania odpowiedzi podobnych do tych generowanych przez Claude. Gdy ocenia GPT-4, preferuje odpowiedzi podobne do generowanych przez GPT-4. Jest to systematyczna stronniczość, która dotyczy wszystkich sędziów LLM.

Ograniczenie tego zjawiska: należy używać kilku różnych modeli jako sędziów i agregować ich oceny. Niezgodność ocen sygnalizuje przypadek graniczny wymagający oceny człowieka.

import anthropic
import openai

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

def multi_model_judge(question, response):
    judge_prompt = (
        f'Rate this response 1-10 for overall quality.\n'
        f'Q: {question}\nA: {response}\n'
        f'Reply with only a number.'
    )

    # Judge 1: Claude
    r_claude = anthropic_client.messages.create(
        model='claude-opus-4-5',
        max_tokens=10,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    score_claude = float(r_claude.content[0].text.strip())

    # Judge 2: GPT-4o
    r_gpt = openai_client.chat.completions.create(
        model='gpt-4o',
        max_tokens=10,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    score_gpt = float(r_gpt.choices[0].message.content.strip())

    avg = (score_claude + score_gpt) / 2
    print(f'Claude judge: {score_claude}, GPT judge: {score_gpt}, Average: {avg}')
    if abs(score_claude - score_gpt) > 2:
        print('WARNING: High disagreement — consider human review')
    return avg

Zawyżanie ocen

Zawyżanie ocen: Sędziowie LLM mają tendencję do przyznawania większości odpowiedzi wysokich ocen (4–5 na 5), spłaszczając rozkład i utrudniając odróżnienie odpowiedzi dobrych od doskonałych. Odpowiedzi, które otrzymałyby ocenę 3/5, często uzyskują 4–4,5/5.

Rozwiązanie: należy użyć kryteriów oceniania wymuszających kalibrację albo zastosować ocenę względną (porównania parami) zamiast oceny bezwzględnej.

# Anti-inflation judge prompt with explicit score anchors
CALIBRATED_JUDGE_PROMPT = (
    'Rate this response 1-5 using these STRICT score definitions:\n'
    '1 = Completely wrong, harmful, or completely off-topic\n'
    '2 = Partially relevant but contains significant errors or omissions\n'
    '3 = Correct and addresses the question but lacks depth or precision\n'
    '4 = Correct, reasonably complete, and clearly expressed\n'
    '5 = Exceptional: correct, complete, insightful, and concise\n\n'
    'Only give 5 if the response is genuinely outstanding.\n'
    'Give 3 for any adequate-but-not-impressive response.\n\n'
    'Question: {question}\n'
    'Response: {response}\n\n'
    'Score (1-5) and one-sentence reason:'
)

# Compare to non-anchored prompt which tends to cluster at 4-5
print('Anchored rubrics force the judge to use the full scale')

Kiedy sędziowie LLM sprawdzają się najlepiej

Sędziowie LLM są najbardziej wiarygodni, gdy:

  • Kryteria są jasne i precyzyjnie zdefiniowane
  • Różnica w jakości odpowiedzi jest duża (odpowiedź wyraźnie dobra i wyraźnie zła)
  • Dziedzina mieści się w zakresie wiedzy modelu pełniącego rolę sędziego
  • Oceniane są cechy subiektywne (ton, użyteczność), co do których również ludzie oceniający nie są zgodni

Są najmniej wiarygodni przy ocenie najnowszej wiedzy, wysoce technicznych dziedzin lub subtelnych błędów rzeczowych, których wykrycie wymaga specjalistycznej wiedzy.

Kiedy wymagana jest ocena człowieka

Udział ludzi należy zachować w przypadku:

  • Oceniania odpowiedzi w wyspecjalizowanych dziedzinach (medycyna, prawo, bezpieczeństwo)
  • Ustalania kalibracji sędziego LLM względem wartości referencyjnych
  • Decyzji o dużej wadze, w których błędy sędziego LLM mają rzeczywiste konsekwencje
  • Nowych zadań, dla których model sędziego ma niewiele danych uczących
  • Wykrywania subtelnych błędów rzeczowych wymagających wiedzy dziedzinowej
def triage_for_human_review(question, response, llm_score, confidence_threshold=0.7):
    """
    Route low-confidence or high-stakes evaluations to human review.
    """
    # Route to human if judge is uncertain
    if llm_score is None:
        return 'human_review', 'LLM judge failed to produce a score'

    # Route to human for borderline scores (near decision boundaries)
    if 2.5 <= llm_score <= 3.5:
        return 'human_review', f'Borderline score {llm_score} — needs human judgment'

    # Route to human for domain-specific high-risk content
    HIGH_RISK_KEYWORDS = ['medication', 'legal advice', 'financial advice', 'security']
    if any(kw in question.lower() for kw in HIGH_RISK_KEYWORDS):
        return 'human_review', 'High-risk domain — human verification required'

    # Else: LLM score is sufficient
    return 'auto_accept', f'Score {llm_score} — LLM judgment sufficient'

routing, reason = triage_for_human_review('What medication should I take?', 'Take aspirin.', 4.5)
print(f'{routing}: {reason}')

Budowanie potoku oceny

Praktyczny potok oceny z użyciem LLM jako sędziego: generowanie odpowiedzi → uruchomienie sędziego LLM → wstępna selekcja przypadków granicznych i przekazanie ich ludziom → agregowanie ocen → raportowanie metryk jakości. Należy rejestrować wszystko, aby zapewnić ścieżki audytu.

import anthropic
import json

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

def evaluate_batch(examples, product_under_test, criteria):
    results = []
    for ex in examples:
        response = product_under_test(ex['question'])
        score, reason = simple_llm_judge(ex['question'], response, criteria)

        results.append({
            'question': ex['question'],
            'response': response,
            'score': score,
            'reason': reason,
            'needs_review': score is None or 2.5 <= (score or 0) <= 3.5
        })

    # Summarize
    valid_scores = [r['score'] for r in results if r['score'] is not None]
    avg_score = sum(valid_scores) / len(valid_scores) if valid_scores else 0
    review_count = sum(1 for r in results if r['needs_review'])

    print(f'Average score: {avg_score:.2f}/5')
    print(f'Cases needing review: {review_count}/{len(results)}')
    return results, avg_score

# results, avg = evaluate_batch(test_cases, my_product, 'helpfulness')

Ewaluacja oparta na referencji a ewaluacja bez referencji

Sędziowie LLM mogą działać w dwóch trybach:

  • Oparta na referencji: Sędzia porównuje odpowiedź ze znaną, poprawną odpowiedzią. Zapewnia wysoką dokładność, ale wymaga oznaczonych danych.
  • Bez referencji: Sędzia ocenia odpowiedź na podstawie jej własnych cech (czy jest spójna, użyteczna i dobrze napisana?). Zapewnia większą elastyczność, ale jest mniej precyzyjna przy ocenie poprawności faktów.

Ocenę opartą na referencji należy stosować, gdy dostępne są odpowiedzi wzorcowe. Ocenę bez referencji należy stosować w przypadku zadań otwartych, takich jak podsumowywanie, ocena tonu lub jakości tekstu kreatywnego.

Sprawdzenie wiedzy: stronniczość pozycji

Czym jest stronniczość pozycji w ewaluacji LLM jako sędziego i do czego prowadzi?

Podsumowanie: ewaluacja LLM jako sędziego

Sędziowie LLM rozumieją niuanse, poprawność semantyczną i jakość subiektywną — czyli aspekty, których tradycyjne metryki nie potrafią mierzyć. Zawodzą w przypadku: stronniczości pozycji (preferowanie pierwszej opcji), stronniczości związanej z długością odpowiedzi (preferowanie dłuższych odpowiedzi), preferowania własnego stylu oraz zawyżania ocen (skupianie się wokół 4–5/5). Aby ograniczyć te problemy, należy losować kolejność odpowiedzi, stosować wyraźne instrukcje przeciwdziałające preferowaniu rozwlekłości, używać zakotwiczonych rubryk definiujących każdy poziom oceny oraz korzystać z wielu różnych modeli jako sędziów. Oceny graniczne i domeny wysokiego ryzyka należy przekazywać do oceny ludzkiej. Sędziów LLM należy używać do skalowania procesu, a ludzi — do kalibracji i podejmowania decyzji o wysokiej stawce.

Często zadawane pytania

Czy lekcja „Używanie LLM do oceny wyników LLM” jest bezpłatna?

Tak — pełny tekst „Używanie LLM do oceny wyników LLM” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.

Co nauczysz się w „Używanie LLM do oceny wyników LLM”?

Dlaczego sędziowie LLM działają i w jakich sytuacjach zawodzą w porównaniu z oceną człowieka. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?

Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Używanie LLM do oceny wyników LLM”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?

Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Używanie LLM do oceny wyników LLM
  2. Prompty oceniania oparte na rubrykach
  3. Ocenianie porównawcze: A kontra B
  4. Kalibracja i uprzedzenia sędziów LLM
← Powrót do AI Prompt Engineering