
一直关注AI生成三维模型这个方向的朋友应该能明显感觉到“text-to-cad”这个词最近一段时间在各个平台上的热度都在涨。简单来说它就是让用户用一句自然语言描述自己想要的零件或结构系统直接生成对应的CAD模型。比如输入“一个带四个安装孔的法兰盘外径100毫米厚度12毫米”得到的不再是一张概念图而是可以继续编辑、测量的三维模型数据。这个能力对工业设计、机械加工、3D打印和快速原型验证来说价值非常直接核心就在于把“脑子里想的”和“软件里画的”之间的那层窗户纸捅破。这篇文章我想从实际使用的角度出发把text-to-cad的原理、主流实现思路、整个操作流程、参数设置以及在测试过程中踩过的坑系统性地讲一遍。如果你正准备尝试这类工具或者打算在自己的工作流里接入类似能力这篇文章应该能帮你省下不少摸索的时间。我不会只堆概念会尽量把关键环节的“为什么这么做”也讲明白。1. 先说清楚text-to-cad 到底是什么能解决什么问题过去我们要把一个想法变成CAD模型路径非常固定打开建模软件、选基准面、画草图、加约束、拉伸旋转切除、倒角圆角……这套操作熟练的人做起来快但门槛始终摆在那里。更重要的是它要求你在动手之前脑子里已经有一个相对清晰的几何结构。如果你只是大概知道“我要一个能连接两根管子的东西”在软件里反而不知道从哪里入手。text-to-cad的核心逻辑是把“几何描述”这件事从“手动操作”变成“语义映射”。它的任务链条可以拆成三步理解自然语言里的几何信息和功能意图把它转换成中间的三维表示再重建成符合CAD规范的可编辑模型。这个过程本质上跟大语言模型生成代码很像——输入是文字输出是另一种结构化的东西只不过这次输出的不是代码而是几何体。那它跟我们更熟悉的AI生图有什么区别生图模型生成的是像素矩阵每一块颜色放在哪儿都无所谓只要整体看起来像就行。但CAD模型是完全相反的它要求精确、可测量、可装配、可加工。一个法兰盘的孔径如果差0.5毫米装配的时候就是装不上。所以text-to-cad不能只做到“看起来像”它必须做到“数值上对”。这也正是这个方向比AI生图难得多的地方也是很多工具实际效果参差不齐的根源。从应用场景来看text-to-cad最适合这几类人需要大量概念模型的工业设计师先快速出草模再细化非机械背景但需要定制零件的创客、电子工程师比如设计一个外壳、支架在做逆向工程或者参数化设计的人想快速搭一个初始几何再去调整教育场景里用来讲解建模思路让学生先描述、再对照生成的模型理解结构关系。不过要注意它目前还不是用来替代精细建模的。你不可能指望它一句话生成一个复杂的装配体、或者一个需要严格公差配合的精密零件。它更擅长的是把“结构明确、特征清晰”的零件模型快速生成出来省掉从零开始的重复劳动。2. 整体设计与技术路线选型2.1 三条主流技术路线的对比我在测试和阅读相关技术方案的时候发现text-to-cad的实现路线大致可以分成三种。它们各有明显的优缺点理解它们的差异能帮你判断一个工具生成出来的结果质量上限在哪里。第一条路线是“文本到三维数据直接生成”。原理跟Stable Diffusion生成图片类似只不过把图像换成体素、点云或者隐式曲面。模型接收文本编码通过扩散或生成式网络直接输出一个三维几何。这条路线的优势是流程短、端到端、生成速度快从输入到出结果可能只需要几秒钟。但问题也很突出生成的几何通常是网格或者隐式场精度不高而且几乎不可编辑。你想把生成结果拿去改动某个孔的尺寸不好意思做不到它就是一坨三角面片。第二条路线是“文本到程序化建模脚本”。也就是让大语言模型直接写代码生成一段OpenSCAD、CadQuery或者类似参数化脚本。执行脚本就能得到CAD模型。这个路线的最大好处是生成的模型天然是参数化的所有尺寸都是变量后续改起来非常方便。而且因为脚本是可读的文本出了问题也能直接在代码层面修改。但它的短板在于语言模型写代码是有幻觉的很容易生成语法正确但几何上根本不可能成立的脚本比如一个自相交的拉伸体、或者负半径的圆。你需要有一个强校验环节兜底。第三条路线是“文本到中间表示再重建为B-Rep实体”。这是我现在比较推荐的方向。它的做法是先让模型预测一个相对简单的中间结果比如一个带尺寸标注的草图、一个2D布局图、或者一组关键尺寸参数然后再通过传统的几何内核把中间表示重建为边界表示B-Rep实体。这样做的好处是把“语义理解”和“几何精确性”分开处理语言模型负责它擅长的部分——理解意图、提取参数几何内核负责它擅长的部分——精确建模、布尔运算、拓扑处理。2.2 为什么我不推荐直接端到端生成B-Rep如果你想做一个能真正用于生产的工具千万不要走“文本端到端直接输出B-Rep实体”这条路。我见过几个尝试这么做的研究者最后都卡在了同一个问题上B-Rep的数据结构太复杂了。一个B-Rep模型不只是一堆面片它是一个完整的拓扑结构包含面、边、顶点、环以及它们之间的邻接关系。每个面还关联着对应的曲面方程比如平面、圆柱面、样条曲面。让神经网络直接预测这种东西相当于让它一步到位学会整个CAD内核的数据结构。现有的深度学习方法在预测这种强结构化、强约束的数据时效果都很差。稍微错一个拓扑关系整个模型就废了。比较合理的做法是降低生成难度把复杂问题拆解。先让神经网络生成一个粗糙的、语义层面的表示比如一张带约束的草图或者一组CSG操作树。然后再用确定性的几何算法把这些表示转换成精确的B-Rep。这样每个环节都是可控的出了问题也能定位到具体是哪个环节出了问题。2.3 我选定的方案架构在我实际搭的一个模拟项目中我采用的架构是这样的文本编码器负责把自然语言转成语义特征向量然后由一个布局生成网络预测模型的整体尺寸信息和部件空间关系接着由一个草图生成模块画出每个视角下的关键轮廓最后把草图和尺寸信息交给几何重建层生成水密的B-Rep实体并导出为标准格式文件。这个架构最大的好处是模块之间解耦。语言理解不好就单独优化语言模块草图生成不好就单独优化草图生成模块。调试的时候不用把所有问题搅在一起排查起来清楚得多。3. 核心细节解析与实操要点3.1 文本特征处理决定你能生成什么文本特征处理是整个pipeline的起点它的质量直接影响最终模型能不能准确反映你的描述。最开始我用的是通用领域的文本编码模型效果一般。问题在于CAD领域有大量专业词汇比如“沉头孔”“腰型槽”“倒角”“拔模斜度”通用模型对这些词的语义表示并不敏感。后来我改用了一个在CAD语料上微调过的文本编码器效果提升很明显。尤其是对尺寸词、特征词和空间关系词的理解准确率上了一个台阶。实操中我会把用户的描述先做一个结构化预处理把句子里的信息拆分出来分成几个维度零件类别、主体形状、关键尺寸、特征列表、空间关系。比如“一个带四个安装孔的法兰盘外径100毫米厚度12毫米”这句话拆解出来就是零件类别法兰盘主体形状圆形盘体关键尺寸外径100毫米厚度12毫米特征列表4个安装孔空间关系孔均匀分布这种结构化信息比直接扔一整句话给模型要稳定得多。因为它把“尺寸数值”和“语义概念”分开处理模型就不用自己琢磨“100毫米”到底是外径还是孔距了。3.2 三维表示与损失设计隐式场是起步但不是终点生成三维几何的时候主流的做法是用隐式场作为中间表示而不是直接预测网格。所谓隐式场可以理解成一个函数输入一个空间坐标输出这个点是在物体内部还是外部以及到物体表面的距离。这种方式的好处是分辨率不受限制无论你想生成多大尺寸的模型都能保持表面连续。但隐式场的直接输出是离散的标量场要变成可用的CAD模型还得经过一个抽取等值面的步骤。我当时用的是移动立方体算法把这个标量场转成网格。这一步的参数设置很关键尤其是等值面的阈值和网格的密度。阈值设得太高会把细小特征抹掉比如小圆角、小孔直接被吞掉设得太低又会产生大量噪声面片。损失函数的设计也有讲究。我主要用了三项一项是表面距离损失衡量预测的隐式场跟真实形状的差异一项是法向一致性损失确保预测表面的法线方向正确不然后续做光照渲染会出现乱七八糟的明暗还有一项是正则化项防止隐式场在远离表面的地方出现不合理的取值。这三项里面我觉得法向一致性最容易被人忽略但它对最终模型的可视化质量影响非常大。3.3 布局与草图生成让“位置关系”变得可约束很多text-to-cad工具生成出来的模型单个看还行一旦涉及多个部件的位置关系就崩了。比如你说“一个底座上等距放置三个圆柱”它可能给你生成三个位置乱掉的圆柱甚至可能嵌到一起。这就是布局生成模块没做好。我的经验是布局问题不能靠单一的神经网络自己学一定要配合传统的空间约束求解器。先由神经网络预测每个部件的中心坐标、朝向和尺寸范围然后把它们交给一个约束求解器强制执行诸如“等距”“同轴”“对称”这类几何约束。神经网络负责提候选方案求解器负责保证可行性各司其职。我试过单纯靠神经网络硬学对称性效果非常不稳定十次里至少有三次是歪的。草图生成跟布局类似最好也用“预测修正”的模式。神经网络先画一张大致轮廓然后用参数化约束修正草图的尺寸、垂直、平行、相切这些关系。这样出来的草图才是可用的而不是一堆毫无约束关系的杂乱线段因为后续做拉伸旋转需要依赖这些约束来生成精确的实体。3.4 网格修复与参数化转换把“艺术家”的成果变成“工程师”的零件很多人以为text-to-cad的最后一步就是生成一个网格完事。如果只是用来做个展示动画那确实够了。但只要你的目标是拿去加工、3D打印、或者导入到主流CAD软件里继续编辑你就必须把网格转成B-Rep实体这就绕不开网格修复。网格转B-Rep第一步是网格修复。算法生成的网格经常会有这些问题非流形边、自相交面、孔洞、错向法线。这些问题都会导致后续转换失败。我用的修复流程是先自动检测并删除非流形边再缝合孔洞最后检查法线一致性。修复完成后再用一个基于面片拟合的算法把平面区域拟合成平面、把圆柱区域拟合成圆柱面、把球面区域拟合成球面最终才能输出一个干净的B-Rep模型。4. 实操过程与环节实现4.1 环境准备别在显存上栽跟头text-to-cad对硬件的要求比一般的大语言模型还要高因为除了文本模型之外还有三维生成模块两者同时跑起来显存占用非常惊人。我第一次跑的时候用的是16GB显存的卡生成一个中等复杂度的零件直接报显存不足。后来我把文本编码部分跟三维生成部分的加载做了分离先生成文本特征并缓存下来再加载三维模块生成才勉强跑通。如果你条件允许建议直接用24GB显存以上的卡体验会好很多。软件环境方面我建议优先用Linux系统CUDA版本要跟所用的深度学习框架匹配好不然到跑训练的时候才会报一堆“找不到内核”的错排查起来异常痛苦。Python环境我习惯用conda管理为这个项目单独建一个环境避免跟其他项目互相污染依赖。conda create -n text2cad python3.10 conda activate text2cad pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install open3d trimesh numpy scipy4.2 模型加载与关键配置在加载预训练权重之前别急着跑推理先花几分钟检查配置文件的参数。我踩过好几次坑都是因为用了默认配置生成结果非常敷衍。几个关键参数值得单独说。第一个是生成分辨率。这个参数控制隐式场采样的细腻程度直接决定输出网格的面数和细节保留程度。分辨率太低小特征直接糊成一团分辨率太高显存爆炸、时间拉满。折中的做法是先用低分辨率跑一遍确认整体形状没问题再用高分辨率精修。第二个是无分类器引导强度guidance scale。这个参数控制生成结果对文本描述的跟随程度。调得太低生成结果跟文本描述没什么关系调得太高模型会过度解读甚至出现“忠实但畸形”的情况。我常用的区间是7到12。第三个是采样步数。增加步数能提升质量但收益不是线性的。超过一定步数之后画面质量提升非常有限但耗时成倍增加。我一般先设30步跑快速实验确定提示词没问题之后再设到80步出最终结果。4.3 提示词工程这是理工科版本的“跟AI沟通”用text-to-cad跟用AI生图一样提示词写得好不好直接影响结果质量。但规则很不一样生图的关键是风格词、光线词、氛围词而text-to-cad要的是准确的几何描述和尺寸信息。我摸索出一套比较稳定的写法模板分享出来供参考先交代零件类型相当于告诉AI“这是什么”让它在正确的语义空间里搜索再交代主体形状和尺寸用具体数值不要用模糊形容词接着逐个列出特征每个特征说明类型、数量、尺寸和位置最后补充关键工艺特征比如倒角、螺纹孔如果不需要可以不写。对比一下两种写法。第一种“一个圆形的法兰有几个孔尺寸中等螺纹孔”。第二种“一个法兰盘外径100毫米内径60毫米厚度12毫米6个直径为8毫米的通孔均匀分布在直径为85毫米的螺栓圆上外缘倒角2毫米”。第二种的生成成功率几乎是第一种的两倍以上。之所以强调“每个特征都要有尺寸和位置”是因为语言模型对模糊空间词汇的理解非常不可靠。“有几个孔”“中等大小”“差不多在中间”这些描述不同模型给出的解释千差万别。你把尺寸写明确了模型用不着猜测直接照做就是。4.4 从生成结果到可编辑CAD别再手动描图了生成完成之后系统输出的通常是一个网格文件比如OBJ或者STL。如果你直接拿STL去3D打印也不是不行但如果你要导入主流CAD软件继续编辑这个格式基本等于一堆废数据。SolidWorks想编辑一个没有特征树的网格用户体验极其痛苦。所以我的做法是生成网格之后先做一次“表面平滑”和“简化”尽量去掉噪声面片和多余顶点然后做一次“水密化”处理确保模型内部没有非流形结构。之后再根据网格法线和曲率信息做区域分割把平坦区、圆柱区、圆角区分开分别拟合对应的解析曲面最后输出STEP格式。这整个流程如果算法实现得干净基本不会丢掉关键特征。5. 常见问题与排查技巧实录5.1 生成结果结构混乱多个部件粘成一团这个问题最常见尤其当你描述的是多部件结构时比如“一个底座上放一个圆筒”。模型很可能把底座和圆筒融在一起形成一个没有任何分界面的怪异实体。原因在于布局生成模块没有起到约束作用两个部件的空间位置没有被合理隔离。排查思路先看中间输出的布局图检查每个部件的包围盒是不是正确。如果布局图已经错了问题出在布局生成模块如果布局图是对的但最终实体还是一团问题出在网格重建阶段是等值面抽取的时候把两个本该分离的区域连在了一起。解决方案在布局生成阶段强制给每个部件加上最小间距约束确保两个部件的包围盒之间存在一定的空隙。或者在网格重建阶段预设分割体素根据每个体素所属的部件ID分别抽取等值面最后再拼装成装配体。后者效果更好但实现复杂度更高。5.2 文字细节缺失小孔、倒角、螺纹被忽略生成结果只有大形、没有细节又是另一个高频问题。比如你说“带螺纹孔”生成出来的就是一个光滑的圆柱孔根本没有螺纹特征。原因很简单细节特征的体量小在隐式场采样的时候小特征占的体素数量太少被当作噪声抹掉了。排查思路检查采样分辨率。如果分辨率不够小特征根本不会被采样到。另一个原因是损失函数的设计如果对表面细节的权重太低模型会倾向于生成光滑的结果因为光滑曲面的损失更小。解决方案提高采样分辨率是最直接的但会带来显存压力。我找到的折中方案是在生成过程中使用渐进式分辨率先用粗略网格确认大形然后在大形附近做局部细化采样把注意力集中在表面区域。这样既能保留小特征又不会把显存吃满。5.3 尺寸比例失真明明说了80毫米生成出来是40毫米尺寸比例错乱是text-to-cad工具最让人抓狂的bug。你明明在提示词里写了外径80毫米生成出来只有40毫米而且整个模型的比例看起来是变形的不是均匀缩放是各轴比例都不一样。这个问题的根源在于很多生成模型本身不理解“毫米”这个单位它只是把文本里的数字当作一个语义特征来参考并没有建立“1毫米多少个体素”的映射关系。所以数字60和80对模型来说只是“两个不同的数字”而不是“长度相差20毫米的关系”。解决方案是在文本编码阶段增加一个尺寸归一化模块把所有尺寸数值映射到一个标准的范围里比如以模型最长边为基准所有尺寸都表示成相对最长边的比例。这样模型只需要学习比例关系而不用操心绝对单位。但这样也有后患——生成结果的绝对尺寸就失真了。所以最终尺寸还是需要人工校对或者用基于规则的尺寸修正模块把生成模型的包围盒缩放到预设的实际尺寸。5.4 运行时间过长或显存溢出生成一个中高复杂度的模型整套流程耗时在3到15分钟之间。如果你的机器配置不够或者参数设得不合理时间还可能更长甚至直接崩掉。我遇到的显存溢出绝大多数发生在隐式场采样阶段因为要在一个三维空间里对每个网格点都计算一遍网络输出这个计算量是O(N³)的分辨率稍有提高显存压力就是指数级上升。比较管用的排查方案是先降低分辨率跑一遍流程确认整体结构没问题再逐步提高分辨率找到一个平衡点。如果瓶颈只在采样阶段也可以考虑用分块采样的方式把一个大的三维空间切分成若干小块逐个计算再拼接显存占用会显著降低。这个表格整理了一些典型问题和对应的排查优先级问题现象可能原因排查优先级解决方案多部件粘连布局模块失效/等值面连通高检查布局输出增加间距约束细节特征丢失采样分辨率不足/损失权重低高提高分辨率局部细化采样尺寸比例失真绝对单位建模失效中尺寸归一化后处理缩放显存不足采样阶段O(N³)开销过大低分块采样渐进式分辨率网格有洞/非流形等值面抽取质量问题中网格修复拓扑重建6. 一些在调试过程中沉淀下来的实操心得整个text-to-cad的调试过程表面上看是跟模型参数较劲实际上是在跟“语义到几何”这条鸿沟较劲。有几个经验希望你提前知道能帮你少走弯路。第一不要用一句复杂的话去描述复杂模型。你描述得越复杂模型出错的概率就越大。拆成多个零件分别生成再在CAD软件里做装配成功率会高很多。我自己测试下来单实体零件的生成成功率大约在70%到80%而带多个部件关系的成功率会掉到40%以下。所以“各个击破再组装”是很务实的路线。第二提示词里尽量使用精确的数字和标准的工程术语。“有一个架子”远不如“有一个L型支架底板长度200毫米宽度100毫米立板高度150毫米底板上有四个直径8毫米的安装孔”来得可靠。工程术语的语义在CAD语料里是有明确对齐的模型见过足够多的“沉头孔”“腰型孔”的表达比你自己发明的描述词稳得多。第三生成不是一次成型的过程把它当迭代来用。先生成大形不满意就改提示词再生成一次或者直接导入CAD软件手动调整细节。这不是偷懒是当前技术条件下最务实的做法。我自己现在的工作流是用text-to-cad做三轮快速迭代确定基本结构和比例再花半小时在CAD软件里精修小特征和公差。还有一点是关于数据集的。如果你打算自己微调一个定制化的text-to-cad模型数据质量比数据量重要得多。网上能找到的公开数据集很多模型都是“好看的网格”根本没有对应的语义标注和精确尺寸标注。用这种数据训练模型能学会“看起来像”但学不会“尺寸对”。我建议优先挑那些带有参数化特征树和完整尺寸标注的数据来训练哪怕数量少一些。text-to-cad这个方向还在快速演进每天都有新的模型结构和训练方法出来。但不管底层技术怎么变核心逻辑基本稳定语义理解、几何推理、精确重建这三个环节缺一不可。你现在花时间把pipeline的每个环节吃透未来不管技术怎么迭代你都能很快跟上。