Bruke LLM til å evaluere LLM-utdata
Hvorfor LLM-dommere fungerer, og hvor de svikter sammenlignet med menneskelig evaluering.
Bruke LLM til å evaluere LLM-utdata er en gratis leksjon i AI-prompt engineering på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-prompt engineering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.
Hvorfor bruke en LLM som dommer?
Tradisjonelle evalueringsmålinger – BLEU, ROUGE og exact match – fungerer for strukturerte utdata, men kommer til kort når det gjelder nyanserte egenskaper som hjelpsomhet, nøyaktighet, tone og kreativitet.
Menneskelig evaluering fanger opp nyanser, men er langsom og kostbar. LLM-as-judge tilbyr en mellomløsning: automatisert evaluering som forstår semantisk betydning, kontekst og subjektiv kvalitet – i stor skala og til lave kostnader.
Hvorfor LLM-dommere fungerer
LLM-dommere fungerer godt fordi de har den samme språkforståelsen som modellen som evalueres. De kan vurdere:
- Om et svar er faktuelt korrekt, ikke bare leksikalsk likt en referanse
- Om et svar er nyttig for det angitte formålet
- Om tonen samsvarer med kravene
- Om et sammendrag fanger opp hovedpunktene
Dette er egenskaper som enkle målinger basert på strengsammenligning ikke kan måle.
En enkel LLM-dommer
Den enkleste formen for en LLM-dommer er å be modellen vurdere et svar på en numerisk skala med en kort begrunnelse. Dette er grunnlaget som alle mer avanserte mønstre for LLM-dommere bygger videre på.
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}')Hvor LLM-dommere feiler: Posisjonsbias
Posisjonsbias: Når LLM-dommere får presentert to svar (A og B), foretrekker de det som står først – uavhengig av kvaliteten. Studier viser at dette påvirker 60–70 % av parvise sammenligninger når man bruker en naiv dommerprompt.
Det betyr at rekkefølgen du presenterer alternativene i, endrer dommerens avgjørelse.
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_baHvor LLM-dommere feiler: Verbositetsbias
Verbositetsbias: LLM-dommere har en tendens til å gi lengre og mer detaljerte svar høyere vurdering – selv når et konsist svar objektivt sett er bedre. Et svar som bruker 400 ord på å si det som kan sies med 50 ord, får ofte høyere poengsum enn den konsise versjonen.
Reduser dette ved å instruere dommeren eksplisitt om å trekke for unødvendig lengde.
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)Hvor LLM-dommere feiler: Selvpreferansebias
Selvpreferansebias: Når Claude vurderer to svar, har modellen en tendens til å foretrekke svar som ligner på Claude-svar. Når GPT-4 vurderer, foretrekker modellen svar som ligner på GPT-4-svar. Dette er en systematisk skjevhet som påvirker alle LLM-dommere.
Tiltak: Bruk flere ulike modeller som dommere, og slå sammen poengsummene deres. Uenighet tyder på et grensetilfelle som krever menneskelig gjennomgang.
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 avgPoengsuminflasjon
Poengsuminflasjon: LLM-dommere har en tendens til å gi høye poengsummer (4–5 av 5) til de fleste svar, noe som komprimerer fordelingen og gjør det vanskelig å skille mellom godt og fremragende. Svar som ville fått 3/5, får ofte 4–4,5/5.
Løsning: Bruk et vurderingskriterium som tvinger frem kalibrering, eller bruk relativ (parvis) i stedet for absolutt poengsetting.
# 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')Når LLM-dommere fungerer best
LLM-dommere er mest pålitelige når:
- Kriteriene er tydelige og veldefinerte
- Forskjellen i svarenes kvalitet er stor (åpenbart godt kontra åpenbart dårlig)
- Fagområdet ligger innenfor dommermodellens kunnskap
- Du evaluerer subjektive egenskaper (tone, hjelpsomhet) som menneskelige vurderere også er uenige om
De er minst pålitelige når de evaluerer ny kunnskap, svært tekniske fagområder eller subtile faktiske feil som krever spesialistkunnskap for å oppdage.
Når menneskelig evaluering er nødvendig
Involver mennesker ved:
- Evaluering av svar innen spesialiserte fagområder (medisin, juss og sikkerhet)
- Etablering av fasitbasert kalibrering for LLM-dommeren
- Beslutninger med høy risiko, der feil fra LLM-dommeren får reelle konsekvenser
- Nye oppgaver som dommermodellen har få treningssignaler for
- Oppdagelse av subtile faktiske feil som krever faglig ekspertise
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}')Bygge en evalueringspipeline
En praktisk pipeline for LLM-as-judge: generer svar → kjør LLM-dommeren → send grensetilfeller til mennesker for vurdering → aggreger poengsummer → rapporter kvalitetsmålinger. Loggfør alt for revisjonsspor.
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')Referansefri kontra referansebasert evaluering
LLM-dommere kan operere i to moduser:
- Referansebasert: Dommeren sammenligner svaret med et kjent korrekt svar. Høy nøyaktighet, men krever merkede data.
- Referansefri: Dommeren evaluerer svaret ut fra egne kvaliteter (er det konsistent, nyttig og velskrevet?). Mer fleksibelt, men mindre presist når det gjelder faktanøyaktighet.
Bruk referansebasert evaluering når du har fasitsvar. Bruk referansefri evaluering for åpne oppgaver som sammendrag, toneevaluering eller vurdering av kvaliteten på kreativ skriving.
Kunnskapssjekk: Posisjonsbias
Hva er posisjonsbias i evaluering med LLM som dommer, og hva fører den til?
Oppsummering: Evaluering med LLM som dommer
LLM-dommere forstår nyanser, semantisk nøyaktighet og subjektiv kvalitet – ting tradisjonelle målemetoder ikke kan måle. De har problemer med: posisjonsbias (foretrekker det første alternativet), verbositetsbias (foretrekker lengre svar), selvpreferanse (foretrekker sin egen stil) og skårinflasjon (skårene samler seg rundt 4–5 av 5). Dette kan motvirkes ved å randomisere svarrekkefølgen, gi eksplisitte instruksjoner mot verbositet, bruke forankrede vurderingsrubrikker som definerer hvert skårnivå, og bruke flere ulike modeller som dommere. Send grensetilfeller og høyrisikoområder til menneskelige vurderere. Bruk LLM-dommere for skala; bruk mennesker til kalibrering og beslutninger med store konsekvenser.
Lær deg AI-prompt engineering med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 53
- Leksjoner
- 199
Ofte stilte spørsmål
Er leksjonen «Bruke LLM til å evaluere LLM-utdata» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien AI-prompt engineering, inkludert «Bruke LLM til å evaluere LLM-utdata», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.
Hva lærer jeg i «Bruke LLM til å evaluere LLM-utdata»?
Hvorfor LLM-dommere fungerer, og hvor de svikter sammenlignet med menneskelig evaluering. Du øver på AI-prompt engineering med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med AI-prompt engineering?
Ingen tidligere erfaring er nødvendig. AI-prompt engineering på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Bruke LLM til å evaluere LLM-utdata»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne AI-prompt engineering-leksjonen?
Ja. Alle AI-prompt engineering-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Bruke LLM til å evaluere LLM-utdata
- Poenggivingsprompter basert på vurderingskriterier
- Sammenlignende vurdering: A mot B
- Kalibrering og skjevheter i LLM-dommere