การปรับเทียบและอคติในผู้ตัดสินที่เป็น 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ใช้ LLM ประเมินข้อมูลส่งออกของ LLM
- พรอมต์ให้คะแนนตามเกณฑ์ประเมิน
- การตัดสินเชิงเปรียบเทียบ: A กับ B
- การปรับเทียบและอคติในผู้ตัดสินที่เป็น LLM