:從自然語言到可編輯參數(shù)化模型)
做 CAD 這個行當?shù)娜诉@兩年應(yīng)該都感受到了一股奇怪的壓力AI 都能寫代碼、畫圖、生成視頻了怎么打開 SolidWorks 還是得自己一個特征一個特征地拉直到 text-to-cad 這個概念密集出現(xiàn)才讓人意識到不是這方向沒人做是過去大家把路走岔了——大部分文本生成 3D 模型的工具生成的其實是 mesh網(wǎng)格而 CAD 要的是參數(shù)化特征樹。這兩者之間的鴻溝恰好就是 text-to-cad 真正要解決的問題。我花了兩周時間把市面上能試的 text-to-cad 項目、API、開源模型都過了一遍包括直接用大模型寫 CadQuery 腳本這種野路子。這篇文章不打算寫成一個綜述而是想從一個實際使用者的角度把這東西的原理、各家方案的差異、能復(fù)現(xiàn)的操作路徑以及最容易被忽視的質(zhì)量評估方法講清楚。如果你也是做機械設(shè)計、3D 打印、工業(yè)建模或者單純好奇一句話生成一個能編輯的零件到底怎么實現(xiàn)這篇文章應(yīng)該能幫你省下不少自己摸索的時間。1. 先說清楚Text-to-CAD 和文字生 3D 模型根本不是一回事很多人第一次聽到 text-to-cad第一反應(yīng)是這不就是文生 3D 模型嗎Meta 那個、OpenAI 那個不都能做 這是一個非常自然的誤解但也是理解整個領(lǐng)域最關(guān)鍵的一道坎。1.1 為什么 CAD 領(lǐng)域一直沒跟上文生圖的節(jié)奏過去幾年文字生成 3D 內(nèi)容的技術(shù)確實進步飛快從早期的 CLIP 驅(qū)動形狀優(yōu)化到后來的擴散模型直接生成神經(jīng)輻射場再到用多視圖擴散重建網(wǎng)格已經(jīng)能生成相當精細的雕像、游戲道具、場景資產(chǎn)。但這些東西有一個共同特點輸出是三角形網(wǎng)格或者隱式曲面本質(zhì)上是一堆點、面、法線、紋理坐標的集合。網(wǎng)格模型對游戲、影視、3D 打印預(yù)覽來說夠用但對工程師來說遠遠不夠。你在 SolidWorks 里打開一個網(wǎng)格零件會發(fā)現(xiàn)沒有特征樹、沒有草圖、沒有拉伸切除的記錄想改一個孔的直徑對不起改不了只能整個重做。CAD 的核心資產(chǎn)是可編輯性是參數(shù)化邏輯是那個記錄怎么一步步把這個零件做出來的特征歷史。text-to-cad 的目標恰恰是后者生成的不只是一個形狀而是一套完整的建模過程、一顆參數(shù)化特征樹甚至是一段可以被 CAD 內(nèi)核重放的建模指令序列。這也是為什么它比文生 3D 模型難那么多。1.2 從特征樹到 CSGCAD 模型內(nèi)部到底長什么樣要理解 text-to-cad 的難點得先搞清楚 CAD 文件在底層是怎么描述一個零件的。這里有三層概念需要區(qū)分。第一層是特征樹Feature Tree也就是你在 SolidWorks、Fusion 360 里左側(cè)那個樹狀列表。它記錄的是先拉伸出底板再在頂面畫草圖切除一個孔再倒角這樣的操作順序。特征樹的每一層都依賴前面的結(jié)果中間任何一個草圖尺寸改掉后面的特征都會自動更新這就是參數(shù)化建模的核心體驗。第二層是B-Rep邊界表示它是 CAD 內(nèi)核Parasolid、ACIS、OpenCASCADE真正用來存儲幾何的數(shù)據(jù)結(jié)構(gòu)。B-Rep 把模型拆成一堆面Face、邊Edge、頂點Vertex并記錄它們之間的拓撲連接關(guān)系還包含精確的曲面方程而非網(wǎng)格近似。B-Rep 保證了模型在數(shù)學(xué)上是精確的但這個數(shù)據(jù)結(jié)構(gòu)極其復(fù)雜直接讓語言模型去生成 B-Rep 幾乎是不可能的。第三層是CSG構(gòu)造實體幾何就是用基本體立方體、圓柱、球做布爾運算并、交、差來拼出復(fù)雜形狀。CSG 很簡單適合做 AI 生成的中間表示比如很多早期研究就是讓模型直接預(yù)測 CSG 樹。但 CSG 的問題也很明顯它表達不了一個帶有復(fù)雜草圖和拉伸特征的工業(yè)零件而且最終還要再把 CSG 轉(zhuǎn)回 B-Rep 才有實際意義。這些概念不是考試重點但它們決定了 text-to-cad 各家技術(shù)路線的走向。簡單說如果你想生成看起來像零件的東西mesh 就夠如果你想生成真正能用的零件就必須觸及特征樹、草圖、拉伸、旋轉(zhuǎn)、布爾運算這一整套東西。text-to-cad 這個名字本身就已經(jīng)表明它選了一條更難的路。2. 核心原理拆解把建模過程變成語言模型的下一句AI 生成 CAD 模型的難點本質(zhì)上是一個表示問題到底讓模型預(yù)測什么它才能輸出可編輯、可制造的參數(shù)化模型目前主流的技術(shù)路線基本可以歸納成三類序列生成、圖生成、外加一套輔助的腳本/Agent 路線。2.1 讓模型學(xué)會畫草圖加拉伸CAD 序列化的幾種做法最直觀的思路是模仿代碼生成。既然代碼可以表示成 token 序列讓 Transformer 去預(yù)測那么 CAD 建模過程為什么不能DeepCAD 是最早公開的開源工作之一做法是把 SolidWorks 里的建模操作序列也就是特征樹的操作記錄轉(zhuǎn)成一種緊湊的 DSL領(lǐng)域特定語言。比如新建草圖、畫一個圓心在某個點的圓、拉伸 10 毫米、再切一個孔這些操作都被編碼成固定格式的 token 序列。訓(xùn)練時模型讀取這些序列學(xué)習(xí)的是從建模語言到建模操作的映射。推理時模型直接生成一段建模序列再用 CAD 內(nèi)核重放成實體。我在本地跑過 DeepCAD 的預(yù)訓(xùn)練模型它生成的最簡單的零件也就是一個底板加一根柱子這個級別的東西復(fù)雜一點的會明顯失真比如出現(xiàn)懸空的面、拉伸方向亂掉、或者干脆生成了零厚度的退化幾何。但它證明了一件很重要的事語言模型完全有能力學(xué)會拉伸切除倒角這些操作的語法序列化這條路是通的。另一個代表性工作是 UCSD 的 Text2CAD 系列他們在序列生成之外還加入了文本編碼器分支讓同一個模型既能做文本到 CAD 的生成也能做 CAD 到文本的描述也就是模型同時學(xué)會了看懂零件和生成零件兩件事。2.2 合成數(shù)據(jù)與反向字幕訓(xùn)練數(shù)據(jù)的來歷這類模型最大的瓶頸其實是數(shù)據(jù)。真實世界的 CAD 模型雖然存量巨大但絕大多數(shù)都沒有配套的文字描述。你想想誰會在畫完一個法蘭盤之后再寫一句這是一個帶四個均布螺栓孔的法蘭盤存在文件里幾乎沒有。所以各家都想到了一個套路反向字幕reverse captioning。先拿一批現(xiàn)成的 CAD 模型解析成序列化的建模流程再用一個已經(jīng)訓(xùn)練好的CAD 理解模型或者規(guī)則引擎自動生成描述文字。這樣就能得到海量的文字-建模序列配對數(shù)據(jù)。Zoo就是 KittyCAD 那家公司在發(fā)布他們的 text-to-cad 時官方技術(shù)博客里明確提到他們用合成數(shù)據(jù)和人工標注的結(jié)合方式來構(gòu)建訓(xùn)練集其中合成數(shù)據(jù)占了絕大部分。這個做法聽起來很順理成章但有個隱患模型學(xué)到的描述和真實工程師的語言習(xí)慣有偏差。合成數(shù)據(jù)里描述的往往非常教科書比如一個凸臺直徑 20 毫米高 5 毫米帶一個直徑 5 毫米的通孔而真實用戶更可能說一個用來固定傳感器的支架底座。語料分布的錯位意味著模型對口語化需求的泛化能力實際上很有限。2.3 端到端生成與工具調(diào)用的 Agent 路線序列生成是一步到位文本進去建模序列出來。還有一種路線是把 LLM 當調(diào)度器讓它調(diào)用外部工具。典型做法是用 GPT-4 或開源大模型寫一段 CadQuery 或 OpenSCAD 腳本然后執(zhí)行腳本從錯誤信息里迭代修正直到生成合格模型。我之所以專門提這條路線是因為它目前反而是最容易被普通用戶復(fù)現(xiàn)的。不需要訓(xùn)練數(shù)據(jù)不需要 GPU只需要一個能寫代碼的 LLM 和一套 CAD 的 Python API。后面我會用一整章講怎么把它落地。端到端模型和 Agent 路線的本質(zhì)區(qū)別在于前者把建模知識焊死在模型參數(shù)里后者把建模知識外包給外部執(zhí)行環(huán)境LLM 只負責(zé)理解需求、寫代碼、根據(jù)報錯改代碼。前者上限高、但可控性差后者每一步都可觀察、可干預(yù)工程上非常實用。我個人的判斷是短期內(nèi) Agent 路線的產(chǎn)品體驗反而會更好因為用戶能眼睜睜看著模型改稿出了問題也知道去哪找原因。3. 各家的實際表現(xiàn)Zoo、AutoDesk 和開源社區(qū)的真實差異把原理過了一遍之后我從實際體驗角度說說目前幾個代表項目的差距。你可以把這一章當成一份選型筆記以后想在這塊投入精力時知道該往哪個方向看。3.1 Zoo Text-to-CAD從炫技 Demo 到可用的 APIZoo 的 text-to-cad 是 2024 年 9 月發(fā)布的當時官方放了一個讓我印象深刻的演示輸入一句一個帶有四個安裝孔和一個中心孔的鋁制安裝板模型生成了一顆完整的參數(shù)化模型特征樹清晰各個孔的直徑、位置都能編輯。它背后用的是自家的 KittyCAD API 和底層的幾何內(nèi)核所以從模型生成到幾何運算都是閉環(huán)的。我實際在 Zoo 的在線 playground 上試過幾次。它的生成速度大概在十幾秒到一分鐘這個量級生成結(jié)果分兩種一種是標準件風(fēng)格的、特征非常規(guī)整的零件另一種是稍微復(fù)雜一點的、需要多個特征疊加的零件。整體感覺是它對機械工程師常用的板-孔-凸臺-倒角這類特征的掌握已經(jīng)很穩(wěn)但對自由曲面、復(fù)雜裝配體、鈑金件這些還是明顯欠火候。另外Zoo 的商業(yè)化策略也值得關(guān)注。他們不僅提供在線生成還把 text-to-cad 的生成能力封裝成了 API可以直接集成進別的軟件。這就意味著將來你在某個在線 3D 打印服務(wù)商、某個夾具設(shè)計工具里看到的用一句話生成模型按鈕很可能背后就是這種服務(wù)。3.2 AutoDesk 和其他實驗室的探索方向AutoDesk 那邊也有一個叫 Project Bernini 的內(nèi)部項目名字叫貝尼尼很明顯致敬那位雕塑家它走的是多模態(tài)生成路線不只是文字到 CAD還能從圖片、交互式輸入甚至多個視角合成全新模型。AutoDesk 的優(yōu)勢在于他們有完整的 Fusion 360 / Inventor 數(shù)據(jù)生態(tài)和大量用戶操作日志這些東西如果用來做訓(xùn)練數(shù)據(jù)上限非常高。目前公開的信息還不算多但我比較確定的是AutoDesk 對可制造性的要求會比初創(chuàng)公司高很多因為他們知道真正的用戶是拿來開模具、上機床的不是拿來做個好看的渲染圖。學(xué)術(shù)界那邊也有不少有意思的工作。除了前面提到的 DeepCAD、Text2CAD還有把強化學(xué)習(xí)引入 CAD 序列生成的、用圖神經(jīng)網(wǎng)絡(luò)做草圖-拉伸特征預(yù)測的、以及專門研究語言描述不夠精確導(dǎo)致幾何歧義這個問題的。這部分工作雖然離產(chǎn)品很遠但它們在給整個領(lǐng)域探路。3.3 開源社區(qū)的務(wù)實派LLM 直接寫腳本最后是開源社區(qū)這里目前最大的價值不是某個成品模型而是LLM CadQuery/OpenSCAD這條極其實用的路線。CadQuery 是一個用 Python 寫參數(shù)化 CAD 的庫它天然適合做 LLM 的輸出目標因為腳本本身就是程序代碼可讀、可調(diào)試、可版本管理。我用這條路線跑了不少測試結(jié)論是GPT-4 級別的模型在寫 CadQuery 時對簡單零件的成功率相當高但對稍微復(fù)雜的裝配、或者需要精確控制某些幾何約束的情況還是會出現(xiàn)看起來合理、一執(zhí)行就報錯的情況。不過好在報錯信息是公開的把報錯喂回給模型讓它自己改兩三輪之內(nèi)通常能修好。這種生成-執(zhí)行-報錯-再生成的循環(huán)本質(zhì)上已經(jīng)把大模型的推理能力和 CAD 內(nèi)核的精確性結(jié)合起來了。4. 現(xiàn)在就能上手的實踐讓 LLM 幫你生成可編輯的參數(shù)化零件前面講了不少概念和現(xiàn)狀但讀者的時間很寶貴我直接進入可以復(fù)現(xiàn)的部分。4.1 環(huán)境準備為什么我選 CadQuery 而不是 OpenSCAD第一步是選工具。OpenSCAD 也是腳本化建模語法更簡單但它的建模方式偏向 CSG不太適合表達先畫草圖、再拉伸、再打孔這種工業(yè)建模流程。CadQuery 更貼近主流 CAD 軟件的操作習(xí)慣生成的結(jié)果也能通過 FreeCAD 或自己轉(zhuǎn)成 STEP 文件生態(tài)更友好。安裝很簡單pip install cadquery如果你需要更復(fù)雜的交互界面可以考慮安裝 CQ-editor它是一個帶 3D 預(yù)覽的編輯器。另外建議同時安裝 FreeCAD因為 CadQuery 的底層依賴 OpenCASCADE而 FreeCAD 也是基于這個內(nèi)核兩邊的文件可以互通。4.2 從自然語言到零件兩個完整的實戰(zhàn)樣例我挑了兩種典型場景演示一下讓 LLM 把一句話變成 CadQuery 腳本的全過程。樣例一語音指令式的描述——幫我做一個底板長 80寬 50高 10四角各有一個直徑 6 的沉頭孔。把這句話直接喂給 LLM它通常會生成類似下面的腳本import cadquery as cq result ( cq.Workplane(XY) .box(80, 50, 10) .faces(Z) .workplane() .rect(80, 50, forConstructionTrue) .vertices() .hole(6.0) ) cq.exporters.export(result, plate.step)這個腳本你八成看不懂但沒關(guān)系執(zhí)行它就會得到一個 80×50×10 的底板四角打了通孔。我實際執(zhí)行后確認模型正確。樣例二工程描述式的指令——生成一個法蘭外徑 100內(nèi)徑 40厚度 15六個直徑為 8 的螺栓孔均勻分布在直徑為 75 的螺栓圓上。這句話的關(guān)鍵在均勻分布在螺栓圓上LLM 需要理解極坐標和陣列的概念。我讓模型生成之后它給出的腳本核心部分大概這樣result ( cq.Workplane(XY) .circle(100 / 2) .extrude(15) .faces(Z) .workplane() .circle(40 / 2) .cutBlind(-15) ) # 螺栓孔陣列 result ( result.faces(Z) .workplane() .polarArray(75 / 2, 0, 360, 6) .circle(8 / 2, forConstructionFalse) .cutBlind(-15) )我把這個腳本放進 CQ-editor 執(zhí)行得到的是一個干凈的法蘭六個螺栓孔按 60 度均勻分布內(nèi)孔貫通。這里的關(guān)鍵是polarArray這個 APILLM 能準確調(diào)用它說明它對 CadQuery 的常用方法已經(jīng)很熟。不過我也遇到過翻車的情況比如同樣一句話換個模型或者換個改寫方式它可能會生成 OpenSCAD 語法或者把沉頭孔理解成埋頭孔、通孔理解成盲孔這些語義偏差全靠人工盯著。4.3 把需求寫清楚提示詞的結(jié)構(gòu)化寫法跑了幾十個案例之后我總結(jié)出一套相對穩(wěn)定的提示詞模板特別適合讓 LLM 生成 CadQuery 腳本指定建?;鶞矢嬖V它用 Workplane(XY) 作為默認平面避免模型隨機選面。明確幾何參數(shù)能用數(shù)字就不用稍微大約這種詞CAD 容不得模糊。列出特征順序先主體后細節(jié)信息組織方式就像你在跟一個實習(xí)生交代任務(wù)。指定輸出格式要求用 CadQuery 腳本、帶 export 語句方便直接執(zhí)行。一個我自己用的提示詞模板大概是這樣的請寫一段 CadQuery Python 代碼生成一個滿足以下要求的零件。所有尺寸單位是毫米。建模時使用 cq.Workplane(XY) 作為起始平面。先創(chuàng)建主體再依次添加孔、槽、倒角等特征。最后使用 cq.exporters.export 導(dǎo)出 STEP 文件。零件要求如下...這個模板本身不神奇但它把模型最容易出錯的幾個地方基準面、單位、特征順序都提前鎖死了實際成功率能提升不少。5. 生成的東西能不能用這是我建議的五步驗收流程text-to-cad 最大的坑不是生成不出來而是生成結(jié)果看起來能用一加工就廢。這一章講講我怎么驗收這些 AI 生成的模型。5.1 幾何層面最常見的坑零厚度、懸空面、不閉合實體網(wǎng)格生成出來的東西是一張皮雖然有空洞、散面這些問題但至少不會有零厚度這種概念。CAD 不一樣CAD 里一切都要有實體語義。我拿 AI 生成的 STEP 文件導(dǎo)入 FreeCAD 檢查時最常見到的問題就是特征順序不合理導(dǎo)致布爾運算產(chǎn)生退化幾何或者某個拉伸方向反了導(dǎo)致面與面重疊、實體內(nèi)部出現(xiàn)自由邊。檢驗方法其實很簡單在 FreeCAD 里用 Part 模塊的檢查幾何工具跑一遍或者嘗試給模型做一個剖切視圖。剖切面一看內(nèi)部是不是實體、有沒有暗藏的零厚度縫隙一目了然。5.2 可編輯性CAD 的命門前面我一直強調(diào)可編輯性這里具體展開。一個合格的 text-to-cad 結(jié)果至少要滿足三點特征樹完整模型不能是一整塊實心疙瘩要能從特征樹里看到底板-拉伸-打孔-倒角的順序。尺寸參數(shù)可改改一個孔的直徑整個模型要自動更新而不是需要手動重建。后續(xù)可繼續(xù)建模生成的模型還要能繼續(xù)加新特征比如在某個面上再畫個槽。這三點序列生成類模型比如 Zoo 的結(jié)果做得比較好因為它本質(zhì)上就是重放建模序列特征信息天然保留。而LLM 寫腳本路線生成的結(jié)果是否可編輯取決于腳本是不是用了參數(shù)變量。我見過不少 LLM 寫出魔法數(shù)字寫死的腳本你要改一個數(shù)得滿文件找體驗很差。所以我在提示詞模板里會額外加一條所有關(guān)鍵尺寸用變量定義統(tǒng)一收在腳本開頭。5.3 我的五步驗收流程不管用什么工具生成拿到模型后我都會走一遍這個流程花不了幾分鐘但能免掉后面的大坑打開 STEP 文件旋轉(zhuǎn)視角肉眼檢查外形和預(yù)期是否一致。打開特征樹確認特征順序合理、特征數(shù)量足夠不是退化合并成一坨。雙擊關(guān)鍵尺寸改一個數(shù)比如孔直徑從 6 改成 8看模型是否干凈更新。用剖切視圖檢查內(nèi)部實體是否存在隱藏缺陷。如果有 3D 打印或加工需求再用切片軟件或 CAM 里的自動檢查過一遍確認沒有薄壁、倒扣這些制造禁忌。這套流程甚至不限于 text-to-cad 生成的東西從網(wǎng)上下載的 STEP 模型、同事發(fā)來的中間格式文件我都建議先過一遍。6. 當下面臨的邊界以及我個人的下一步預(yù)期最后聊聊這個技術(shù)的天花板在哪以及它接下來大概會怎么走。這部分的判斷帶有我個人的主觀色彩只能代表我自己的觀察。6.1 語言描述的離散性 vs 連續(xù)幾何的鴻溝自然語言本質(zhì)上是離散的、符號化的而 CAD 幾何是連續(xù)的、精確的。你用外徑 100內(nèi)徑 40這句話能描述一個法蘭但描述不了葉片泵里那個復(fù)雜的三維扭曲曲面。語言能表達的信息量是有限的一句話說不完的細節(jié)模型就只能在后臺猜猜出來的結(jié)果當然不一定符合你的意圖。這也是為什么我現(xiàn)在仍然認為在很長一段時間內(nèi)text-to-cad 最合適的應(yīng)用場景是快速生成標準件、簡單零件、概念草模而不是替代工程師設(shè)計復(fù)雜產(chǎn)品。6.2 裝配體、制造約束與標準件的問題大多數(shù) text-to-cad 工作集中在單個零件但現(xiàn)實工業(yè)里幾乎沒有孤立零件——哪怕一個最簡單的傳感器支架也要和閥體、蓋板、螺栓發(fā)生裝配關(guān)系。生成一個零件容易生成一套配合裝配體難得多因為涉及裝配約束、間隙、公差、命名規(guī)則一系列問題。另外現(xiàn)在的模型基本沒有制造約束的概念。它可以生成一個從渲染圖上完全合理、但用數(shù)控機床根本沒法加工的零件比如無法裝夾、刀具伸不進去的內(nèi)腔。所以我也在持續(xù)關(guān)注那些把可制造性分析接到 text-to-cad 后面的項目這才是一條完整的產(chǎn)品鏈路。6.3 關(guān)于工具和思路的建議如果你問我現(xiàn)階段普通人怎么用 text-to-cad 最劃算我的建議是別追求一步到位生成一個復(fù)雜零件而是把它當做一個**參數(shù)化方向加速器**。先用 text-to-cad 生成一個意思對了的初版再導(dǎo)入專業(yè) CAD 里把細節(jié)修正、把制造工藝加上。這樣比從零開始畫快很多至少省了一張草圖和一堆反復(fù)調(diào)整的時間。我自己現(xiàn)在試得最多的還是LLM 寫 CadQuery這條開源路線因為每一步都可以審、可以改、可以用 git 管版本出錯也不會黑盒。Zoo 這類端到端服務(wù)則適合快速驗證想法、生成演示用的 STEP 文件。兩者不沖突反而互補。說句實在話text-to-cad 還處在玩具到工具之間的位置但它把 CAD 建模從親手畫變成描述需求、審核結(jié)果這個思路已經(jīng)不可逆了。未來很快標準件的生成會變成各種在線 CAD 工具的一個默認按鈕再往后等模型學(xué)會讀懂裝配約束和加工工藝它就會真正進入工程師的日常流程。到那個時候回頭再看今天這些生澀的提示詞調(diào)優(yōu)和特征樹檢查大概會像現(xiàn)在看當年的人肉布線一樣既覺得麻煩又覺得懷念。