0Pricing
AI Prompt Engineering · บทเรียน

การปรับเทียบและอคติในผู้ตัดสินที่เป็น LLM

อคติจากตำแหน่ง อคติจากความยืดยาว และวิธีลดอคติเหล่านี้ในพรอมต์ผู้ตัดสิน

การปรับเทียบและอคติในผู้ตัดสินที่เป็น LLM เป็นบทเรียน AI Prompt Engineering ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Prompt Engineering และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการปรับเทียบผู้ตัดสินจึงสำคัญ

ผู้ตัดสิน LLM ที่ให้คะแนนคำตอบประเภทหนึ่งสูงเกินกว่าที่ควรอย่างเป็นระบบ จะสร้างผลการประเมินที่ทำให้เข้าใจผิด คุณอาจนำโมเดลที่แย่กว่าไปใช้งาน เพียงเพราะผู้ตัดสินชอบสไตล์ที่ยืดเยื้อของโมเดลนั้น ไม่ใช่คุณภาพที่แท้จริง

การปรับเทียบหมายความว่าคะแนนของผู้ตัดสินสะท้อนคุณภาพที่แท้จริงได้อย่างถูกต้อง ผู้ตัดสินที่ผ่านการปรับเทียบจะให้ผลตรงกับผู้ให้คะแนนมนุษย์ในอัตราที่วัดได้ และจะไม่ชอบคุณลักษณะใดคุณลักษณะหนึ่งอย่างเป็นระบบ หากคุณลักษณะนั้นไม่เกี่ยวข้องกับคุณภาพ

เจาะลึกอคติด้านตำแหน่ง

อคติด้านตำแหน่งเป็นอคติของผู้ตัดสิน LLM ที่รุนแรงและได้รับการศึกษามากที่สุด ในการเปรียบเทียบแบบจับคู่ ผู้ตัดสินชอบตัวเลือกแรก 60–65% ของเวลาโดยไม่ขึ้นกับคุณภาพ ซึ่งเทียบเท่ากับเหรียญที่ออกหัว 60% ของเวลา และมีนัยสำคัญเมื่อใช้ในวงกว้าง

อคตินี้เกิดขึ้นเพราะ LLM ได้รับการฝึกให้สร้างข้อความต่อเนื่อง เมื่อเห็น ‘คำตอบ A:’ ก่อน จึงถูกชี้นำให้เอนเอียงไปทาง A ก่อนที่จะอ่าน 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 bias

เจาะลึกอคติด้านความยืดเยื้อ

อคติด้านความยืดเยื้อทำให้ผู้ตัดสินชอบคำตอบที่ยาวกว่า แม้คำตอบที่สั้นกว่าจะถูกต้องและครบถ้วนกว่า งานวิจัยแสดงให้เห็นว่าผู้ตัดสิน LLM ให้คะแนนคำตอบที่ยาวกว่าว่า ‘ดีกว่า’ บ่อยขึ้น 1.5–2 เท่าในการเปรียบเทียบแบบจับคู่ โดยควบคุมคุณภาพของเนื้อหาแล้ว

อคตินี้น่าจะเกิดจากข้อมูลฝึกที่ผู้ให้คะแนนมนุษย์เองก็ผูกความยาวเข้ากับคุณภาพเช่นกัน

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

เจาะลึกอคติจากการชอบตนเอง

ผู้ตัดสินโคลดให้คะแนนคำตอบที่สร้างโดยโคลดสูงกว่าโดยเฉลี่ย ผู้ตัดสิน GPT-4 ให้คะแนนคำตอบที่สร้างโดย GPT-4 สูงกว่า เรื่องนี้ได้รับการยืนยันจากการศึกษาที่เป็นอิสระหลายฉบับ

กลไกที่อยู่เบื้องหลังคือ โมเดลแต่ละแบบมีรูปแบบเฉพาะตัว ทั้งโครงสร้างประโยค รูปแบบการใช้ถ้อยคำเผื่อความไม่แน่นอน และการเลือกคำศัพท์ โมเดลเดียวกันจดจำและชื่นชอบรูปแบบของตนเอง

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

