من یک ویرایشگر CAD در مرورگر ساختم، سپس به یک LLM یاد دادم که از آن استفاده کند

از اپلیکیشنم پرسیدم: «چند تا در و پنجره وجود دارد؟»

هوش مصنوعی با ارائه تعداد آن‌ها پاسخ داد. سپس بدون اینکه از او خواسته شود، چیزی اضافه کرد:

«توجه: عرض D3 تنها ۳۰۰ میلی‌متر است. این احتمالاً یک در است که به اشتباه تشخیص داده شده. می‌خواهید بررسی‌اش کنم؟»

حق با او بود. سیستم من یک قطعه هندسه را به یک در ۳۰ سانتی‌متری تبدیل کرده بود. هیچ انسانی متوجه آن نشده بود. مدل داده‌ها را خواند، دری را دید که از یک جعبه کفش هم باریک‌تر است و آن را علامت‌گذاری کرد.

آن لحظه، پاداش یک چالش مهندسی عظیم بود. من مجبور بودم فایل‌های AutoCAD DWG را تجزیه (parse) کنم، مدل‌های ساختمان را از میان هزاران خط تصادفی بازسازی کنم، یک ویرایشگر دوبعدی را از صفر بسازم و آن را به Claude متصل کنم.

در اینجا نحوه ساخت آن را توضیح می‌دهم.

مشکل داده‌ها

یک فایل DWG شامل دیوار نیست؛ بلکه شامل خطوط است. تمام بخش‌های جذاب این پروژه در فضای بین این دو جمله اتفاق می‌افتد.

برای مدیریت این فایل‌ها از دو قانون پیروی کردم:

  • اجرای پارسر به عنوان یک زیرفرآیند (subprocess). اگر پارسر ۳۰ ساله‌ای کرش کرد، سرور من را از کار نمی‌اندازد.
  • هرگز به فایل اعتماد نکنید. هدرهای (headers) فایل DWG اغلب درباره واحدها دروغ می‌گویند. من هدر را نادیده می‌گیرم و برای یافتن مقیاس واقعی، به اعداد واقعی نگاه می‌کنم.

خط لوله استخراج (Extraction Pipeline)

من مجموعه‌ای درهم‌ریخته از خطوط را به یک مدل ساختاریافته تبدیل کردم:

  • دیوارها خطوط مرکزی هستند.
  • درها و پنجره‌ها به دیوارهای میزبان چسبیده (snap) می‌شوند.
  • اتاق‌ها چندضلعی‌هایی با نام و مساحت هستند.

برای طبقه‌بندی از یک ترفند ساده استفاده کردم. از تطبیق زیررشته (substring matching) برای نام لایه‌ها استفاده کردم. اگر نام لایه‌ای "WAND" یا "MAUER" باشد، سیستم می‌فهمد که آن یک دیوار است. اگر لایه‌ای نامی نداشته باشد، سیستم از هندسه برای حدس زدن استفاده می‌کند.

ویرایشگر

من ویرایشگر را با استفاده از یک Canvas 2D خام ساختم. برای حفظ سرعت، از سه لایه استفاده کردم:

  • لایه ۱: شبکه (grid) ایستا و خطوط اصلی.
  • لایه ۲: مدل (دیوارها، اتاق‌ها، درها).
  • لایه ۳: نشانگر فعال و پیش‌نمایش‌ها.

این کار باعث شد نرخ فریم حتی با وجود نزدیک به ۱,۰۰۰ دیوار، روی ۶۰ FPS باقی بماند.

کمک‌خلبان هوش مصنوعی (AI Copilot)

من چت‌باتی نمی‌خواستم که فقط حرف بزند؛ من یک عامل (agent) می‌خواستم که کار کند. من ۱۳ ابزار به Claude دادم تا مدل را بخواند و ویرایش کند.

برای حفظ امنیت، از سه قانون پیروی کردم:

  • یک مسیر نوشتن واحد: هوش مصنوعی دقیقاً از همان کد تاییدشده‌ای استفاده می‌کند که رابط کاربری (UI) دستی استفاده می‌کند. اگر UI نتواند آن را ذخیره کند، هوش مصنوعی هم نمی‌تواند.
  • خطاهای قابل بازیابی: اگر هوش مصنوعی سعی کند دری را در جایی که جا نمی‌شود قرار دهد، ابزار یک خطا برمی‌گرداند. هوش مصنوعی آن خطا را می‌خواند و جای دیگری را امتحان می‌کند.
  • قابلیت بازگشت (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