בניתי עורך CAD בדפדפן, ואז לימדתי LLM להשתמש בו
שאלתי את האפליקציה שלי: "כמה דלתות וחלונות יש שם?"
ה-AI ענה עם הספירות. ואז הוא הוסיף משהו שלא התבקש:
"הערה: D3 ברוחב 300 מ"מ בלבד. סביר להניח שמדובר בדלת שזוהתה בטעות. תרצו שאבדוק את זה?"
הוא צדק. המערכת שלי הפכה חלק מהגאומטריה לדלת של 30 ס"מ. אף בן אדם לא הבחין בכך. המודל קרא את הנתונים, ראה דלת צרה יותר מקופסת נעליים, וסימן אותה.
הרגע הזה היה התגמול על אתגר הנדסי עצום. הייתי צריך לנתח (parse) קבצי AutoCAD DWG, לשחזר מודלים של מבנים מתוך אלפי קווים אקראיים, לבנות עורך 2D מאפס, ולחבר אותו ל-Claude.
הנה איך בניתי אותו.
בעיית הנתונים
קובץ DWG אינו מכיל קירות. הוא מכיל קווים. כל מה שמעניין בפרויקט הזה קורה במרווח שבין שני המשפטים האלה.
פעלתי לפי שני כללים כדי לטפל בקבצים האלה:
- להריץ את ה-parser כתת-תהליך (subprocess). אם ה-parser בן ה-30 קורס, הוא לא מפיל את השרת שלי.
- לעולם לא לסמוך על הקובץ. כותרות (headers) של DWG משקרות לעיתים קרובות לגבי יחידות מידה. אני מתעלם מה-header ומסתכל על המספרים בפועל כדי למצוא את קנה המידה האמיתי.
תהליך החילוץ (The Extraction Pipeline)
הפכתי "מרק" של קווים למודל מובנה:
- קירות הם קווי מרכז (centerlines).
- דלתות וחלונות נצמדים (snap) לקירות המארחים.
- חדרים הם פוליגונים עם שמות ושטחים.
השתמשתי בטריק פשוט לסיווג. השתמשתי בהתאמת תת-מחרוזת (substring matching) לשמות שכבות (layers). אם שכבה נקראת "WAND" או "MAUER", המערכת יודעת שמדובר בקיר. אם לשכבה אין שם, המערכת משתמשת בגאומטריה כדי לנחש.
העורך
בניתי את העורך באמצעות Canvas 2D context גולמי. כדי לשמור על מהירות, השתמשתי בשלוש שכבות:
- שכבה 1: הרשת הסטטית והקווים המקוריים.
- שכבה 2: המודל (קירות, חדרים, דלתות).
- שכבה 3: הסמן הפעיל ותצוגות מקדימות.
זה שמר על קצב פריימים של 60 FPS גם עם כמעט 1,000 קירות.
ה-AI Copilot
לא רציתי צ'אטבוט שרק מדבר. רציתי סוכן (agent) שעובד. נתתי ל-Claude שלושה-עשר כלים לקריאה ועריכה של המודל.
כדי לשמור על בטיחות, פעלתי לפי שלושה כללים:
- נתיב כתיבה יחיד: ה-AI משתמש בדיוק באותו קוד מאומת שבו משתמש ממשק המשתמש (UI) הידני. אם ה-UI לא יכול לשמור את זה, ה-AI לא יכול לשמור את זה.
- שגיאות הניתנות לשחזור: אם ה-AI מנסה להציב דלת במקום שבו היא לא מתאימה, הכלי מחזיר שגיאה. ה-AI קורא את השגיאה ומנסה במיקום אחר.
- יכולת ביטול (Undo): כל פעולת AI נכנסת תחת טרנזקציה (transaction) אחת. אם ה-AI טועה, לחיצה אחת על Ctrl+Z מתקנת הכל.
הלקחים
- באגים גאומטריים מתחבאים בצורות שאתם לא בודקים. מבנים מלבניים הם קלים. מבנים בצורת L שוברים הכל.
- בצעו fuzzing לכלים שלכם. ה-LLM הוא fuzzer. התמודדו איתו עם גבולות קוד קשיחים.
- החלק הקשה הוא לא ה-AI. זה תשתית הנתונים. מכיוון שהגאומטריה הייתה מוצקה, שילוב ה-AI ארך ימים במקום שבועות.
Source: https://dev.to/arif/i-built-a-cad-editor-in-the-browser-then-taught-an-llm-to-use-it-1l92
