最近一段时间,text-to-cad的热度明显涨上来了,身边不少做机械结构、工业设计和数控加工的工程师都在问同一件事:能不能用一句自然语言,直接生成一个能用的三维模型?我理解这种期待。传统CAD建模的痛点太直接了:新建草图、画线、标约束、拉伸、切除、打孔、阵列,每一步都不能少,中间想改个尺寸还要回头翻参数。text-to-cad要解决的正是这个——让计算机理解人的语言,输出一个真正可以在CAD软件里继续编辑、重新参数化的三维实体模型。这篇文章不打算堆概念,我把这个方向的底层原理、主流技术路线、可以上手的开源工具,以及自己复现和试用过程中的踩坑记录整理出来,适合算法工程师、结构设计工程师,也对所有关注AI辅助设计的人有参考价值。
1. 为什么 text-to-CAD 不是"文生图加个三维通道"那么简单
1.1 图像生成和CAD建模的目标函数完全不一样
很多人第一次接触这个方向,会觉得它跟文生图差不多:输入提示词,模型生成结果,只不过输出从二维像素变成了三维网格。这个类比基本成立,但也正是它容易把人带偏。
图像生成的核心是"语义上的合理"。你生成一张猫咪图,尾巴角度歪了5度、耳朵轮廓差了几个像素,普通人看不出问题,甚至AI绘画圈还有"崩图也有艺术感"的说法。但CAD模型不一样,它服务的对象是加工、装配、仿真,几何尺寸错了就是废品。举个最简单的例子:一块板上有4个孔,模型的孔中心如果偏移了1毫米,视觉上完全看不出来,但实际装配时螺丝就是装不上,轻则返工,重则整个零件报废。
所以图像生成可以用CLIP分数、人工打分这类模糊指标评估,而text-to-cad的评估要落到几何精度、拓扑合法性、参数可修改性这些硬指标上。生成一个"长得像法兰盘的mesh"很容易,但生成一个"孔距公差正确、能导入CNC程序、能继续编辑"的STEP实体模型,是另一个难度级别的事。
1.2 CAD的底层表达比三维网格高一个量级
要理解这个方向为什么难,先得知道CAD数据到底是什么。我们平时在网页上看到的三维模型,大多数是三角网格(mesh),本质是一堆顶点和三角形面片,只能表达外观,没有内部结构,也不能做参数化修改。而工业级CAD软件里的模型至少分三类表达方式:
第一类是边界表示,也就是B-rep。模型由顶点、边、面以及它们之间的拓扑关系构成,面可以是平面、圆柱面、NURBS曲面,边可以是圆弧、样条曲线。B-rep模型的每个面都有精确的数学表达,所以能被数控加工、有限元仿真直接使用。
第二类是构造实体几何,也就是CSG。模型被表示成一系列基本体(方块、圆柱、球)和布尔运算(并集、差集、交集)组成的树。这种表达直观,但表达复杂造型时树会变得很庞大。
第三类是特征历史树,这是最贴近真实设计流程的表达。一个模型在CAD软件里的操作历史——拉伸、旋转切除、打孔、倒角、阵列——被完整记录,每个特征还有可修改的参数。现代CAD软件几乎都基于这个思想。
text-to-cad面临的关键问题,就是要从一句话自然语言中同时推理出几何形状、建模步骤和设计约束。模型不仅要学会"这是什么形状",还要学会"这个形状是用什么特征一步步做出来的"。这比图像生成多了一个"设计意图"的维度。可以这样理解:文生图是拍一张好照片,text-to-cad是交付一份还能修改尺寸的施工图,而且每一根尺寸线都是活的参数。
1.3 用户真正要的是"可编辑的参数化实体"
我在实际试用这类工具时发现一个规律:刚开始大家都被"一句话生成模型"惊艳,但兴奋期一过,最关心的问题永远是下面三个——导出的格式是不是STEP或原生CAD文件格式?模型能不能在软件里继续改尺寸?改完尺寸后关联特征会不会自动更新?
这个需求本质上就是"参数化实体"。当前很多文本生成三维模型的方法,输出的是mesh,本质上是一个"看得见摸不着"的雕塑,导入CAD后既不能继续拉伸切除,也不能改孔距,只能当视觉参考,实用性大打折扣。所以,真正意义上的text-to-cad项目,早期设计目标就要定在"生成可编辑的CAD特征序列或CAD脚本"上,而不是生成一张好看的渲染图。这个目标一旦定下来,后面的技术选型逻辑就完全不一样了。
2. 三条主路线的进化:从"看起来像"到"真的能改"
2.1 老路线:生成体素、点云和隐式场,快但不可用
最早一批文本到三维模型的研究,走的是体素、点云、隐式神经场这类路线。思路很直接:用文本编码器提取语义特征,再用生成模型输出三维形状的概率分布。这类方法能跑通、能出图,也能做形状插值,但产物基本都是mesh级别的表面,不带特征信息、不带参数、不带建模历史。
我在调研阶段专门试过这类开源模型,直观感受是:它们更适合游戏资产或影视视效的概念设计。比如你说"一把木质椅子",它能给一个像模像样的模型;但你说"一块120×80×10的铝合金板,四角各有一个直径8的孔",它输出的结果在尺寸精度上基本不可控,甚至孔的数量都会错。原因不难理解,这类模型是在三维形状的统计分布上做采样,它天然擅长"整体形状",不擅长"精确特征"。
2.2 核心路线:把CAD建模命令当成序列来生成
后来这个领域找到了更贴近CAD本质的路线——把建模过程当成一个序列生成问题来建模。典型代表是DeepCAD和Text2CAD这一系列工作。
这个思路的精髓在于,它把一个个CAD特征(新建草图、画直线、画圆弧、标注约束、拉伸、打孔、倒角)离散化成固定词表上的token,于是生成一个CAD模型就等价于生成一段token序列。模型本身可以用Transformer架构来训练,条件变量是自然语言描述,输出是完整的建模命令序列。得到序列之后,在CAD软件或Open CASCADE内核里逐条重放,就能重建出实体模型。
这条路线之所以比生成mesh有前途,是因为输出是结构化特征序列,天然满足"可编辑"需求——序列中每个特征都对应真实建模操作,修改指定参数就能更新模型。但它的难点也非常实际:第一,一个稍微复杂的零件,建模序列可能包含上百个token,序列越长,误差积累越明显,前面某个草图的坐标偏移一点,后面所有特征全受影响;第二,训练数据不够通用,目前能用的CAD命令级数据集以机械零件为主,对自由曲面、复杂装配几乎没有覆盖;第三,生成结果需要合法性校验,不是任何token序列都能重建成合法实体。
2.3 大模型路线:让LLM直接写CAD脚本,通用性最强
深度学习之外还有一条工程上最容易落地的路线:直接让大语言模型编写CAD脚本。以CadQuery和OpenSCAD这两个为代表,CadQuery是Python库,通过面向对象方式描述草图、拉伸和布尔运算;OpenSCAD则是纯代码式CAD,模型完全由脚本生成。
这条路线本质上是把text-to-cad转化成了代码生成问题。而代码生成恰好是大语言模型最擅长的事情之一。GPT-4、Claude这类模型见过大量编程语料,对几何关系和自然语言的理解都要好于专门的CAD生成模型,配合检索增强(把常用建模代码片段作为示例注入提示词),效果可以做到相当可用。
我在实际使用中,这样的组合能稳定处理"四边都有倒角的矩形板加中心通孔""带六角法兰面的安装座"这类中等复杂度零件。生成结果不再是一堆不可编辑的mesh,而是一段可重复执行的Python代码,改参数就是改变量,导出STEP也只需一行命令。当然它也有短板:生成代码偶尔会出现语义正确语法错误的"幻觉"、坐标系方向搞反、用错了CadQuery方法参数,这些都需要一套"生成—执行—检验—修复"的闭环去兜底。
2.4 三条路线怎么选
这三条路线没有绝对优劣,关键看产物交付形态。我整理了一张对比表,方便你按自己的需求快速判断:
| 技术路线 | 代表做法 | 产物类型 | 优点 | 缺点 |
|---|---|---|---|---|
| 直接生成3D表示 | 体素/点云/神经场 | mesh级模型 | 生成快、视觉效果好 | 无可编辑特征、无精确尺寸 |
| CAD命令序列生成 | DeepCAD、Text2CAD等 | 可重放的特征步骤 | 贴近真实CAD流程、可编辑 | 数据少、长序列误差、泛化受限 |
| 大模型编写CAD脚本 | LLM + CadQuery / OpenSCAD | 代码 + 可导出STEP实体 | 语义理解强、通用性高、易集成 | 生成代码稳定性需校验,依赖代码库 |
| 扩散模型改造CAD表达 | 扩散在潜在CAD表示上 | B-rep或参数化中间表达 | 前沿、能处理连续曲面 | 工程成熟度低、复现成本高 |
对绝大多数想尽快用起来的团队,我会建议走第三条路线;如果要发论文、做算法研究,第二条路线仍然是最接近CAD本质的方向;如果只是做产品概念演示或内部评审的可视化素材,第一条路线成本最低、出图最快。
3. 可上手的工具盘点:哪些值得装、哪些只适合围观
3.1 开源界的网红:Text2CAD项目本身
Text2CAD是当前这个方向里被讨论最多的开源项目之一。它的做法和上面提到的"CAD命令序列生成"路线一致:在DeepCAD的建模命令序列之上,通过指令微调让模型学会从自然语言映射到CAD操作序列。训练数据主要来自Fusion 360 Gallery这类大规模CAD数据集,这些数据带有原始特征树,可以反向用于指令配对。
如果你主要目的是做研究、跑实验、对比算法指标,我建议认真复现一遍这个项目。它把数据预处理、tokenizer构建、模型训练、序列到CAD重建的完整链路都串起来了,是学习这个方向最好的入门口。但如果你只是一个想快速出模型的设计师,我不建议直接部署它——原始模型对自然语言的容错率没有那么高,句子表述稍微绕一点,生成出来的建模序列就可能出现几何上可行但语义不对的情况。
3.2 实用性最强的组合:LLM + CadQuery
这个组合我在实际工作中用了一年多,是目前投入产出比最高的方案。核心方法很简单:把需求描述成一段自然语言,交给大语言模型生成CadQuery脚本,然后在本地Python环境里执行脚本,通过Open CASCADE内核做布尔运算和导出STEP。
一个最小可复现的例子是这样。提示词写清楚"生成一个120×80×10、四角radius 5倒角、四个直径8通孔、中心直径30通孔的矩形板",模型会输出类似下面的代码:
import cadquery as cq result = ( cq.Workplane("XY") .box(120, 80, 10) .edges().fillet(5) .faces(">Z").workplane() .pushPoints([(40, 20), (-40, 20), (40, -20), (-40, -20)]) .hole(8) .faces(">Z").workplane() .center(0, 0).hole(30) ) cq.exporters.export(result, "plate_with_holes.step")这段代码生成的实体模型,可以直接导入FreeCAD、Fusion 360等软件继续编辑。就算某一步生成出错,报错信息也会指向具体CadQuery方法,通常让模型看一眼报错信息再返修一次,就能解决问题。
3.3 浏览器端的轻量方案:CADmium这类项目
如果你不想搭Python环境,可以关注CADmium这类开源项目。它把CAD建模搬进了浏览器,界面内可以直接切换AI代理,通过自然语言生成CadQuery源码,然后在浏览器里完成几何体预览。优势是零安装、演示效果好,适合给非技术背景的同事展示text-to-cad的完整概念。
但它也有明显的天花板:浏览器端的几何内核性能不如本地Open CASCADE,面对复杂装配和高精度曲面会吃力;项目本身还在快速迭代,接口不一定稳定,不适合直接接入生产管线。我把它定位成"交互式demo验证工具"。
3.4 商业软件方向的现状判断
传统CAD巨头和一些创业公司也都在做这个方向,有的是在原生CAD软件里加AI提示入口,有的是做"自然语言+参考图片直接生成特征历史"的插件。现阶段它们的共同策略是:尽量不交出"一次性生成的死模型",而是让AI参与最耗时间的草图构建和特征排列,生成结果仍然保留完整特征树和参数,方便设计师二次修改。这个方向我认为是对的,因为真实工业场景里,设计决策是不可替代的,AI最先取代的一定是重复性特征操作。
3.5 按用途选型的思路总结
结合我自己的经验,做工具选型时可以按下面这个逻辑来对号入座:
- 只是想给方案评审做视觉效果图:走文生3D模型的老路线,快而且效果好,别追求CAD精度。
- 需要可编辑、可出STEP的机械零件:优先LLM + CadQuery本地管线,工程成熟度最高。
- 做算法研究、想发论文:复现Text2CAD类方法,从CAD序列生成的角度切入。
- 给客户做产品原型或交互演示:试试浏览器端方案,轻量且直观。
4. 复现和搭建text-to-CAD环境时,我踩过的一组坑
4.1 环境依赖:Open CASCADE和Python版本是最大的敌人
不管是复现Text2CAD还是跑CadQuery,第一步都是装好Open CASCADE的Python绑定。这个库是CAD领域事实标准的内核,很多项目都要用到,但它的编译安装出了名地麻烦。我曾经在一台Ubuntu服务器上尝试源码编译,连续两次因为Boost库版本不匹配失败,每次都要耗掉快一个小时。
我的建议是直接用conda安装现成的cadquery发行包,而不是手动编译底层依赖。同时把Python版本固定到项目文档推荐的版本区间,不要图新换Python 3.12,很多CAD相关的轮子还没跟上新版本。GPU训练方面,单卡8GB显存能跑小规模的CMD序列模型,但如果要上完整数据集的指令微调,建议至少准备24GB显存,或者直接用云上A100跑。
注意:环境折腾不值钱,值钱的是时间。把环境步骤写成脚本、把依赖版本锁死,是这个方向所有实操的第一步。
4.2 数据集的坑:几十个GB只是开始
目前text-to-cad方向主要使用的公开数据集是Fusion 360 Gallery和ABC,还有DeepCAD内部整理的CAD命令序列。这些数据集都有同一个特点:非常大。Fusion 360 Gallery解压后要占用几十GB磁盘空间,而且原始文件格式并不统一,有的是参数字典,有的是导出后的step或smt格式。
我最初按默认方式全量解压,结果磁盘直接爆了。正确做法是先读数据集的官方解析脚本,把需要的字段和CAD命令序列提取成精简的中间格式,比如JSONL或者npy,再进入训练管线。另一个坑是单位尺度不统一:不同来源的模型有的用毫米、有的用英寸,有的模型自身没有归一化。训练之前必须统一把尺寸转换到毫米,并且对模型做适当的对中处理,不然模型学到的几何分布是乱的。
4.3 指令对的构造:CAD序列本身没有自然语言标签
搭建数据管线时,你会发现最棘手的问题不是"怎么训练",而是"训练数据从哪里来"。Fusion 360 Gallery里的模型每个都带有完整的建模历史,但没有配套的中文或英文描述;而text-to-cad需要的是成对的"自然语言—CAD命令序列"。
我采用的解决办法有两种。第一种是程序化模板生成:把参数化的模型描述直接拼接成自然语言,比如"一个120×80×10的带四孔的板",这类样本生成成本极低,量大但表述单调。第二种是让大语言模型基于模型渲染图或特征摘要反向生成多样化描述,再用人工抽检筛选,质量高但成本也高。实际项目中通常是两种搭配使用,先用模板数据保证规模,再用模型改写提高表达多样性。
4.4 训练和推理里的隐性坑
训练层面,CAD命令序列的长度普遍长于常规文本,而很多Transformer实现默认最大序列长度是512。我在实验中发现,一批中等复杂零件的命令序列频繁超过这个阈值,结果多个样本被截断,模型根本学不到完整特征。解决办法是把max_length调到1024,同时用更紧凑的tokenizer设计,把草图坐标量化成更小的词汇表。
推理层面,beam search不加合法性约束是最常见的翻车点。模型可能生成像模像样的token串,但重放时会发现"还没有草图就执行拉伸""约束数量不足导致草图过约束"。我在项目里加了一个简单的合法性mask,每一步推理前检查当前特征上下文,禁止生成那些不符合建模状态的token。光这一项,合法模型率就从不到50%提升到接近90%。
另外还有一个细节容易被忽略:混合精度训练。很多开源代码默认开启fp16加速,但CAD序列生成任务里,某些梯度的数值范围比较大,fp16容易导致loss变成NaN。遇到这种情况不要硬调学习率,先试着关掉混合精度跑一遍,如果稳定,再换bf16。
5. 几个不花钱但很管用的土办法:提升生成质量的实战技巧
5.1 提示词里写清"几何语言",别只描述感觉
text-to-cad模型的输入质量对输出影响极大。同样是描述一块带孔的板,我见过效果最差的提示词是"一个板子上面有几个洞",效果最好的提示词是"一块120×80×10mm的6061铝合金板,四角各一个直径8mm通孔,孔中心距离边缘10mm,中心一个直径25mm盲孔,深度5mm"。
差别就在于后者把几何尺寸、特征类型、数量、位置关系全部量化了。模型不再需要自己猜语义,只需要把数值映射到相应的CAD参数上。不管用的是开源序列模型还是大语言模型,写提示词都要养成这个习惯:先写材料/外形,再写具体尺寸,然后写特征,最后写公差或表面处理的额外要求。同时,所有尺寸后面明确写上"mm"或"英寸",能有效避免模型默认单位不同带来的尺寸翻车。
5.2 迭代修正比一次生成的成功率更高
目前没有任何text-to-cad工具能做到一次生成完全符合要求的模型,所以别抱一步到位的期望。有效的做法是把整个流程拆成生成—检查—修改三步。先生成一个大体结构正确的模型,然后针对差异点单独发指令,比如"把四个孔改成六个孔,沿长边等距分布""把圆角从5mm改成3mm"。
这里多说一句,大语言模型加CadQuery的路线在迭代上比CAD序列生成模型好用得多,因为代码是文本,可以直接定位到具体的参数变量,局部修改不会让整个模型推倒重来。而序列模型往往一个地方错了,整个序列需要重新生成。如果你的工作流需要频繁迭代修改,优先考虑代码生成路线。
5.3 自动校验和后处理:别让废品混进交付物
生成完之后,必须建立自动校验环节。我目前的做法很简单:所有生成的CAD实体统一跑一次Open CASCADE的合法性检查,确保没有零厚度的面、没有自相交的边、所有特征都能被正确求解。第二步是自动检查关键尺寸。用CadQuery的boundingBox接口取包围盒尺寸,与输入提示词的期望值做对比,误差超过1%就判定失败并自动重跑。
在实际项目里,我会对同一个提示词执行多次采样,每次生成不同随机种子下的结果,然后用脚本过滤掉不合法或尺寸偏差过大的模型,保留top1作为最终候选。这个"多采样—自动过滤—保留最优"的流程,即使模型本身不太强,最终产出质量也能稳定不少。
5.4 接入现有CAD工作流:STEP不是终点,是起点
生成后的模型最终要进入设计师的工作流。目前最通用的中间格式是STEP,因为它被所有主流CAD软件支持,能从CadQuery、FreeCAD导出,也能无缝导入Fusion 360、SolidWorks、Creo等商业软件。
我实际使用中有两个经验可以分享。第一,导出STEP之前一定要确认单位制,CadQuery默认单位毫米,但如果模型是英制导入的,导出的STEP在目标软件里会显示成奇怪的大尺寸,这类问题隐蔽且容易被人忽视。第二,CAD软件导入STEP后,通常会当成一个"无历史特征的实体"来处理,也就是你能修改的位置是有限的,想加新特征通常要额外转换。所以更稳的工作流是保留原始的CadQuery脚本,把它作为"设计活源",STEP只是给协作方看的结果文件。
6. 我对text-to-CAD现状的判断:边界很清楚,机会也很大
6.1 当前模型最擅长和完全做不好的事
经过一段时间的实践,我对目前text-to-cad技术边界有了比较清晰的认识。它现在最擅长的是规则机械零件:板类、轴套类、壳体类,特征是阵列孔、沉头孔、倒角、加强筋这些常见结构化特征。因为这些零件的建模逻辑清晰,参数规律性强,数据集中也最容易覆盖。
它目前完全做不好的场景,第一类是自由曲面造型,比如车身蒙皮、鼠标外壳、人体工学手柄,这类形状依赖NURBS曲面的连续性和空间感,本质不是"特征步骤"能简单描述的;第二类是复杂装配体,一个装配体里有几十个零件之间的位置约束和运动关系,现有方法还远远无法从一句自然语言推断出来;第三类是公差和设计意图,比如"这个孔和对面壳体是过渡配合",这种隐含在工程语义里的知识,单靠几何生成很难表达。
6.2 对普通设计师意味着什么
我越来越觉得,text-to-cad短期内不会替代设计师,而是会大幅降低三维建模的工具门槛。以前一个机械专业学生要花几个月熟悉软件操作、坐标平面、约束概念,才能画出像样的零件;未来只要能把需求表达清楚,AI就能先搭出结构雏形,剩下的精修和决策工作交给人工。
对一线工程师来说,最直接的变化是重复劳动减少。每周画支架、出盖板、改孔位这类工作,占用了大量本该用来做结构优化的时间。把这些让AI去做,腾出精力做方案对比和仿真验证,这才是这个方向真正的价值。
6.3 后续值得关注的拓展方向
从技术发展看,我认为有三个方向后续最有潜力。第一个是检索增强,把企业的标准件库、历史设计规范、典型特征代码片段注入生成上下文,让模型输出天然贴合企业内部规范。第二个是多轮对话式建模,让模型支持从草稿到细化的连续修改,目前代码生成路线在这方面基础最好。第三个是B-rep级别的预训练模型,直接从边界表示学习几何,绕过"命令序列"这一步,在处理自由曲面时会有突破。
我自己现在的日常工作方式已经发生了变化:接到一个零件需求,先写下带尺寸的自然语言规格,然后用LLM加CadQuery生成首版模型,导入FreeCAD快速检查特征,需要调整就改代码参数重新导出。整个过程下来,真正的重复建模时间至少节省了一半。最后再分享一个小技巧:无论你用什么工具,提示词里第一句一定要写单位——"all dimensions in mm",这句话能帮你避开一半以上的尺寸翻车问题。如果你正准备入坑这个方向,我的建议很简单,别一开始就追大模型,先把一个单零件的生成—校验—导出管线完全跑通,你会发现后面所有的事情都会顺很多。