पाठ 8 / 29
LLM-as-Judge: उपयोगी, पक्षपाती, calibration ज़रूरी
खुले-अंत आउटपुट को ग्रेड करने के लिए मॉडल उपयोग करें, और ग्रेडर को जाँचें।
Judge का अपना मूल्यांकन चाहिए
खुले-अंत आउटपुट (सार, व्याख्याएँ, chat उत्तर) के लिए exact matching विफल होती है, इसलिए टीमें मज़बूत मॉडल को rubric ("faithfulness को 1 से 5 में रेट करो; असमर्थित दावे सूचीबद्ध करो") के साथ judge की तरह उपयोग करती हैं। यह अच्छी तरह scale होता है पर इसकी ज्ञात कमज़ोरियाँ हैं: स्थिति पक्षपात (पहले दिखाए उत्तर को पसंद करना), लंबाई पक्षपात (लंबे उत्तर पसंद करना), स्व-पसंद (अपने मॉडल परिवार का पाठ पसंद करना), और असंगति। Judge को ऐसा मापक यंत्र मानें जिसका calibration ज़रूरी है: 50 से 100 मामले मनुष्यों से label करवाएँ, संयोग-सुधारित सांख्यिकी जैसे Cohen's kappa से सहमति मापें (कच्ची सहमति भ्रमित कर सकती है: जो judge हमेशा "good" कहे वह यहाँ 60% सहमत है पर kappa 0), उत्तरों का क्रम बदलें या randomise करें, उदाहरणों सहित स्पष्ट rubrics दें, अस्पष्ट समग्र scores की जगह pairwise या checklist-शैली निर्णय पसंद करें, और judge बदलने पर उसे दोबारा जाँचें। उच्च-जोखिम निर्णयों में मनुष्यों को लूप में रखें।
सहमति बनाम kappa, चलाकर
मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया। Judge 10 में से 8 मामलों पर मनुष्य से सहमत है (kappa 0.58, मध्यम)। हमेशा "good" कहने वाला आलसी judge 10 में से 6 पर सहमत है सिर्फ़ इसलिए कि 60% मानव labels "good" हैं, पर उसका kappa 0.00 है: वह कोई जानकारी नहीं जोड़ता।
def cohen_kappa(a, b):
n = len(a); po = sum(x == y for x, y in zip(a, b)) / n
labels = set(a) | set(b)
pe = sum((a.count(l) / n) * (b.count(l) / n) for l in labels)
return (po - pe) / (1 - pe) if pe < 1 else 1.0
human = ["good", "bad", "good", "good", "bad", "bad", "good", "bad", "good", "good"]
judge = ["good", "bad", "good", "bad", "bad", "bad", "good", "good", "good", "good"]
agree = sum(h == j for h, j in zip(human, judge))
print(f"raw agreement: {agree}/10 | Cohen's kappa: {cohen_kappa(human, judge):.2f}")
always_good = ["good"] * 10
print(f"a judge that always says 'good': agreement {sum(h == 'good' for h in human)}/10, kappa {cohen_kappa(human, always_good):.2f}")
Output:
raw agreement: 8/10 | Cohen's kappa: 0.58 a judge that always says 'good': agreement 6/10, kappa 0.00
स्थिति पक्षपात और क्रम-बदल उपाय (अनुकरण), चलाकर
मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया। यह गढ़ी संख्याओं और seeded random draws वाला अनुकरण है, इसलिए यह प्रभाव का रूप दिखाता है, किसी उत्पाद का माप नहीं। दो उत्तर ठीक बराबर अच्छे हैं, पर अनुकरित judge जो पहले दिखे उसे 70% बार पसंद करता है। पहले दिखने पर A लगभग 85% बार जीतता दिखता है और दूसरे दिखने पर 15%। दोनों क्रमों का औसत पक्षपात हटाकर 0.50 लौटाता है, जो सच्चा मान है।
# A and B are EXACTLY equally good. A judge with position bias picks whichever answer is shown FIRST 70% of the time
# (simulated); otherwise it flips a coin.
import random
rng = random.Random(1)
def biased_judge():
return "first" if rng.random() < 0.7 else rng.choice(["first", "second"])
N = 20000
a_first = sum(biased_judge() == "first" for _ in range(N)) / N # A shown first
a_second = sum(biased_judge() == "second" for _ in range(N)) / N # A shown second
print("A wins when shown first :", round(a_first, 3))
print("A wins when shown second:", round(a_second, 3))
print("average over both orders:", round((a_first + a_second) / 2, 3), "(true value is 0.5)")
Output:
A wins when shown first : 0.852 A wins when shown second: 0.152 average over both orders: 0.502 (true value is 0.5)
Judge को उदाहरणों सहित rubric दें
उदाहरणों सहित स्पष्ट scoring guide निर्णयों को अधिक सुसंगत बनाती है।
त्वरित जाँच: Pairwise judging में स्थिति पक्षपात घटाने का सरल तरीक़ा क्या है?
- छोटा rubric उपयोग करें
- बेहतर उत्तर हमेशा पहले दिखाएँ
- हर जोड़ी को दोनों क्रमों में judge करें और परिणाम मिलाएँ
- Judge को अनदेखा करें
Answer
हर जोड़ी को दोनों क्रमों में judge करें और परिणाम मिलाएँ — क्रम बदलना उस पक्षपात को निरस्त करता है जो स्थिति को पसंद करता है।