मैंने ब्राउज़र में एक CAD एडिटर बनाया, फिर एक LLM को इसे इस्तेमाल करना सिखाया
मैंने अपने ऐप से पूछा: "वहाँ कितने दरवाजे और खिड़कियाँ हैं?"
AI ने उनकी संख्या बता दी। फिर उसने बिना पूछे कुछ और भी जोड़ दिया:
"नोट: D3 केवल 300 mm चौड़ा है। यह संभवतः गलत तरीके से पहचाना गया दरवाजा है। क्या आप चाहते हैं कि मैं इसकी जाँच करूँ?"
वह सही था। मेरे सिस्टम ने ज्योमेट्री (geometry) के एक हिस्से को 30 cm के दरवाजे में बदल दिया था। किसी इंसान ने इस पर ध्यान नहीं दिया था। मॉडल ने डेटा पढ़ा, एक जूते के डिब्बे से भी संकरा दरवाजा देखा, और उसे फ्लैग (flag) कर दिया।
वह पल एक बहुत बड़ी इंजीनियरिंग चुनौती का प्रतिफल था। मुझे AutoCAD DWG फाइलों को पार्स (parse) करना था, हजारों रैंडम लाइनों से बिल्डिंग मॉडल को फिर से बनाना था, शुरुआत से एक 2D एडिटर बनाना था, और उसे Claude से जोड़ना था।
यहाँ बताया गया है कि मैंने इसे कैसे बनाया।
डेटा की समस्या (The Data Problem)
एक DWG फाइल में दीवारें नहीं होतीं। उसमें लाइनें होती हैं। इस प्रोजेक्ट में सब कुछ दिलचस्प इन्हीं दो वाक्यों के बीच की जगह में होता है।
इन फाइलों को संभालने के लिए मैंने दो नियमों का पालन किया:
- पार्सर को एक सबप्रोसेस (subprocess) के रूप में चलाएं। यदि 30 साल पुराना पार्सर क्रैश हो जाता है, तो वह मेरे सर्वर को बंद नहीं करता।
- फाइल पर कभी भरोसा न करें। DWG हेडर अक्सर यूनिट्स (units) के बारे में गलत जानकारी देते हैं। मैं हेडर को अनदेखा करता हूँ और सही स्केल (scale) खोजने के लिए वास्तविक नंबरों को देखता हूँ।
एक्सट्रैक्शन पाइपलाइन (The Extraction Pipeline)
मैंने लाइनों के ढेर को एक स्ट्रक्चर्ड मॉडल में बदल दिया:
- दीवारें सेंटरलाइन (centerlines) हैं।
- दरवाजे और खिड़कियाँ होस्ट दीवारों (host walls) से जुड़ जाते हैं।
- कमरे नाम और क्षेत्रफल (areas) वाले पॉलीगॉन (polygons) हैं।
मैंने वर्गीकरण (classification) के लिए एक सरल ट्रिक का उपयोग किया। मैंने लेयर के नामों के लिए सबस्ट्रिंग मैचिंग (substring matching) का उपयोग किया। यदि कोई लेयर "WAND" या "MAUER" कहती है, तो सिस्टम जान जाता है कि वह एक दीवार है। यदि किसी लेयर का कोई नाम नहीं है, तो सिस्टम अंदाज़ा लगाने के लिए ज्योमेट्री का उपयोग करता है।
एडिटर (The Editor)
मैंने एडिटर को रॉ Canvas 2D कॉन्टेक्स्ट (raw Canvas 2D context) का उपयोग करके बनाया। इसे तेज़ रखने के लिए, मैंने तीन लेयर्स का उपयोग किया:
- लेयर 1: स्टैटिक ग्रिड और मूल लाइनें।
- लेयर 2: मॉडल (दीवारें, कमरे, दरवाजे)।
- लेयर 3: एक्टिव कर्सर और प्रिव्यू।
इससे लगभग 1,000 दीवारों के साथ भी फ्रेम रेट 60 FPS पर बना रहा।
AI कोपायलट (The AI Copilot)
मैं ऐसा चैटबॉट नहीं चाहता था जो सिर्फ बातें करे। मैं एक ऐसा एजेंट चाहता था जो काम करे। मैंने Claude को मॉडल को पढ़ने और एडिट करने के लिए तेरह टूल्स दिए।
इसे सुरक्षित रखने के लिए, मैंने तीन नियमों का पालन किया:
- एक राइट पाथ (write path): AI ठीक उसी वैलिडेटेड कोड का उपयोग करता है जो मैनुअल UI का है। यदि UI इसे सेव नहीं कर सकता, तो AI भी इसे सेव नहीं कर सकता।
- रिकवरेबल एरर्स (Recoverable errors): यदि AI किसी ऐसे स्थान पर दरवाजा लगाने की कोशिश करता है जहाँ वह फिट नहीं बैठता, तो टूल एक एरर (error) देता है। AI उस एरर को पढ़ता है और किसी दूसरे स्थान पर कोशिश करता है।
- एक अनडू स्टोरी (undo story): AI की हर क्रिया को एक सिंगल ट्रांजेक्शन (transaction) में समेटा जाता है। यदि AI कोई गलती करता है, तो Ctrl+Z दबाते ही सब कुछ ठीक हो जाता है।
सबक (The Lessons)
- ज्योमेट्री बग्स उन आकृतियों में छिप जाते हैं जिनका आप परीक्षण नहीं करते हैं। आयताकार (rectangular) इमारतें आसान होती हैं। L-आकार की इमारतें सब कुछ बिगाड़ देती हैं।
- अपने टूल्स को फज़ (fuzz) करें। LLM एक फज़र (fuzzer) है। इसका सामना सख्त कोड सीमाओं (code boundaries) के साथ करें।
- कठिन हिस्सा AI नहीं है। यह डेटा फाउंडेशन है। क्योंकि ज्योमेट्री मजबूत थी, इसलिए AI इंटीग्रेशन में हफ्तों के बजाय कुछ दिन ही लगे।
स्रोत: https://dev.to/arif/i-built-a-cad-editor-in-the-browser-then-taught-an-llm-to-use-it-1l92
