AI Engineering Academy · Lekcja

Wzorzec LLM-as-Judge

Poznaj sposób tworzenia promptów dla silnego LLM, aby oceniał lub porównywał wyniki pod kątem kryteriów takich jak poprawność, użyteczność i ton, oraz dowiedz się, dlaczego skaluje się to lepiej niż ocena przez ludzi.

Lekcja 1 z 413 kroki

Wzorzec LLM-as-Judge to bezpłatna lekcja AI Engineering Academy 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 Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Dlaczego automatyczna ewaluacja jest konieczna

Ręczna ocena wyników LLM jest powolna i kosztowna. Zespół oceniający złożony z ludzi może ocenić kilkaset wyników tygodniowo, podczas gdy system produkcyjny generuje ich tysiące dziennie. LLM-as-judge wykorzystuje zaawansowany model językowy do oceniania jakości wyników innych LLM na dużą skalę, umożliwiając automatyczne testy regresji i ciągłe monitorowanie jakości bez zatrudniania armii osób wykonujących adnotacje.

Podstawowa idea: jeden LLM ocenia inny

W podejściu LLM-as-judge do modelu oceniającego (zwykle GPT-4o lub Claude) wysyła się prompt systemowy definiujący kryteria oceny, oryginalne pytanie, odpowiedź modelu oraz opcjonalnie odpowiedź referencyjną. Oceniający zwraca wynik liczbowy, etykietę lub ranking. Działa to dlatego, że najnowocześniejsze modele wystarczająco dobrze rozumieją pojęcia związane z jakością, takie jak poprawność, użyteczność i spójność.

JUDGE_SYSTEM_PROMPT = '''
You are an expert evaluator of AI-generated responses.
Given a question and an AI-generated answer, score the answer on:
- Correctness (0-5): Is the information factually accurate?
- Completeness (0-5): Does it fully address the question?
- Clarity (0-5): Is it easy to understand?
Return a JSON object with scores and a brief rationale.
'''

Pisanie promptu dla oceniającego

Dobry prompt dla oceniającego określa jednoznaczne kryteria oceniania wraz z definicjami wyników, zamiast używać nieprecyzyjnych określeń, takich jak „dobry” lub „zły”. Należy konkretnie zdefiniować, co oznaczają wyniki 5, 3 i 1 dla każdego kryterium. Trzeba podać pytanie, ocenianą odpowiedź oraz opcjonalnie odpowiedź referencyjną. Warto poprosić o uzasadnienie przed podaniem wyniku (chain-of-thought), aby ograniczyć arbitralne oceny.

def build_judge_prompt(question: str, answer: str, reference: str = None) -> str:
    ref_section = f'Reference answer:\n{reference}\n\n' if reference else ''
    return f'''
Question: {question}

{ref_section}Answer to evaluate:
{answer}

Score this answer on correctness (1-5) where:
5 = Completely accurate, no factual errors
3 = Mostly accurate with minor errors
1 = Contains significant factual errors

First explain your reasoning, then provide the score as JSON:
{{"correctness": <1-5>, "rationale": "..."}}
'''

Wywoływanie modelu oceniającego

Należy wywołać model oceniający za pomocą promptu ewaluacyjnego. Odpowiedź JSON trzeba przeanalizować, aby wyodrębnić wyniki. Zawsze należy używać ustrukturyzowanych wyników lub trybu JSON, aby mieć pewność, że oceniający zwróci dane możliwe do przeanalizowania. Użycie tego samego modelu zarówno jako systemu poddawanego testom, jak i oceniającego może wprowadzać stronniczość — lepiej użyć innego modelu albo przynajmniej innej konfiguracji oceniającego.

from pydantic import BaseModel
import instructor
from openai import OpenAI

class JudgeScore(BaseModel):
    correctness: int
    completeness: int
    clarity: int
    rationale: str

judge_client = instructor.from_openai(OpenAI())

def judge(question: str, answer: str) -> JudgeScore:
    return judge_client.chat.completions.create(
        model='gpt-4o',  # Use stronger judge than the model being tested
        response_model=JudgeScore,
        messages=[
            {'role': 'system', 'content': JUDGE_SYSTEM_PROMPT},
            {'role': 'user', 'content': build_judge_prompt(question, answer)}
        ]
    )

Ocenianie bez odpowiedzi referencyjnej a ocenianie z odpowiedzią referencyjną

