لقد بنيت محرر CAD في المتصفح، ثم علّمت نموذج لغة كبير (LLM) كيفية استخدامه

سألت تطبيقي: "كم عدد الأبواب والنوافذ الموجودة؟"

أجاب الذكاء الاصطناعي بالأعداد. ثم أضاف شيئاً دون أن أطلبه:

"ملاحظة: الباب D3 عرضه 300 ملم فقط. من المحتمل أن يكون هذا خطأ في اكتشاف الباب. هل تريد مني التحقق من ذلك؟"

كان محقاً. لقد حول نظامي قطعة هندسية إلى باب بعرض 30 سم. لم يلاحظ أي إنسان ذلك. قرأ النموذج البيانات، ورأى باباً أضيق من صندوق أحذية، فقام بالتنبيه إليه.

كانت تلك اللحظة هي الثمرة لتحدٍ هندسي هائل. كان عليّ تحليل ملفات AutoCAD DWG، وإعادة بناء نماذج المباني من آلاف الخطوط العشوائية، وبناء محرر 2D من الصفر، وربطه بـ Claude.

إليك كيف بنيته.

مشكلة البيانات

ملف DWG لا يحتوي على جدران، بل يحتوي على خطوط. كل شيء مثير للاهتمام في هذا المشروع يحدث في المساحة الفاصلة بين هاتين الجملتين.

اتبعت قاعدتين للتعامل مع هذه الملفات:

  • تشغيل المحلل (parser) كعملية فرعية (subprocess). إذا تعطل المحلل الذي يعود تاريخه لـ 30 عاماً، فلن يتسبب في توقف الخادم الخاص بي.
  • عدم الثقة في الملف أبداً. غالباً ما تضلل رؤوس ملفات (headers) الـ DWG المعلومات المتعلقة بالوحدات. لذا، أتجاهل الرأس وأنظر إلى الأرقام الفعلية للعثور على المقياس الحقيقي.

مسار الاستخراج

لقد حولت مجموعة عشوائية من الخطوط إلى نموذج مهيكل:

  • الجدران هي خطوط مركزية (centerlines).
  • الأبواب والنوافذ تلتصق (snap) بالجدران الحاضنة.
  • الغرف هي مضلعات (polygons) لها أسماء ومساحات.

استخدمت حيلة بسيطة للتصنيف؛ حيث استخدمت مطابقة السلاسل الفرعية (substring matching) لأسماء الطبقات (layers). إذا كان اسم الطبقة "WAND" أو "MAUER"، سيعرف النظام أنه جدار. وإذا لم يكن للطبقة اسم، يستخدم النظام الهندسة للتخمين.

المحرر

بنيت المحرر باستخدام سياق Canvas 2D خام. وللحفاظ على سرعته، استخدمت ثلاث طبقات:

  • الطبقة 1: الشبكة الثابتة والخطوط الأصلية.
  • الطبقة 2: النموذج (الجدران، الغرف، الأبواب).
  • الطبقة 3: المؤشر النشط والمعاينات.

حافظ هذا على معدل إطارات يبلغ 60 FPS حتى مع وجود ما يقرب من 1,000 جدار.

مساعد الذكاء الاصطناعي (AI Copilot)

لم أكن أريد روبوت دردشة يتحدث فقط، بل أردت وكيلاً (agent) يعمل. لقد أعطيت Claude ثلاثة عشر أداة لقراءة النموذج وتحريره.

للحفاظ على الأمان، اتبعت ثلاث قواعد:

  • مسار كتابة واحد: يستخدم الذكاء الاصطناعي نفس الكود الذي تم التحقق منه والمستخدم في واجهة المستخدم اليدوية. إذا لم تتمكن واجهة المستخدم من حفظه، فلن يتمكن الذكاء الاصطناعي من حفظه.
  • أخطاء قابلة للاسترداد: إذا حاول الذكاء الاصطناعي وضع باب في مكان لا يناسبه، تعيد الأداة خطأً. يقرأ الذكاء الاصطناعي هذا الخطأ ويحاول في مكان آخر.
  • سجل تراجع (undo): يتم دمج كل إجراء يقوم به الذكاء الاصطناعي في عملية (transaction) واحدة. إذا ارتكب الذكاء الاصطناعي خطأً، فإن ضغطة واحدة على Ctrl+Z تصلح كل شيء.

الدروس المستفادة

  • الأخطاء الهندسية تختبئ في الأشكال التي لا تختبرها. المباني المستطيلة سهلة، أما المباني على شكل حرف L فتتسبب في تعطل كل شيء.
  • اختبر أدواتك بطريقة عشوائية (Fuzz). إن الـ LLM هو بمثابة fuzzer، لذا واجهه بحدود برمجية صارمة.
  • الجزء الصعب ليس الذكاء الاصطناعي، بل أساس البيانات. ولأن الهندسة كانت متينة، استغرق دمج الذكاء الاصطناعي أياماً بدلاً من أسابيع.

المصدر: https://dev.to/arif/i-built-a-cad-editor-in-the-browser-then-taught-an-llm-to-use-it-1l92