मैं अपनी वेबसाइट पर एक डिजिटल ट्विन चलाता हूँ। यह मेरे जीवन और कौशल के बारे में सवालों के जवाब देता है। मैंने इसे एक सख्त नियम दिया था: कभी भी मनगढ़ंत बातें न करें। यदि कोई ऐसे कौशल के बारे में पूछता है जो मेरे पास नहीं है, तो इसे स्वीकार करना चाहिए कि यह नहीं जानता। महीनों तक, मुझे लगा कि सिस्टम काम कर रहा था। मैंने यहाँ-वहाँ इसे हाथ से टेस्ट किया, और जवाब सही लग रहे थे। फिर मैंने एक उचित इवैल्यूएशन हार्नेस (evaluation harness) बनाया। आंकड़े चौंकाने वाले थे। 35 में से नौ सवालों में सीधे तौर पर झूठ बोला गया था। आठ ऐसे सवालों में जो अनसुलझे रहने के लिए बनाए गए थे, मॉडल ने केवल चार को ही मना किया। मेरा एंटी-हैलुसिनेशन प्रॉम्प्ट (anti-hallucination prompt) लगभग एक चौथाई समय विफल रहा। मैं एक ऐसा प्रोडक्ट डिलीवर कर रहा था जो अपने यूजर्स से झूठ बोल रहा था।
एक बेहद सरल रिट्रीवल सेटअप
मैंने Pinecone या किसी भारी-भरकम वेक्टर डेटाबेस का उपयोग नहीं किया। पूरा सेटअप एक साधारण JSON फ़ाइल पर आधारित है। मेरा कोड मेरी प्रोफाइल को अलग-अलग सेक्शन में विभाजित करता है। जब कोई सवाल आता है, तो सिस्टम क्वेरी और टेक्स्ट के प्रत्येक हिस्से के बीच कोसाइन सिमिलरिटी (cosine similarity) की गणना करता है, सबसे करीबी मैचों का चयन करता है, और उन्हें संदर्भ (context) के रूप में प्रॉम्प्ट में डाल देता है। मॉडल फिर पूरी तरह से उसी जानकारी के आधार पर उत्तर जेनरेट करता है जो उसे उस विंडो में दिखाई देती है।
तथ्यों के एक सीमित सेट वाली छोटी व्यक्तिगत साइट के लिए, यह दृष्टिकोण तेज़ है और इसकी लागत लगभग शून्य है। किसी रिमोट वेक्टर स्टोर के लिए कोई नेटवर्क राउंड-ट्रिप नहीं है, कोई इंडेक्सिंग ओवरहेड नहीं है, और कोई जटिल ऑर्केस्ट्रेशन नहीं है। आप फ़ाइल पढ़ते हैं, चंक्स (chunks) को स्कोर करते हैं, प्रॉम्प्ट बनाते हैं, और काम हो जाता है। लेकिन बैकएंड की सादगी आउटपुट में ईमानदारी की गारंटी नहीं देती है। एक हल्का-फुल्का पाइपलाइन भी गंभीर समस्याएं पैदा कर सकता है जब मॉडल अपनी मर्जी से कुछ नया बनाने (improvise) का फैसला करता है। "यहाँ संदर्भ है" और "यहाँ वह है जो मैं इसके बारे में कहूँगा" के बीच का अंतर ही वह जगह है जहाँ हैलुसिनेशन (hallucinations) पनपते हैं। आप मॉडल को अपने कार्य इतिहास के बारे में एक पैराग्राफ दे सकते हैं और फिर भी किसी ऐसी प्रोग्रामिंग भाषा के बारे में आत्मविश्वास के साथ गलत जानकारी प्राप्त कर सकते हैं जिसे आपने कभी छुआ भी नहीं है।
वे आंकड़े जिन्होंने मेरा भरोसा तोड़ दिया
महीनों तक, मैंने मैन्युअल स्पॉट-चेकिंग को पर्याप्त माना। मैं चैट खोलता, एक ऐसा सवाल पूछता जिसका जवाब मुझे पहले से पता होता, और जब जवाब सही लगता तो सिर हिला देता। यही मेरी टेस्टिंग रणनीति थी। यह पूरी लग रही थी क्योंकि मैं खुद इंटरफ़ेस का उपयोग कर रहा था। लेकिन ऐसा नहीं था।
जब मैंने अंततः एक इवैल्यूएशन हार्नेस लिखा जो व्यवस्थित रूप से चल सके, तो तस्वीर बदल गई। टेस्ट सूट ने ट्विन पर 35 सवाल दागे। नौ जवाबों में झूठ था। मैंने आठ ऐसे सवाल भी शामिल किए जिनका मेरी प्रोफाइल में कहीं भी कोई उत्तर नहीं था। मॉडल को उन सभी को अस्वीकार कर देना चाहिए था। उसने केवल चार को ही मना किया। मेरा सावधानीपूर्वक तैयार किया गया एंटी-हैलुसिनेशन प्रॉम्प्ट, जिसमें कभी भी मनगढ़ंत बातें न करने के बारे में सख्त निर्देश शामिल थे, लगभग 25 प्रतिशत समय विफल रहा। चार में से एक। यह कोई मामूली गलती नहीं है। यह एक टूटा हुआ प्रोडक्ट है।
अनुकूल (Friendly) सवालों के साथ टेस्टिंग करना बंद करें
आप केवल अपने स्वयं के प्रोडक्ट का उपयोग करके बग्स नहीं ढूंढ सकते। आप उन्हें उसे तोड़ने की कोशिश करके ढूंढते हैं। मेरे मैन्युअल टेस्ट बहुत 'फ्रेंडली' थे। मैंने केवल वे सवाल पूछे जहाँ मुझे सटीक उत्तर पता था, जिसका अर्थ था कि मैं अवचेतन रूप से मॉडल को सुरक्षित क्षेत्र की ओर ले जा रहा था। मैंने कभी सीमाओं (edges) को नहीं परखा। मैंने कभी उन कौशलों के बारे में नहीं पूछा जो मैं चाहता था, या उन अनुभवों के बारे में जो कभी हुए ही नहीं।
वास्तविक टेस्टिंग के लिए प्रतिकूल इरादे (adversarial intent) की आवश्यकता होती है। आपको ऐसे सवाल तैयार करने होंगे जिन्हें AI को विफल करने के लिए डिज़ाइन किया गया हो। आप चाहते हैं कि वह लैब में गलती करे ताकि वह किसी विजिटर के सामने गलती न करे। एक टेस्ट सूट जो केवल उसी बात की पुष्टि करता है जिस पर आप पहले से विश्वास करते हैं, वह केवल एक दिखावटी डेमो है। यदि आप सक्रिय रूप से एज केस (edge cases) और ट्रैप प्रश्न (trap questions) नहीं बना रहे हैं, तो आप टेस्टिंग नहीं कर रहे हैं। आप केवल उम्मीद कर रहे हैं।
वे दो गलतियाँ जो मायने रखती थीं
प्रॉम्प्टिंग कोई गारंटी नहीं है। AI को हैलुसिनेट न करने के लिए कहने वाला एक लंबा, विस्तृत निर्देश केवल एक कमांड के रूप में सजाया गया एक सुझाव है। मॉडल अधिकांश समय इसका पालन कर सकता है, लेकिन जैसे ही सांख्यिकीय दबाव (statistical pressure) उसे कहीं और ले जाता है, वह निर्देश को अनदेखा कर देगा। टेम्परेचर (Temperature), टोकन प्रोबेबिलिटी (token probability), और ट्रेनिंग डेटा का स्वरूप, आपके सिस्टम प्रॉम्प्ट में एक वाक्य की तुलना में अधिक भारी होते हैं। आपको आज्ञाकारिता को डेटा के साथ मापना चाहिए, उम्मीद के साथ नहीं। एक मजबूत निर्देश सत्यापित तथ्य नहीं है। यह एक अनुरोध है, और अनुरोधों को अस्वीकार किया जा सकता है। यदि आपकी पूरी सुरक्षा रणनीति अपने प्रॉम्प्ट को मजबूती से लिखने पर टिकी है, तो आपने टिश्यू पेपर से रेलिंग बनाई है। आपको एक ऐसा इवैल्यूएशन हार्नेस चाहिए जो यह गिने कि मॉडल कितनी बार आज्ञा का पालन करता है, किन परिस्थितियों में, और जब वह विफल होता है तो क्यों विफल होता है। आंकड़े आपकी आवाज़ के लहजे की परवाह नहीं करते।
The evaluation loop was flawed. Here is a subtle trap that almost got me. My original testing tool ran the retrieval process twice. The first run fetched context to check against the ground truth. The second run fetched context for the actual answer generation. In practice, this meant the chunks the judge saw could differ from the chunks the model saw. The judge was grading the answer against data the AI might never have received. An evaluation that grades the wrong input is worse than no evaluation. It gives you a false sense of security. You look at the score, see a high pass rate, and relax. Meanwhile your users are
