
这两年做生成式设计的朋友十有八九都被“text-to-CAD”这个词刷过屏。它解决的问题很直接你输入一句话比如“一个带四个安装孔的法兰盘外径120毫米中心孔直径30毫米”系统直接给你返回一个可编辑的三维CAD模型而不是一张渲染图。这个方向对机械设计、结构构思、非标件快速打样的人来说吸引力极大因为它卡在了一个长期痛点——从想法到模型之间的那段“手工劳动”。text-to-CAD和常见的文生图、文生视频是两回事。图像生成追求的是视觉合理性像素对了就算成功而CAD生成追求的是工程合法性每一个特征、每一个尺寸、每一步特征树操作都要能落地能进入下游的仿真和制造流程。换句话说文生图是自由发挥的素描text-to-CAD是按照工程制图规范出机械图纸差之毫厘谬以千里。也正因为这个门槛它才值得单独拿出来拆解。这篇内容会把text-to-CAD从原理到落地完整过一遍包括它目前的主流技术路线、各路线之间的选型权衡、一个最小可运行方案的实操步骤以及我实际跑下来遇到的坑。适合三类人看想把生成式设计引入实际项目的工程师、做图形学或AIGC方向想找落地场景的开发者以及刚接触这个领域、想快速建立认知的同学。1. text-to-CAD的核心矛盾与设计思路先把这个方向最别扭的地方说透。CAD模型不是一个网格文件那么简单它的本质是一棵特征树先画草图再拉伸再打孔再倒角每一步都依赖前一步形成一个可追溯、可修改的建模过程。我们拿到的“CAD模型”应该是这份操作序列而不是渲染出来的三角面片。这就让text-to-CAD面临一个很特别的约束模型的输出必须是一段“可以执行”的程序而不是一串“看起来像样”的几何坐标。一个文本编码器把用户输入编码成条件向量然后一个生成器去产生建模指令序列每一步指令都要能被CAD内核完整回放。如果序列中间某一步出错后面的特征全部失效因为特征树是严格因果的。这个因果性带来的连锁反应是搜索空间巨大且高度离散。一次建模操作可能有十几个参数一个零件可能有几十个操作组合起来就是天文数字。而且和自然语言不同CAD指令序列没有“近似正确”的说法。写错一个孔的位置尺寸整个零件就是废品你不能像对话AI一样让用户“猜个大概”。因此我理解的text-to-CAD项目设计第一原则是“合法优先于逼真”。先保证生成结果能被完整重建再去谈形状匹配度。围绕这个原则目前行业内基本跑出了三条不同的技术路线各有各的取舍。选择哪一条直接决定了后续的模型结构、数据准备方式、训练策略和验收标准。2. 三条主流技术路线拆解与选型依据2.1 路线A将建模指令序列化当作代码生成任务这条路线把CAD建模过程当作一个“程序”来生成。做法是先把模型库里的每个零件都解析成有序的建模操作比如“新增草图平面”“绘制圆圆心在(0,0)直径30”“添加同轴约束”“拉伸深度40”“添加倒角半径5”把这些操作离散化成token序列。然后训练一个序列到序列的模型输入是文本描述输出是token序列。做完之后生成结果天然就是一棵合法的特征树用户拿到就能改参数这是它最大的优势。可编辑性最强存储效率极高一个模型只有几百个token。缺点也很明显生成多样性受限于建模模板的表达空间复杂曲面几乎无法用标准特征操作描述而且长序列存在误差累积问题前面错一个token后面全崩。这条路线适合产品级落地尤其是机械零件、钣金件、注塑件这类以拉伸、旋转、打孔为主要特征的物件。它的输出能直接进PDM/PLM系统工程师可以在特征树上继续做修改。2.2 路线B先生成隐式场或网格再逆向转换为CAD这条路线更接近传统AIGC的做法。模型先生成三维体素场、有向距离场或密度场再用等值面提取算法得到网格最后做网格逆向拟合出参数化曲面或实体。几何表达能力更强复杂自由曲面、有机形态都能做到相当高的逼真度。但问题出在最后一步“网格转CAD”上。这个逆向过程在数学上是不适定问题一个网格可以对应无数种曲面拟合方案边界线如何抽离、拟合误差如何控制、圆角特征能否恢复每一步都可能引入失真。生成的零件好看但要么无法转回参数化特征要么转回来之后特征树乱七八糟没法继续编辑。这条路线适合概念设计、造型评审、3D打印手板制作这些场景。你要的是“先做个东西出来看看”不追求进一步的可编辑性。对于直接加工制造至少现阶段还缺一口气。2.3 路线C语义检索加程序化参数改写路线C的思路最务实。先从模型库里检索出与文本描述语义最接近的模板模型然后用语言模型解析文本中的关键参数对模板做程序化改写改尺寸、改孔位、改凸台数量等。因为模板本身是合法模型改动也限制在参数层面所以生成结果几乎不会出现非法拓扑。这条路线是三条里稳定度最高的工程可用性最强但它有一个天花板只能生成模板库覆盖范围内的“变体”。文本里出现库中完全没有的概念比如“双曲面蜗壳”可库里只有法兰和支架检索结果就会很牵强生成质量完全依赖底层库的丰富度。2.4 路线如何选维度路线ACAD序列生成路线B隐式场网格逆向路线C检索参数改写可编辑性最高直接给出特征树低网格或B-rep难编辑中依赖模板参数化程度几何表现力中局限于标准特征操作高能表达复杂曲面中低受模板覆盖范围限制生成稳定性中长序列易累积误差高整体生成较稳定最高基本不会炸拓扑适用场景机械零件、可量产交付概念设计、外观评审标准件变体、快速方案技术重点序列建模、指令合法性校验隐式场生成、曲面拟合文本解析、参数映射我的建议是如果你做的是产品原型验证从路线C起步一周能出demo如果做的是可编辑交付物深耕路线A如果做的是探索性设计工具押注路线B。我在实操中最终选了路线A作为主攻方向做完整流水线因为它的产出最接近“真正的CAD”也是这个项目名最有想象力的部分。3. 实操从零搭一个最小可用的text-to-CAD流水线这条实操路线聚焦路线A目标是实现“输入一段中文描述输出一段可执行的建模脚本并自动重建出三维模型”。我用的是当前主流的深度学习框架做训练配合一个开源的参数化建模库做执行校验。整体流程分五步每一步都有值得细抠的细节。3.1 数据准备与序列化这一步决定了整条流水线的上限。数据的来源是用公开社区开源的零件模型库做基底这些模型本身带有完整的建模历史可以通过脚本逐个解析导出每一步操作的参数化描述。序列化的核心是建立一个稳定的中间表示。我采用的方案是将建模历史拆成“草图定义 特征操作 布尔运算”三类原子指令。每个原子指令的每个参数都做离散化处理尺寸类参数转为浮点数并保留两位小数位置类参数转为相对于零件包围盒中心的相对坐标。所有指令按依赖顺序排列形成一个线性token序列。离散化的时候有一个容易被忽略的问题原始模型里的尺寸千奇百怪有的来自全局变量有的是直接标注有的带有复杂的表达式依赖。如果原封不动写入token序列模型很难学到规律。我做了两件事一是把尺寸值做对数变换后映射到离散桶降低大数值区间的稀疏性二是过滤掉依赖外部参数的模型样本只保留完全自包含的特征树。这一步产出的数据质量直接决定了后面训练能否收敛。3.2 词汇表构建与文本编码建模指令的token化看起来和自然语言差不多但有一个坑自然语言的词汇表是相对稳定的而CAD序列中大量出现的是数值token比如“30.00”“45.50”。如果每个数值都单独成token词汇表会膨胀到不可控而且模型很难泛化到训练集里没出现过的尺寸。我的做法是关键词草图、拉伸、旋转、倒角、打孔、线性阵列等作为独立token这部分大概几百个。数值token采用三部分编码符号位、整数位、小数位分别映射到三个子词汇表。这样“30.00”被拆成“正号/整数30/小数00”模型学到的是数值的组成规律而不是死记硬背某个数字。布尔操作类型、约束类型、平面朝向等枚举量各建独立小词汇表。文本输入侧用的是图文对比预训练编码器抽取语义向量再经过一个映射层压到生成模型的输入维度。实测下来直接拿预训练编码器的原始向量做条件效果不如把它再过一层可学习的映射网络因为通用语义空间和CAD指令空间之间存在不小的分布偏移需要一层适配。3.3 模型结构与训练配置生成模型采用因果Transformer架构输入是“条件向量 已生成的指令token”输出是下一个token的概率分布。这里不展开网络结构细节直接给一组我试下来比较稳的训练配置配置项推荐值说明输入序列长度512覆盖中等复杂零件超过这个长度建议拆段生成词汇表大小约1.2万关键词数值子表控制符模型层数12再深收益有限显存开销大涨注意力头数8与隐层维度匹配隐层维度512标准配置稳定复现学习率峰值1e-4带1000步warmup过大容易直接崩掉批大小32按单卡显存调整梯度累积到等效64损失函数交叉熵预测下一个tokenBeam size4推理阶段用束搜索重复惩罚1.2抑制同一指令反复出现训练中用了teacher forcing和因果掩码损失只统计指令token部分条件向量的对齐不参与监督。训练轮次大约200个epoch随时间下降学习率。3.4 推理阶段与合法性校验推理是整个流程里最见功力的一环。裸的beam search生成的序列经常长这样前面几步完全合法画了一个像模像样的草图到第五步开始莫名其妙比如对一个已经闭合的轮廓做第二次拉伸或者引用了一个不存在的草图平面。这本质上是因为网络在训练时见过足够多的“上下文相关”语法但对“法律”没有概念——它不知道什么是可执行的。解法是在推理时接入一个轻量级的执行校验器每生成一个token序列前缀就送入参数化建模内核尝试重建如果某一步重建抛出异常就把这条beam路径杀掉。这样保证最终解出来的序列一定经过了“可执行性”的过滤。我在实践里更进一步不只做最终校验而是在每一步束搜索打分时给“通过执行校验的部分序列”额外的分数加成鼓励模型优先走向可执行分支。这一步改动让执行成功率从约61%提升到87%是整条流水线里性价比最高的一次优化。3.5 后处理与三维预览输出最终生成的指令序列用参数化建模库执行输出为带特征历史的实体模型。我做了两层后处理单位统一。所有内部计算走毫米输出时根据目标环境做单位转换避免生成尺寸在英制公制之间漂移。特征命名与分组。生成的指令序列里特征名往往是默认的“feature_001”后续工程使用很不友好。我加了启发式规则根据操作类型自动重命名比如拉伸特征按拉伸方向命名为“revolve_axis”打孔特征按直径标注为“hole_d30”。预览阶段把生成结果导出为三角网格喂给三维查看器同时保留原始特征树供进一步编辑。这样用户既能“看到”模型也能“改到”模型是text-to-CAD区别于text-to-3D的关键体验。4. 训练与推理中的常见问题排查实录这部分内容是我重复实验后筛选出来最有价值的一批踩坑记录按问题类别整理成表格每个问题都附排查思路。症状根因排查与解法生成序列总是做到一半就断序列长度分布不均长零件样本太少统计训练集序列长度分布对长度超过阈值的长样本做上采样推理时beam search结束条件要宽松一些尺寸数值总是重复输出“整数10、20”数值token分布严重偏向常见整数对数值token做频率均衡采样让小数和非常见数字在训练中更多暴露增加尺寸数值的扰动增广同一零件族之间互相泄漏训练集里相似零件被分到训练和测试两侧按零件类别做分层抽样保证同一类别的样本只出现在一个集合中中文描述生成质量明显低于英文预训练编码器在中文语义空间覆盖不足前期把中文输入翻译成规范英文术语再编码中期加入中文微调样本做混合训练显存不够跑不了beam search多条beam路径同时喂入参数化内核解码做分块解码先逐token验证前64个token再扩展后续块高峰显存控制在单卡可承受范围生成结果边界漂移孔打到了板外相对坐标归一化后反算时发生累进误差位置参数改用“绝对值容差校验”归一化只用于输入表示输出阶段回到绝对坐标并在重建后做几何边界校验布尔运算频繁失败草图轮廓自交或已有实体与新增特征体积重叠生成草图后在重建前做轮廓合法性预检布尔失败时对该beam路径加惩罚优先选择其他分支有一个问题最隐蔽也最值得单独说生成的零件虽然几何合法但特征树顺序非常反人类。比如正常工程师会先把板厚拉伸出来再倒角而模型经常先生成倒角特征再补一个拉伸。几何上完全成立结果上也没有问题但后续要修改板厚的时候特征顺序会把工程师逼疯。我加了一个拓扑依赖评分对特征依赖关系简单、顺序接近人工习惯的序列给予分数加成实际可用性提升非常明显。5. 实操之外的扩展思考与落地建议跑通基本流程之后投入产出比的衡量要考虑一个“三维复杂度”的概念。很多人的误区是认为生成越复杂的零件越有成就感但实际工程场景里最值钱的生成能力往往集中在那些“看起来简单”的类别上法兰、支架、底座、箱体、端盖。这些零件特征少、结构标准化但需求量大占非标设计的很大比例。抓住这些品类做生成比追求全品类通用生成更早产生实际价值。落地方式上我比较推荐以插件形式嵌入现有设计软件的工作流而不是要求用户登录一个新的网页工具来回倒文件。工程师的习惯是在CAD界面里开始一切操作生成结果应该直接出现在特征树里而不是作为中间文件导入。这块的价值被普遍低估很多团队把精力全花在模型效果上忽略了交付形态最后模型很强落地阻力也很大。评估指标也跟常规生成任务很不一样。除了通常的文本-几何匹配度我建议增加三个指标执行成功率生成的指令序列能被参数化建模内核完整重建的比例。特征树复杂度生成结果的依赖层数、特征数量是否贴近人工建模习惯。编辑友好度在生成结果上做一次“改板厚、改直径”的扰动测试观察特征树是否自动更新成功。这三个指标比单纯的几何误差更能反映text-to-CAD的实际价值。6. 项目体会与个人经验总结做完整条流水线我最深的一个体悟是text-to-CAD和text-to-3D表面上只差一个字母实际是完全不同的工程命题。前者的核心壁垒不在生成模型本身而在“可执行性校验”和“特征树合理性”这两个工程环节。生成模型决定上限而校验与约束决定下限。一个能生成漂亮网格的模型很容易让人兴奋但只有配合上可靠的执行校验器它才真正进入可用的范畴。另一个体悟是数据质量的控制永远值得花最多时间。我做数据清洗的时间远超模型调参的时间但每次清洗带来的提升都立竿见影。序列化过程中丢掉多少信息、数值离散化粒度如何选择、长尾尺寸如何处理这些细节才是模型最终表现的分水岭。最后分享一个小技巧训练时给数值token加上微小的随机扰动尺寸值在小数点后一位的范围内随机抖动。这么做看起来会影响精度实际反而让模型对数值分布更加鲁棒生成结果在大范围尺寸变化时表现更稳。这是我试过最简单但性价比最高的数据增广手段推荐想复现的读者直接抄这个作业。