言到可編輯參數(shù)化模型)
1. text-to-cad到底解決什么問(wèn)題1.1 先把“能生成3D模型”和“能生成零件”分清楚先說(shuō)個(gè)結(jié)論text-to-cad 不是讓 AI 隨手吐一個(gè)三維模型出來(lái)而是要輸出能進(jìn)加工、裝配、仿真流程的“正經(jīng) CAD 模型”。很多第一次接觸這個(gè)概念的人以為只要對(duì)著電腦說(shuō)一句“幫我畫一個(gè)圓角矩形盒子”就能得到和 SolidWorks 里一模一樣可編輯的零件——這個(gè)期待是對(duì)的但離技術(shù)現(xiàn)狀還有一段距離。我見(jiàn)過(guò)不少項(xiàng)目在這個(gè)點(diǎn)上栽跟頭。團(tuán)隊(duì)拿一個(gè)文本生成點(diǎn)云或網(wǎng)格的開(kāi)源模型跑通了 demo興奮地拿去給機(jī)械工程師看結(jié)果對(duì)方打開(kāi)模型第一句話就是“這個(gè)孔是貫通的嗎圓角能不能改 R3壁厚均勻嗎”工程師關(guān)心的不是渲染效果而是這個(gè)模型能不能放進(jìn)加工環(huán)境、能不能改尺寸、能不能做有限元。text-to-cad 的核心價(jià)值恰恰就藏在這些“能不能”里。這里要區(qū)分兩個(gè)概念一個(gè)是“生成 3D 形狀”另一個(gè)是“生成 CAD 模型”。前者可以是一團(tuán)點(diǎn)云、一個(gè) mesh、一張深度圖只要視覺(jué)上像就行后者必須包含參數(shù)、特征、約束、歷史樹(shù)。CAD 模型的本質(zhì)不是形狀而是一串“制造意圖”的連續(xù)記錄。比如一個(gè)法蘭盤在 CAD 系統(tǒng)里不是一個(gè)圓柱加六個(gè)孔而是由“拉伸基體、切除材料、陣列孔”這些特征組成的操作序列。text-to-cad 要解決的就是這個(gè)問(wèn)題把自然語(yǔ)言描述轉(zhuǎn)換成工程師能繼續(xù)編輯的特征序列。我常用一個(gè)類比來(lái)解釋傳統(tǒng)建模就像口述做菜給一個(gè)廚師廚師會(huì)按你的步驟切菜、配菜、下鍋但你要是只給“我要一道好吃的菜”廚師只能自由發(fā)揮而 text-to-cad 的目標(biāo)是讓 AI 變成那個(gè)能聽(tīng)懂“少鹽、多醋、不要香菜”的幫廚而不是直接把外賣端上桌。1.2 直接生成網(wǎng)格為什么難落地市面上很多“文本轉(zhuǎn) 3D”項(xiàng)目比如文本生成點(diǎn)云、文本生成神經(jīng)輻射場(chǎng)其實(shí)走的是另一條路線。它們擅長(zhǎng)生成視覺(jué)上驚艷的有機(jī)體一只貓、一把椅子、一個(gè)角色概念。但這類結(jié)果到了 CAD 場(chǎng)景里幾乎不可用原因很現(xiàn)實(shí)。網(wǎng)格模型沒(méi)有工程語(yǔ)義。一個(gè)由幾十萬(wàn)三角面片組成的 mesh里面根本沒(méi)有“圓柱”“通孔”“圓角”這些概念。你想把孔直徑從 8mm 改成 9mm網(wǎng)格模型只能整體重生成或手動(dòng)雕刻沒(méi)法像參數(shù)化模型那樣改一個(gè)數(shù)字。同時(shí)網(wǎng)格模型的拓?fù)滟|(zhì)量很難保證經(jīng)常出現(xiàn)破面、重疊三角形、法線翻轉(zhuǎn)、非流形邊。拿去切片打印切片軟件可能會(huì)直接報(bào)錯(cuò)拿去 CAM 編程刀路更是沒(méi)法算。還有精度問(wèn)題。工業(yè) CAD 的尺寸精度通常是微米級(jí)一個(gè)機(jī)械零件如果臺(tái)階厚度差了 0.1mm裝配就可能出問(wèn)題。而生成式網(wǎng)格模型天然是近似表示它的頂點(diǎn)坐標(biāo)、面片密度都服務(wù)于“看起來(lái)像”而不是“量起來(lái)準(zhǔn)”。這就像用像素畫去指導(dǎo)數(shù)控機(jī)床加工本質(zhì)上不是同一個(gè)信息載體。所以 text-to-cad 的技術(shù)路線從一開(kāi)始就注定不能走“生成網(wǎng)格”這條捷徑而是要讓模型學(xué)會(huì)輸出參數(shù)化操作。哪怕最終也要導(dǎo)出成 mesh 用于渲染或打印但在中間環(huán)節(jié)必須有可編輯、可約束、可重算的 CAD 數(shù)據(jù)結(jié)構(gòu)。誰(shuí)能在這一層做得穩(wěn)誰(shuí)才能真正落地。1.3 誰(shuí)適合用text-to-cad先說(shuō)最直接的用戶非專業(yè)建模者。很多 3D 打印玩家有明確需求我要一個(gè)能卡住攝像頭的小支架、一個(gè)路由器掛架、一個(gè)補(bǔ)缺的塑料墊片。他們不想學(xué)一整套 CAD 軟件只想用自然語(yǔ)言描述尺寸和功能。text-to-cad 可以成為“設(shè)計(jì)助手”幫他們生成第一版模型再進(jìn)軟件微調(diào)。另一類是設(shè)計(jì)師和結(jié)構(gòu)工程師的草圖階段。工程師經(jīng)常開(kāi)會(huì)時(shí)口頭描述一個(gè)零件寬度大概 60長(zhǎng)度 100厚度 3四周開(kāi)四個(gè)沉頭孔。過(guò)去要回工位慢慢畫如果有一個(gè) text-to-cad 工具能先畫出基礎(chǔ)特征再到 CadQuery 或 SolidWorks 里補(bǔ)細(xì)節(jié)效率會(huì)高不少。注意這里說(shuō)的是“輔助”不是“替代”目前替代還不現(xiàn)實(shí)。還有自動(dòng)化批量生成場(chǎng)景。比如電商平臺(tái)要按不同參數(shù)生成成千上萬(wàn)款定制銘牌、外殼、齒輪。用傳統(tǒng)模板參數(shù)化當(dāng)然也能做但如果有自然語(yǔ)言入口業(yè)務(wù)人員就能直接描述需求不需要開(kāi)發(fā)改代碼。教學(xué)場(chǎng)景也很有意思讓學(xué)生用自然語(yǔ)言描述設(shè)計(jì)意圖再對(duì)照生成的 CAD 特征樹(shù)學(xué)建模邏輯比從零學(xué)命令快得多。我個(gè)人的判斷是text-to-cad 短期不是要取代 CAD 軟件而是把人和三維建模之間的“輸入門檻”降低一大截。它能做的事是讓“畫一個(gè)東西”變得更像“說(shuō)一個(gè)東西”。2. 主流技術(shù)路徑從文本到參數(shù)化模型2.1 核心是把語(yǔ)言翻譯成構(gòu)造步驟目前比較靠譜的 text-to-cad 實(shí)現(xiàn)幾乎都是同一個(gè)思路讓大型語(yǔ)言模型把文本翻譯成一份 CAD 構(gòu)造腳本。所謂 CAD 構(gòu)造腳本就是一系列可執(zhí)行的建模操作例如“創(chuàng)建一個(gè)平面草圖畫一個(gè)矩形拉伸到 10mm在中心打一個(gè)直徑 5mm 的孔”。這類腳本語(yǔ)言包括 OpenSCAD、CadQuery、SolidPython、FreeCAD 的 Python API 等。為什么要用代碼作為中間表示因?yàn)槲谋臼请x散的代碼也是離散的語(yǔ)言模型處理連續(xù)的點(diǎn)云反而不擅長(zhǎng)。文本描述“凸臺(tái)邊長(zhǎng) 20高 5”可以直接映射到代碼里的cube([20, 20, 5])這種 token 級(jí)別的映射關(guān)系是語(yǔ)言模型天然可以學(xué)習(xí)的。反過(guò)來(lái)如果讓模型直接回歸三維坐標(biāo)誤差控制非常難而且很難引入“約束”信息。這里有個(gè)關(guān)鍵點(diǎn)CAD 腳本不是簡(jiǎn)單的一句代碼而是一棵樹(shù)。OpenSCAD 的布爾運(yùn)算本身就是一個(gè) CSG 樹(shù)CadQuery 則是面向?qū)ο蟮奶卣餍蛄?。我們要?AI 學(xué)會(huì)的是如何從自然語(yǔ)言中提取實(shí)體、屬性、空間關(guān)系并組織成合法的操作樹(shù)。比如“在圓盤中央打一個(gè)通孔”模型不僅要識(shí)別出“圓盤”和“孔”兩個(gè)實(shí)體還要知道“中央”是位置約束、“通孔”是貫穿特征。所以在實(shí)際項(xiàng)目里我不建議直接用大模型輸出純 OpenSCAD 代碼。更穩(wěn)的方案是設(shè)計(jì)一個(gè)受限的中間 DSL領(lǐng)域?qū)S谜Z(yǔ)言比如 JSON 格式的特征列表{ features: [ {type: cylinder, radius: 20, height: 10, origin: [0, 0, 0]}, {type: hole, radius: 4, origin: [0, 0, 0], through: true} ], units: mm }然后寫一個(gè)解釋器把這個(gè) JSON 轉(zhuǎn)成 OpenSCAD 或 CadQuery 腳本。這樣做的原因是讓大模型直接生成自由代碼語(yǔ)法錯(cuò)誤率太高但如果讓它生成結(jié)構(gòu)化 JSON再交給固定解釋器渲染就把“語(yǔ)義理解”和“語(yǔ)法生成”分離了。前者是大模型擅長(zhǎng)的后者是傳統(tǒng)代碼可以兜底的。2.2 三種常見(jiàn)表示空間怎么選text-to-cad 的技術(shù)路徑中中間表示的選擇決定了整個(gè)系統(tǒng)的上限。我總結(jié)下來(lái)主流方案有三類。第一類是程序化代碼表示代表工具是 OpenSCAD、CadQuery。它生成的模型自帶參數(shù)和特征可編輯性最強(qiáng)也最容易驗(yàn)證。缺點(diǎn)是表達(dá)能力受限于腳本語(yǔ)言復(fù)雜的自由曲面很難表達(dá)需要依賴放樣、掃掠、曲面建模等高級(jí)操作。第二類是隱式場(chǎng)表示比如 SDF符號(hào)距離場(chǎng)、占用場(chǎng)。這類表示適合生成有機(jī)形狀比如閥體、外殼、人體工程學(xué)手柄。模型輸出一個(gè)函數(shù)空間中每個(gè)點(diǎn)返回“到表面的距離”或“是否在體內(nèi)”再?gòu)暮瘮?shù)里提取等值面生成網(wǎng)格。優(yōu)點(diǎn)是表達(dá)能力強(qiáng)能生成任意拓?fù)淙秉c(diǎn)是提取網(wǎng)格后仍然是 mesh無(wú)法直接進(jìn)入 CAD 特征樹(shù)需要再做逆向。AutoSDF、Point-E 這類方法都在這個(gè)方向上。第三類是點(diǎn)云或體素表示通常作為中間輸出再配合后續(xù)的曲面重建進(jìn)入 CAD。點(diǎn)云本身不帶任何工程語(yǔ)義需要額外步驟因此目前更多用于“文本生成形狀”的研究不太適合直接做機(jī)械零件。我給一個(gè)不太嚴(yán)謹(jǐn)?shù)軐?shí)用的選擇建議如果目標(biāo)是加工件、標(biāo)準(zhǔn)件、裝配體優(yōu)先選代碼生成因?yàn)樘卣鳌⒊叽纭⒓s束都在如果目標(biāo)是概念外形、外觀件可以考慮隱式場(chǎng)如果只是做設(shè)計(jì)靈感預(yù)覽那就無(wú)所謂了點(diǎn)云、網(wǎng)格都行。也就是說(shuō)越接近制造環(huán)節(jié)越要偏向可編輯的程序化表示。2.3 端到端生成與傳統(tǒng)兩步走的取舍有些研究論文追求一個(gè)模型從文本直接輸出 CAD 操作序列也就是端到端。這種方案聽(tīng)起來(lái)很爽實(shí)際訓(xùn)練起來(lái)卻非常吃數(shù)據(jù)和算力。CAD 操作序列本身是一種帶層級(jí)結(jié)構(gòu)的程序語(yǔ)言模型要同時(shí)學(xué)會(huì)語(yǔ)義理解、幾何推理、語(yǔ)法約束和參數(shù)回歸任何一個(gè)環(huán)節(jié)出錯(cuò)都會(huì)崩盤。我見(jiàn)過(guò)的端到端 demo大多是訓(xùn)練數(shù)據(jù)里見(jiàn)過(guò)的類似句式能跑通換一個(gè)說(shuō)法就完全失靈。相比而言兩步走方案在工程上更穩(wěn)妥。第一步先用語(yǔ)言模型做信息抽取識(shí)別文本中的實(shí)體、數(shù)量、單位、位置關(guān)系。第二步再用規(guī)則或模板規(guī)劃生成 CAD 操作。比如“一個(gè) 40mm × 30mm × 5mm 的底座四角帶 M3 沉頭孔”第一步先抽取出“底座、四個(gè)孔、M3、矩形陣列”第二步查標(biāo)準(zhǔn)件庫(kù)得到 M3 沉頭孔的尺寸然后生成 CadQuery 代碼。兩步走的好處是可以引入外部知識(shí)庫(kù)和規(guī)則約束。沉頭孔的標(biāo)準(zhǔn)尺寸不該靠模型“想象”而是查表。倒角該倒多大、螺紋底孔該鉆多大都應(yīng)由工藝規(guī)范決定。這些信息用外部規(guī)則注入比讓模型硬記可靠得多。所以我的判斷是當(dāng)前階段工程應(yīng)用應(yīng)優(yōu)先做可控的分步系統(tǒng)而不是迷信一個(gè)“黑盒”端到端模型。3. 落地實(shí)操?gòu)囊痪涿枋龅娇纱蛴〉腟TL文件3.1 先搭一個(gè)最小可用的環(huán)境拿一個(gè)最簡(jiǎn)單的場(chǎng)景舉例從自然語(yǔ)言生成 OpenSCAD 模型再導(dǎo)出 STL 用于 3D 打印。這個(gè)流程足夠小卻覆蓋了 text-to-cad 的幾個(gè)關(guān)鍵節(jié)點(diǎn)語(yǔ)義解析、代碼生成、渲染校驗(yàn)、導(dǎo)出制造格式。環(huán)境準(zhǔn)備只需要三樣?xùn)|西Python 環(huán)境用于調(diào)用大模型和編寫解析邏輯OpenSCAD 命令行工具用于把腳本渲染成 PNG 或?qū)С?STL以及一個(gè)文本編輯器或 Jupyter Notebook。如果你希望生成更現(xiàn)代的腳本式模型也可以裝 CadQuery它的 Python API 比 OpenSCAD 更接近傳統(tǒng) CAD 的特征思維但最小示例用 OpenSCAD 就夠了。安裝 OpenSCAD 之后記得確認(rèn)命令openscad在 PATH 里。在 Linux 下可以用apt install openscadmacOS 下用 Homebrew 安裝Windows 下安裝后手動(dòng)把可執(zhí)行文件路徑加進(jìn) PATH。這個(gè)步驟看起來(lái)簡(jiǎn)單但很多人卡在腳本調(diào)用時(shí)找不到可執(zhí)行文件后面所有自動(dòng)化都會(huì)報(bào)錯(cuò)。3.2 一個(gè)從文本到OpenSCAD腳本的完整示例假設(shè)用戶輸入這樣一句話“一個(gè)直徑 40mm、高 10mm 的圓柱中心打一個(gè)直徑 8mm 的通孔?!边@是一個(gè)非常典型的入門級(jí)描述。先讓大模型做結(jié)構(gòu)化抽取輸出 JSON{ base: {type: cylinder, radius: 20, height: 10}, hole: {type: hole, radius: 4, through: true} }然后由一個(gè)解釋器生成 OpenSCAD 腳本$fn 64; difference() { cylinder(r 20, h 10); cylinder(r 4, h 10); }這里有兩個(gè)細(xì)節(jié)常被新手忽略。第一文本說(shuō)“直徑 40mm”半徑是 20mm文本說(shuō)“直徑 8mm”半徑是 4mm。模型如果不理解“直徑”和“半徑”的轉(zhuǎn)換生成結(jié)果會(huì)大錯(cuò)特錯(cuò)。所以在結(jié)構(gòu)化表達(dá)中我建議直接統(tǒng)一使用半徑并把“直徑/半徑”的轉(zhuǎn)換放在語(yǔ)義解析階段完成不要讓解釋器再去猜。第二OpenSCAD 的$fn參數(shù)控制圓的逼近精度。實(shí)際打印時(shí)如果$fn設(shè)置成 64圓柱側(cè)面看起來(lái)已經(jīng)足夠光滑但如果用于精密零件建議用更高的$fn或改用$fa、$fs控制角度和尺寸誤差。還有一點(diǎn)通孔的建模用cylinder加上difference布爾減法是常規(guī)做法但如果你希望孔在工程上更真實(shí)考慮錐角、沉頭等特征時(shí)就不能只用一個(gè)簡(jiǎn)單的圓柱了那屬于后處理階段需要補(bǔ)充的工藝細(xì)節(jié)。生成腳本后立刻進(jìn)行渲染預(yù)覽在命令行執(zhí)行openscad -o preview.png -D $fn64 part.scad如果命令沒(méi)有報(bào)錯(cuò)并生成了一張正常圖片說(shuō)明基本語(yǔ)法沒(méi)問(wèn)題。但別高興太早這只是第一步。3.3 不能只看渲染圖自動(dòng)校驗(yàn)的四個(gè)環(huán)節(jié)文本生成代碼最大的風(fēng)險(xiǎn)是“看起來(lái)對(duì)實(shí)際不能用”。很多 AI 生成的 OpenSCAD 模型渲染預(yù)覽能通過(guò)切片時(shí)卻出問(wèn)題。我自定義了一套四步校驗(yàn)流程每次批量生成都跑一遍。第一步是語(yǔ)法校驗(yàn)。用 OpenSCAD 的--check-parameters這類參數(shù)檢查或直接用 Python 的 AST 解析腳本看看有沒(méi)有未定義變量、括號(hào)不匹配、函數(shù)名拼錯(cuò)。代碼層面的錯(cuò)誤要最先干掉。第二步是幾何校驗(yàn)。導(dǎo)出 STL 之后用admesh、MeshLab或 Python 的trimesh庫(kù)檢查 STL 是不是閉合的流形有沒(méi)有朝向錯(cuò)誤的面、破洞、自相交。對(duì)于打印來(lái)說(shuō)非流形模型等于廢件。第三步是尺寸校驗(yàn)。把腳本里的關(guān)鍵參數(shù)抽出來(lái)和用戶輸入的要求做比對(duì)直徑對(duì)不對(duì)、高度對(duì)不對(duì)、孔位間距對(duì)不對(duì)。這一步不是看渲染圖而是做數(shù)值斷言。比如用戶要求“中心孔距底面 30mm”生成的代碼里translate([0, 0, 30])就必須真有一個(gè)30。第四步是工程校驗(yàn)。是否有拔模角度壁厚是否小于打印機(jī)能承受的極限孔是否有過(guò)盈配合需要這類規(guī)則沒(méi)法靠單一模型解決需要一套規(guī)則庫(kù)。我的做法是把校驗(yàn)規(guī)則寫成 Python 檢查器在生成流水線里逐個(gè)執(zhí)行檢查不通過(guò)就觸發(fā)“重新生成”或“標(biāo)記人工審核”。3.4 批量生成時(shí)的工程化提示當(dāng)你開(kāi)始批量處理幾十條描述時(shí)就不能一條條手動(dòng)跑命令了。我會(huì)把所有流程包裝成一個(gè)函數(shù)def text_to_stl(description: str, out_path: str): spec llm_extract(description) script build_openscad(spec) if not validate_syntax(script): raise ValueError(syntax check failed) tmp_scad write_temp(script) preview render_preview(tmp_scad) stl_path export_stl(tmp_scad, out_path) if not validate_mesh(stl_path): raise RuntimeError(mesh not manifold) return stl_path這個(gè)函數(shù)里我刻意把每一步拆開(kāi)原因是方便定位問(wèn)題。如果生成的 STL 流形不通錯(cuò)誤信息可以直接告訴你是語(yǔ)法、幾何還是尺寸階段失敗而不是讓你面對(duì)一團(tuán)亂麻的報(bào)錯(cuò)日志。還有一個(gè)工程化細(xì)節(jié)大模型的 temperature 參數(shù)要調(diào)低。text-to-cad 和聊天不同這里要的是穩(wěn)定輸出不是創(chuàng)意發(fā)揮。temperature 設(shè)置在 0.1 到 0.2 之間能顯著減少隨機(jī)生成的“胡話參數(shù)”。另外system prompt 里必須寫明“只輸出 JSON不要解釋”否則模型把思考過(guò)程也輸出出來(lái)解釋器直接崩潰。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 文本歧義AI把“薄壁”理解成模型的一個(gè)薄片自然語(yǔ)言天生有歧義這在 text-to-cad 里會(huì)被放大。比如“兩孔之間的薄壁厚度是 2mm”AI 可能把這個(gè)“薄壁”理解成單獨(dú)一個(gè)薄片實(shí)體而不是兩個(gè)孔之間的距離約束。我遇到最典型的例子是用戶說(shuō)“做一個(gè)小外殼壁厚 1.5mm”結(jié)果生成的模型是“一個(gè)壁厚 1.5mm 的實(shí)體板”而不是一個(gè)空心的薄壁容器。解法有兩種。第一種是在提示詞工程里做約束要求模型把“壁厚”識(shí)別為“殼操作”或“布爾減去的內(nèi)部偏移”并且在中間表示里明確字段wall_thickness。第二種是后規(guī)則校驗(yàn)如果檢測(cè)到文本里出現(xiàn)“外殼”“盒體”“壁厚”等詞匯而生成的模型沒(méi)有布爾挖空操作就判定為語(yǔ)義解析失敗觸發(fā)重新生成。遇到歧義時(shí)我傾向于讓模型輸出多個(gè)候選解釋再讓用戶選擇。比如“做一個(gè)長(zhǎng) 50 的盒子”到底是內(nèi)長(zhǎng)還是外長(zhǎng)先讓模型生成兩個(gè)版本標(biāo)注“內(nèi)尺寸版本”和“外尺寸版本”這種交互比強(qiáng)行讓 AI 猜一個(gè)要可靠得多。4.2 尺寸單位與半徑直徑混淆單位問(wèn)題是 text-to-cad 的隱形殺手。CAD 領(lǐng)域默認(rèn)用毫米但普通用戶可能說(shuō)“4 厘米”“3 英寸”。如果系統(tǒng)沒(méi)有單位換算后面所有尺寸都會(huì)對(duì)不上。我的建議是在語(yǔ)義解析階段直接統(tǒng)一到毫米并在 JSON 里記錄原始單位和原始數(shù)值方便追溯。另一個(gè)高頻錯(cuò)誤是“直徑/半徑”不分的幻覺(jué)。用戶說(shuō)“直徑 10 的孔”模型卻生成r 10。這個(gè)問(wèn)題看起來(lái)很蠢但語(yǔ)言模型非常容易混淆因?yàn)椤?0”出現(xiàn)在描述里模型就傾向于直接作為參數(shù)。補(bǔ)救方法是建立關(guān)鍵詞歸一化表與“直徑”對(duì)應(yīng)的 key 是diameter然后在解釋器里做radius diameter / 2而不是讓模型自己換算。4.3 布爾運(yùn)算與拓?fù)溴e(cuò)誤OpenSCAD 的difference、union、intersection是 CSG 布爾運(yùn)算對(duì)輸入幾何體的要求很嚴(yán)格。當(dāng)兩個(gè)圓柱共面、一個(gè)立方體正好貼住另一個(gè)立方體的面時(shí)OpenSCAD 可能產(chǎn)生退化面、零厚度邊最后導(dǎo)出的 STL 流形不閉合。最典型的場(chǎng)景是“在方形底板的中心挖一個(gè)剛好與板厚度相等的貫通槽”。由于槽高度和板厚度完全相等布爾求差時(shí)兩個(gè)體在 Z 方向“恰好相切”軟件無(wú)法穩(wěn)定判斷邊界渲染圖上可能顯示正確導(dǎo)出 STL 后卻出現(xiàn)裂縫。排查策略是對(duì)每個(gè)布爾操作“留一點(diǎn)點(diǎn)余量”。比如挖槽的高度比底板厚度多 0.001mm或者把分割平面做一次微小偏移讓布爾操作“穿過(guò)”而不是“擦過(guò)”。經(jīng)驗(yàn)規(guī)則是參與布爾運(yùn)算的體盡量讓它們有明確的相交區(qū)域避免共面接觸。4.4 LLM幻覺(jué)代碼與參數(shù)失控大模型生成代碼時(shí)會(huì)一本正經(jīng)地編造不存在的函數(shù)或參數(shù)。比如 OpenSCAD 里根本沒(méi)有chamfer圓角命令它卻可能生成chamfer(...)。這種問(wèn)題特別的隱蔽因?yàn)槟_本報(bào)錯(cuò)后初學(xué)者第一反應(yīng)是去查 OpenSCAD 文檔沒(méi)想到是模型在“一本正經(jīng)地胡說(shuō)八道”。解決辦法是不要讓它直接輸出“自由文本代碼”而是讓它生成受限的 JSON 特征指令再由本地的“可執(zhí)行函數(shù)庫(kù)”映射到 OpenSCAD 或 CadQuery。如果某個(gè)特性比如倒角當(dāng)前還不支持JSON 解釋器就直接報(bào)“不支持該特征”而不是讓模型臨場(chǎng)發(fā)揮。另一個(gè)幻覺(jué)點(diǎn)是參數(shù)范圍。模型可能生成半徑 1e8 的巨大圓柱或者負(fù)高度的立方體。所以每個(gè)參數(shù)都要做范圍檢查radius 必須大于 0 且小于 1000height 必須大于 0 且小于 1000。數(shù)值校驗(yàn)是成本最低、收益最高的防線。4.5 數(shù)據(jù)依賴與泛化邊界text-to-cad 模型的泛化能力目前受限于訓(xùn)練數(shù)據(jù)。開(kāi)源社區(qū)在做 Text2CAD 這類數(shù)據(jù)集把 CAD 模型的操作序列和文本描述配對(duì)。這類數(shù)據(jù)合成思路是對(duì)的但覆蓋范圍還比較窄大多是機(jī)械零件、規(guī)則幾何體。一旦遇到汽車曲面、復(fù)雜裝配體、需要自由曲面建模的造型模型的表現(xiàn)就會(huì)斷崖式下跌。所以我的建議是把它當(dāng)“規(guī)則零件的輔助設(shè)計(jì)器”用別拿它當(dāng)“萬(wàn)能建模師”。在業(yè)務(wù)落地時(shí)先盤點(diǎn)自己的需求是否落在訓(xùn)練數(shù)據(jù)覆蓋范圍內(nèi)。如果都是板件、軸、套、孔系結(jié)構(gòu)那 text-to-cad 能發(fā)揮很大價(jià)值如果涉及外觀創(chuàng)意設(shè)計(jì)建議找另一個(gè)技術(shù)路線。5. 工具選型與學(xué)習(xí)建議5.1 不同需求對(duì)應(yīng)不同技術(shù)棧需求場(chǎng)景推薦中間表示推薦工具理由機(jī)械零件、標(biāo)準(zhǔn)件特征序列CadQuery / SolidPython貼近 CAD 特征思維參數(shù)改動(dòng)方便3D 打印外殼、支架CSG 樹(shù)OpenSCAD語(yǔ)法簡(jiǎn)單AI 容易生成驗(yàn)證快概念外觀、自由曲面隱式場(chǎng)SDF / 神經(jīng)隱式模型表達(dá)能力更強(qiáng)適合有機(jī)形態(tài)裝配體、多零件設(shè)計(jì)參數(shù)約束網(wǎng)絡(luò)FreeCAD Python API支持裝配關(guān)系但技術(shù)門檻更高純?cè)O(shè)計(jì)靈感預(yù)覽點(diǎn)云或網(wǎng)格現(xiàn)成文本生成 3D 模型快但不適合工程化這段表格不是絕對(duì)標(biāo)準(zhǔn)但可以作為技術(shù)選型的第一層過(guò)濾器。機(jī)械場(chǎng)景里我強(qiáng)烈建議優(yōu)先掌握 CadQuery。它的思想是“先建平面草圖、再拉伸旋轉(zhuǎn)、再打孔”和主流 CAD 軟件的操作邏輯一致所以模型生成的代碼也更接近真實(shí)設(shè)計(jì)步驟。5.2 開(kāi)源項(xiàng)目怎么讀才不走彎路很多人讀 text-to-cad 相關(guān)的論文或開(kāi)源倉(cāng)庫(kù)一上來(lái)就盯模型架構(gòu)、loss 函數(shù)結(jié)果越看越暈。我建議先看數(shù)據(jù)再看中間表示最后看模型結(jié)構(gòu)。因?yàn)檫@類任務(wù)最大的難點(diǎn)往往不是模型而是數(shù)據(jù)如何構(gòu)造。先看訓(xùn)練數(shù)據(jù)長(zhǎng)什么樣一條文本描述對(duì)應(yīng)幾個(gè)操作步驟操作步驟是用序列化的 JSON 表示還是一段 CadQuery 代碼如果數(shù)據(jù)本身質(zhì)量不高模型再先進(jìn)也白搭。再看中間表示是否支持“可逆執(zhí)行”。也就是從表示能不能直接重建出模型并且能不能方便地做局部修改。如果中間表示是固定長(zhǎng)度的向量那基本不具備工程價(jià)值頂多發(fā)論文。最后才是模型。我個(gè)人的經(jīng)驗(yàn)是當(dāng)前階段與其去訓(xùn)練一個(gè)新模型不如先在大模型預(yù)訓(xùn)練基礎(chǔ)上做少量微調(diào)或直接做 in-context learning。LSTM 時(shí)代那種從零訓(xùn)練序列模型的方式已經(jīng)被大模型取代了別走回頭路。5.3 幾條寫在最后的大實(shí)話如果讓我總結(jié) text-to-cad 真正重要的東西我會(huì)說(shuō)不是模型從文本生成能力而是“約束系統(tǒng)”。一個(gè)能讓 AI 自由發(fā)揮的文本生成器和一個(gè)能把結(jié)果約束在制造規(guī)則之內(nèi)的生成器是完全不同的產(chǎn)品。普通用戶只看到渲染圖工程師卻會(huì)檢查尺寸、公差、螺紋孔、壁厚、材料收縮率。這些約束越早進(jìn)入系統(tǒng)落地的概率越大。在實(shí)際操作中我把大模型當(dāng)“翻譯官”而不是“設(shè)計(jì)師”。它負(fù)責(zé)把用戶的話翻譯成結(jié)構(gòu)化訴求剩下的幾何生成和校驗(yàn)交給規(guī)則系統(tǒng)。這樣可以充分發(fā)揮大模型的語(yǔ)義理解能力同時(shí)避免它的幻覺(jué)和不確定性。你可以在提示詞里加上一句話“如果你的描述有歧義請(qǐng)輸出你能想到的默認(rèn)假設(shè)并單獨(dú)列出假設(shè)條件?!边@比讓模型悶頭生成更可控。還有一個(gè)小技巧每個(gè)生成的模型都保留當(dāng)時(shí)的“輸入文本、中間 JSON、最終腳本”三件套存成一個(gè)可追溯的 case。下次模型表現(xiàn)不對(duì)時(shí)翻出歷史 case 對(duì)比能更快定位是語(yǔ)義抽取問(wèn)題還是解釋器問(wèn)題。我就靠這個(gè)辦法把模型的單次成功率從八成提到了九成以上。最后再分享一個(gè)我常用的驗(yàn)證思路拿到一個(gè) text-to-cad 生成結(jié)果別先急著看正面渲染圖先剖開(kāi)看內(nèi)部。把模型切一半看壁厚是否均勻、孔道是否貫通、倒角是否如預(yù)期。文本生成模型的很多錯(cuò)誤藏在內(nèi)部比藏在表面多得多。做設(shè)計(jì)工具的人一定要有“切開(kāi)模型”的習(xí)慣。