การลดอคติ 1: สลับลำดับ

วิธีลดอคติด้านตำแหน่งที่มีประสิทธิภาพสูงสุดเพียงวิธีเดียวคือ ดำเนินการเปรียบเทียบแบบจับคู่ทุกคู่สองครั้งโดยสลับลำดับ และใช้เฉพาะผลที่ตรงกัน นำวิธีนี้ไปใช้เป็นฟังก์ชันมาตรฐานที่การประเมินทั้งหมดต้องเรียกใช้ผ่านฟังก์ชันนี้

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

การลดอคติ 2: ผู้ตัดสินหลายรายที่หลากหลาย

อคติจากการชอบตนเองลดลงได้ด้วยการใช้โมเดลที่แตกต่างกันหลายแบบเป็นผู้ตัดสิน แล้วรวมคำตัดสินของผู้ตัดสินเหล่านั้นเข้าด้วยกัน เมื่อโคลด GPT-4 และเจมิไนเห็นตรงกันทั้งหมด ผลลัพธ์จะน่าเชื่อถือกว่าคำตัดสินของโมเดลใดโมเดลหนึ่งเพียงตัวเดียวมาก

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

การลดอคติ 3: คำสั่งต่อต้านความยืดเยื้อ

กำชับผู้ตัดสินโดยตรงให้หักคะแนนความยืดเยื้อและให้รางวัลกับความกระชับ วิธีนี้ช่วยต้านอคติด้านความยืดเยื้อ ซึ่งไม่เช่นนั้นจะทำให้คำตอบที่ยาวกว่าดูดีกว่า

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

การปรับเทียบกับผู้ให้คะแนนมนุษย์

มาตรฐานสูงสุดสำหรับการปรับเทียบผู้ตัดสินคือ เปรียบเทียบคะแนนของผู้ตัดสิน LLM กับคะแนนของผู้ให้คะแนนมนุษย์ในชุดข้อมูลปรับเทียบ วัดความสอดคล้องและระบุความแตกต่างอย่างเป็นระบบ

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

การตรวจจับรูปแบบอคติอย่างเป็นระบบ

วิเคราะห์ผลลัพธ์ของผู้ตัดสินตามหมวดหมู่คำตอบที่แตกต่างกันเพื่อค้นหาอคติอย่างเป็นระบบ ผู้ตัดสินให้คะแนนคำตอบจากโมเดลหนึ่งสูงกว่าอย่างสม่ำเสมอหรือไม่ ผู้ตัดสินหักคะแนนคำตอบในหัวข้อบางประเภทหรือไม่

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

รายการตรวจสอบการลดอคติ

รายการตรวจสอบที่ควรใช้ก่อนนำผู้ตัดสิน LLM ไปใช้งานจริง:

  • ดำเนินการเปรียบเทียบแบบจับคู่ทั้งหมดสองครั้งโดยสลับลำดับ
  • ใส่คำสั่งต่อต้านความยืดเยื้อไว้อย่างชัดเจนในเกณฑ์
  • ใช้โมเดลที่แตกต่างกันอย่างน้อย 2 แบบเป็นผู้ตัดสินสำหรับการประเมินที่มีผลกระทบสูง
  • กำหนดเกณฑ์อ้างอิงระดับคะแนนอย่างชัดเจนเพื่อป้องกันการให้คะแนนสูงเกินจริง
  • ปรับเทียบกับผู้ให้คะแนนมนุษย์โดยใช้ตัวอย่างที่เป็นตัวแทน
  • บันทึกและติดตามอัตราการชนะตามป้ายกำกับโมเดลเพื่อตรวจจับการเบี่ยงเบน
  • เพิ่มเอาต์พุตข้อมูลเจสันที่มีโครงสร้างเพื่อป้องกันการซ่อนคะแนนไว้ในข้อความอิสระ

บันทึกการตรวจสอบและความสามารถในการอธิบาย

