text-to-cad:用自然语言生成参数化CAD模型的原理与实践 前几天深夜改电机支架的图纸我盯着屏幕上画了一半的草图轮廓随口跟同事说了一句如果我能敲一行字就得到这个模型该多好。没想到不到两个月text-to-cad 已经从论文里的概念变成了我可以实际跑通的工具。所谓 text-to-cad就是直接把自然语言描述翻译成参数化 CAD 模型——我说一个带四个安装孔的矩形法兰厚度10mm它能还我一个可以继续编辑的实体模型而不是一张图片或者一个三角网格。这篇文章会把这条路拆给你看技术原理、能跑的实操链路、数据集背后的坑、以及什么场景真的值得上。我假定你至少用过一种主流的 CAD 软件也写过几行 Python这样读起来会最舒服。1. 一句话代替三小时建模text-to-cad 到底改变了什么1.1 传统建模的痛点时间都消耗在了哪里我见过太多设计师的一天上午接到需求打开 SolidWorks 或者 Fusion 360开始画草图。画一个法兰要先建基准面画中心圆再画四个螺栓孔圆添加几何约束标注尺寸然后拉伸、阵列、圆角。等模型出来往往一两个小时就过去了。如果甲方改个尺寸又要回去改草图、改拉伸、再处理圆角失效。问题在于这些操作里有大量是重复性操作而不是创造性设计。设计师真正花在决策上的时间可能只占三分之一剩下三分之二是在把这些决策翻译成软件的操作序列。text-to-cad 想消灭的正是这三分之二。它的核心假设是很多机械零件的设计意图可以用语言表达清楚一块 100×80×5 的铝板四角开 R8 圆角中心一个直径20的通孔——这句话信息量其实已经足够生成一个可编辑的实体。语言是人类传递设计意图最自然的载体而 CAD 建模本质上是把意图形式化的过程。如果大模型学会了如何把语言翻译成建模操作序列设计师就能从操作工变回决策者。1.2 它是怎么一步步火起来的text-to-cad 不是一夜之间冒出来的。我梳理了一下它的演进脉络大致经历了三个阶段。第一阶段是可研究阶段。2022 年前后DeepCAD 提出把建模过程编码为离散的操作序列每个操作就像一条指令画一条直线、画一个圆弧、加一个标注、做一次拉伸。他们从 Fusion 360 的用户公开文件中提取了几十万个带操作历史的模型把这些历史转成了计算机可以训练的符号序列。这个工作很关键——它第一次让生成 CAD变成了一个序列生成问题而不是三维几何问题。第二阶段是可理解阶段。2024 年左右的 Text2CAD 系列工作开始引入语言模型用 T5 这类预训练模型做文本到 CAD 序列的翻译。模型输入是自然语言描述输出是建模步骤的 token 序列。到这一步语言和建模操作之间真正建立了映射。第三阶段是可用阶段。以 Zoo 为代表的一批在线工具把 text-to-cad 封装成了产品页面你输入描述它输出一个可以下载的模型文件。虽然商用产品的质量还参差不齐但至少说明这个方向已经从实验室走向了市场。我不是说这条路已经完全成熟了。恰恰相反我自己跑下来发现它的能力边界比宣传材料里画的要小得多但作为效率辅助工具它已经值得认真评估了。1.3 它不能做的事同样重要在深入细节之前我想先把边界画清楚免得你对它产生不切实际的期待。text-to-cad 生成的是参数化特征模型还是裸几何这决定了它的可用性。目前多数方案生成的是建模操作序列经过回放后得到的是带特征历史的实体这类结果可以在原软件里继续编辑这是好消息。但坏消息是它基本做不了复杂的装配体。单个零件已经不容易几十个零件的装配关系、配合约束、运动自由度目前没有一个开源方案能稳定处理。它对精度的理解很粗。你说公差 0.01mm它生成的结果可能在视觉上对但工程上完全不可用。因为训练数据里的标注很少包含 GDT 信息。它对复杂曲面极不擅长。自由曲面、流线型外壳、A 级曲面这类需求目前的技术基本无能为力。所以我的判断是现阶段 text-to-cad 的价值在于快速得到可讨论的初稿而不是直接产出可加工的图纸。这个定位如果没想明白后面所有尝试都会变成失望。2. 四条技术路线的底层逻辑与各自槽点我在这段时间里调研了社区里主流的 text-to-cad 实现方案发现它们虽然都叫文本生成 CAD但底层逻辑差别很大。搞清楚这些路线你才能判断哪个适合自己二次开发哪个只能当玩具。2.1 路线一把 CAD 操作变成一串 Token用序列模型来生成这条路线是目前的主流代表作就是 DeepCAD 和它的后继者。它的核心思想非常直观既然 CAD 建模是一连串命令操作那我干脆把每个操作写成一行符号化的指令整段建模历史就成了一篇文章。模型的任务就变成给定设计意图自然语言生成这篇文章。比如一个简单的圆角矩形块加圆孔的建模历史序列化之后大致长这样sketch_start line_from 0,0 to 50,0 line_from 50,0 to 50,30 line_from 50,30 to 0,30 line_from 0,30 to 0,0 arc_from 0,0 center 25,0 extrude depth 10 hole_diameter 20 center 25,15注意这只是一个示意。真实系统中每个 token 是离散的 ID比如line_from是 1203extrude是 445坐标值也会做离散化处理。模型其实是在背一长串 ID 序列。这样做的好处是可以直接复用 NLP 领域成熟的 Transformer、采样、beam search 等技术输出天然是参数化的因为它就是建模命令回放即建模。槽点也很明显序列非常长一个中等复杂程度的零件动辄上千个 token模型容易在长序列上累积误差而且序列越长生成速度越慢你很难做到交互式响应。2.2 路线二扩散模型直接长出三维形状另一条路线更暴力不用管什么建模操作直接用扩散模型生成三维形状本身。OpenAI 的 Shap-E 和 Point-E 就是这类思路——输入文本输出一个隐式场类似一个可以随时查询表面位置的三维函数或者点云再网格化。这条路线的问题在于它的输出是离散的网格/点云不是参数化实体。你拿到一个精度尚可的 STL 文件想在 SolidWorks 里改一个孔的直径抱歉没有特征树没有草图你只能重新建模。我在实际测试中遇到过很多次这种情况生成的形状看起来很像那么回事但根本无法进入正常的 CAD 工作流。所以我认为这条路线适合做灵感草图或视觉预览距离真正的 CAD 设计还差一个曲面逆向的距离。当然也有团队在尝试从网格反推 B-Rep但目前计算稳定性很差。2.3 路线三检索增强与零件库复用这条路线被很多人忽略了但它是目前工程上最稳的一条路。原理很简单在零件库里做文本检索找到语义相似的模型然后对它的尺寸参数做替换调整。举个例子用户说一个 M8 的六角螺栓系统不用从零生成而是从标准件库里检索到六角螺栓的模板把直径改到 M8长度按描述设置直接输出。标准件、法兰、轴承座这类高度标准化的零件用这条路线几乎不会出错。槽点是泛化能力几乎为零你让它生成一个带卷边的异形钣金件库里没有类似模板它就抓瞎了。所以检索增强适合企业内部的标准化工作流不适合开放式创造。2.4 路线四端到端预测 B-Rep 的控制点与面片这是相对前沿的研究方向不走序列建模而是直接预测边界表示 B-Rep 中的几何控制点哪些点构成哪条边哪些边围成哪个面面的法向量是多少。你可以把它理解为让模型直接学会描述三维物体的拓扑结构。这个路线的优势是绕开了建模操作回放这一步理论上生成的模型可以直接被 CAD 内核识别不需要操作历史。困难在于B-Rep 的拓扑约束非常严格点、边、面之间必须满足闭合性、无自交、方向一致等条件。模型预测出来的控制点经常在数学上自洽但在几何上畸形需要大量的后处理校验。我的建议是如果你做的是学术研究路线四值得跟如果你是要解决当下的工程问题路线一和路线三的成熟度明显更高。我把四条路线整理成了一个对比表方便你快速决策技术路线代表方法输出形式可编辑性成熟度适合场景操作序列生成DeepCAD、Text2CAD建模操作 token高回放后带特征中高初级零件、概念设计三维扩散生成Shap-E、Point-E网格/点云低不可参数化中视觉预览、灵感草图检索增强企业自有系统模板模型高但依赖库高标准件、重复零件端到端 B-Rep研究阶段参数化实体理论较高低前沿研究3. 亲手跑通文本转 CAD环境、模型与一条龙实操这一节是动手环节。我假设你有一台带 NVIDIA GPU 的机器显存最好在 8GB 以上。没有 GPU 也不是完全不行但生成一个中等零件的推理时间会长到让你怀疑人生。3.1 环境准备能省时间的依赖清单我建议用 conda 建一个干净的 Python 3.10 环境避免和现有项目冲突。conda create -n t2cad python3.10 -y conda activate t2cad接下来是必装的依赖按我的实际踩坑经验排序PyTorch 的版本一定要和 CUDA 匹配。你可以在 PyTorch 官网的安装向导页面选择自己的 CUDA 版本不要直接用 pip install torch 默认装 CPU 版。pip install torch --index-url https://download.pytorch.org/whl/cu118 pip install torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install transformers numpy trimesh pythonocc-core这里提醒一句pythonocc-core 在纯 pip 环境里有时候装不上如果你不需要直接可视化 STEP 文件可以先跳过它用 trimesh 凑合着看网格结果。装了之后你就能直接在 Python 里调用 OpenCASCADE 内核解析 STEP 文件了这对验证输出非常有用。3.2 用开源权重跑通一次推理环境准备好之后你需要下载一个训练好的开源模型。社区里比较活跃的 DeepCAD 系和 Text2CAD 系都有公开权重一般发布在项目主页或模型的托管平台。下载后通常是 PyTorch 的 checkpoint 文件里面包含了模型权重、tokenizer 词表、配置参数。加载模型和分词器的代码结构大致如下import torch from transformers import T5Tokenizer, T5ForConditionalGeneration device cuda if torch.cuda.is_available() else cpu model_path ./checkpoints/text2cad_v1 tokenizer T5Tokenizer.from_pretrained(model_path) model T5ForConditionalGeneration.from_pretrained(model_path).to(device) prompt A flat rectangular plate with four corner holes and a central bore inputs tokenizer(prompt, return_tensorspt).to(device) # 关键参数max_length 决定了生成序列上限太短会截断建模步骤 # num_beams1 时是贪心解码速度快但容易重复建议先用贪心跑通 with torch.no_grad(): outputs model.generate( **inputs, max_length1024, num_beams1, temperature1.0, do_sampleFalse ) sequence_ids outputs[0].tolist() print(generated sequence length:, len(sequence_ids))注意不同项目的 tokenizer 用法差异很大有的项目不用 HuggingFace 的 T5Tokenizer而是自己实现了 CAD token 的词表和词表映射。遇到这种情况你需要读一下项目里的 data_processing 脚本确认 token ID 和实体之间的对应关系再动手。我建议第一次跑的时候把num_beams从 1 改成 4、do_sample设为 False你会发现生成质量有明显提升因为 beam search 会保留多个候选序列选出整体概率最高的那个。3.3 从 Token 返回实体序列回放与格式导出序列生成完之后你手里拿到的还只是 token ID 数组。要让它们变成真正的 CAD 模型需要经过回放过程——把序列逐条翻译回建模命令然后逐条执行。这一步官方一般会提供脚本核心逻辑就是读取 token 序列把它解析成建模指令结构然后调用 OpenCASCADE 或类似的几何内核去执行。伪代码大概是for token in sequence_ids: command decode_token(token) # 例如: (line, (0, 0), (50, 0)) if command.name line: sketch.add_line(command.start, command.end) elif command.name extrude: solid sketch.extrude(command.depth) elif command.name hole: solid solid.cut(Hole(command.center, command.diameter))回放过程中最常见的报错是曲线不闭合或者特征交叉。模型虽然有很强的统计规律能力但它并不真正理解几何约束偶尔会生成一条根本没闭合的草图拉伸自然就失败了。我的建议是遇到回放失败不要急着重跑先检查是哪个 token 停住了如果只是最后几个特征失败你可以手动裁掉尾部序列再回放。成功后把结果导出成 STEP 格式from OCC.Core.STEPControl import STEPControl_Writer from OCC.Core.IFSelect import IFSelect_RetDone writer STEPControl_Writer() writer.Transfer(solid) writer.Write(output.step)有了 STEP 文件你就可以在 SolidWorks、Fusion 360 或 FreeCAD 里打开它检查特征树是否正常修改关键参数确认它是不是真的可编辑。3.4 复现结果的验证手法跑通一次不等于结果可信。我在验证阶段通常做两件事。第一件事是人工目检把生成的 STEP 文件和训练集里同类的零件放在一起从几个角度截图对比。看的是整体形状是否合理、孔位是否准确、厚薄是否均匀。这一步非常主观但能快速筛掉明显劣质的输出。第二件事是数值指标。学术界常用 Chamfer Distance倒角距离来度量两个三维形状的接近程度它的做法是把两个形状表面分别采样成密集点云然后计算两个点云之间的平均最近邻距离。数值越低说明两个形状越接近。import numpy as np from scipy.spatial import cKDTree def chamfer_distance(points_a, points_b): tree_a cKDTree(points_a) tree_b cKDTree(points_b) dist_ab tree_a.query(points_b)[0] dist_ba tree_b.query(points_a)[0] return (dist_ab.mean() dist_ba.mean()) / 2不过我要提醒你倒角距离只能衡量形状相似度衡量不了工程语义的正确性。一个零件孔的直径差 0.5mm倒角距离可能很小但对装配来说它就是废品。所以数值指标只能辅助真正的验收必须回到应用场景。4. 数据工程才是真正的护城河CAD 训练数据的构建内幕玩了一圈你可能会发现模型的效果好坏很大程度上不取决于你调了多少超参数而取决于训练语料。text-to-cad 领域的语料就是建模操作历史和对应的文本描述。这块水很深值得单独说。4.1 操作历史数据从哪来目前学术界最常用的 DeepCAD 数据集其原始素材来自 Fusion 360 的公开模型库。用户上传到云端并公开分享的模型如果保留了设计时间线就能导出完整的操作历史。研究人员从几十万个模型里筛选、清洗只保留结构相对简单、特征完整、回放不报错的模型。这个清洗过程极其痛苦。你以为拿到一个 .f3d 文件就能直接提取操作序列吗不。文件里可能包含失效特征、隐藏特征、冗余草图、退化的几何约束。清洗管线要做不止一轮先尝试回放回放失败就丢弃回放成功后再检测实体数量、体积是否是正数、有无自相交再过滤一遍。在我自己构造一个小规模数据集的过程中体会最深的是CAD 历史数据的清洗成本远高于采集成本。网上的模型很多但能进训练集的不到一半。4.2 文本描述是数据链路上最贵的部分模型需要把文本翻译成操作序列可建模历史里没有一句话解释它自己在干什么。所以数据管线里必须增加一步为每个建模序列生成自然语言描述。社区里比较常见的做法是组合式方案先用规则模板生成基准描述比如提取主特征的类型、数量、尺寸拼成rectangular plate with four holes再用大语言模型对基准描述做润色变成更自然的表达。早期 Text2CAD 的做法让我印象很深他们用 GPT 之类的模型为 CAD 历史生成多样化描述再经过人工筛选保证每条描述忠实于模型实际的样子。如果你也想自己攒数据我可以给你一个更省事的 prompt 套路。把模型的参数化特征树整理成 JSON让大语言模型参考然后生成描述{ sketch: rectangular, length: 80.0, width: 60.0, thickness: 8.0, features: [ {type: bore, position: [20, 20], diameter: 10} ] }prompt 可以写成You are a CAD design assistant. Based on the following feature JSON, write a natural language description that a mechanical designer might use to specify this part. Keep it concise. Avoid mentioning exact coordinate values.你会发现描述的风格直接影响模型能力全部用rectangular plate这种词模型就只会生成板类零件加入mounting bracket for a motor这种带工况的表达模型的泛化性才会好一点。4.3 不平衡与长尾标准件以外的零件很难学数据集里还有一个长期被忽视的问题类别分布极不均衡。公开模型库里最多的是各种支架、法兰、板件、轴套占据了大半壁江山而那些形状独特、结构复杂的零件则寥寥无几。模型学到最后对常见形状生成效果很好但你要它生成一个非对称的扭曲叶片就会彻底翻车。我做过一个小实验拿 50 个常见素材和 50 个长尾素材分别测试模型常见组的回放成功率在八成以上长尾组连三成都不到。这说明什么说明你要是真的想在自己的业务里用 text-to-cad光靠公开数据集是不够的必须收集你业务里真正会出现的零件类型做领域微调。数据增强方面学术界惯用的手法是旋转、缩放等几何变换。但注意CAD 操作序列不能像图像那样随便旋转——旋转 90 度之后拉伸的方向语义就变了。我自己只做居中归一化和镜像增强其他变换宁可不用也不能让训练数据出现语义错乱。5. 实战边界感哪些需求能直接上哪些只能当陪跑跑通模型之后最重要的能力就是判断什么需求可以交给 text-to-cad什么需求必须人来做。这是一项典型的边界感技能光看论文参数是练不出来的。5.1 适合场景概念设计、标准件、参数预演我实际用得最顺的场景是概念设计。接到一个需求脑子里只有一个模糊的形状概念用 text-to-cad 先快速生成一版 3D 初稿确认整体比例和布局再在 CAD 软件里精修。它最大的价值是帮你跳过从空白画布开始的心理障碍。第二个适合场景是标准件变体。比如M6 内六角螺栓长度 30mm不锈钢这类描述高度模板化恰好是模型最擅长的区域。因为训练集里见过的螺栓、法兰、轴承座实在太多了生成结果几乎不用大改。第三个场景是参数预演。设计师经常要在不同尺寸方案之间切换用手动建模的方式改尺寸要一个特征一个特征地动。text-to-cad 可以快速生成不同尺寸的版本帮你快速对比加长到 120mm 会不会影响重心之类的问题。注意我说的是快速对比不是用于最终设计。5.2 翻车场景高精度配合、复杂曲面、大装配反过来有三类需求我强烈不建议硬上。第一类是高精度配合。模型的对齐基准、共面约束、公差语义都不是为大装配设计的。你要求两个配合面的间隙控制在 0.02mm 以内它生成的模型可能连基准面都不在同一个坐标系里。这不是它的错是它没学过 GDT 数据。第二类是复杂曲面。前面说过牌面铰链盖、流体导流罩、人体工学手柄这些带有广泛自由曲面的零件目前的 text-to-cad 几乎没有能力。凡是你觉得这零件得用放样、曲面裁剪、填充这些命令才能做出来的请直接跳过它。第三类是大装配。一次生成几十个零件再自动装配成一个机构这个愿景目前没有任何开源方案做到了。装配涉及材质、质量、运动副、连接关系是远比单体建模复杂的系统工程。5.3 一个可操作的判断标准参数化程度说了这么多我总结一个特别好用的判断标准看这个零件的尺寸能不能用十几个数字概括。能概括的比如板、法兰、轴套、支架、壳体它们的特征本质上就是长度、宽度、厚度、孔径、孔距这些参数语言完全能表达清楚text-to-cad 就是为这类零件准备的。不能概括的比如流体力学优化的机翼、扭曲的装饰曲面、复杂的加强筋结构它们的形状不是参数能描述的语言也不够用。我一直跟团队说一句话text-to-cad 的本质是租借大语言模型对自然语言的理解力这种理解力是语义级的不是几何级的。你用语义的方式提问它给你语义级的答案你要几何级的答案请去用专业的几何引擎。6. 从 Demo 到可交付管线我踩过的工程坑最后这部分我想把从跑通 Demo到做成真实管线之间我踩过的坑集中讲一下。每一个都是实际的教训写出来能帮你省至少一周时间。6.1 显存与推理延迟我最初在 8GB 显存的入门卡上跑 base 尺寸的模型单次推理耗时大约 20 秒到 1 分钟看序列长度。这个速度做在线交互体验很差。后来我换来 24GB 显存的卡又加了 batch 推理的优化单次可以压到 5 秒以内。我的经验是如果要做成服务尽量用 flash attention 的推理框架并固定模型的输入输出长度上限防止恶意长序列把显存打满。另外务必在后端设置超时和降级逻辑。模型生成偶尔会卡死或者输出无限重复的 token如果不加超时用户会一直转圈体验极其糟糕。6.2 单位与坐标系这是一个特别容易被忽略的坑。训练数据的单位大多是毫米但不同数据集的单位可能混有英寸或者厘米。如果你直接拿模型输出的坐标去驱动制造设备很可能得到一个大 25.4 倍的零件。 我在第一次导出 STEP 时没注意这一点结果生成的模型在 SolidWorks 里显示 10.011 英寸而不是 254 毫米。后来我在回放管线里强制加入了单位归一化逻辑所有模型的包围盒被缩放到统一尺度训练导出时再按需求还原到目标尺寸。坐标系方面模型输出的坐标原点通常位于全局原点但不保证与主视图对齐。如果你需要通过图纸的某个基准面定位请在后处理里做一次坐标系对齐否则 CAM 加工时会出大问题。6.3 结果校验与人工兜底生成模型必须过一个自动校验器我称之为体检器它检查实体的体积是否为正、表面是否自交、孔特征是否贯穿、壁厚是否合理区间。只要任意一项异常就自动标记为需人工审阅。不要跳过这一步。大模型偶尔会生成拓扑不闭合的实体这类模型在导进 CAM 软件时会造成刀路崩溃甚至让整个加工任务停下来。我现在的管线里自动校验 人工抽检是硬性要求凡是过不了校验的模型一律不进生产环节。6.4 中文描述的支持还有一个很多人关心的问题英文模型能不能接中文 prompt实测结果是直接用中文效果很差因为训练数据几乎全是英文描述。我的解决办法是在服务前面加一个翻译层中文输入先翻译成英文再送进模型。这个方案在多数情况下可行但翻译层偶尔会把专业术语翻歪所以我建议在术语层面做一个映射表比如法兰强制翻成flange、倒角强制翻成chamfer而不是让通用翻译引擎自由发挥。我曾用一批中文机械设计术语做过对比测试加了术语映射表之后生成成功率提升了大约 30%这个数字说明了行业词表的重要性。如果你也在做类似的落地尝试我最后再分享一个体会text-to-cad 现在的能力更像是一个很有天赋但没受过工程训练的新人设计师。你用得好它能帮你把重复体力活砍掉一大半你用不好它也能在你最忙的时候给你添乱。把边界划清楚、把校验环节做扎实它才能在你的工作流里真正活下来。