मैंने अपने Discord AI को hallucinate करने से कैसे रोका
मैं Inner Circle नाम की एक Discord community चलाता हूं. ये एक creator cohort है, दर्जनों active members, और एक ही admin. मैं.
हर दिन वही सवाल chat में आते हैं. मेरा rank क्या है? मेरे पास कितने points हैं? उस बंदे के पास मुझसे ज़्यादा क्यों हैं? मैं क्या miss कर रहा हूं? Leaderboard कब reset होता है? Bonus कैसे काम करता है? इनमें से कोई भी सवाल मुश्किल नहीं है. सबके जवाब उस data से मिल जाते हैं जो हम पहले से track कर रहे हैं. लेकिन इन्हें हाथ से, एक-एक करके, पूरे दिन जवाब देना एक इंसान से आगे scale नहीं करता. और यहां बिल्कुल एक ही इंसान था.
तो मैंने एक AI assistant बनाया जो ये सवाल मेरे लिए जवाब देता है. ये Discord में एक slash command की तरह रहता है, /ask, और साथ में एक reply trigger भी है ताकि members किसी भी message को quote करके उसके बारे में पूछ सकें. कोई member type करता है /ask what's my rank and what am I still missing, और ये चंद सेकंड में, channel के अंदर ही, असली cohort data से जवाब देता है.
ये हिस्सा आसान है. असली दिलचस्प हिस्सा वो सब कुछ है जो मैंने इसे झूठ बोलने से रोकने के लिए किया.
एक factual assistant, chatbot क्यों नहीं
पहला फैसला scope का था. मुझे कोई "coach" नहीं चाहिए था जो आपको बताए कि अपनी posts कैसे बेहतर करें. मुझे एक boring, factual clerk चाहिए था जो numbers पक्के तौर पर जानता हो: आपकी standing, आपके tasks, आपके submissions, leaderboard, आप किसी दूसरे member के मुकाबले कहां हो, और अगर आप सब कुछ पूरा कर लें तो क्या आप अब भी #1 तक पहुंच सकते हो.
Boring होना ही असली बात है. एक community assistant जो कभी-कभी कोई rule या number खुद गढ़ ले, वो बिना assistant के भी बुरा है, क्योंकि अब लोग अपने payout को लेकर bot से बहस कर रहे हैं. एक ऐसे cohort में जहां points असली rewards से जुड़े हैं, एक hallucinated number कोई प्यारी सी गलती नहीं है. ये एक support ticket और एक trust की समस्या है.
तो मकसद साफ और सीमित था: बार-बार आने वाले "what's my status" के बोझ को मुझसे हटाकर किसी ऐसी चीज़ पर डालना जो हर बार, बिना चूके सही हो.
Guardrail का मतलब "please behave" नहीं है
यहां वो चीज़ है जो ज़्यादातर लोग गलत करते हैं जब वे अपने product पर LLM लगाते हैं. वे एक लंबा system prompt लिखते हैं जो कहता है "सिर्फ X के बारे में जवाब दो, कभी Y मत बताओ, कुछ भी मत गढ़ो," और उसे guardrail कह देते हैं. ये guardrail नहीं है. ये एक सुझाव है. कोई ठान लेने वाला user, या बस एक बदकिस्मत phrasing, इसके आर-पार सीधे निकल जाती है.
असली guardrail एक capability boundary है. आप model से behave करने को नहीं कहते. आप misbehave करना नामुमकिन बना देते हो.
Assistant को कभी database connection मिलता ही नहीं. ये कोई query नहीं लिख सकता. ये बस एक तय list से functions call कर सकता है जो मैंने लिखी है: get_my_standing, get_my_tasks, get_leaderboard, compare_to, और लगभग एक दर्जन और. हर एक read-only है, और हर एक सिर्फ वही fields लौटाता है जो community में पहले से public हैं. "मैं कौन हूं" वाला हिस्सा कभी model के हाथ में नहीं होता. जब कोई अपनी standing के बारे में पूछता है, तो server caller की पहचान tool call में inject कर देता है. Model कभी "me" को resolve नहीं करता, इसलिए इसे किसी और का private data खींचने के लिए बहलाया नहीं जा सकता. पहुंच के भीतर कोई private data है ही नहीं.
एक बार boundary इस तरह बन जाए, तो system prompt अब user और आपके database के बीच खड़ी दीवार नहीं रहता. ये बस इसलिए है ताकि जवाब पढ़ने में अच्छे लगें.
LLMs math में कमज़ोर हैं, तो मैंने उनसे math कराना बंद कर दिया
दूसरा सबक मुझे कुछ शर्मिंदा करने वाले production bugs झेलने के बाद समझ आया.
शुरुआत में किसी ने assistant से कहा कि उसकी तुलना किसी दूसरे member से करे. इसने एक tool call किया, दो profiles वापस मिलीं, और फिर पूरे यकीन से समझाया कि दूसरा बंदा आगे इसलिए है क्योंकि उसके पास "biweekly tasks हैं जिनके ज़्यादा points मिलते हैं." कोई biweekly tasks हैं ही नहीं. इसने एक ऐसे वाक्य की खाली जगह भरने के लिए इन्हें गढ़ दिया जिसे किसी वजह की ज़रूरत महसूस हुई.
एक और बार इसने जवाब दिया "आपने 0 tasks miss किए हैं" जबकि member ने असल में ज़्यादातर miss कर दिए थे, क्योंकि वो tasks archived थे और model को सिर्फ दिखने वाला हिस्सा ही नज़र आया.
दोनों मामलों में fix एक ही था, और यही वो rule है जो अब मैं हर जगह लगाता हूं: model compute नहीं करता, वो narrate करता है. कोई भी असली arithmetic, दो लोगों की तुलना, points का ceiling जोड़ना, miss किए गए tasks गिनना, ये सब server code में होता है जिसे मैं test कर सकता हूं. Tool एक पूरा, सही breakdown वापस देता है, और model का काम बस इतना है कि उसे साफ भाषा में कह दे. अगर server एक साफ breakdown नहीं बना पाता, तो tool एक flag लौटाता है जो model को कहता है कि "मैं आपको totals दिखा सकता हूं लेकिन gap का breakdown नहीं दे सकता" कहे, बजाय इसके कि कोई वजह गढ़ ले.
Temperature zero पर set है. Prompt साफ शब्दों में कहता है, कभी कोई number मत गढ़ो, सिर्फ उसी से जवाब दो जो tools ने लौटाया. इन दो चीज़ों और narrate-don't-compute rule के बीच, वो "creative filling" ज़्यादातर गायब हो जाती है.
छोटी-छोटी चीज़ें जो इसे usable बनाती हैं
कुछ details ने experience के लिए model की choice से कहीं ज़्यादा किया.
ज़्यादातर सवालों का जवाब zero tool calls में मिल जाता है, क्योंकि model के चलने से पहले ही मैं caller का rank, points और leaderboard का top context में pre-load कर देता हूं. आम सवाल फौरन और सस्ते में resolve हो जाते हैं.
Program rules कुछ छोटे, curated notes के set में रहते हैं, और model जरूरत पड़ने पर ठीक एक relevant chunk खींच सकता है. मैंने ये मुश्किल तरीके से सीखा कि पूरी rulebook हर prompt में paste करने से ये ज़्यादा hallucinate करता है, कम नहीं. कम context, बेहतर grounded.
हमारी community में दो currencies हैं जिनके नाम इतने मिलते-जुलते हैं कि उलझन हो जाती है, और model इन्हें बार-बार mix कर देता था. तो prompt में एक सख्त glossary है जो हर एक को define करता है और दोनों को एक जैसा मानने से मना करता है. उस एक paragraph ने गलत जवाबों की एक पूरी category ही खत्म कर दी.
और चूंकि जो model मैं इस्तेमाल करता हूं वो formatting instructions को ढीले-ढाले तरीके से follow करता है, इसलिए generation के बाद एक deterministic cleanup step है जो हर वो चीज़ हटा देता है जिसे Discord ठीक से render नहीं करता. Model जितना चाहे formatting पर misbehave कर ले. User को वो कभी दिखता ही नहीं.
इसने असल में क्या बदला
Assistant वही सवाल जवाब देता है जो मैं पहले खुद जवाब देता था. बस इतना ही, और यही सब कुछ है. एक member मुझे ping किए बिना अपनी standing check कर लेता है. कोई "कौन आगे है" वाली बहस मुझसे पूछने के बजाय bot से पूछकर निपटा लेता है. नए members को एक ऐसे timezone में सुबह 3 बजे program के जवाब मिल जाते हैं जब मैं सो रहा होता हूं.
इसने एक इंसान को वो community चलाने दी जिसके लिए वरना एक छोटी सी support team चाहिए होती, और किसी को ये महसूस भी नहीं होता कि वो किसी दीवार से बात कर रहा है. Bot बार-बार आने वाले सवाल संभाल लेता है ताकि इंसानी energy वहां जाए जो असल में एक community को ज़िंदा रखती है. हर जवाब असली data पर grounded है, इसलिए कोई किसी गढ़े हुए number से बहस नहीं कर रहा.
ये उस community के लिए बनाया गया अकेला AI tool भी नहीं है. दूसरा वाला किसी member के draft को post करने से पहले मेरी voice में review करता है, ताकि कमज़ोर posts मेरे review queue तक पहुंचने से पहले ही fix हो जाएं.
अगर आप किसी चीज़ पर LLM लगा रहे हो
तीन बातें जो मैं इसे बनाने वाले किसी को भी कहूंगा:
Guardrail को एक capability boundary बनाओ, instructions का paragraph नहीं. अगर model उस चीज़ तक शारीरिक रूप से पहुंच ही नहीं सकता, तो आपको उस पर भरोसा करने की ज़रूरत नहीं कि वो ऐसा नहीं करेगा.
जो arithmetic आपके लिए मायने रखती है, उसे model से कभी मत कराओ. उसे code में compute करो, model को जवाब थमाओ, उसे बस narrate करने दो. उसे "मुझे नहीं पता" कहने का एक ईमानदार तरीका दो, बजाय अनुमान लगाने की वजह के.
इसे कम feed करो, ज़्यादा नहीं. अपना सारा context prompt में डाल देने की जो सहज इच्छा होती है, वो बिल्कुल उल्टी है.
ये वैसी ही चीज़ है जो मैं तब बनाता हूं जब किसी community या product को उससे आगे scale करना हो जितना एक इंसान हाथ से जवाब दे सकता है. यही वजह है कि मैं अपने tools खुद बनाना पसंद करता हूं बजाय उन्हें किराए पर लेने के. अगर ये आपकी भी एक समस्या है, तो एक call book करो और मुझे इसके बारे में बताओ.
अक्सर पूछे जाने वाले सवाल
What is an AI community manager?
एक AI community manager एक bot है जो वो बार-बार आने वाले सवाल संभालता है जिन्हें एक इंसान वरना पूरे दिन जवाब देता रहता: rank, points, tasks, leaderboard standing. मेरा वाला एक Discord slash command की तरह चलता है और सेकंडों में असली cohort data से जवाब देता है, ताकि एक इंसान वो community चला सके जिसके लिए वरना एक छोटी सी support team चाहिए होती.
How do you stop an AI assistant from hallucinating?
Guardrail को एक capability boundary बनाओ, एक विनम्र instruction नहीं. Model कभी database को छूता ही नहीं; ये सिर्फ वो read-only functions call कर सकता है जो मैंने लिखे हैं. ये arithmetic भी कभी नहीं करता. Server compute करता है, model narrate करता है. Temperature zero है, और इसे कहा जाता है कि सिर्फ उसी से जवाब दे जो tools ने लौटाया.
Should an LLM do the math in your app?
नहीं. LLMs arithmetic में कमज़ोर हैं और एक वाक्य की खाली जगह भरने के लिए कोई वजह गढ़ लेंगे. कोई भी असली calculation, दो members की तुलना या points का ceiling जोड़ना, उस server code में होता है जिसे आप test कर सकते हो. Tool एक पूरा, सही breakdown वापस देता है, और model का काम बस इतना है कि उसे साफ भाषा में कह दे.