Penilaian Komparatif: A vs B
Prompt perbandingan berpasangan untuk mengurutkan output tanpa penilaian absolut.
Penilaian Komparatif: A vs B adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 3 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.
Apa Itu Evaluasi Berpasangan (A vs B)?
Evaluasi berpasangan (juga disebut penjurian komparatif) menyajikan dua respons untuk pertanyaan yang sama kepada juri, lalu menanyakan mana yang lebih baik. Alih-alih memberi satu respons skor 1–5, juri membuat penilaian relatif: A lebih baik, B lebih baik, atau keduanya seri.
Pendekatan ini menghindari sebagian bias penilaian absolut dan sering menghasilkan peringkat yang lebih andal daripada skor absolut per respons.
Perintah Dasar Juri Berpasangan
Juri berpasangan paling sederhana menanyakan respons mana yang lebih baik dan alasannya. Kuncinya adalah memaksa juri memilih—jangan biarkan juri menghindari perbandingan dengan jawaban samar seperti “keduanya bagus”.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
PAIRWISE_PROMPT = (
'Given the same question, compare these two responses and decide which is better.\n\n'
'Question: {question}\n\n'
'Response A:\n{response_a}\n\n'
'Response B:\n{response_b}\n\n'
'Which response is better? You must pick A, B, or TIE (use TIE only if '
'they are truly equal in all meaningful ways).\n\n'
'Return JSON: {{"winner": "A" or "B" or "TIE", '
'"reason": "<one sentence explaining why the winner is better>"}}'
)
def pairwise_judge(question, response_a, response_b):
prompt = PAIRWISE_PROMPT.format(
question=question,
response_a=response_a,
response_b=response_b
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=150,
messages=[{'role': 'user', 'content': prompt}]
)
return json.loads(r.content[0].text)
result = pairwise_judge(
'What is machine learning?',
'Machine learning is a subset of AI.',
'Machine learning is a method of data analysis that automates model building.'
)
print(result)Mengacak Urutan untuk Mengurangi Bias Posisi
Bias posisi membuat juri lebih menyukai opsi pertama. Untuk menetralkannya, jalankan setiap perbandingan dua kali: sekali dengan A di posisi pertama, dan sekali dengan B di posisi pertama. Hanya hitung pemenang jika kedua urutan menghasilkan keputusan yang sama. Jika hasilnya berbeda, nyatakan seri atau eskalasikan ke peninjauan manusia.
import anthropic
import json
import random
client = anthropic.Anthropic(api_key='sk-ant-...')
def debiased_pairwise_judge(question, response_a, response_b):
def single_comparison(first, second, first_label, second_label):
prompt = (
f'Question: {question}\n\n'
f'Response {first_label}:\n{first}\n\n'
f'Response {second_label}:\n{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()
# Run A-first
result_ab = single_comparison(response_a, response_b, 'A', 'B')
# Run B-first
result_ba = single_comparison(response_b, response_a, 'B', 'A')
if result_ab == 'A' and result_ba == 'A':
return 'A', 'Consistent: A wins in both orderings'
elif result_ab == 'B' and result_ba == 'B':
return 'B', 'Consistent: B wins in both orderings'
else:
return 'TIE', f'Inconsistent: {result_ab} then {result_ba} — position bias detected'
winner, reason = debiased_pairwise_judge(
'Explain a hash table.',
'A hash table maps keys to values.',
'A hash table is a data structure using a hash function to store key-value pairs for O(1) lookup.'
)
print(f'Winner: {winner} — {reason}')Perbandingan Berpasangan dengan Beberapa Kriteria
Minta juri membandingkan berdasarkan dimensi tertentu, bukan sekadar menanyakan “mana yang lebih baik secara keseluruhan”. Perbandingan berpasangan berdasarkan dimensi memberikan informasi yang dapat ditindaklanjuti tentang alasan suatu respons lebih disukai.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
DIMENSIONAL_PAIRWISE = (
'Compare Response A and Response B on each dimension.\n\n'
'Question: {question}\n\n'
'Response A: {response_a}\n\n'
'Response B: {response_b}\n\n'
'For each dimension, say A, B, or TIE:\n'
'1. ACCURACY: Which is more factually correct?\n'
'2. COMPLETENESS: Which answers the question more fully?\n'
'3. CLARITY: Which is easier to understand?\n'
'4. CONCISENESS: Which avoids unnecessary length?\n\n'
'Return JSON: {{"accuracy":"A/B/TIE", "completeness":"A/B/TIE", '
'"clarity":"A/B/TIE", "conciseness":"A/B/TIE", "overall":"A/B/TIE"}}'
)
def dimensional_compare(question, a, b):
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
messages=[{'role': 'user', 'content': DIMENSIONAL_PAIRWISE.format(
question=question, response_a=a, response_b=b
)}]
)
return json.loads(r.content[0].text)
result = dimensional_compare(
'How does HTTPS work?',
'HTTPS encrypts web traffic using SSL/TLS.',
'HTTPS secures HTTP using TLS. The browser and server perform a handshake, exchange certificates, and establish an encrypted channel for all data transfer.'
)
print(result)Membangun Turnamen: Sistem Setiap Peserta Bertemu
Saat membandingkan lebih dari dua respons, gunakan turnamen sistem setiap peserta bertemu: setiap respons dibandingkan dengan semua respons lainnya. Respons dengan kemenangan terbanyak menempati peringkat pertama.
from itertools import combinations
from collections import defaultdict
def round_robin_tournament(question, responses):
"""
responses: list of (label, text) tuples
Returns ranking by win count.
"""
wins = defaultdict(int)
ties = defaultdict(int)
# Every pair compared once
for (label_a, text_a), (label_b, text_b) in combinations(responses, 2):
winner, reason = debiased_pairwise_judge(question, text_a, text_b)
if winner == 'A':
wins[label_a] += 1
elif winner == 'B':
wins[label_b] += 1
else: # TIE
ties[label_a] += 1
ties[label_b] += 1
print(f'{label_a} vs {label_b}: {winner}')
# Rank by wins, then ties
ranking = sorted(
responses,
key=lambda x: (wins[x[0]], ties[x[0]]),
reverse=True
)
print('\nFinal ranking:')
for i, (label, _) in enumerate(ranking, 1):
print(f'{i}. {label}: {wins[label]} wins, {ties[label]} ties')
return rankingPeringkat Elo untuk Pemeringkatan Berkelanjutan
Untuk evaluasi berskala besar, gunakan peringkat Elo sebagai ganti sistem setiap peserta bertemu. Setiap respons dimulai dengan 1000 poin. Setelah setiap perbandingan, pemenang memperoleh poin dan yang kalah kehilangan poin, sebanding dengan seberapa mengejutkan hasil tersebut. Setelah banyak perbandingan, skor Elo menghasilkan peringkat global yang andal.
import math
def elo_update(rating_a, rating_b, winner, k=32):
"""
Update Elo ratings after a match.
winner: 'A' (A won), 'B' (B won), 'TIE' (draw)
Returns (new_rating_a, new_rating_b)
"""
expected_a = 1 / (1 + 10 ** ((rating_b - rating_a) / 400))
expected_b = 1 - expected_a
if winner == 'A':
score_a, score_b = 1, 0
elif winner == 'B':
score_a, score_b = 0, 1
else: # TIE
score_a, score_b = 0.5, 0.5
new_a = rating_a + k * (score_a - expected_a)
new_b = rating_b + k * (score_b - expected_b)
return new_a, new_b
# Simulate ratings for 4 model variants
ratings = {'ModelA': 1000, 'ModelB': 1000, 'ModelC': 1000, 'ModelD': 1000}
# After running many pairwise comparisons:
ratings['ModelA'], ratings['ModelB'] = elo_update(ratings['ModelA'], ratings['ModelB'], 'A')
ratings['ModelC'], ratings['ModelD'] = elo_update(ratings['ModelC'], ratings['ModelD'], 'TIE')
ranking = sorted(ratings.items(), key=lambda x: x[1], reverse=True)
for model, score in ranking:
print(f'{model}: {score:.0f}')Kapan Menggunakan Penilaian Berpasangan atau Absolut
Gunakan penilaian berpasangan ketika:
- Anda ingin memeringkat beberapa model atau variasi perintah
- Ambang skor absolut sulit ditentukan
- Anda membandingkan keluaran yang sama-sama “baik”, tetapi dengan keunggulan yang berbeda
Gunakan penilaian absolut (rubrik) ketika:
- Anda memerlukan ambang lulus/gagal (“apakah respons ini cukup baik?”)
- Anda hanya memiliki satu respons untuk dievaluasi pada setiap kueri
- Anda memerlukan skor tingkat kriteria untuk melakukan penelusuran kesalahan
Perbandingan Berpasangan Berbasis Pengambilan Sampel dalam Skala Besar
Menjalankan semua pasangan untuk N respons memerlukan N*(N-1)/2 perbandingan—O(N^2). Untuk N yang besar, gunakan pengambilan sampel acak: bandingkan setiap respons dengan K lawan acak, bukan dengan semua respons lainnya. Cara ini memperkirakan peringkat sebenarnya dengan biaya yang jauh lebih rendah.
import random
from collections import defaultdict
def sampled_tournament(question, responses, k_opponents=5):
"""
Compare each response against k random opponents.
More efficient than full round-robin for large N.
"""
wins = defaultdict(int)
n = len(responses)
for i, (label, text) in enumerate(responses):
# Sample k random opponents (not self)
opponent_indices = random.sample(
[j for j in range(n) if j != i],
min(k_opponents, n - 1)
)
for j in opponent_indices:
opp_label, opp_text = responses[j]
winner, _ = debiased_pairwise_judge(question, text, opp_text)
if winner == 'A':
wins[label] += 1
elif winner == 'B':
wins[opp_label] += 1
ranking = sorted(responses, key=lambda x: wins[x[0]], reverse=True)
for i, (label, _) in enumerate(ranking, 1):
print(f'{i}. {label}: {wins[label]} wins')
return rankingMenafsirkan Ketidaksepakatan
Ketika dua urutan menghasilkan keputusan berbeda (A menang dalam urutan A-B, B menang dalam urutan B-A), hal ini menandakan perbandingan yang benar-benar berada di ambang batas—bukan sekadar bias posisi. Kasus-kasus ambang batas ini perlu dianalisis lebih mendalam.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
def deep_analyze_tie(question, response_a, response_b):
"""When A vs B is a genuine tie, ask the judge to explain strengths of each."""
analysis_prompt = (
f'These two responses to the same question are closely matched in quality.\n\n'
f'Question: {question}\n\n'
f'Response A: {response_a}\n\n'
f'Response B: {response_b}\n\n'
f'Analyze both:\n'
f'1. What does A do better than B?\n'
f'2. What does B do better than A?\n'
f'3. For what audience or context would you prefer A?\n'
f'4. For what audience or context would you prefer B?'
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=400,
messages=[{'role': 'user', 'content': analysis_prompt}]
)
return r.content[0].text
analysis = deep_analyze_tie(
'Explain async/await in Python.',
'Async/await allows non-blocking code execution.',
'Async/await lets you write asynchronous code that looks synchronous, '
'using the asyncio event loop to handle I/O without blocking.'
)
print(analysis[:300])Mencatat Hasil Perbandingan Berpasangan
Catat semua hasil perbandingan berpasangan untuk membangun rekam jejak yang dapat dicari tentang respons mana yang mengungguli respons lain dan dalam kondisi apa. Data ini berguna untuk pengujian regresi dan memahami peningkatan model dari waktu ke waktu.
import json
import datetime
def logged_pairwise(question, response_a, response_b,
label_a='A', label_b='B', log_file='pairwise_log.jsonl'):
winner, reason = debiased_pairwise_judge(question, response_a, response_b)
entry = {
'timestamp': datetime.datetime.utcnow().isoformat(),
'question': question[:100], # Truncate for storage
'label_a': label_a,
'label_b': label_b,
'winner': winner,
'reason': reason,
'response_a_length': len(response_a.split()),
'response_b_length': len(response_b.split()),
}
with open(log_file, 'a') as f:
f.write(json.dumps(entry) + '\n')
print(f'{label_a} vs {label_b}: {winner} — {reason}')
return winner
logged_pairwise(
'What is SQL?',
'SQL is a database query language.',
'SQL (Structured Query Language) is used to query and manage relational databases.',
label_a='ModelV1',
label_b='ModelV2'
)Evaluasi Berpasangan vs Penilaian Absolut: Pertukaran
Evaluasi berpasangan dan penilaian absolut berbasis rubrik saling melengkapi, bukan bersaing. Gunakan keduanya: penilaian absolut untuk menetapkan batas minimum kualitas, dan perbandingan berpasangan untuk memeringkat kandidat yang berada di atas batas tersebut.
Pertukaran utamanya: perbandingan berpasangan memerlukan O(N^2) perbandingan untuk N respons, sedangkan penilaian absolut memerlukan O(N). Pada skala besar, perbandingan berpasangan berbasis pengambilan sampel atau peringkat Elo menjadi diperlukan.
Pemeriksaan Pengetahuan: Mengurangi Bias dalam Evaluasi Berpasangan
Apa cara paling efektif untuk mengurangi bias posisi dalam evaluasi LLM secara berpasangan?
Rangkuman: Penjurian Komparatif A vs B
Evaluasi berpasangan menanyakan mana dari dua respons yang lebih baik, bukan memberi skor pada masing-masing respons berdasarkan skala absolut. Untuk mengendalikan bias posisi, jalankan setiap perbandingan dua kali dengan urutan ditukar dan hanya terima hasil yang konsisten. Untuk N respons, gunakan sistem setiap peserta bertemu (semua pasangan) jika N kecil, atau turnamen berbasis sampel jika N besar. Peringkat Elo menghasilkan pemeringkatan berkelanjutan dari banyak perbandingan berpasangan. Gunakan penilaian berpasangan berdasarkan dimensi (keakuratan, kelengkapan, dan kejelasan secara terpisah) untuk memperoleh informasi diagnostik yang dapat ditindaklanjuti. Catat semua hasil untuk pengujian regresi dan analisis tren antarversi model.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penilaian Komparatif: A vs B” gratis?
Ya — teks lengkap “Penilaian Komparatif: A vs B” 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 “Penilaian Komparatif: A vs B”?
Prompt perbandingan berpasangan untuk mengurutkan output tanpa penilaian absolut. 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 3 dari 4.
Berapa lama pelajaran “Penilaian Komparatif: A vs B” 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