Я створив CAD-редактор у браузері, а потім навчив LLM ним користуватися

Я запитав свій додаток: "Скільки тут дверей та вікон?"

ШІ відповів із підрахунком. Потім він додав щось без запиту:

"Примітка: D3 має ширину лише 300 мм. Ймовірно, це помилково виявлені двері. Хочете, щоб я перевірив це?"

Вона була права. Моя система перетворила фрагмент геометрії на двері шириною 30 см. Жодна людина цього не помітила. Модель прочитала дані, побачила двері вужчі за коробку для взуття і позначила це як помилку.

Цей момент став винагородою за величезний інженерний виклик. Мені довелося парсити файли AutoCAD DWG, реконструювати моделі будівель із тисяч випадкових ліній, створити 2D-редактор з нуля та підключити його до Claude.

Ось як я це зробив.

Проблема даних

Файл DWG не містить стін. Він містить лінії. Усе найцікавіше в цьому проєкті відбувається саме в просторі між цими двома реченнями.

Щоб працювати з цими файлами, я дотримувався двох правил:

  • Запускати парсер як підпроцес. Якщо 30-річний парсер вилетить, це не покладе мій сервер.
  • Ніколи не довіряти файлу. Заголовки DWG часто помиляються щодо одиниць вимірювання. Я ігнорую заголовок і дивлюся на фактичні числа, щоб знайти справжній масштаб.

Конвеєр витягування даних

Я перетворив «суп» із ліній на структуровану модель:

  • Стіни — це осеві лінії.
  • Двері та вікна прив'язуються до стін, на яких вони розташовані.
  • Кімнати — це полігони з назвами та площами.

Для класифікації я використав простий трюк. Я застосував пошук підрядків у назвах шарів. Якщо шар називається "WAND" або "MAUER", система розуміє, що це стіна. Якщо шар не має назви, система використовує геометрію, щоб зробити припущення.

Редактор

Я створив редактор, використовуючи чистий Canvas 2D context. Щоб він працював швидко, я використав три шари:

  • Шар 1: Статична сітка та оригінальні лінії.
  • Шар 2: Модель (стіни, кімнати, двері).
  • Шар 3: Активний курсор та попередній перегляд.

Це дозволило підтримувати частоту кадрів 60 FPS навіть при наявності майже 1000 стін.

ШІ-копілот

Мені не потрібен був чат-бот, який просто розмовляє. Мені потрібен був агент, який працює. Я надав Claude тринадцять інструментів для читання та редагування моделі.

Щоб забезпечити безпеку, я дотримувався трьох правил:

  • Єдиний шлях запису: ШІ використовує той самий валідований код, що й ручний інтерфейс. Якщо інтерфейс не може це зберегти, ШІ теж не зможе.
  • Помилки, що піддаються виправленню: Якщо ШІ намагається розмістити двері там, де вони не поміщаються, інструмент повертає помилку. ШІ зчитує цю помилку і пробує інше місце.
  • Можливість скасування: Кожна дія ШІ об'єднується в одну транзакцію. Якщо ШІ припуститься помилки, одне натискання Ctrl+Z виправить усе.

Уроки

  • Геометричні баги ховаються у формах, які ви не тестуєте. Прямокутні будівлі — це легко. L-подібні будівлі ламають усе.
  • Тестуйте свої інструменти методом фаззингу. LLM — це фаззер. Зустрічайте її з суворими межами коду.
  • Найскладніше — це не ШІ. Це фундамент даних. Оскільки геометрія була надійною, інтеграція ШІ зайняла дні замість тижнів.

Source: https://dev.to/arif/i-built-a-cad-editor-in-the-browser-then-taught-an-llm-to-use-it-1l92