Kalibrasi dan Bias pada Penilai LLM
Bias posisi, bias verbosity, dan cara menguranginya dalam prompt penilai.
Kalibrasi dan Bias pada Penilai LLM adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Mengapa Kalibrasi Juri Penting
Juri LLM yang secara sistematis memberi skor lebih tinggi kepada jenis respons tertentu daripada yang semestinya akan menghasilkan hasil evaluasi yang menyesatkan. Anda mungkin merilis model yang lebih buruk karena juri menyukai gayanya yang panjang—bukan kualitasnya yang sebenarnya.
Kalibrasi berarti skor juri secara akurat mencerminkan kualitas sebenarnya. Juri yang terkalibrasi mencapai tingkat kesesuaian yang dapat diukur dengan penilai manusia dan tidak secara sistematis mengunggulkan atribut tertentu yang tidak berkaitan dengan kualitas.
Bias Posisi: Pembahasan Mendalam
Bias posisi adalah bias juri LLM yang paling kuat dan paling banyak diteliti. Dalam perbandingan berpasangan, juri lebih menyukai opsi pertama sebanyak 60–65% dari waktu, terlepas dari kualitasnya. Ini setara dengan koin yang menunjukkan sisi kepala 60% dari waktu—signifikan pada skala besar.
Bias ini muncul karena LLM dilatih untuk menghasilkan kelanjutan teks—ketika melihat “Respons A:” terlebih dahulu, LLM terdorong ke arah A sebelum membaca B.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
def measure_position_bias(question, n_pairs=20):
"""
Measure position bias by comparing IDENTICAL responses.
If both responses are the same, wins should be 50/50.
Any deviation from 50/50 is pure position bias.
"""
response = 'Machine learning is a subset of AI that learns from data.'
first_wins = 0
for _ in range(n_pairs):
prompt = (
f'Which response is better?\nQ: {question}\n'
f'Response A: {response}\n'
f'Response B: {response}\n'
f'Reply with A or B.'
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=5,
messages=[{'role': 'user', 'content': prompt}]
)
if 'A' in r.content[0].text:
first_wins += 1
bias = first_wins / n_pairs
print(f'First-position win rate with IDENTICAL responses: {bias:.0%}')
print(f'Expected (no bias): 50%')
print(f'Measured bias: {(bias - 0.5) * 100:+.0f}%')
return biasBias Keberpanjangan: Pembahasan Mendalam
Bias keberpanjangan menyebabkan juri lebih menyukai respons yang lebih panjang, bahkan ketika respons yang lebih pendek lebih akurat dan lengkap. Penelitian menunjukkan bahwa juri LLM menilai respons yang lebih panjang sebagai “lebih baik” 1,5–2 kali lebih sering dalam perbandingan berpasangan, dengan kualitas isi yang dikendalikan.
Bias ini kemungkinan berasal dari data pelatihan yang membuat penilai manusia juga menyamakan panjang dengan kualitas.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
def measure_verbosity_bias(question, correct_answer):
"""
Compare a concise correct answer against a verbose one with filler.
A good judge should prefer the concise version or call it a tie.
"""
concise = correct_answer
verbose = (
f'That is a great question! I am happy to help. '
f'{correct_answer} '
f'I hope this comprehensive explanation addresses all your needs. '
f'Please feel free to ask if you need any further clarification!'
)
for label, resp in [('Concise', concise), ('Verbose', verbose)]:
prompt = (
f'Rate this response 1-5 for quality.\n'
f'Q: {question}\nA: {resp}\n'
f'Return only a number 1-5.'
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=5,
messages=[{'role': 'user', 'content': prompt}]
)
score = r.content[0].text.strip()
print(f'{label} response score: {score}')
print(f' ({len(resp.split())} words)')Bias Preferensi terhadap Diri Sendiri: Pembahasan Mendalam
Juri Claude rata-rata memberi skor lebih tinggi pada respons yang dihasilkan Claude. Juri GPT-4 memberi skor lebih tinggi pada respons yang dihasilkan GPT-4. Hal ini telah dibuktikan dalam beberapa penelitian independen.
Mekanismenya: setiap model memiliki gaya khas—struktur kalimat, pola penggunaan kata penghalus, dan pilihan kosakata. Model yang sama mengenali dan menyukai gayanya sendiri.
import anthropic
import openai
anthropic_client = anthropic.Anthropic(api_key='sk-ant-...')
openai_client = openai.OpenAI(api_key='sk-...')
def test_self_preference(question):
# Generate one response per model
claude_answer = anthropic_client.messages.create(
model='claude-opus-4-5', max_tokens=100,
messages=[{'role': 'user', 'content': question}]
).content[0].text
gpt_answer = openai_client.chat.completions.create(
model='gpt-4o', max_tokens=100,
messages=[{'role': 'user', 'content': question}]
).choices[0].message.content
judge_prompt = (
f'Which response is better?\nQ: {question}\n'
f'Response A: {claude_answer}\n'
f'Response B: {gpt_answer}\n'
f'Reply: A or B'
)
# Claude judges the comparison
claude_verdict = anthropic_client.messages.create(
model='claude-opus-4-5', max_tokens=5,
messages=[{'role': 'user', 'content': judge_prompt}]
).content[0].text.strip()
print(f'Claude judge verdict: {claude_verdict}')
print('(A=Claude response, B=GPT response)')
print('Self-preference: did Claude prefer its own response?')Mitigasi 1: Tukar Urutan
Mitigasi tunggal yang paling efektif untuk bias posisi: jalankan setiap perbandingan berpasangan dua kali dengan urutan yang ditukar, lalu gunakan hanya hasil yang konsisten. Terapkan ini sebagai fungsi standar yang harus dilewati semua evaluasi.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
def debiased_compare(question, response_a, response_b, label_a='A', label_b='B'):
def single_pass(first, second, first_label, second_label):
prompt = (
f'Q: {question}\n\n'
f'{first_label}: {first}\n\n'
f'{second_label}: {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()
# Pass 1: A first
p1 = single_pass(response_a, response_b, label_a, label_b)
# Pass 2: B first — but labels stay the same (we just swap presentation order)
p2 = single_pass(response_b, response_a, label_b, label_a)
# Normalize p2: if judge said label_b in pass 2, that means they preferred first-shown
# Need to map back: if p2 = label_b, the 'first' won; if p2 = label_a, the 'second' won
if p1 == p2 and p1 != 'TIE':
return p1, 'Consistent result'
else:
return 'TIE', f'Inconsistent: pass1={p1}, pass2={p2}'
winner, reason = debiased_compare(
'What is Docker?',
'Docker is a containerization platform.',
'Docker allows you to package applications into containers for consistent deployment.'
)
print(f'{winner}: {reason}')Mitigasi 2: Beberapa Juri yang Beragam
Bias preferensi terhadap diri sendiri berkurang jika Anda menggunakan beberapa model berbeda sebagai juri dan menggabungkan putusan mereka. Jika Claude, GPT-4, dan Gemini semuanya sepakat, hasilnya jauh lebih dapat dipercaya daripada putusan model tunggal mana pun.
import anthropic
import openai
anthropic_client = anthropic.Anthropic(api_key='sk-ant-...')
openai_client = openai.OpenAI(api_key='sk-...')
def multi_model_pairwise(question, response_a, response_b):
results = {}
# Judge 1: Claude
r1 = anthropic_client.messages.create(
model='claude-opus-4-5', max_tokens=5,
messages=[{'role': 'user', 'content':
f'Q: {question}\nA: {response_a}\nB: {response_b}\n'
f'Which is better? Reply A, B, or TIE.'
}]
)
results['Claude'] = r1.content[0].text.strip()
# Judge 2: GPT-4o
r2 = openai_client.chat.completions.create(
model='gpt-4o', max_tokens=5,
messages=[{'role': 'user', 'content':
f'Q: {question}\nA: {response_a}\nB: {response_b}\n'
f'Which is better? Reply A, B, or TIE.'
}]
)
results['GPT4o'] = r2.choices[0].message.content.strip()
print(f'Claude judge: {results["Claude"]}')
print(f'GPT-4o judge: {results["GPT4o"]}')
# Aggregate: majority vote
votes = list(results.values())
if votes.count('A') >= 2: return 'A'
if votes.count('B') >= 2: return 'B'
return 'TIE'
final = multi_model_pairwise(
'Explain recursion.',
'A function that calls itself.',
'Recursion is when a function solves a problem by solving a smaller version of the same problem.'
)
print(f'Final verdict: {final}')Mitigasi 3: Instruksi Anti-Keberpanjangan
Instruksikan juri secara langsung untuk mengurangi skor bagi keberpanjangan dan memberikan penghargaan untuk keringkasan. Hal ini mengimbangi bias keberpanjangan yang sebaliknya membuat respons yang lebih panjang tampak lebih baik.
ANTI_VERBOSITY_JUDGE = (
'Evaluate this response. Apply these corrections for known judge biases:\n\n'
'VERBOSITY CORRECTION: Do NOT rate a response higher simply because it is longer. '
'A concise, accurate 20-word answer is better than a 200-word answer that says the same thing. '
'Actively penalize unnecessary padding, filler phrases like "Great question!", '
'and repetition.\n\n'
'LENGTH PENALTY: If the response contains introductory filler, closing remarks, '
'or restates the question, subtract 1 point from your score.\n\n'
'Question: {question}\n'
'Response: {response}\n\n'
'Score 1-5 (apply verbosity correction above):'
)
# This instruction significantly reduces verbosity inflation in practice
print('Anti-verbosity instructions reduce the length-quality conflation')Mengalibrasi terhadap Penilai Manusia
Standar emas untuk kalibrasi juri: bandingkan skor juri LLM Anda dengan skor penilai manusia pada kumpulan data kalibrasi. Ukur tingkat kesesuaian dan identifikasi perbedaan sistematis.
import anthropic
import json
from scipy import stats # pip install scipy
client = anthropic.Anthropic(api_key='sk-ant-...')
def calibrate_judge(calibration_set):
"""
calibration_set: list of dicts with:
{'question': str, 'response': str, 'human_score': float}
"""
llm_scores = []
human_scores = []
for item in calibration_set:
prompt = (
f'Rate this response 1-5.\n'
f'Q: {item["question"]}\nA: {item["response"]}\n'
f'Return only a number.'
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=5,
messages=[{'role': 'user', 'content': prompt}]
)
try:
llm_score = float(r.content[0].text.strip())
except ValueError:
llm_score = 3.0 # Default on parse error
llm_scores.append(llm_score)
human_scores.append(item['human_score'])
correlation, p_value = stats.pearsonr(llm_scores, human_scores)
print(f'LLM-Human correlation: {correlation:.3f} (p={p_value:.4f})')
print(f'LLM mean score: {sum(llm_scores)/len(llm_scores):.2f}')
print(f'Human mean score: {sum(human_scores)/len(human_scores):.2f}')
return correlationMendeteksi Pola Bias Sistematis
Analisis keluaran juri pada berbagai kategori respons untuk mendeteksi bias sistematis. Apakah juri secara konsisten memberi skor lebih tinggi pada respons dari salah satu model? Apakah juri mengurangi skor respons pada topik tertentu?
import json
from collections import defaultdict
def analyze_judge_bias(log_file='pairwise_log.jsonl'):
"""
Analyze pairwise logs to detect systematic bias.
"""
wins_by_label = defaultdict(int)
total_by_label = defaultdict(int)
with open(log_file) as f:
for line in f:
entry = json.loads(line)
winner = entry['winner']
label_a = entry['label_a']
label_b = entry['label_b']
if winner == 'A':
wins_by_label[label_a] += 1
elif winner == 'B':
wins_by_label[label_b] += 1
total_by_label[label_a] += 1
total_by_label[label_b] += 1
print('Win rate by model:')
for label in sorted(total_by_label):
total = total_by_label[label]
wins = wins_by_label[label]
print(f' {label}: {wins}/{total} = {wins/total:.0%}')
# Flag if any model wins >60% — likely systematic bias
for label in total_by_label:
rate = wins_by_label[label] / total_by_label[label]
if rate > 0.65 or rate < 0.35:
print(f'WARNING: {label} win rate {rate:.0%} suggests systematic bias')Daftar Periksa Mitigasi Bias
Daftar periksa yang perlu diterapkan sebelum menerapkan juri LLM dalam lingkungan produksi:
- Jalankan semua perbandingan berpasangan dua kali dengan urutan ditukar
- Sertakan instruksi anti-keberpanjangan yang eksplisit dalam rubrik
- Gunakan setidaknya 2 model berbeda sebagai juri untuk evaluasi berisiko tinggi
- Berikan jangkar secara eksplisit pada tingkat skor untuk mencegah inflasi
- Kalibrasikan terhadap penilai manusia menggunakan sampel yang representatif
- Catat dan pantau tingkat kemenangan berdasarkan label model untuk mendeteksi pergeseran
- Tambahkan keluaran JSON terstruktur untuk mencegah skor tersembunyi dalam teks bebas
Jejak Audit dan Kemudahan Penjelasan
Penilai yang terkalibrasi juga harus mudah dijelaskan. Jika penilai memberikan skor 4/5 untuk suatu respons, Anda harus dapat menelusuri alasannya — kriteria mana yang terpenuhi dan mana yang belum.
Mewajibkan penilai mengembalikan JSON dengan skor untuk setiap kriteria dan alasan singkat akan membuat jejak audit secara alami. Para pemangku kepentingan dapat meninjau alasan respons tertentu memperoleh skor tersebut, dan Anda dapat menemukan pola berulang pada skor rendah.
Uji Pengetahuan: Mitigasi Preferensi Diri
Strategi mitigasi mana yang PALING langsung mengatasi bias preferensi diri pada penilai LLM?
Rangkuman: Kalibrasi dan Bias pada Penilai LLM
Penilai LLM memiliki empat bias sistematis utama: bias posisi (lebih menyukai pilihan pertama), bias kebertele-telean (lebih menyukai respons yang lebih panjang), preferensi diri (lebih menyukai gaya mereka sendiri), dan inflasi skor (mengelompok pada 4–5/5). Mitigasi setiap bias secara khusus: tukar urutan untuk bias posisi, tambahkan instruksi anti-kebertele-telean untuk bias kebertele-telean, gunakan penilai dari beragam model untuk preferensi diri, dan gunakan rubrik berjangkar untuk inflasi skor. Kalibrasikan penilai Anda terhadap penilai manusia menggunakan kumpulan data berlabel, lalu ukur korelasi Pearson. Pantau tingkat kemenangan berdasarkan label dari waktu ke waktu untuk mendeteksi pola bias yang mulai muncul sebelum mendistorsi pipeline evaluasi Anda.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kalibrasi dan Bias pada Penilai LLM” gratis?
Ya — teks lengkap “Kalibrasi dan Bias pada Penilai LLM” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Kalibrasi dan Bias pada Penilai LLM”?
Bias posisi, bias verbosity, dan cara menguranginya dalam prompt penilai. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Kalibrasi dan Bias pada Penilai LLM” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menggunakan LLM untuk Mengevaluasi Output LLM
- Prompt Penilaian Berbasis Rubrik
- Penilaian Komparatif: A vs B
- Kalibrasi dan Bias pada Penilai LLM