给工程师朋友推荐text-to-cad这类工具时我最常听到的反应是“AI会画图是一回事让它画能用的CAD模型”说实话我一开始也这么想。直到有一天领导要求把一批老零件的安装孔从4个改成6个、孔径统一放大2mm我坐在工位上机械地重复同样的操作突然意识到这种活真的应该交给机器。text-to-cad就是把自然语言描述翻译成可编辑CAD模型的自动化流程它解决的不是“从白纸开始画图”的问题而是从需求到模型的转化成本问题。不管你是做机械设计、结构件打样还是想给3D打印模型批量生成变体这个方向都值得认真看一遍。1. text-to-cad到底终结的是哪一类重复劳动1.1 从“口头需求”到“能用的模型”中间隔着多少步做过非标设备的人都有这种经历客户说“这里加一个安装座固定传感器”然后呢安装座装在哪个面孔距多少传感器是M4还是M6螺纹导线要不要走线槽材质用铝还是不锈钢。落在那张草图上可能是三分钟的事落到三维模型里就是半天起步。这不是建模操作本身难而是语言和模型之间存在巨大的信息不对等。传统流程里需求到模型的链路大致是这样的需求沟通 → 工程师拆解为设计参数 → 初版建模 → 干涉检查 → 尺寸调整 → 评审 → 再改模型。每一步都可能往复两三次。真正耗时的不是“画一个拉伸特征”而是“确认这个拉伸特征到底该长在哪、长多大、和谁发生关系”。text-to-cad切入的正是最前面那段把“还能商量的初版模型”交给机器给人留出时间去处理更棘手的装配关系和制造约束。举个例子我拿一个M8六角螺栓转成文本描述“六角头对边13mm头部厚度5.2mm螺纹长度20mm螺距1.25mm总长25mm。”对着LLM说这句话生成CADQuery脚本再执行整个过程可能不到一分钟。手动建模再快也不会低于五分钟而且每换一个直径都要重新调参。批量做10个规格螺栓text-to-cad的优势就非常明显了。1.2 为什么CAD文本生成比AI绘画晚这么久很多人奇怪AI画图已经能画出以假乱真的插画了为什么CAD模型生成才刚起步答案不在模型能力而在输出对象的本质差异。图片是栅格像素稍微模糊一点、边缘偏移一点人眼和下游业务都能接受。CAD模型是精确几何一个面差0.1mm装配就会干涉孔位偏0.2mm螺钉就可能穿不出。像素有容错几何没有。更隐蔽的问题是数据。互联网上有几十亿张图片带文字标签但网上几乎没有公开的、带干净标注的CAD模型库。工业CAD模型大多躺在企业的PLM系统里附带的属性是图号、材料、版本很少有人会为模型写一句“这是带四个腰形孔的低碳钢底板”。这导致text-to-cad的数据集只能靠学术机构后期加工规模比图像数据集小几个数量级。另一个被低估的障碍是语言本身的歧义。CAD领域有专业的图纸语言但自然语言里没有那种精度。“大一点”“厚一点”“差不多”这种词在建模里必须翻译成具体数值。LLM擅长的是在词面上补全它不知道一个法兰盘的厚度通常和直径有相关性也不知道钣金壁厚最小不能低于某个值。这些常识需要额外注入到提示词或后处理规则里是当前text-to-cad工程化绕不开的功课。2. 技术路线之争为什么主流方案都在生成代码而不是生成网格2.1 网格模型看似合理却在工业软件里寸步难行听起来最顺的思路是让神经网络直接输出一个3D网格再用点云或体素重建。这项技术其实很成熟很多AI建模demo展示的就是这个一个茶壶、一把椅子生成出来像模像样。但你把一个生成好的mesh文件倒进SolidWorks或者NX里就会发现事情变得很麻烦软件把它当作“输入几何”而不是“本地特征模型”你无法编辑草图中的尺寸无法修改拉伸深度也无法改孔距。它就像一张不发源文件的图片看着对实际没法用。工程CAD的核心价值在于“可重放的特征历史”。一个零件最有价值的部分不是最终那坨几何形状而是从草图、拉伸、阵列、抽壳一步步搭建的过程。修改任何一个中间参数后面所有特征都会跟着更新。网格模型没有这个结构直接生成网格等于把工业设计的可复用性丢掉了。还有一个现实问题网格转B-rep的算法至今都不稳健。网格转STEP会遇到曲面拟合误差、拓扑缝隙、法向不一致最后转出来的实体要么没法布尔运算要么有微小的自相交。指望神经网络输出高质量网格再自动转成完美CAD现阶段属于用错误的中间表示绕远路。2.2 生成代码的本质让模型扮演建模脚本工程师现在业界和开源社区更看好的路线是让大语言模型输出CAD脚本代码比如CADQuery、OpenSCAD或者Fusion 360的Python API再在本地执行代码生成模型。这条路径的本质不是“让AI生成模型”而是“让AI写一个建模程序”程序跑完模型就出来了。这个思路妙在哪里第一代码是可读的如果生成错了工程师可以像review代码一样查找问题改一个数字重新跑一遍就行。第二参数化天然成立CADQuery脚本里的变量就是设计参数改螺纹直径只需要换一个变量的值。第三输出是标准特征模型它是基于真正CAD内核构建的实体能被下游CAM、CAE直接识别而不是一堆孤立网格。代价也很明显大模型对三维空间的想象能力仍然有限。它可能写出语法完全正确、但几何上完全错误的脚本比如让一个孔洞从实体外面开始切、把两个布尔运算对象重合后搞出退化的模型。所以目前靠谱的实践都强调不要直接相信生成结果必须做几何校验并且要在可控的沙盒环境里运行AI生成的代码。2.3 当前能打的分支方案与典型工具我把现在的主要实现粗略分成三类方便你建立整体认知。路线思路典型形态适合场景主要短板LLM生成脚本GPT/开源LLM输出Python或CAD脚本执行后得到模型各类基于LLM的CAD插件、Workflow快速出概念草模、批量变体依赖模型空间推理容易出幻觉端到端序列生成用Transformer直接输出CAD建模操作序列学术界的DeepCAD、Text2CAD系列科研探索、标准件库对装配体和自由曲面支持弱混合解析与规则库LLM只做意图解析参数映射到参数化模板部分工业软件内置的辅助模块企业定制件、标准化特征需要预先搭建模板库灵活性有限如果你是第一次接触我建议关注LLM生成脚本这条线因为它的门槛最低、更新最快而且你可以用已经训练好的大模型API跑通一个真实流程不需要自己训练模型。后面三个章节我会带你完整走一遍。3. 手把手实操用大模型加CADQuery跑通“一句话建模”3.1 环境准备与最小依赖组合在动手之前先把环境搭好。我这里给的是最轻量的一套组合本地Python环境运行CADQuery外部大模型API负责生成CAD脚本。来回验证大概半小时内能跑通。我的推荐组合是这三个东西Python 3.9 以上环境我用conda管理避免系统Python被搞乱。CADQuery库负责执行CAD脚本和导出STEP。一个可访问的大模型API客户端用来发送提示词和接收代码。安装命令比较简单新建一个环境然后pip安装cadquery。为了后面方便可以顺便装上openai客户端。我不在这里展开每个包的依赖细节官方文档都写得很清楚重点是环境隔离避免版本冲突。conda create -n cq_ai python3.9 conda activate cq_ai pip install cadquery openai为什么选CADQuery而不是直接调商用CAD因为CADQuery完全脚本化可以在命令行里无头执行不需要打开图形界面正好适合接大模型输出。它的建模思路也接近机械设计的思维方式Workplane上画草图然后拉伸开孔LLM学习这类代码的规律要相对容易一些。3.2 提示词策略怎样写CAD提示词才有高成功率跑通text-to-cad的人都会告诉你一句实话模型能不能生成好代码一半取决于提示词。和平时聊天式提示词完全不同给CAD用的提示词需要把规则立得非常死。我推荐直接使用下面这种“约束式提示词”结构把输出格式、单位、变量和禁忌全部写清楚你是一个熟练使用CADQuery库的Python工程师。请根据用户的自然语言描述生成一段完整的Python代码使用CADQuery库构建机械零件模型。 要求 1. 只输出纯Python代码保留在python代码块中不输出任何解释文字。 2. 所有尺寸以毫米为单位并使用float类型定义成有意义的变量名。 3. 不要使用cadquery之外任何第三方库。 4. 代码必须定义result变量并在最后调用EXPORT。 5. 生成完成后添加一个基础的几何自检如果关键尺寸小于等于0直接抛出ValueError。注意最后一条很多生成结果错误都源于模型为了凑一个好看的数字把尺寸写成负数或零加上自检逻辑可以让这些错误在执行阶段直接暴露出来而不是默默生成一个畸形的模型。接下来给一个具体需求示例。你可以拿它测试整个链路生成一个矩形法兰底板。板长120mm板宽80mm板厚10mm。在板的中心区域挖一个深度3mm、长度100mm、宽度60mm的矩形沉槽槽底圆角R2。在沉槽边缘外侧的四个角落各打一个直径8mm的通孔孔中心距板边15mm。所有尺寸使用变量定义。这描述完全够一个普通工程师建模但LLM仍然可能把沉槽深度搞成正的拉伸而不是切割也可能把孔放错位置。所以提示词里我给模型留了退路如果它不理解至少要生成“可运行”的代码然后靠人工检查几何结果来修正。3.3 完整调用流程与生成后的检查习惯下面是连接大模型和CADQuery的最小调用脚本。这里用的客户端接口是常见的聊天补全风格你换成其他开源模型都同理。import os import re from openai import OpenAI client OpenAI(api_keyos.getenv(LLM_API_KEY)) prompt 你是一个熟练使用CADQuery库的Python工程师。请根据用户的自然语言描述生成一段完整的Python代码... 把你上面的提示词原样粘进来 resp client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你是CAD脚本生成专家输出内容必须准确、克制、可执行。}, {role: user, content: prompt} ], temperature0, ) python_code resp.choices[0].message.content # 提取代码块 match re.search(rpython\n(.*?)\n, python_code, re.S) if match: with open(generated_part.py, w, encodingutf-8) as f: f.write(match.group(1)) print(代码已保存请人工审查后再执行)把温度设为0很重要温度越高模型越喜欢发挥在CAD场景里“发挥”就是尺寸乱飘。这一步只是生成代码我建议不要立刻执行先人工看一眼主要是检查有没有危险操作和明显错误。如果代码看起来正常再执行python generated_part.py执行脚本会在当前目录导出STEP文件。下面是一次实际生成的代码需求是“四角带通孔的沉槽法兰板”模型输出大概长这样import cadquery as cq plate_length 120.0 plate_width 80.0 plate_thickness 10.0 slot_depth 3.0 slot_length 100.0 slot_width 60.0 corner_hole_d 8.0 hole_edge_offset 15.0 if plate_thickness 0 or plate_length 60 or plate_width 60: raise ValueError(基本尺寸不满足建模约束) result ( cq.Workplane(XY) .box(plate_length, plate_width, plate_thickness) .faces(Z) .workplane() .rect(slot_length, slot_width) .cutBlind(-slot_depth) .faces(Z) .workplane() .pushPoints([ (-plate_length/2 hole_edge_offset, -plate_width/2 hole_edge_offset), (plate_length/2 - hole_edge_offset, -plate_width/2 hole_edge_offset), (-plate_length/2 hole_edge_offset, plate_width/2 - hole_edge_offset), (plate_length/2 - hole_edge_offset, plate_width/2 - hole_edge_offset), ]) .hole(corner_hole_d) ) cq.exporters.export(result, flange_plate.step)这段代码生成的模型是“底板上方开了一个3mm深的沉槽四角各钻一个8mm通孔”可以直接导入任何支持STEP的CAD软件检查。你仔细观察会发现一个细节模型自动判断了孔位距离并加了一个基本尺寸的自检断言。这就是提示词里约束语术发挥效果的例子。模型不是真的“理解”了法兰设计规范而是被提示词引导去遵循工程常识。拿到模型后我养成了一个固定的检查习惯先打开STEP看特征树确认沉槽和孔是独立特征而不是直接布尔合并出来的垃圾体再打开剖视图确认孔真的贯穿了板厚最后用测量工具确认关键点位尺寸。这套检查和平时对设计师的图纸检查没有区别机器生成的模型更需要这种物理层面的验证。4. 数据集与评测指标怎么判断生成得好还是坏4.1 DeepCAD与Text2CAD当前主流数据集长什么样前面说了text-to-cad的瓶颈一定绕不开数据。这个领域绕不过去的两个公开数据集是DeepCAD和Text2CAD。DeepCAD的价值在于把机械CAD模型的建模过程给序列化了。它收录了大量真实机械零件模型每个模型都附带对应的建模操作序列比如“新建草图、拉伸10mm、切除5mm、阵列六个孔”。这些操作序列经过token化之后就是现成的训练语料。模型学习到的是“某个特征应该接在哪个面之后”这让端到端生成路线成为可能。Text2CAD是近年推出的新数据集它的想法很直接既然要文本生成CAD那就先给每个模型配上自然语言描述。论文团队把DeepCAD里的模型逐个人工写成“底板300毫米长200毫米宽16毫米厚带有六个M8通孔”这类描述然后训练一个从文本到建模序列的模型。虽然规模仍然有限但它提供了一个所有研究者都能对齐的基准。使用这两个数据集时要意识到它们的特点绝大多数模型是回转体、拉伸体和它们组合而成的机械件几乎没有自由曲面也几乎没有完整的装配体。所以学术界在数据集上跑出高分不代表模型能理解“这里要一个流线型外壳”这种工业设计需求。工业设计的曲面和复杂造型仍然要靠传统建模text-to-cad暂时管不了。4.2 从Chamfer Distance到约束满足率学术指标和工程验收的差距提到评测论文里最常出现的是Chamfer Distance字面意思是“倒角距离”。它的原理很简单生成模型表面的每个点去找目标模型表面上最近点算所有距离的平均。这个指标能粗略反映两个模型在空间上的重合程度。但放在工程场景里这个指标就很离谱了。两个模型点云重合度很高不代表一个能开模一个不能一个孔偏了0.3mm点云距离上根本看不出来但装配时就是装不上。反过来一个模型尺寸全错但形状很接近Chamfer Distance可能还挺好看实际就是个废品。做工程落地的人更关心的其实是这些维度模型能不能在目标CAD软件里打开、特征树是否完整、修改参数后是否稳定重算、关键尺寸是否满足公差要求、有没有自相交或零厚度的退化特征。这些指标没有一个能靠点云距离算出来。所以我一直认为真正评估text-to-cad系统好坏的标准是“修改参数之后它还能不能好好更新”。这比任何学术指标都贴近真实设计流程。我的建议是玩一下论文模型没问题但如果你真的想在生产中评估一个text-to-cad工具就用你的真实零件去生成10个变体然后逐一做三件事打开、改参数、检查干涉。能过了这三关才值得继续谈。5. 想到生产里用这些坑我提前帮你踩过了5.1 数值与单位最容易发生的“翻译失真”语言里的“孔距约80毫米”到了代码里可能会变成“孔距80.5”或者“孔距80.0但整体单位是英寸”。大模型对单位极其不敏感这是我在试过几十次之后确定的规律。解决方法是在提示词里加一条硬约束“所有尺寸以mm为单位并使用float类型变量定义不得使用整数。”整数的问题在于一个杯口直径120mm的模型如果全用整数生成特征自检时可能通过但公差信息全丢了。浮点数至少保留了精度概念后续人工调整也更顺。另一个容易被忽略的坑是“视觉上合理数值上不现实”。比如你让模型生成一根直径30mm的轴它可能把轴总长写成3000mm假装自己符合比例。解决方式是把关键尺寸关系也写进提示词然后让模型自己在代码开头加断言。别嫌这一步麻烦哪怕多写两行断言也比事后在三维软件里逐个发现异常强得多。5.2 幻觉与自洽性问题看似能编译实则没法加工这里说的幻觉不是指模型胡编零件名而是指它生成了一段完全可运行的代码但构建出来的几何根本不可能制造。最常见的有三种孔位落在实体外部、壁厚薄到0.01mm、某个特征被另一个特征完全吞掉导致实际几何缺失。举个具体例子我让模型生成一块带中心方孔的底座板孔边长40mm、板边长50mm。模型给出的代码语法完全正确但稍微心算就知道方孔和板边之间的壁厚只剩5mm这已经是相当薄的结构了。如果再让模型随手加两个沉头孔这些孔很可能直接和方孔切穿造成实际几何退化。LLM在词面上知道“孔”“座”这些概念但没有空间关系常识。应对方法分为三层。第一层是提示词要求“所有特征必须从真实存在的实体面上开始”。第二层是代码层像前面说的参数断言把危险的约束关系写成条件。第三层是结果层导出STEP后用CAD软件自动检测薄壁和干涉区域。我给团队的规矩是没有过第三层的模型一律不算完成。生成代码这件事可以自动化但验收必须回归到制造层面的物理逻辑。5.3 数据合规和后续编辑别把企业图纸直接喂给外部API最后说一个很多人没意识到的问题当你用外部模型API做text-to-cad时你输入的提示词本身就是企业敏感信息。如果你把“某型号传感器的安装底板孔径4.2mm孔位相对基准面偏移20mm”发给云端模型你的产品尺寸特征就已经离开公司网络了。这是我在企业里落地时遇到的真实阻力也是很多研发负责人一票否决这个方案的原因。合规的替代方案并不是不用AI而是改变调用边界。第一种做法是把大模型本地化部署用开源小模型做代码生成虽然是开源参数规模有限但对标准件变体这种场景足够。第二种做法是混合架构本地规则库负责参数映射和几何建模大模型只做“意图识别”把“带四个孔的底板”解析成结构化的模板参数外部模型根本不接触具体尺寸。第三种做法最稳妥但实现成本最高那就是彻底离线训练一个小型专用模型挂在内部系统里。后续编辑的坑也同样要提前设计。LLM生成的脚本第一次执行成功不代表第二次改参数还能成功。CADQuery是这样一种API它强调工作平面上的操作链如果修改了某个尺寸导致后续特征依附的面不存在了脚本直接跑崩。我提醒所有刚开始用text-to-cad做变体设计的朋友你的测试不能只测原型必须把参数边界列表也写进去。比如孔间距最小值、槽深上限、壁厚下限一旦越界就要让系统自动拒绝。否则第一版跑得很欢第三版参数一改就崩你会比手动建模更痛苦。根据我个人的实测经验text-to-cad最舒服的使用方式不是“把提示词当产品经理把模型当绘图员”而是“把提示词当编程接口把模型当参数化脚本生成器”。给它的需求越结构化它产出的结果越稳定。你完全可以把常用零件做成固定的提示词模板每个模板留出五六个参数位每次只改数值这样成功率会从碰运气变成可预期的稳定输出。这也是我认为这个方向真正值得在生产环境投入的原因它没有取代设计师而是把设计师从重复的参数调整里解放出来了。