ผู้ประเมินที่ผ่านการปรับเทียบต้อง อธิบายเหตุผลได้ ด้วย หากผู้ประเมินให้คะแนนคำตอบเป็น 4/5 คุณควรตรวจสอบย้อนกลับได้ว่าเพราะเหตุใด — เกณฑ์ใดผ่าน และเกณฑ์ใดทำได้ไม่ถึงระดับ

การกำหนดให้ผู้ประเมินส่งคืนข้อมูลในรูปแบบเจสันพร้อมคะแนนแยกตามเกณฑ์และเหตุผลสั้น ๆ จะสร้างบันทึกการตรวจสอบที่เป็นธรรมชาติ ผู้มีส่วนได้ส่วนเสียสามารถตรวจสอบได้ว่าคำตอบแต่ละรายการได้คะแนนเช่นนั้นเพราะเหตุใด และคุณยังสังเกตรูปแบบที่เกิดซ้ำในคำตอบที่ได้คะแนนต่ำได้ด้วย

ตรวจสอบความรู้: การลดอคติชอบตนเอง

กลยุทธ์การลดผลกระทบใดที่จัดการกับอคติชอบตนเองในผู้ประเมินที่ใช้ LLM ได้ตรงที่สุด (MOST)?

สรุป: การปรับเทียบและอคติในผู้ประเมินที่ใช้ LLM

ผู้ประเมินที่ใช้ LLM มีอคติเชิงระบบหลัก 4 ประการ ได้แก่ อคติตำแหน่ง (ชอบตัวเลือกแรก) อคติจากความยาว (ชอบคำตอบที่ยาวกว่า) อคติชอบตนเอง (ชอบรูปแบบของตนเอง) และการให้คะแนนสูงเกินจริง (คะแนนกระจุกอยู่ที่ 4–5/5) ให้ลดผลกระทบของแต่ละอคติอย่างตรงจุด ได้แก่ สลับลำดับตัวเลือกเพื่อแก้อคติตำแหน่ง เพิ่มคำสั่งต่อต้านการใช้ถ้อยคำยืดเยื้อเพื่อแก้อคติจากความยาว ใช้ผู้ประเมินจากโมเดลที่หลากหลายเพื่อแก้อคติชอบตนเอง และใช้เกณฑ์การให้คะแนนที่มีจุดอ้างอิงเพื่อแก้การให้คะแนนสูงเกินจริง ปรับเทียบผู้ประเมินของคุณกับผู้ให้คะแนนที่เป็นมนุษย์โดยใช้ชุดข้อมูลที่มีป้ายกำกับ และวัดสหสัมพันธ์ของเพียร์สัน ติดตามอัตราการชนะตามป้ายกำกับเมื่อเวลาผ่านไป เพื่อค้นหารูปแบบอคติที่เกิดขึ้นใหม่ก่อนที่จะบิดเบือนกระบวนการประเมินของคุณ

คำถามที่พบบ่อย

บทเรียน “การปรับเทียบและอคติในผู้ตัดสินที่เป็น LLM” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การปรับเทียบและอคติในผู้ตัดสินที่เป็น LLM” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Prompt Engineering ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การปรับเทียบและอคติในผู้ตัดสินที่เป็น LLM”

อคติจากตำแหน่ง อคติจากความยืดยาว และวิธีลดอคติเหล่านี้ในพรอมต์ผู้ตัดสิน คุณปฏิบัติ AI Prompt Engineering ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Prompt Engineering หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Prompt Engineering บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การปรับเทียบและอคติในผู้ตัดสินที่เป็น LLM” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Prompt Engineering นี้ได้ไหม

ได้ บทเรียน AI Prompt Engineering ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ใช้ LLM ประเมินข้อมูลส่งออกของ LLM
  2. พรอมต์ให้คะแนนตามเกณฑ์ประเมิน
  3. การตัดสินเชิงเปรียบเทียบ: A กับ B
  4. การปรับเทียบและอคติในผู้ตัดสินที่เป็น LLM
← กลับไปที่ AI Prompt Engineering