0Pricing
AI Prompt Engineering · Ders

LLM Değerlendiricilerinde Kalibrasyon ve Önyargı

Konum önyargısı, ayrıntı önyargısı ve bunları değerlendirme istemlerinde azaltma yolları.

LLM Değerlendiricilerinde Kalibrasyon ve Önyargı, CoddyKit'te ücretsiz bir AI Prompt Engineering dersidir. Bu, 4 dersinin 4. 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.

Değerlendirici Kalibrasyonu Neden Önemlidir

Bir LLM değerlendiricisi, bir tür yanıtı hak ettiğinden sistematik olarak daha yüksek puanlarsa yanıltıcı değerlendirme sonuçları üretir. Değerlendirici gerçek kaliteyi değil de uzun üslubu tercih ettiği için daha kötü bir modeli kullanıma sunabilirsiniz.

Kalibrasyon, değerlendiricinin puanlarının gerçek kaliteyi doğru biçimde yansıtmasıdır. Kalibre edilmiş bir değerlendirici, insan değerlendiricilerle ölçülebilir bir oranda uyuşur ve kaliteyle ilgisiz herhangi bir özelliği sistematik olarak kayırmaz.

Konum Yanlılığı: Derinlemesine İnceleme

Konum yanlılığı, LLM değerlendiricilerindeki en güçlü ve en çok incelenen yanlılıktır. İkili karşılaştırmada değerlendiriciler, kaliteden bağımsız olarak zamanın %60-65'inde ilk seçeneği tercih eder. Bu, her atışta %60 oranında tura gelen bir yazı tura parası gibidir — büyük ölçekte anlamlıdır.

Bu yanlılık, LLM'lerin devam metinleri üretmek üzere eğitilmesinden kaynaklanır — “Yanıt A:” ifadesini önce görmek, B'yi okumadan önce onları A'ya yönlendirir.

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 bias

Uzunluk Yanlılığı: Derinlemesine İnceleme

Uzunluk yanlılığı, daha kısa yanıtlar daha doğru ve eksiksiz olsa bile değerlendiricilerin daha uzun yanıtları tercih etmesine neden olur. Araştırmalar, içerik kalitesi sabit tutulduğunda LLM değerlendiricilerinin ikili karşılaştırmalarda daha uzun yanıtları 1,5-2 kat daha sık “daha iyi” olarak puanladığını gösterir.

Bu yanlılık muhtemelen insan puanlayıcıların da uzunluğu kaliteyle karıştırdığı eğitim verilerinden kaynaklanır.

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)')

Öz-Tercih Yanlılığı: Derinlemesine İnceleme

Claude değerlendiricileri, Claude tarafından üretilen yanıtları ortalamada daha yüksek puanlar. GPT-4 değerlendiricileri, GPT-4 tarafından üretilen yanıtları daha yüksek puanlar. Bu durum birden çok bağımsız çalışmada gösterilmiştir.

Bu mekanizmanın nedeni şudur: Her modelin cümle yapısı, ihtiyat belirten ifade kalıpları ve sözcük seçimleri gibi ayırt edici bir üslubu vardır. Aynı model kendi üslubunu tanır ve tercih eder.

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?')

Azaltma 1: Sırayı Değiştirme

Konum yanlılığını azaltmanın en etkili tek önlemi şudur: Her ikili karşılaştırmayı sıralamayı değiştirerek iki kez çalıştırın ve yalnızca tutarlı sonuçları kullanın. Bunu, tüm değerlendirmelerin geçtiği standart bir işlev olarak uygulayın.

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}')

Azaltma 2: Birden Çok Farklı Değerlendirici

Öz-tercih yanlılığı, değerlendirici olarak birden çok farklı model kullanılarak ve bu modellerin kararları birleştirilerek azaltılır. Claude, GPT-4 ve Gemini aynı fikirde olduğunda sonuç, tek bir modelin kararından çok daha güvenilirdir.

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}')

Azaltma 3: Aşırı Uzunluğu Önlemeye Yönelik Yönergeler

Değerlendiriciye uzunluğu cezalandırmasını ve özlülüğü ödüllendirmesini doğrudan söyleyin. Bu, aksi halde daha uzun yanıtların daha iyi görünmesine neden olacak uzunluk yanlılığını dengeler.

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')

İnsan Değerlendiricilere Göre Kalibrasyon

