डेवलपर ने LLM चैटबॉट्स को स्क्रिप्ट का विश्वसनीय और सस्ते में पालन कराने के लिए FSM-आधारित फ्रेमवर्क बनाया
एक डेवलपर ने अपने कस्टम ओपन-सोर्स लाइब्रेरी के निर्माण का वर्णन किया है जो LLM-आधारित चैटबॉट्स को एक पूर्वनिर्धारित संवाद स्क्रिप्ट का सख्ती से पालन करने के लिए बाध्य करता है, जिसमें भाषा मॉडल के साथ एक फिनाइट स्टेट मशीन (Finite State Machine) को जोड़ा गया है, बजाय महंगे मल्टी-कॉल एजेंट आर्किटेक्चर पर निर्भर रहने के। इस प्रोजेक्ट, जिसे tg-statemachine-bot कहा जाता है, संवादों को YAML फ़ाइलों में परिभाषित चरणों में विभाजित करता है, और मॉडल को केवल वर्तमान चरण से संबंधित निर्देश देता है ताकि संदर्भ छोटा और व्यवहार पूर्वानुमानित रहे।
एक बिज़नेस चैटबॉट पर काम करते हुए लेखक ने पाया कि बड़े भाषा मॉडल (large language model, LLM) लंबी और विस्तृत स्क्रिप्ट का भरोसेमंद ढंग से पालन करने में संघर्ष करते हैं, क्योंकि उनकी चौड़ी कॉन्टेक्स्ट विंडो के कारण लंबे निर्देशों में उनकी संरचना बिखर जाती है। इसके अलावा, इस समस्या के मौजूदा एजेंट-आधारित समाधान कार्य को कई चरणों में बांटते हैं, जिससे मॉडल कॉल्स की संख्या और साथ ही हर बातचीत की लागत भी कई गुना बढ़ जाती है।
इसे सस्ते तरीके से हल करने के लिए लेखक ने एक ओपन-सोर्स लाइब्रेरी बनाई, जिसमें एक फ़ाइनाइट स्टेट मशीन (finite state machine, FSM) पूरे संवाद ग्राफ को नियंत्रित करती है और यह तय करती है कि किसी भी क्षण LLM को किस चरण के निर्देश भेजे जाएं। इस तरह मॉडल को पूरी स्क्रिप्ट के बजाय केवल मौजूदा चरण से जुड़े निर्देश ही दिखते हैं। इस आर्किटेक्चर में तीन मॉड्यूल हैं: एक FSM मॉड्यूल जो संवाद ग्राफ और यूज़र की स्थिति को ट्रैक करता है, एक vars_memory मॉड्यूल जो संवाद के वेरिएबल्स को उनके बदलावों के इतिहास के साथ संग्रहीत करता है, और एक conversation_core मॉड्यूल जो LLM को की जाने वाली कॉल्स का प्रबंधन करता है।
हर बार जब मॉडल जवाब देता है, तो उसे एक निश्चित चार-फ़ील्ड फॉर्मेट का पालन करना होता है — यूज़र के लिए एक संदेश, एक ट्रांज़िशन सिग्नल, संरचित चरण-परिणाम, और चरण का सार-संक्षेप। यदि मॉडल इस फॉर्मेट का उल्लंघन करता है (जैसे अमान्य JSON यानी जावास्क्रिप्ट ऑब्जेक्ट नोटेशन, न मौजूद ट्रांज़िशन सिग्नल, या परिणामों का गायब होना), तो सिस्टम स्वचालित रूप से एक सुधारात्मक फॉलो-अप रिक्वेस्ट भेजता है। चरणों के बीच संवाद की निरंतरता बनाए रखने के लिए OpenAI के Responses API की previous_response_id चेनिंग सुविधा का उपयोग किया जाता है, जो सस्ती कैश-रीड प्राइसिंग के ज़रिए लागत को भी कम करती है।
पूरी संवाद-स्क्रिप्ट को एक YAML फ़ाइल (यानी "यह ऐन्ट मार्कअप लैंग्वेज नहीं है" फॉर्मेट) में दर्शाया गया है, जबकि हर चरण के विस्तृत निर्देश अलग-अलग फ़ाइलों में रखे गए हैं। इससे यह संभव हो पाता है कि अंतर्निहित इंजन को बिना किसी बदलाव के अलग-अलग चैटबॉट डोमेन में दोबारा इस्तेमाल किया जा सके। YAML को हाथ से एडिट करने की जटिलता को संभालने के लिए लेखक ने एक स्क्रिप्ट बनाई जो YAML को draw.io डायग्राम में बदल देती है, जिससे इंसानों के लिए इसकी समीक्षा करना आसान हो जाता है। इसके साथ ही एक लॉग व्यूअर टूल भी बनाया गया है, जो टेस्ट संवादों को चैट जैसे फॉर्मेट में दिखाता है, जिसमें सिस्टम लॉग्स को विस्तार से देखा जा सकता है, साथ ही लोकल डिबगिंग के दौरान रीयल-टाइम अपडेट भी मिलते हैं।
प्रदर्शन के तौर पर, रिपॉज़िटरी में एक उदाहरण 'एनालिस्ट बॉट' शामिल है, जो सोलो डेवलपर्स को उनके प्रोजेक्ट की आवश्यकताओं को स्पष्ट करने में मदद करता है। लेखक के अनुसार, इसमें प्रति यूज़र मैसेज केवल लगभग 1.03 LLM कॉल्स की ज़रूरत पड़ी, और इसके बावजूद यह स्क्रिप्ट का भरोसेमंद ढंग से पालन करता है और संरचित जानकारी इकट्ठा करता है, हालांकि इस डेमो बॉट की प्रॉम्प्ट इंजीनियरिंग को पूरी तरह से परिष्कृत नहीं किया गया है।
स्रोत: Habr — хаб NLP —
मूल
