Använda LLM för att utvärdera LLM-utdata
Varför LLM-domare fungerar och var de brister jämfört med mänsklig utvärdering.
Använda LLM för att utvärdera LLM-utdata är en gratis lektion i AI-promptteknik på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för AI-promptteknik, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-promptteknik innehåller totalt 4 lektioner.
Varför använda en LLM som bedömare?
Traditionella utvärderingsmått – BLEU, ROUGE och exakt matchning – fungerar för strukturerade utdata men misslyckas med nyanserade egenskaper som hjälpsamhet, korrekthet, ton och kreativitet.
Mänsklig utvärdering fångar nyanser men är långsam och dyr. LLM som bedömare erbjuder en mellanväg: automatiserad utvärdering som förstår semantisk innebörd, kontext och subjektiv kvalitet – i stor skala och till låg kostnad.
Varför LLM-bedömare fungerar
LLM-bedömare fungerar eftersom de har samma språkförståelse som modellen som utvärderas. De kan bedöma:
- Om ett svar är sakligt korrekt, inte bara lexikalt likt en referens
- Om ett svar är hjälpsamt för det angivna ändamålet
- Om tonen motsvarar kraven
- Om en sammanfattning fångar huvudpunkterna
Detta är egenskaper som enkla strängmatchningsmått inte kan mäta.
En enkel LLM-bedömare
Den enklaste LLM-bedömaren: be modellen poängsätta ett svar på en numerisk skala med en kort motivering. Detta är grunden som alla mer avancerade bedömningsmönster bygger vidare 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}')Varför LLM-bedömare misslyckas: positionsbias
Positionsbias: När två svar (A och B) presenteras föredrar LLM-bedömare det som visas först – oavsett kvalitet. Studier visar att detta påverkar 60–70 % av parvisa jämförelser när en naiv bedömningsprompt används.
Det innebär att ordningen som alternativen presenteras i påverkar bedömarens utslag.
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_baVarför LLM-bedömare misslyckas: utförlighetsbias
Utförlighetsbias: LLM-bedömare tenderar att ge längre och mer detaljerade svar högre betyg – även när ett koncist svar objektivt sett är bättre. Ett svar som använder 400 ord för att säga det som 50 ord kunde ha sagt får ofta högre poäng än den koncisa versionen.
Motverka detta genom att uttryckligen instruera bedömaren att ge avdrag för onödig längd.
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)Varför LLM-bedömare misslyckas: självpreferens
Självpreferensbias: När Claude bedömer två svar tenderar modellen att föredra svar som liknar Claude-svar. När GPT-4 bedömer svar föredrar modellen svar som liknar GPT-4-svar. Detta är en systematisk bias som påverkar alla LLM-bedömare.
Motåtgärd: använd flera olika modeller som bedömare och slå samman deras poäng. Oenighet signalerar ett gränsfall som kräver mänsklig granskning.
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 avgPoänginflation
Poänginflation: LLM-bedömare tenderar att ge höga poäng (4–5 av 5) till de flesta svar, vilket komprimerar fördelningen och gör det svårt att skilja bra från utmärkt. Svar som skulle få 3/5 får ofta 4–4,5/5.
Åtgärd: använd en bedömningsmatris som tvingar fram kalibrering, eller använd relativ poängsättning (parvis) i stället för absolut poängsättning.
# 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-bedömare fungerar bäst
LLM-bedömare är mest tillförlitliga när:
- Kriterierna är tydliga och väldefinierade
- Skillnaden i svarskvalitet är stor (uppenbart bra kontra uppenbart dåligt)
- Området ligger inom bedömningsmodellens kunskap
- Ni utvärderar subjektiva egenskaper (ton, hjälpsamhet) som mänskliga bedömare också är oense om
De är minst tillförlitliga vid utvärdering av ny kunskap, mycket tekniska områden eller subtila sakfel som kräver specialistkunskaper för att upptäckas.
När mänsklig utvärdering krävs
Låt människor ingå i granskningsprocessen för:
- Utvärdering av svar inom specialiserade områden (medicin, juridik och säkerhet)
- Fastställande av kalibrering mot facit för er LLM-bedömare
- Beslut med höga insatser där fel från LLM-bedömaren får verkliga konsekvenser
- Nya uppgifter där bedömningsmodellen har fått få träningssignaler
- Upptäckt av subtila sakfel som kräver ämnesexpertis
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}')Bygg en utvärderingspipeline
En praktisk pipeline för LLM som bedömare: generera svar → kör LLM-bedömaren → sortera gränsfall till mänskliga bedömare → slå samman poäng → rapportera kvalitetsmått. Logga allt för granskningsspår.
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')Utvärdering utan referens kontra med referens
LLM-bedömare kan arbeta i två lägen:
- Referensbaserad: Bedömaren jämför svaret med ett känt korrekt svar. Hög noggrannhet, men märkta data krävs.
- Referensfri: Bedömaren utvärderar svaret utifrån dess egna kvaliteter (är det konsekvent? hjälpsamt? välskrivet?). Mer flexibelt, men mindre exakt när det gäller saklig korrekthet.
Använd referensbaserad utvärdering när ni har kvalitetssäkrade referenssvar. Använd referensfri utvärdering för öppna uppgifter som sammanfattning, tonutvärdering eller kvaliteten på kreativt skrivande.
Kunskapskontroll: Positionsbias
Vad är positionsbias vid utvärdering med en LLM som bedömare, och vad leder den till?
Sammanfattning: Utvärdering med LLM som bedömare
LLM-bedömare förstår nyanser, semantisk korrekthet och subjektiv kvalitet – sådant som traditionella mätvärden inte kan mäta. De misslyckas med: positionsbias (föredrar det första alternativet), utförlighetsbias (föredrar längre svar), självpreferensbias (föredrar sin egen stil) och poänginflation (samlas kring 4–5 av 5). Motverka detta genom att slumpa svarens ordning, använda uttryckliga instruktioner mot överdriven utförlighet, använda förankrade bedömningsmatriser som definierar varje poängnivå och använda flera olika modeller som bedömare. Skicka gränsfall och områden med hög risk till mänskliga utvärderare. Använd LLM-bedömare för skalbarhet och människor för kalibrering och beslut med stora konsekvenser.
Lär dig AI-promptteknik med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 53
- Lektioner
- 199
Vanliga frågor
Är lektionen ”Använda LLM för att utvärdera LLM-utdata” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen AI-promptteknik, inklusive ”Använda LLM för att utvärdera LLM-utdata”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i AI-promptteknik innehåller totalt 4 lektioner.
Vad lär jag mig i ”Använda LLM för att utvärdera LLM-utdata”?
Varför LLM-domare fungerar och var de brister jämfört med mänsklig utvärdering. Ni övar på AI-promptteknik med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig AI-promptteknik?
Du behöver inga förkunskaper. Utbildningen i AI-promptteknik på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Använda LLM för att utvärdera LLM-utdata”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här AI-promptteknik-lektionen?
Ja. Varje AI-promptteknik-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Använda LLM för att utvärdera LLM-utdata
- Prompter för bedömning enligt kriterier
- Jämförande bedömning: A mot B
- Kalibrering och bias hos LLM-domare