मूल्यांकन

आप एक प्रॉम्प्ट बदलते हैं, इसे एक बार आजमाते हैं, उत्तर बेहतर लगता है, और आप शिप करते हैं, फिर एक हफ्ते बाद उपयोगकर्ता उन मामलों को हिट करते हैं जिन्हें यह चुप करके बदतर बना देता है। एक मूल्यांकन (मूल्यांकन के लिए संक्षिप्त) समाधान है: यह परीक्षण करने का एक दोहराया जा सकने वाला तरीका है कि आपकी AI सुविधा काम करती है या नहीं, यह इनपुट का एक सेट है जो यह दिखाता है कि एक अच्छा आउटपुट कैसा दिखता है, और हर बार एक ही तरीके से स्कोर किया जाता है ताकि आप बता सकें कि क्या कोई परिवर्तन वास्तव में मदद करता है। एक मॉडल एक संभाव्य ब्लैक बॉक्स है जो एक ही सवाल का हर रन में अलग तरीके से जवाब देता है, इसलिए मापना ही एकमात्र तरीका है जानने का, और यह अनुशासन एक डेमो को एक उत्पाद से अलग करता है।
आंखों से देखना क्यों विफल होता है
अपने AI के उत्तरों को हाथ से जांचना पहली बार ठीक लगता है। आप एक प्रॉम्प्ट चलाते हैं, जवाब पढ़ते हैं, और यह अच्छा लगता है, तो आप आगे बढ़ते हैं। समस्या यह है कि तीन चीजें चुप करके आपके खिलाफ काम करती हैं, और आपने सभी से पहले ही मिल चुके हैं।
ये तीन हैं:
- आउटपुट भिन्न होता है। एक ही प्रॉम्प्ट हर रन में विभिन्न उत्तर दे सकता है, इसलिए एक अच्छा परिणाम यह वादा नहीं करता कि अगला भी अच्छा होगा।
- परिवर्तन प्रतिगमन का कारण बनते हैं। एक प्रॉम्प्ट संपादन जो एक मामले को ठीक करता है, अक्सर दूसरे को तोड़ देता है जिस पर आप नहीं देख रहे थे।
- यह स्केल नहीं करता है। आप पांच उत्तर पढ़ सकते हैं। आप हर बार जब आप एक लाइन बदलते हैं तो पांच सौ नहीं पढ़ सकते।
इसका मतलब यह नहीं है कि आपने कुछ गलत किया है। इसका मतलब है कि आंखों से देखना इस आकार के काम के लिए गलत उपकरण है, और इसे करने का एक शांत तरीका है।
एक मूल्यांकन सेट बनाएं
एक मूल्यांकन सेट परीक्षण मामलों की एक सूची है। प्रत्येक मामले में एक इनपुट है और इसके लिए एक अच्छा आउटपुट कैसा दिखता है। छोटे से शुरू करें। दस से बीस मामले जो आपकी सामान्य परिस्थितियों को कवर करते हैं और कुछ मुश्किल किनारे के मामले किसी से कहीं अधिक उपयोगी हैं, और आप जंगली में नई विफलताओं को खोजने के समय सेट को बढ़ा सकते हैं।
eval_set = [
{"input": "खाना ठंडा और देरी से आया।", "expected": "NEGATIVE"},
{"input": "मेरी जिंदगी का सबसे अच्छा भोजन!", "expected": "POSITIVE"},
{"input": "यह ठीक था, कुछ विशेष नहीं।", "expected": "NEUTRAL"},
# ...जैसे-जैसे आप उन्हें खोजते हैं, वास्तविक मामले और किनारे के मामले जोड़ें
]जब कोई उपयोगकर्ता एक बुरा उत्तर की रिपोर्ट करता है, तो इसे सेट में जोड़ें जो आउटपुट देना चाहिए था। आपका मूल्यांकन सेट फिर हर गलती की एक बढ़ती हुई स्मृति बन जाता है जिसे आप फिर कभी नहीं करना चाहते, उसी तरह से एक बग जिसे आप ठीक करते हैं एक परीक्षण बन जाता है जिसे आप रखते हैं।
कैसे ग्रेड करें
विभिन्न कार्यों को विभिन्न ग्रेडिंग की आवश्यकता है, इसलिए पहला कदम जांच को आपके द्वारा अपेक्षित उत्तर के प्रकार से मेल खाना है।
- सटीक मैच काम करता है जब एक सही उत्तर हो: एक वर्गीकरण लेबल, एक निकाली गई फील्ड, एक हां या नहीं। आप आउटपुट को अपेक्षित मान के साथ सीधे तुलना करते हैं।
- मानदंड-आधारित ग्रेडिंग काम करता है जब एक एकल सही उत्तर न हो, जैसे एक सारांश या एक जवाब। आप जांचते हैं कि क्या आउटपुट शर्तें पूरी करता है: क्या सारांश मुख्य तथ्य का उल्लेख करता है? क्या यह 50 शब्दों से कम है? क्या टोन विनम्र है?
- LLM-as-judge आपके मानदंड के खिलाफ आउटपुट को स्कोर करने के लिए एक दूसरी मॉडल कॉल का उपयोग करता है। यह एक सरल जांच नहीं को पकड़ सकते हैं फजी गुणवत्ता सवालों के लिए स्केल करता है, लेकिन न्यायाधीश स्वयं एक मॉडल है, इसलिए यह गलत हो सकता है, और आप कभी-कभी इसे मानवीय निर्णय के खिलाफ सेनिटी-चेक करते हैं।
# मूल्यांकन सेट पर सटीक-मैच ग्रेडिंग
def run_evals(eval_set, classify):
passed = 0
for test in eval_set:
output = classify(test["input"])
if output == test["expected"]:
passed += 1
else:
print(f'FAIL: "{test["input"]}" -> got {output}, wanted {test["expected"]}')
print(f"{passed}/{len(eval_set)} passed")सटीक मैच शुरू करने के लिए सबसे दोस्ताना जगह है, और यह पिछले अध्यायों से वर्गीकरण और निष्कर्षण कार्य को पूरी तरह से फिट करता है। LLM-as-judge विचार काम करता है क्योंकि यह स्पॉट करना कि क्या एक उत्तर एक मानदंड को पूरा करता है, अक्सर उत्तर का उत्पादन करने से आसान भविष्य कहनेवाला है, उसी तरह से एक निबंध की समीक्षा करना इसे लिखने से आसान है। लेकिन न्यायाधीश एक ही खामियों के साथ दूसरा भविष्य कहनेवाला है, इसलिए इसके स्कोर को एक उपयोगी अनुमान के रूप में मानें, इसे एक स्पष्ट रूब्रिक दें, और हर बार इसके ग्रेड के खिलाफ अपने आप को एक नमूने पर जांचें।
हर परिवर्तन पर चलाएं
एक मूल्यांकन सेट केवल उपयोगी है यदि आप वास्तव में इसे चलाते हैं। अपने प्रॉम्प्ट को कोड की तरह मानें: इससे पहले कि आप एक प्रॉम्प्ट, एक मॉडल, या आपकी पुनर्प्राप्ति में परिवर्तन को शिप करें, मूल्यांकन चलाएं और स्कोर की तुलना पहले से करें। यदि संख्या नीचे चली गई, तो आपने एक प्रतिगमन का कारण बना दिया, भले ही आपकी एक हाथ-परीक्षा ठीक दिखने के लिए हुई हो।
यह वह है जो प्रॉम्प्ट इंजीनियरिंग को अनुमान से कुछ में बदल देता है जिस पर आप आत्मविश्वास के साथ पुनरावृत्ति कर सकते हैं। कुछ बदलें, इसे मापें, जो उच्च स्कोर करता है उसे रखें, और जो कम स्कोर करता है उसे त्यागें। यह वही लूप है जो सामान्य सॉफ्टवेयर को विश्वसनीय बनाता है, अब AI सुविधा के फजी हिस्सों पर लागू किया गया है।
यदि स्कोर गिरता है, तो आपने एक प्रतिगमन का कारण बना दिया। एक भाग्यशाली हाथ-परीक्षा सेट को ओवररूल नहीं करता है, इसलिए हर बार संख्या को टाईब्रेकर होने दें।
व्यावहारिक रूप में
पिछले अनुभाग से run_evals फंक्शन एक पूर्ण, यदि छोटा, eval harness है। आप इसे अपने क्लासिफायर और अपने eval सेट पर इंगित करते हैं, और यह आपको बताता है कि कितने मामले पास करते हैं और आपको बिल्कुल दिखाता है कि कौन विफल होते हैं:
run_evals(eval_set, classify_review)
# FAIL: "यह ठीक था, कुछ विशेष नहीं।" -> got POSITIVE, wanted NEUTRAL
# 2/3 passedयह एक विफल लाइन दर्जन सफल हाथ-परीक्षण से अधिक लायक है, क्योंकि यह एक वास्तविक कमजोरी पर इंगित करती है जिसे आप अब ठीक कर सकते हैं और फिर से माप सकते हैं। अंतिम अध्याय, सुरक्षा और सीमाएं, उन जोखिमों को कवर करता है जिन्हें आप इसे असली उपयोगकर्ताओं के सामने रखने से पहले डिजाइन करते हैं।
run_evals जैसा एक छोटा harness पहले से ही अपनी रखरखाव को अर्जित करता है: यह आपको एक स्कोर और सटीक मामलों को देता है जो टूटे। एक को ठीक करें, इसे फिर से चलाएं, संख्या को चलते हुए देखें। अगला, सुरक्षा और सीमाएं असली उपयोगकर्ता आने से पहले क्या बचाव करना है इसे कवर करती हैं। 
