हमने अपने डिसीज़न स्टैक को Jev से बदला। यह काम कर गया।
लाइव वॉयस कॉल्स में Aika ने एम्बेडिंग और LLM वाले फ़ैसलों को Jev से कैसे बदला, और बैचिंग, प्रीफ़ेचिंग तथा चेकआउट से हमें क्या सीख मिली।
चेकआउट के दौरान कोई "ओके" कहता है। क्या हम अगले निर्देश पर बढ़ें, या हमें किसी सवाल का जवाब देने की ज़रूरत है? पहले हम यह तय करने का काम एक जनरेटिव मॉडल से कराते थे। वह यह कर तो सकता था, लेकिन एक साधारण हामी के लिए नए सिरे से खुली तार्किक सोच की ज़रूरत नहीं होनी चाहिए।
कॉल के अन्य हिस्सों में, हम चार दूसरे फ़ैसले लेने के लिए एम्बेडिंग सिमिलैरिटी और KNN का इस्तेमाल करते थे। हर क्लासिफ़ायर अपने-आप में वाजिब था। लेकिन साथ मिलकर वे एक ही लोकल मॉडल को साझा करते थे और उसका ध्यान पाने के लिए आपस में होड़ करते थे।
हमने इन रास्तों की जगह TypeSafe के टाइप्ड डिसीज़न मॉडल Jev को लगाया। Jev जवाब नहीं लिखता। यह सीमित दायरे वाले सवालों के जवाब विकल्पों और संभावनाओं (प्रोबेबिलिटीज़) के साथ देता है, और हमारा कोड तय करता है कि उनका क्या करना है। अब यह लाइव कॉल्स पर चलता है। सबसे बड़ी सीख यह नहीं थी कि कोई नया मॉडल हमारे सवालों के जवाब दे सकता था। सीख यह थी कि हमें सवालों को लेकर और उन जवाबों पर कार्रवाई करने का अधिकार किसके पास हो, इसे लेकर कहीं ज़्यादा स्पष्ट होना पड़ा।
पहले हम फ़ैसले कहाँ लेते थे
सहमति, पेमेंट से जुड़े जवाब, राउटिंग और लाइवनेस—ये चार स्वतंत्र एम्बेडिंग + KNN फ़ैसले थे। ये किसी पाइपलाइन के चरण नहीं थे। बस ये एक ही लोकल मॉडल पर निर्भर थे, जिसके साझा लॉक की वजह से एक वॉयस कॉल के दौरान सारा काम एक-एक करके कतार में (सीरियलाइज़) हो सकता था।
चेकआउट का स्वरूप अलग था। हमारा संवादात्मक LLM वहाँ पहले से मौजूद था, इसलिए हमने उसी पर यह समझने का काम छोड़ दिया कि कॉलर ने किसी निर्देश पर हामी भरी है या आगे की प्रगति बताई है। सवालों और समस्याओं के लिए तो यह समझ में आता था, लेकिन सामान्य बदलावों के लिए यह ज़रूरत से कहीं ज़्यादा भारी-भरकम इंतज़ाम था। और उससे भी बड़ी बात, बोली गई बात का मतलब निकालना और यह तय करना कि पेमेंट हुआ है या नहीं—ये दोनों एक ही काम नहीं हैं।
एक अनुरोध, चार सवाल
कॉल ऑर्केस्ट्रेशन लेयर अब Jev से पूछती है कि किसी जवाब का मतलब सहमति के लिए हाँ है या ना, पेमेंट के लिए हाँ है या ना, बातचीत की उस बारी के लिए कौन-सा रूट उपयुक्त है, और क्या कही गई बात एक लाइवनेस प्रोब है। ये सवाल एक-दूसरे से स्वतंत्र हैं, इसलिए चार अलग-अलग चक्कर लगाने के बजाय हम इन्हें एक साथ भेजते हैं।
एक साथ भेजा गया (बैच किया गया) अनुरोध भी बहुत धीमा पड़ता अगर वह स्पीच रिकग्निशन पूरा होने के बाद ही शुरू होता। हम इसे खामोशी शुरू होते ही चालू कर देते हैं, ठीक उस दौरान जब कॉल बोलने की बारी की पहचान पूरी कर रही होती है और ट्रांसक्रिप्ट को अंतिम रूप दे रही होती है। अगर ज़रूरत पड़ने पर जवाब तैयार नहीं होता, तो सामान्य रास्ता कमान संभाल लेता है। हम किसी अनुमानित (स्पेकुलेटिव) फ़ैसले के लिए कॉलर को इंतज़ार नहीं कराते।
शुरुआती प्रोडक्शन ट्रैफ़िक दिखाता है कि जब पहले से मँगाया गया (प्रीफ़ेच किया गया) परिणाम इस्तेमाल के लिए उपलब्ध होता है, तो वह आमतौर पर समय पर तैयार मिल जाता है। यह इस बात का उपयोगी प्रमाण है कि दोनों कामों का यह ओवरलैप काम करता है; यह ऐसा दावा नहीं है कि हर कॉल तेज़ हो गई है। इससे भी अहम बात यह है कि ये चारों फ़ैसले अब लोकल एम्बेडिंग मॉडल के पीछे कतार में खड़े नहीं होते।
LLM की गैर-ज़रूरी बारी के बिना चेकआउट
चेकआउट के लिए एक अलग इंटीग्रेशन की ज़रूरत थी। एक कॉलर किसी निर्देश पर हामी भर सकता है, पेमेंट स्क्रीन दिखने की बात बता सकता है, मदद माँग सकता है, किसी समस्या का ज़िक्र कर सकता है या अपना इरादा बदल सकता है। Jev उस जवाब को वर्गीकृत करता है और जब कोई प्रगति की जानकारी देता है, तो वह पहचानता है कि कॉलर ने किस पड़ाव (माइलस्टोन) का ज़िक्र किया है।
बिलिंग सिस्टम वे पड़ाव उपलब्ध कराता है जो उस समय वास्तव में संभव होते हैं। एक स्पष्ट हामी मिलने पर LLM को दोबारा बोलने के लिए कहे बिना एक तयशुदा (डिटरमिनिस्टिक) रास्ते पर आगे बढ़ा जा सकता है। प्रगति की जानकारी देने वाला जवाब भी तभी ऐसा कर सकता है जब Jev किसी अनुमत पड़ाव की पर्याप्त भरोसे के साथ पहचान करे। सवाल, समस्याएँ और अनिश्चित जवाब अब भी LLM के पास ही जाते हैं। और Jev कभी भी किसी पेमेंट को पूरा घोषित नहीं करता: केवल सत्यापित पेमेंट इवेंट और बिलिंग स्टेट ही ऐसा कर सकते हैं।
हम लाइव चेकआउट की बारियों में इस रास्ते का इस्तेमाल होते देख रहे हैं। यह चेकआउट का एक छोटा हिस्सा है, और ऐसा ही होना भी चाहिए: ज़्यादातर बारियों में अब भी एक वास्तविक जवाब की ज़रूरत होती है या वे फ़ास्ट-पाथ की शर्तों को पूरा नहीं करतीं। शुरुआती कामयाबी यह नहीं है कि Jev बातचीत की जगह ले लेता है। कामयाबी यह है कि एक साधारण हामी को संवादात्मक मॉडल की एक और बारी नहीं बनना पड़ता, जबकि पेमेंट से जुड़ा अधिकार बिलिंग सिस्टम के पास ही रहता है।
कॉलर की दुनिया के बारे में पूछें, हमारी दुनिया के बारे में नहीं
चेकआउट से जुड़े हमारे पहले सवाल में प्रगति का वर्णन हमारे अपने आंतरिक लेबलों में किया गया था। कॉल करने वाले उन लेबलों में बात नहीं करते। कोई कह सकता है "बैंक का पेज आ गया"; हमारे सवाल को उस स्क्रीन को पहचानना था जिसकी वे बात कर रहे थे, न कि उस नाम को जो हमने उसे कोड में दिया था। हाथ से लेबल किए गए एक छोटे रीप्ले में, जब हमने मापदंड बदलकर उसमें वह लिखा जो कॉलर असल में कहते हैं, तो प्रगति से जुड़े अस्पष्ट जवाब ठोस अवलोकनों में बदल गए। हमने इसे कॉन्फ़िडेंस की सीमा (थ्रेशोल्ड) घटाकर ठीक नहीं किया। हमने सवाल को ठीक किया।
यह सीख चेकआउट से आगे भी लागू होती है: फ़ैसले का वर्णन उस व्यक्ति की भाषा में करें जिसे आप सुन रहे हैं, न कि अपने आंतरिक enum नामों में।
कॉन्फ़िडेंस एप्लिकेशन की नीति है
हमने Jev के हर जवाब के लिए एक जैसी सीमा (थ्रेशोल्ड) या एक जैसा फ़ॉलबैक तय नहीं किया। सहमति और पेमेंट असममित (असिमेट्रिक) हैं: "ना" को गलती से "हाँ" समझ लेना दोबारा पूछने से ज़्यादा बुरा है। जब इन दोनों में से कोई भी जवाब अनिश्चित होता है, तो हम आगे बढ़ने के बजाय उसे अस्पष्ट ही रहने देते हैं। राउटिंग वापस सामान्य संवादात्मक हैंडलर के पास लौट सकती है। लाइवनेस अपना मौजूदा फ़ैसला बरकरार रख सकती है।
यह अलगाव सटीकता के किसी एक आँकड़े से कहीं ज़्यादा मायने रखता है। मॉडल अपना आकलन देता है; परिणाम की ज़िम्मेदारी एप्लिकेशन की होती है। चेकआउट में इसका मतलब है कि कॉलर जो देखने की बात कहता है, Jev उस पर गौर तो कर सकता है, लेकिन पैसे के लेन-देन को सत्यापित करने का काम उसे कभी नहीं मिलता।
आगे हम क्या आज़माना चाहते हैं
Jev पहले से ही एक कॉल से जुड़े सीमित दायरे वाले फ़ैसले संभालता है। आगे हम चाहते हैं कि यह संवादात्मक मॉडल को इस बारे में संकेत दे कि कॉलर जो करने की कोशिश कर रहा है, उसके लिए कौन-सी टूल क्षमताएँ उपयुक्त हैं। खास टूल चुनने और कॉलर से बात करने का काम तब भी LLM ही करेगा। Jev का काम विकल्पों का दायरा सीमित करना होगा, बातचीत की कमान अपने हाथ में लेना नहीं।
लक्ष्य यह है कि गलत टूल चुने जाने और मनगढ़ंत जवाबों के मामले कम हों, वह भी कॉलर को ज़्यादा इंतज़ार कराए बिना या जिस टूल की उन्हें वाकई ज़रूरत है उसे रोके बिना। यह एक ऐसी दिशा है जिसका हम मूल्यांकन कर रहे हैं, न कि कोई ऐसा लाभ जिसे हमने लागू कर दिया है या माप लिया है।
सिद्धांत वही रहता है: Jev को एक सीमित सवाल का जवाब देने दें, और कार्रवाई करने का अधिकार उसी सिस्टम के पास रखें जिसके पास उसका स्वामित्व है।
संदर्भ और आगे पढ़ने के लिए
- TypeSafe, System One
- TypeSafe, How to build with TypeSafe
- TypeSafe, Primitives
- TypeSafe, Confidence
- TypeSafe, Speculative fan-out
ऐसे उद्धृत करें
Aika Labs. 'हमने अपने डिसीज़न स्टैक को Jev से बदला। यह काम कर गया।.' aikalabs.ai/hi/blog/we-replaced-our-decision-stack-with-jev, 2026-09-24.