Я створив 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