Istnieją dwa tryby oceniania przez LLM. Ocenianie bez odpowiedzi referencyjnej polega na poproszeniu oceniającego o ocenę jakości bez odpowiedzi wzorcowej — jest przydatne, gdy nie istnieje prawidłowa odpowiedź, na przykład w otwartym czacie. Ocenianie z odpowiedzią referencyjną dostarcza odpowiedź wzorcową i sprawdza, czy odpowiedź modelu jest z nią zgodna — lepiej sprawdza się w odpowiadaniu na pytania faktograficzne, gdy znana jest poprawna odpowiedź. Jeśli dostępny jest oznaczony zbiór testowy, należy używać oceniania z odpowiedzią referencyjną.

# Reference-free: good for open-ended generation
judge_result = judge(question='What is machine learning?', answer=model_answer)

# Reference-based: better for factual QA
judge_result = judge(
    question='What year was Python created?',
    answer=model_answer,
    reference='Python was created by Guido van Rossum and released in 1991.'
)

Kontrolowanie stronniczości oceniającego

Oceniający LLM mają znane stronniczości: preferują dłuższe odpowiedzi (stronniczość na rzecz rozwlekłości), odpowiedzi brzmiące pewnie oraz odpowiedzi zgodne ze stylem danych treningowych. Aby ograniczyć stronniczość na rzecz rozwlekłości, należy w kryteriach oceniania wyraźnie karać niepotrzebną długość. Stronniczość pozycji w porównaniu parami można zmniejszyć, losowo ustalając, która odpowiedź pojawia się jako pierwsza, i uśredniając wyniki dla obu kolejności.

# Anti-verbosity note in rubric:
ANTI_VERBOSITY_CLAUSE = '''
Note: A concise, accurate answer should score higher than a long,
rambling answer that happens to contain the correct information.
Do not reward length for its own sake.
'''

# Position-debiasing for pairwise comparison:
async def debiased_pairwise(q, a, b):
    score_ab = await compare(q, answer_a=a, answer_b=b)
    score_ba = await compare(q, answer_a=b, answer_b=a)
    # A wins if it wins in both orderings
    a_wins = (score_ab == 'A' and score_ba == 'B')
    return 'A' if a_wins else 'B' if (score_ab == 'B' and score_ba == 'A') else 'tie'

Grupowanie ewaluacji w celu zwiększenia szybkości

Ewaluacje przez oceniającego należy uruchamiać równolegle, aby szybko oceniać duże zbiory testowe. Za pomocą asyncio i semafora można oceniać setki wyników na minutę. Należy utrzymywać osobny budżet limitu zapytań dla wywołań oceniającego (one również wykorzystują tokeny) oraz rozważyć użycie mniejszego, ale nadal wystarczająco dobrego modelu oceniającego, takiego jak GPT-4o-mini, dla kryteriów niewymagających głębokiego rozumowania, pozostawiając GPT-4o dla najważniejszych kryteriów.

import asyncio

async def batch_judge(qa_pairs: list, concurrency: int = 20) -> list:
    sem = asyncio.Semaphore(concurrency)

    async def judge_one(item):
        async with sem:
            return await async_judge(item['question'], item['answer'])

    return await asyncio.gather(
        *[judge_one(item) for item in qa_pairs],
        return_exceptions=True
    )

Agregowanie wyników oceniającego

Po ocenieniu zbioru testowego należy zagregować wyniki w statystyki podsumowujące: średnią, medianę oraz odsetek odpowiedzi przekraczających próg jakości (na przykład poprawność ≥ 4). Należy porównywać te wartości między wersjami modelu lub wariantami promptu. Spadek o ponad 5% w odsetku wyników przekraczających próg powinien uruchomić przegląd przed wdrożeniem nowej wersji.

import statistics

def summarize_judge_results(scores: list) -> dict:
    correctness = [s.correctness for s in scores if isinstance(s, JudgeScore)]
    return {
        'n': len(correctness),
        'mean_correctness': round(statistics.mean(correctness), 2),
        'median_correctness': statistics.median(correctness),
        'pct_above_4': round(100 * sum(1 for s in correctness if s >= 4) / len(correctness), 1)
    }

Porównywanie wersji LLM za pomocą oceniającego

LLM-as-judge można wykorzystać do porównania dwóch wersji systemu — na przykład przed zmianą promptu i po niej. Obie wersje należy uruchomić na tym samym zestawie pytań testowych, ocenić wszystkie wyniki i obliczyć współczynnik zwycięstw: odsetek przypadków, w których wersja B uzyskała wyższy wynik niż wersja A. Współczynnik zwycięstw powyżej 55% dla ponad 100 próbek jest zazwyczaj statystycznie istotny na tyle, aby uzasadnić wdrożenie nowej wersji.

