tei-mcp v0.3: स्रोत को दोबारा लिखे बिना TEI एनकोडिंग

जब मैंने पहली बार tei-mcp के बारे में लिखा, तो मक़सद था एआई असिस्टेंटों को TEI मार्कअप गढ़ने से रोकना। स्कीमा-आधार ने समस्या का एक हिस्सा सुलझा दिया: P5 विनिर्देश तक सीधी, उपकरण-आधारित पहुँच मिल जाने पर मॉडल को अब यह अनुमान नहीं लगाना पड़ता कि किसी एलिमेंट का मतलब क्या है या वह कौन-से एट्रिब्यूट स्वीकार करता है। आउटपुट वैध निकलता है।
लेकिन TEI एनकोडिंग में मतिभ्रम के दो चेहरे हैं, और स्कीमा उनमें से सिर्फ़ एक को पकड़ती है। विनिर्देश पर परखने से इतना पता चलता है कि मार्कअप सही बना है। उस पाठ के बारे में यह कुछ नहीं कहती, जिसे वह मार्कअप लपेटे हुए है। और यहीं – पाठ में ही – ज़्यादा घातक मतिभ्रम बसते हैं। v0.3 की प्रमुख सुविधा, स्पैन-लॉक्ड कंपोज़िशन, ख़ास तौर पर इन्हीं को रोकने के लिए बनाई गई है।
सामग्री तालिका
वह मतिभ्रम जिसे स्कीमा नहीं पकड़ सकती
किसी मॉडल से सोलहवीं सदी का एक फ़्रांसीसी पत्र एनकोड करने को कहिए, और अक्सर आपको
एक ऐसा TEI दस्तावेज़ मिलेगा जो देखने में बेदाग़ लगेगा। हेडर भरा हुआ है, <persName>
टैग सही जगह पर हैं, <dateline> ठीक बना है। उसे validate_document से गुज़ारिए,
और वह पास हो जाता है।
फिर उसके मूल पाठ का स्रोत से मिलान कीजिए।
mesme बनकर même हो गया है। एक अल्पविराम अपनी जगह से खिसक गया है। luy चुपचाप
आधुनिक होकर lui बन गया है। पांडुलिपि में जो वाक्यांश पढ़ने में कठिन था, उसे
“सुधारकर” कुछ ज़्यादा साफ़-सुथरा बना दिया गया है। इनमें से कोई बदलाव माँगा नहीं
गया था। कोई चिह्नित नहीं है। दस्तावेज़ स्कीमा के हिसाब से वैध है, और चुपचाप ग़लत।
अभिलेखीय वर्कफ़्लो में – जहाँ एनकोड किया गया पाठ वह स्थायी अभिलेख बन जाता है जिस पर आगे के पाठक, खोज-अनुक्रमणिकाएँ और उद्धरण टिके होते हैं – यही वह विफलता है जो सबसे ज़्यादा मायने रखती है। एक बिगड़ा हुआ टैग खीज पैदा करता है। एक आधुनिक की गई वर्तनी, जिस पर पाँच साल तक किसी की नज़र न पड़े, पाठ का भ्रष्ट हो जाना है।
स्पैन-लॉक्ड कंपोज़िशन
नया रिलीज़ (v0.3) मतिभ्रम रोकने की एक ऐसी व्यवस्था लेकर आया है, जिसका निशाना ठीक यही विफलता है। डिज़ाइन का लक्ष्य: मूल पाठ के मतिभ्रम को केवल असंभाव्य नहीं, बल्कि बनावट से ही असंभव बना देना।
विचार सीधा-सा है: मॉडल मूल पाठ कभी टाइप नहीं करता।
इसके बजाय वर्कफ़्लो यों चलता है:
- मॉडल
get_source("letter_001")बुलाता है और उसे स्रोत का सादा पाठ एक अपरिवर्तनीय स्ट्रिंग के रूप में मिलता है। - जो भी टैग वह लगाना चाहता है, उसके लिए वह
tag_span("letter_001", start, end, element_path, attrs)बुलाता है – यानी स्रोत की एक वर्ण-सीमा पर एक TEI एलिमेंट दर्ज करता है। - काम पूरा होने पर वह
compose("letter_001")बुलाता है। सर्वर दर्ज किए गए टैगों को मूल सादे पाठ में पिरोता है, अंतिम TEI तैयार करता है, और फिर बाइट-दर-बाइट जाँचता है कि तैयार दस्तावेज़ का सपाट पाठ स्रोत के बराबर है या नहीं।
बाइट मिल गए, तो दस्तावेज़ लौट आता है। नहीं मिले – अगर मॉडल के टैगों से किसी तरह
ऐसा मूल पाठ निकलता है जो स्रोत से एक भी वर्ण में भिन्न हो – तो compose() भ्रष्ट
दस्तावेज़ लौटाने के बजाय त्रुटि उठा देता है।
इस वर्कफ़्लो में कोई ऐसा रास्ता नहीं जिससे मॉडल एक ऐसा TEI दस्तावेज़ बना सके जिसका
मूल पाठ स्रोत से भिन्न हो। यह अपरिवर्तनीय शर्त यांत्रिक है, व्यवहार पर टिकी नहीं।
आपको यह भरोसा नहीं करना कि मॉडल मतिभ्रम नहीं करेगा; आपको बस दो बाइट-स्ट्रिंगों के
बीच एक == जाँच पर भरोसा करना है।
यह क्या है, और क्या नहीं
स्पैन-लॉक्ड कंपोज़िशन स्कीमा-आधार की पूरक है, उसका विकल्प नहीं। स्कीमा-आधार के
उपकरण (validate_document, lookup_element, valid_children और मूल सोलह में से
बाक़ी) मॉडल को वैध TEI बनाने में मदद करते हैं। स्पैन-लॉक्ड कंपोज़िशन इसकी गारंटी
देती है कि उस TEI के भीतर का मूल पाठ स्रोत के प्रति वफ़ादार है। काम में लाने लायक़
एनकोडिंग वर्कफ़्लो को दोनों कसौटियों पर खरा उतरना होता है, और अब दोनों एक ही सर्वर
से सधती हैं।
यह हर मर्ज़ की दवा भी नहीं है। compose() अभी यह नहीं जाँचता कि दर्ज किए गए टैग
किसी लोड किए गए ODD अनुकूलन के अनुसार स्वीकार्य हैं या नहीं – यह अगला क़दम है।
दर्ज किए गए टैग प्रोसेस की मेमोरी में रहते हैं और रीस्टार्ट के बाद नहीं बचते। और
स्रोत फ़ाइलें वहाँ से पढ़ने योग्य होनी चाहिए जहाँ सर्वर चल रहा है। ये सब सुलझाए
जा सकते हैं; इनमें से कोई भी मूल अपरिवर्तनीय शर्त को कमज़ोर नहीं करता।
TEI से आगे यह क्यों मायने रखता है
यह पैटर्न सामान्यीकृत होता है। जब भी किसी मॉडल से किसी पाठ पर टिप्पणी करने, उसे रूपांतरित करने या लपेटने को कहा जाए – और जब भी मूल पाठ की अखंडता मॉडल की “सुधारने” की क्षमता से ज़्यादा मायने रखे – तो इसी आकार का समाधान लागू होता है। मॉडल से पाठ दोबारा टाइप करने को मत कहिए। उससे पाठ पर निर्देश बनवाइए, और एक नियतात्मक कंपोज़र को समानता की अपरिवर्तनीय शर्त के तहत उन्हें लागू करने दीजिए।
ख़ास तौर पर डिजिटल संस्करणों के लिए इससे यह बदल जाता है कि आप ज़िम्मेदारी के साथ किसी मॉडल से क्या करवा सकते हैं। एनकोडिंग अचानक ऐसा काम बन जाती है जिसे आप हर आउटपुट का स्रोत से हाथ से मिलान किए बिना सौंप सकते हैं। मशीन उबाऊ रास्ता चलती है; संपादक मार्कअप की समीक्षा करता है, वर्तनी की नहीं।
अपडेट कैसे पाएँ
अगर tei-mcp पहले से इंस्टॉल है:
uvx tei-mcp@latest
या नए सिरे से:
pip install tei-mcp
स्पैन-लॉक्ड कंपोज़िशन इस्तेमाल करने के लिए सर्वर को स्रोत की सादा-पाठ फ़ाइलों की किसी डायरेक्टरी की ओर मोड़िए:
export TEI_MCP_SPAN_SOURCE_ROOT=/path/to/sources
uvx tei-mcp
हर फ़ाइल का मूल नाम उसका दस्तावेज़ ID बन जाता है (letter_001.txt →
letter_001)।
स्रोत कोड, पूरा दस्तावेज़ीकरण और अपरिवर्तनीय शर्त के डिज़ाइन-नोट: github.com/Pantagrueliste/tei-mcp