Değerlendirici kalibrasyonu için altın standart şudur: LLM değerlendiricinizin puanlarını bir kalibrasyon kümesindeki insan değerlendirici puanlarıyla karşılaştırın. Uyuşmayı ölçün ve sistematik farklılıkları belirleyin.

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 correlation

Sistematik Yanlılık Örüntülerini Belirleme

Sistematik yanlılığı belirlemek için değerlendiricinizin çıktısını farklı yanıt kategorileri üzerinden inceleyin. Değerlendirici, bir modelden gelen yanıtları sürekli olarak daha yüksek mi puanlıyor? Belirli konulardaki yanıtları cezalandırıyor mu?

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')

Yanlılığı Azaltma Kontrol Listesi

Bir LLM değerlendiricisini üretim ortamında kullanıma sunmadan önce uygulamanız gereken kontrol listesi:

  • Tüm ikili karşılaştırmaları sıralamayı değiştirerek iki kez çalıştırın
  • Ölçüt yönergesine aşırı uzunluğu önlemeye yönelik açık yönergeler ekleyin
  • Yüksek riskli değerlendirmelerde değerlendirici olarak en az 2 farklı model kullanın
  • Puan şişmesini önlemek için puan düzeylerini açıkça sabitleyin
  • Temsili bir örneklem üzerinde insan değerlendiricilere göre kalibrasyon yapın
  • Kaymayı belirlemek için model etiketine göre kazanma oranlarını günlüğe kaydedin ve izleyin
  • Puanların serbest metinde gizlenmesini önlemek için yapılandırılmış JSON çıktısı ekleyin

Denetim İzleri ve Açıklanabilirlik

Kalibre edilmiş bir değerlendirici aynı zamanda açıklanabilir olmalıdır. Değerlendirici bir yanıta 5 üzerinden 4 puan verirse bunun nedenini — hangi ölçütlerin karşılandığını, hangilerinin yetersiz kaldığını — izleyebilmeniz gerekir.

Değerlendiricinin her ölçüt için puanları ve kısa bir gerekçeyi içeren JSON döndürmesini zorunlu kılmak, doğal bir denetim izi oluşturur. Paydaşlar belirli yanıtların neden bu puanları aldığını inceleyebilir, siz de düşük puanlardaki yinelenen örüntüleri fark edebilirsiniz.

Bilgi Yoklaması: Kendini Tercih Etme Yanlılığını Azaltma

LLM değerlendiricilerindeki kendini tercih etme yanlılığını MOST doğrudan ele alan azaltma stratejisi hangisidir?

Özet: LLM Değerlendiricilerinde Kalibrasyon ve Yanlılık

LLM değerlendiricilerinde dört temel sistematik yanlılık bulunur: konum yanlılığı (ilk seçeneği tercih etme), uzunluk yanlılığı (daha uzun yanıtları tercih etme), kendini tercih etme (kendi tarzını tercih etme) ve puan şişmesi (4-5/5 çevresinde kümelenme). Her birini özel olarak azaltın: konum yanlılığı için seçeneklerin sırasını değiştirin, uzunluk yanlılığı için uzun yanıtları engelleyen yönergeler ekleyin, kendini tercih etme yanlılığı için çeşitli model değerlendiricileri kullanın ve puan şişmesi için dayanaklı değerlendirme ölçütleri kullanın. Değerlendiricinizi etiketli bir veri kümesinde insan değerlendiricilere göre kalibre edin ve Pearson korelasyonunu ölçün. Değerlendirme işlem hattınızı bozabilecek yeni yanlılık örüntülerini erkenden yakalamak için zaman içinde etikete göre kazanma oranlarını izleyin.

Sıkça Sorulan Sorular

“LLM Değerlendiricilerinde Kalibrasyon ve Önyargı” dersi ücretsiz mi?

Evet — “LLM Değerlendiricilerinde Kalibrasyon ve Önyargı” 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.

“LLM Değerlendiricilerinde Kalibrasyon ve Önyargı” dersinde ne öğreneceğim?

Konum önyargısı, ayrıntı önyargısı ve bunları değerlendirme istemlerinde azaltma yolları. 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 4. dersidir.

“LLM Değerlendiricilerinde Kalibrasyon ve Önyargı” 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

  1. LLM Kullanarak LLM Çıktılarını Değerlendirme
  2. Derecelendirme Ölçütü Tabanlı Puanlama İstemleri
  3. Karşılaştırmalı Değerlendirme: A ve B
  4. LLM Değerlendiricilerinde Kalibrasyon ve Önyargı
← AI Prompt Engineering Sayfasına Dön