async def ab_compare(test_questions: list, version_a, version_b) -> dict:
    a_wins = b_wins = ties = 0
    for q in test_questions:
        answer_a = await version_a.answer(q)
        answer_b = await version_b.answer(q)
        winner = await debiased_pairwise(q, answer_a, answer_b)
        if winner == 'A': a_wins += 1
        elif winner == 'B': b_wins += 1
        else: ties += 1
    total = len(test_questions)
    return {'a_win_rate': a_wins/total, 'b_win_rate': b_wins/total, 'tie_rate': ties/total}

Kalibrowanie wyników oceniającego względem ocen ludzi

Oceniającego należy zweryfikować, porównując jego wyniki z ocenami ludzi na zbiorze kalibracyjnym obejmującym 50–200 przykładów. Należy obliczyć korelację Pearsona między wynikami oceniającego i ludzi. Korelacja powyżej 0,7 oznacza, że oceniający jest wiarygodny. Jeśli korelacja jest niska, trzeba przeanalizować prompt oceniającego, aby sprawdzić, gdzie nie zgadza się on z ludźmi, oraz dodać przykłady lub wyjaśnienia do kryteriów oceniania. Nie należy wdrażać oceniającego bez kalibracji.

from scipy.stats import pearsonr

def calibrate_judge(human_scores: list, judge_scores: list) -> dict:
    corr, p_value = pearsonr(human_scores, judge_scores)
    mean_abs_error = sum(abs(h - j) for h, j in zip(human_scores, judge_scores)) / len(human_scores)
    return {
        'pearson_r': round(corr, 3),
        'p_value': round(p_value, 4),
        'mean_abs_error': round(mean_abs_error, 2),
        'reliable': corr >= 0.7
    }

Kiedy nie używać LLM-as-judge

LLM-as-judge nie jest odpowiedni w każdym scenariuszu ewaluacji. Należy go unikać, gdy: kryterium wymaga wiedzy dziedzinowej, której nie ma model oceniający (na przykład poprawność diagnozy medycznej lub zgodność z prawem); potrzebna jest prawnie możliwa do obrony ocena (wymagany jest przegląd człowieka); oceniany jest model silniejszy od oceniającego (oceniający nie potrafi wiarygodnie ocenić wyniku, którego sam nie mógłby wygenerować); lub budżet ewaluacji jest zbyt mały na dodatkowy koszt API. W takich przypadkach należy użyć oceny ludzkiej lub metryk deterministycznych.

# Appropriate uses of LLM-as-judge:
# YES: General helpfulness, clarity, tone, factual accuracy (general knowledge)
# YES: Code correctness for common languages
# YES: Translation quality comparison
# YES: Content safety classification
#
# NOT appropriate:
# NO: Medical/legal/financial accuracy (needs domain expert)
# NO: Evaluating GPT-4o with GPT-4o (same capability ceiling)
# NO: Formal compliance audits (non-deterministic judge)
# NO: Streaming quality at individual token level

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat wzorca ewaluacji LLM-as-judge.

Podsumowanie lekcji

W tej lekcji poznano: LLM-as-judge, który wykorzystuje zaawansowany model do oceniania jakości na dużą skalę za pomocą jednoznacznych kryteriów; tryby bez odpowiedzi referencyjnej i z odpowiedzią referencyjną, odpowiednie dla różnych scenariuszy ewaluacji; oraz kalibrację względem ocen ludzi, która potwierdza wiarygodność oceniającego przed użyciem go na produkcji. W następnej części zaimplementujemy strategie oceny punktowej i porównania parami.

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Wzorzec LLM-as-Judge” jest bezpłatna?

Tak — pełny tekst „Wzorzec LLM-as-Judge” 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 Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wzorzec LLM-as-Judge”?

Poznaj sposób tworzenia promptów dla silnego LLM, aby oceniał lub porównywał wyniki pod kątem kryteriów takich jak poprawność, użyteczność i ton, oraz dowiedz się, dlaczego skaluje się to lepiej niż… Ćwiczysz AI Engineering Academy 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 Engineering Academy?

Nie wymagamy żadnego doświadczenia. AI Engineering Academy 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 „Wzorzec LLM-as-Judge”?

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 Engineering Academy?

Tak. Każda lekcja AI Engineering Academy 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. Wzorzec LLM-as-Judge
  2. Ewaluacja punktowa i porównawcza
  3. Kalibracja modeli-sędziów względem ludzi
  4. Tworzenie ciągłego potoku ewaluacji
← Powrót do AI Engineering Academy