Karşılaştırmalı Değerlendirme: A ve B
Çıktıları mutlak puanlama olmadan sıralamak için ikili karşılaştırma istemleri.
Karşılaştırmalı Değerlendirme: A ve B, CoddyKit'te ücretsiz bir AI Prompt Engineering dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Prompt Engineering öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Prompt Engineering kursu toplamda 4 dersten oluşur.
İkili (A ve B) Değerlendirme Nedir?
İkili değerlendirme (karşılaştırmalı değerlendirme olarak da adlandırılır), değerlendiriciye aynı soruya verilen iki yanıtı sunar ve hangisinin daha iyi olduğunu sorar. Değerlendirici, tek bir yanıtı 1-5 arasında puanlamak yerine göreli bir karar verir: A daha iyi, B daha iyi veya berabere.
Bu yaklaşım, bazı mutlak puanlama yanlılıklarını aşar ve çoğu zaman yanıt başına verilen mutlak puanlardan daha güvenilir sıralamalar üretir.
Temel İkili Değerlendirme Yönergesi
En basit ikili değerlendirme yönergesi, hangi yanıtın daha iyi olduğunu ve nedenini sorar. Önemli nokta, bir seçimi zorunlu kılmaktır — değerlendiricinin belirsiz bir “ikisi de iyi” ifadesiyle karşılaştırmadan kaçınmasına izin vermeyin.
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)Konum Yanlılığını Azaltmak İçin Sırayı Rastgeleleştirme
Konum yanlılığı, değerlendiricilerin ilk seçeneği tercih etmesine neden olur. Bunu etkisizleştirmek için her karşılaştırmayı iki kez çalıştırın: bir kez A ilk sıradayken, bir kez B ilk sıradayken. Yalnızca iki sıralamada da aynı kazanan çıkarsa kazananı kabul edin. Sonuçlar farklıysa berabere ilan edin veya insan incelemesine yönlendirin.
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}')Birden Çok Ölçütle İkili Değerlendirme
Değerlendiriciden yalnızca “genel olarak hangisi daha iyi?” diye sormak yerine belirli boyutları karşılaştırmasını isteyin. Boyutlara göre yapılan ikili karşılaştırma, bir yanıtın neden tercih edildiğine ilişkin uygulanabilir bilgiler sağlar.
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)Turnuva Oluşturma: Herkes Herkesle Karşılaşır
İkiden fazla yanıtı karşılaştırırken herkesin herkesle karşılaştığı bir turnuva kullanın: her yanıt diğer her yanıtla karşılaştırılır. En çok galibiyet alan yanıt ilk sırada yer alır.
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 rankingSürekli Sıralama İçin Elo Puanı
Büyük ölçekli değerlendirme için herkesin herkesle karşılaştığı turnuva yerine Elo puanlarını kullanın. Her yanıt 1000 puanla başlar. Her karşılaştırmadan sonra kazanan puan kazanır, kaybeden puan kaybeder; puan değişimi sonucun ne kadar şaşırtıcı olduğuyla orantılıdır. Çok sayıda karşılaştırmadan sonra Elo puanları güvenilir bir genel sıralama üretir.
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}')İkili ve Mutlak Puanlama Ne Zaman Kullanılmalı
İkili değerlendirmeyi şu durumlarda kullanın:
- Birden çok modeli veya yönerge varyantını sıralamak istiyorsanız
- Mutlak puan eşiklerini tanımlamak zorsa
- Her ikisi de “iyi” olan ancak farklı yönlerden iyi yanıtları karşılaştırıyorsanız
Mutlak (ölçüt tabanlı) puanlamayı şu durumlarda kullanın:
- Bir başarılı/başarısız eşiğine ihtiyacınız varsa (“Bu yanıt yeterince iyi mi?”)
- Her sorgu için değerlendirecek yalnızca bir yanıtınız varsa
- Hata ayıklama için ölçüt düzeyinde puanlara ihtiyacınız varsa
Büyük Ölçekte Örneklemeye Dayalı İkili Karşılaştırma
N yanıt için tüm çiftleri çalıştırmak N*(N-1)/2 karşılaştırma, yani O(N^2) gerektirir. N büyük olduğunda her yanıtı diğer tüm yanıtlarla karşılaştırmak yerine K rastgele rakiple karşılaştırmak için rastgele örnekleme kullanın. Bu yöntem, gerçek sıralamayı çok daha düşük maliyetle yaklaşık olarak verir.
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 rankingAnlaşmazlıkları Yorumlama
İki sıralama aynı sonucu vermediğinde (A-B sıralamasında A kazanırken B-A sıralamasında B kazanıyorsa), bu yalnızca konum yanlılığına değil, gerçekten sınırda kalan bir karşılaştırmaya işaret eder. Bu sınırda kalan durumlar daha derinlemesine analizi hak eder.
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])İkili Karşılaştırma Sonuçlarını Günlüğe Kaydetme
Hangi yanıtın hangisine üstün geldiğini ve bunun hangi koşullarda gerçekleştiğini gösteren aranabilir bir kayıt oluşturmak için tüm ikili karşılaştırma sonuçlarını günlüğe kaydedin. Bu veriler, gerileme sınamaları ve model iyileştirmelerini zaman içinde anlamak için değerlidir.
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'
)İkili Değerlendirme ve Mutlak Puanlama: Ödünleşimler
İkili değerlendirme ile mutlak puanlama yönergeleri birbirinin rakibi değil, birbirini tamamlayan yaklaşımlardır. Bunları birlikte kullanın: asgari kalite düzeyini belirlemek için mutlak puanlamayı, bu düzeyin üzerindeki adayları sıralamak için ikili karşılaştırmayı kullanın.
Temel ödünleşim şudur: N yanıt için ikili değerlendirme O(N^2) karşılaştırma gerektirirken mutlak puanlama O(N) gerektirir. Büyük ölçekte örneklemeye dayalı ikili değerlendirme veya Elo puanları gerekli hale gelir.
Bilgi Kontrolü: İkili Değerlendirmede Yanlılığı Giderme
İkili LLM değerlendirmesinde konum yanlılığını azaltmanın en etkili yolu nedir?
Özet: A ve B'nin Karşılaştırmalı Değerlendirmesi
İkili değerlendirme, iki yanıttan hangisinin daha iyi olduğunu sorar; her yanıtı mutlak bir ölçekte puanlamaz. Konum yanlılığını denetlemek için her karşılaştırmayı sıralamayı değiştirerek iki kez çalıştırın ve yalnızca tutarlı sonuçları kabul edin. N yanıt için küçük N değerlerinde herkesin herkesle karşılaştığı turnuvayı (tüm çiftleri), büyük N değerlerinde ise örneklemeli turnuvaları kullanın. Elo puanları, çok sayıda ikili karşılaştırmadan sürekli sıralamalar üretir. Uygulanabilir tanısal bilgiler elde etmek için boyutlara göre ikili değerlendirme yapın (doğruluk, eksiksizlik ve açıklığı ayrı ayrı değerlendirin). Model sürümleri arasındaki gerileme sınamaları ve eğilim analizi için tüm sonuçları günlüğe kaydedin.
Sıkça Sorulan Sorular
“Karşılaştırmalı Değerlendirme: A ve B” dersi ücretsiz mi?
Evet — “Karşılaştırmalı Değerlendirme: A ve B” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Prompt Engineering kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Prompt Engineering kursu toplamda 4 dersten oluşur.
“Karşılaştırmalı Değerlendirme: A ve B” dersinde ne öğreneceğim?
Çıktıları mutlak puanlama olmadan sıralamak için ikili karşılaştırma istemleri. AI Prompt Engineering ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Prompt Engineering öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Prompt Engineering, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Karşılaştırmalı Değerlendirme: A ve B” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Prompt Engineering dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Prompt Engineering dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- LLM Kullanarak LLM Çıktılarını Değerlendirme
- Derecelendirme Ölçütü Tabanlı Puanlama İstemleri
- Karşılaştırmalı Değerlendirme: A ve B
- LLM Değerlendiricilerinde Kalibrasyon ve Önyargı