ブラウザでCADエディタを構築し、LLMにその使い方を教えた
アプリにこう尋ねてみた。「ドアと窓はいくつありますか?」
AIは個数を答えた。そして、何も指示していないのにこう付け加えた。
「注意:D3の幅はわずか300mmです。これは誤検知されたドアである可能性があります。確認しますか?」
それは正しかった。私のシステムは、ある幾何学的な図形を30cmのドアに変えてしまっていたのだ。人間は誰も気づかなかった。モデルはデータを読み取り、靴箱よりも細いドアを見つけ、それをフラグ立てした。
その瞬間、膨大なエンジニアリングの挑戦が報われた。AutoCADのDWGファイルを解析し、数千ものバラバラな線から建物のモデルを再構築し、2Dエディタをゼロから構築して、Claudeに接続しなければならなかった。
構築のプロセスを以下に記す。
データの問題
DWGファイルには「壁」は含まれていない。含まれているのは「線」だ。このプロジェクトにおける興味深いことのすべては、この2つの文章の間に存在する。
これらのファイルを扱うために、2つのルールに従った:
- パーサーをサブプロセスとして実行する。30年前のパーサーがクラッシュしても、サーバーが停止しないようにするためだ。
- ファイルを決して信用しない。DWGのヘッダーは単位について嘘をつくことがよくある。ヘッダーは無視し、実際の数値を見て真のスケールを特定する。
抽出パイプライン
バラバラな線の集まりを、構造化されたモデルに変換した:
- 壁は中心線。
- ドアと窓は、ホストとなる壁にスナップする。
- 部屋は名前と面積を持つポリゴン。
分類には簡単なトリックを用いた。レイヤー名に対して部分一致(substring matching)を用いた。レイヤー名が「WAND」や「MAUER」であれば、システムはそれが壁であることを認識する。レイヤー名がない場合は、幾何学的な形状から推測する。
エディタ
生のCanvas 2Dコンテキストを使用してエディタを構築した。高速性を維持するために、3つのレイヤーを使用した:
- レイヤー1:静的なグリッドと元の線。
- レイヤー2:モデル(壁、部屋、ドア)。
- レイヤー3:アクティブなカーソルとプレビュー。
これにより、1,000個近い壁があってもフレームレートを60 FPSに保つことができた。
AIコパイロット
ただ喋るだけのチャットボットではなく、実際に動くエージェントが欲しかった。Claudeに、モデルを読み取り編集するための13個のツールを与えた。
安全性を保つために、3つのルールに従った:
- 単一の書き込みパス:AIは、手動UIと全く同じ検証済みコードを使用する。UIで保存できないものは、AIでも保存できない。
- 回復可能なエラー:AIが適合しない場所にドアを配置しようとすると、ツールがエラーを返す。AIはそのエラーを読み取り、別の場所を試みる。
- Undo(元に戻す)の仕組み:AIのすべての操作は、単一のトランザクションにまとめられる。AIがミスをしても、Ctrl+Zを一度押すだけですべてが修正される。
教訓
- 幾何学的なバグは、テストしていない形状に潜んでいる。長方形の建物は簡単だが、L字型の建物はすべてを壊してしまう。
- ツールをファジング(Fuzz)せよ。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
