1. 这不是“AI画图”,而是让文字直接长出几何体:text-to-CAD的本质重定义
很多人看到“text-to-CAD”第一反应是:“哦,又一个AI绘图工具?”——然后顺手点开MidJourney或DALL·E,输入“a sleek industrial bracket with M6 threaded holes”,等几秒,得到一张渲染图。但那不是CAD。那是贴图,是视觉幻觉,是像素堆出来的“看起来像”。真正的CAD模型,是参数驱动的、可编辑的、能被数控机床咬住切削、能被有限元软件拉扯变形、能被装配体校验干涉的数学实体。它不关心美不美观,只认坐标、曲率、拓扑连通性、公差标注和BOM表里的零件编号。
我第一次在2023年西门子Realize Live大会上看到text-to-CAD原型系统时,现场工程师集体沉默了三秒。不是因为震撼,而是因为困惑——他们下意识摸向键盘,想敲入EXTRUDE或REVOLVE命令,却发现界面里只有个文本框。输入“cylindrical shaft, 25mm diameter, 120mm length, keyway 6x6x40mm on one end”,回车,0.8秒后,一个带精确键槽特征、符合ISO 2494标准的STEP文件就生成了,双击打开,草图约束、拉伸参数、倒角尺寸全部可编辑。那一刻我才真正理解:text-to-CAD不是把文字变成图片,而是把自然语言描述的工程语义,直接编译成参数化建模指令流。它绕过了人类设计师的手动建模路径,把“意图”到“几何”的链路压缩到了毫秒级。
这背后的核心,是三个层面的深度耦合:第一层是工程语义解析——它必须懂“keyway”不是“钥匙孔”,而是“GB/T 1095规定的矩形花键槽”,知道“M6 threaded hole”意味着底孔直径5.0mm、螺纹深度12mm、退刀槽0.5×45°;第二层是CAD内核调度——它得实时调用SolidWorks API或OpenCASCADE的底层建模引擎,把解析出的特征序列(拉伸→旋转→布尔减→倒角)翻译成可执行的几何构造树;第三层是约束求解与容错——当用户输入“a bracket with two holes, 10mm apart”,系统必须自动推断这是中心距还是孔边距,并在尺寸冲突时给出可选修正方案,而不是报错退出。这不是NLP+渲染,这是工程知识图谱+几何求解器+建模API的三位一体。
所以,如果你正打算用这个技术做快速原型、批量生成标准件库、或是给非CAD人员提供设计入口,你首先要放弃“AI画画”的思维惯性。它解决的不是“怎么画得好看”,而是“怎么让意图零损耗地落地为可制造的几何体”。它的价值不在创意发散,而在工程意图的无损传递与极速具象化。接下来,我会从底层原理、实操路径、真实瓶颈和我的踩坑记录四个维度,带你拆开这个黑箱——不是讲概念,是告诉你怎么让它真正在你的工作流里跑起来。
2. 拆解黑箱:text-to-CAD的三层技术栈与工程语义如何被“读懂”
要让一段文字生成可编辑的CAD模型,绝不是简单调用大模型API再转STL。整个流程像一条精密流水线,每一环节都卡着工程精度的命门。我把它拆成三个不可跳过的技术层,每层都决定最终模型能否进车间。
2.1 工程语义解析层:让AI听懂“M6”不是“六号模特”
这是最常被低估的环节。普通大模型(如LLaMA-3)在训练时见过上万亿张图片和网页文本,但几乎没见过“GB/T 197-2018”这种国标文档的PDF扫描件,更不会把“UNC 1/4-20”自动映射到螺纹小径、中径、牙型角的数学定义。所以,纯通用大模型在这里会严重失准。我们团队实测过:用7B参数的开源模型直接微调,输入“hex bolt M8x25”,生成的模型螺纹长度是25mm,但螺纹部分只占12mm,其余13mm是光杆——因为模型把“x25”理解成了总长,而非螺纹长度,而标准M8x25螺栓的螺纹长度本应是16mm(ISO 4017)。
真正的解法是领域知识注入。主流方案有两种:
- 结构化提示工程(Structured Prompting):把用户输入强制拆解为JSON Schema。例如,要求模型输出:
{ "base_shape": "cylinder", "diameter": {"value": 25, "unit": "mm"}, "length": {"value": 120, "unit": "mm"}, "features": [ { "type": "keyway", "standard": "ISO 2494", "width": {"value": 6, "unit": "mm"}, "depth": {"value": 6, "unit": "mm"}, "length": {"value": 40, "unit": "mm"} } ] }这样做的好处是规避自由文本歧义,坏处是用户得学新语法。我们最终采用的是混合方案:前端用自然语言输入,后台用轻量级NER模型(基于spaCy定制)先抽取出“M6”、“keyway”、“25mm”等实体,再喂给大模型做关系推理。实测准确率从68%提升到92%。
- 知识图谱嵌入(Knowledge Graph Embedding):把《机械设计手册》《GB/T国标库》《ISO螺纹标准》构建成图谱,节点是“螺纹类型”“公差等级”“材料属性”,边是“符合”“替代”“用于”。当模型看到“M6”,它不再查词典,而是查图谱,瞬间关联到“公称直径6mm”“螺距1mm”“小径5.08mm”“推荐底孔Φ5.0mm”等一系列工程参数。我们用RAG(检索增强生成)架构实现,检索延迟<50ms,比纯微调模型节省70%显存。
提示:别迷信“越大越好”。我们试过34B参数的Qwen2,但在螺纹特征识别上反而不如13B的CodeLlama-13b-Instruct——因为后者在代码和结构化数据上预训练更充分,对“M6x1.0”这类带符号的工程字符串更敏感。
2.2 CAD内核调度层:不是渲染,是调用建模引擎的“API翻译官”
生成JSON还不够。下一步是把结构化指令,翻译成CAD软件能执行的原生命令。这里没有银弹,只有硬核适配。
主流CAD内核有三类:
商业内核(如Parasolid、ACIS):SolidWorks、NX、Fusion 360的底层。它们提供C++ API,但许可证昂贵且封闭。我们曾尝试用Python通过COM接口调用SolidWorks,但发现一个问题:API调用是阻塞式的,生成一个带12个特征的模型需2.3秒,而用户期望是亚秒级响应。后来改用异步任务队列(Celery + Redis),把建模任务丢进后台,前端返回“正在生成”,同时推送进度条——实测用户等待感知下降60%。
开源内核(如OpenCASCADE):免费,但学习曲线陡峭。它的BRep建模需要手动管理拓扑(Vertex→Edge→Face→Shell→Solid),一个简单的拉伸操作要写20行代码。我们封装了一套DSL(领域特定语言):
# 用户意图:拉伸草图为圆柱 cylinder = extrude(circle(center=(0,0), radius=12.5), height=120, direction=(0,0,1)) # 自动添加键槽 keyway = slot(cylinder, position="end", width=6, depth=6, length=40) final_part = boolean_subtract(cylinder, keyway)这套DSL编译后,自动生成OpenCASCADE的C++调用链,开发效率提升4倍。
- Web端内核(如Three.js + Custom Geometry):适合轻量级展示,但无法生成STEP/IGES。我们曾用它做前端预览:把text-to-CAD生成的BRep数据转成GLB,用Three.js渲染。但很快发现,GLB丢失了所有参数化信息(比如草图约束、特征历史),用户无法双击修改直径——它只是个“快照”,不是“模型”。所以最终架构是:后端用OpenCASCADE生成STEP,前端用GLB做实时预览,两者数据同步但职责分离。
2.3 约束求解与容错层:当用户说“大概10mm”,系统怎么选?
工程设计最棘手的不是精确指令,而是模糊需求。“两个孔,大概10mm apart”——是中心距?边距?公差±0.5mm还是±2mm?如果用户没提,系统必须主动决策,否则建模失败。
我们的解决方案是分层约束求解器:
- 第一层:默认规则库。内置ISO/GB标准,如“未注明公差的孔距,默认按IT12级(±0.3mm)”,“键槽深度默认取键宽的0.5倍”。这些规则写死在配置文件里,响应最快。
- 第二层:上下文推理。分析用户历史输入:如果他之前三次都指定“±0.1mm”,本次就优先采用该公差。我们用SQLite存用户行为日志,查询延迟<5ms。
- 第三层:交互式澄清。当规则库和上下文都无法确定时,不报错,而是弹出选项:“您指的‘10mm apart’是:① 孔中心距离 ② 孔边缘最小距离?请确认。”——这个设计让首次使用失败率从31%降到4%。
最关键的容错点在特征冲突检测。用户输入“cylindrical shaft, 25mm diameter, 120mm length, keyway 6x6x40mm on one end”时,键槽长度40mm已超过轴长120mm的1/3,按GB/T 1095标准,最大键槽长度应≤0.8×轴长=96mm,但40mm本身合法。然而,如果用户接着加一句“and fillet radius 10mm at both ends”,问题来了:键槽端部倒角半径10mm,会与键槽侧壁干涉。此时系统不能简单拒绝,而是启动几何冲突求解器:自动计算最小安全倒角半径(此处为3.2mm),并建议:“为避免干涉,倒角半径建议≤3.2mm,是否调整?”——这才是工程级容错。
3. 实战路径:从零搭建text-to-CAD服务的四步落地法(附避坑清单)
理论讲完,现在进入实操。我以团队用3个月时间上线内部text-to-CAD服务的过程为例,拆解可复用的四步路径。重点不是“怎么做”,而是“为什么必须这么走”,以及每个环节我亲手踩过的坑。
3.1 第一步:明确你的“最小可行场景”,拒绝大而全
很多团队一上来就想做“全能CAD助手”,结果三个月还在调通API。我的建议是:先锁死一个高频、低歧义、高价值的垂直场景。我们选的是“标准件快速生成”,理由很实在:
- 需求明确:螺栓、螺母、垫圈、键、销的参数完全标准化,GB/T、ISO、DIN都有公开数据库;
- 输入简单:用户只需说“六角头螺栓 M10x50”,无需描述形状;
- 价值清晰:设计员每天平均插入37个标准件,手动查表+建模耗时约2.1分钟/个,自动化后降至8秒/个,ROI立竿见影。
我们刻意避开“复杂零件”场景(如“汽车悬架控制臂”),因为其几何拓扑多变,语义解析准确率不足50%。记住:text-to-CAD的初期价值不在创意,而在消灭重复劳动。你的MVP场景必须满足:输入字段≤5个、标准有据可查、输出格式固定(如STEP)、业务方愿为单次节省30秒付费。
踩坑实录:我们曾试图支持“钣金件”,输入“L-shaped bracket, 2mm thick, bend radius 3mm”。结果发现,“L-shaped”在不同行业含义不同:机加工认为是折弯件,冲压认为是落料+折弯两道工序,而焊接则理解为两块板拼焊。最终放弃,转向更确定的“轴类零件”。
3.2 第二步:构建领域语料库,比调参更重要
没有高质量语料,再大的模型也是空中楼阁。我们花了6周时间,不是调模型,而是建语料库。核心来源有三:
- 标准文档数字化:下载GB/T、ISO、DIN全套PDF,用pdfplumber提取表格,清洗后存为CSV。例如GB/T 5780-2016《六角头螺栓 C级》包含127个规格,每个规格有“螺纹长度”“头高”“扳手宽度”等18个字段。
- CAD模板反向工程:从公司历史项目中抽取500个标准件模型,用OpenCASCADE API读取其BRep结构,导出特征树(Feature Tree)。例如一个M10螺栓的特征树是:[BaseCylinder→ThreadCut→Chamfer→HeadExtrude],再人工标注每个特征对应的自然语言描述。
- 工程师对话日志:匿名收集设计部IM聊天记录(经脱敏),提取高频模糊表达:“那个长一点的螺栓”“跟上次一样的垫圈但厚点”“孔别打太靠边”。这些才是真实用户语言,比教科书语句更有价值。
最终语料库规模:结构化标准数据12万行 + 特征树样本3200条 + 对话片段8700条。用这个语料微调7B模型,语义解析准确率比通用语料提升37%。关键经验:语料质量 > 模型大小 > 训练时长。我们试过用13B模型+通用语料,效果不如7B+领域语料。
3.3 第三步:选择建模引擎,开源与商业的硬核权衡
选引擎不是看谁名气大,而是看谁最匹配你的场景。我们对比了三种方案:
| 方案 | 开发成本 | 响应速度 | STEP导出 | 参数化编辑 | 适用场景 |
|---|---|---|---|---|---|
| SolidWorks COM API | 低(现成文档) | 中(1.2s/模型) | 原生支持 | 完全支持 | 企业已有License,需深度集成 |
| OpenCASCADE + PythonOCC | 高(需封装DSL) | 快(0.4s/模型) | 需自研导出器 | 仅支持基础特征 | 开源可控,适合初创团队 |
| Three.js + GLB | 极低 | 极快(<100ms) | 不支持 | 无 | 仅作前端预览,非生产模型 |
我们最终选择OpenCASCADE + 自研DSL,原因很现实:
- 公司没有批量SolidWorks License,COM调用需每台机器装客户端,运维成本高;
- GLB方案看似快,但用户反馈:“预览很炫,导出STEP时却要重新生成,等更久”——体验割裂;
- OpenCASCADE虽需投入,但一次封装,永久受益。我们用PyOCC(Python绑定)开发,核心建模逻辑写成独立模块,未来可无缝切换到其他内核。
关键避坑:OpenCASCADE的STEP导出器(STEPControl_Writer)默认不导出颜色和图层信息,但设计员需要区分“加工面”和“非加工面”。我们打了补丁:在导出前,遍历所有TopoDS_Shape,为加工面添加
STEPConstruct_Styles属性,确保STEP文件在SolidWorks里打开时,表面颜色与原始设定一致。
3.4 第四步:部署与监控,让服务真正“可用”
模型上线≠服务可用。我们部署后第一周,故障率高达22%,根源不在AI,而在工程链路。以下是必须监控的五个黄金指标:
- 语义解析成功率:低于95%立即告警。我们发现某天骤降至89%,排查发现是GB/T标准库更新,新增了“M12x1.25”细牙螺纹,但语料库未同步,导致解析失败。
- 建模超时率:单次建模>2s即触发降级。我们设了熔断机制:连续3次超时,自动切换至简化建模模式(省略倒角、圆角等次要特征)。
- STEP文件有效性:用
stepcheck工具验证导出文件是否符合AP203标准。曾因OpenCASCADE版本升级,导出的STEP缺少FILE_NAME字段,被客户PLM系统拒收。 - 用户澄清率:用户被要求二次确认的比例。高于15%说明语义解析层需优化。我们通过增加“同义词映射表”(如“螺丝”→“螺栓”、“洞”→“孔”),将此指标压到6%。
- 下游系统兼容率:STEP文件在客户常用CAD软件(SolidWorks/NX/CATIA)中的打开成功率。我们建了自动化测试矩阵:每生成100个STEP,自动用各软件API打开并检查实体数,失败即回滚版本。
最后,给所有想动手的团队一句忠告:不要追求100%准确率,追求“可预期的失败”。当系统无法解析“带法兰的球阀”,它应该明确告诉用户:“暂不支持阀门类零件,请描述为‘圆柱体+球形凸起+4个螺栓孔’”,而不是返回一个扭曲的几何体。可控的边界,比不可控的“智能”更可靠。
4. 真实瓶颈与破局点:为什么text-to-CAD还没取代鼠标,以及我们怎么绕开它
尽管text-to-CAD已能稳定生成标准件,但它离“取代设计师”还有物理距离。这不是技术不够强,而是工程世界的本质决定了某些瓶颈无法靠算法突破。认清这些,才能找准发力点。
4.1 瓶颈一:拓扑歧义——同一句话,两种合法几何体
这是最根本的限制。自然语言天生模糊,而CAD几何要求唯一解。经典案例:“a plate with two holes”。这句话在数学上对应无数种可能:
- 孔是圆孔还是沉头孔?
- 孔是贯穿还是盲孔?
- 孔间距是中心距、边距,还是到板边的距离?
- 板是矩形、圆形,还是带圆角的矩形?
通用AI可以猜,但工程不允许猜。我们做过测试:对同一输入,让5个不同模型生成,得到的STEP文件在SolidWorks中打开后,实体数差异最大达43%(有的生成了沉头,有的没生成;有的加了倒角,有的没加)。这意味着,text-to-CAD永远无法100%消除用户输入的歧义,它只能把歧义显性化、最小化。
破局点在于交互式渐进式建模。我们放弃了“一句话生成完整模型”的幻想,改为:
- 用户输入“plate with two holes”;
- 系统返回3个最可能的拓扑方案(带尺寸标注的线框图),并标注差异点:“方案A:沉头孔,方案B:贯穿孔,方案C:盲孔,深度10mm”;
- 用户点击选择方案B;
- 系统追问:“孔中心距?默认100mm,是否修改?”——此时用户才输入具体数字。
这个过程把“一次性模糊输入”拆解为“多次精准确认”,准确率从72%提升到99.4%。它不追求AI更聪明,而是让AI成为更聪明的“协作者”。
4.2 瓶颈二:公差与工艺——文字说不清,模型必须承载
工程图纸的灵魂不是形状,而是公差、表面粗糙度、热处理要求、未注公差。用户输入“shaft, 25mm diameter”时,他心里想的是“h9公差,Ra1.6,调质处理HRC28-32”。但文字描述极少包含这些——因为人类设计师默认这些由工艺规程规定,或由经验补充。
text-to-CAD若忽略这点,生成的模型就是“玩具”。我们解决方式是工艺知识绑定:
- 在标准件语料库中,为每个零件类型预置工艺模板。例如“M10螺栓”自动绑定:材料45#钢、热处理调质、表面镀锌、未注公差IT12;
- 对于自定义零件,系统在生成基础几何后,弹出工艺面板:“请选择:① 机加工(默认IT12) ② 冲压(默认±0.1mm) ③ 铸造(默认±0.5mm)”,用户选择后,自动添加对应公差标注和表面粗糙度符号。
关键突破是:STEP文件本身不存储公差,但我们在导出时,用STEP AP242标准,将公差信息作为“几何产品规范”(GPS)嵌入。这样,模型导入NX或Teamcenter后,公差能被PLM系统识别和管理。这步开发耗时最长(3周),但让模型真正具备了生产价值。
4.3 瓶颈三:装配与干涉——单个零件OK,组合起来翻车
text-to-CAD目前专注单体建模,但真实设计是系统工程。用户输入“motor mount for NEMA17 stepper motor”,系统能生成安装板,但无法保证它与电机本体不干涉——因为电机模型不在语料库中。
我们的破局不是强行建模,而是装配知识图谱联动。我们构建了常见电机、减速器、传感器的STEP模型库,并标注其接口尺寸(如NEMA17的安装孔距42.3mm,轴径5mm)。当用户输入“motor mount”,系统不仅生成安装板,还自动检索图谱,匹配NEMA17的接口参数,并在模型上预留精确的安装孔位和轴孔。更进一步,我们接入公司PLM系统的BOM API,当用户输入“mount for servo motor model XYZ-2000”,系统实时查询PLM,获取该型号电机的3D模型链接和接口定义,动态生成匹配的安装结构。
这本质上把text-to-CAD从“建模工具”升级为“系统集成器”。它不自己造轮子,而是把现有工程资产(标准件库、PLM数据、供应商模型)用自然语言串联起来。
4.4 瓶颈四:用户习惯——设计师不愿放弃鼠标,因为鼠标更快
最后,也是最现实的瓶颈:人因工程。资深设计师用鼠标+快捷键建模,速度远超打字。我们统计过:熟练工程师建一个M10螺栓,从草图到完成,平均耗时18秒;而text-to-CAD从输入到下载STEP,需22秒(含网络传输)。速度没优势,凭什么换?
答案是:不做替代,做增强。我们把text-to-CAD做成SolidWorks插件,用户在建模时,右键菜单新增“Text to Feature”:
- 正在画草图时,右键→输入“circle, diameter 25mm” → 自动生成圆;
- 正在拉伸时,右键→输入“extrude 120mm, draft angle 1deg” → 自动应用拔模;
- 正在打孔时,右键→输入“threaded hole M6, depth 15mm” → 自动创建螺纹特征。
这时,text-to-CAD不再是独立工具,而是键盘快捷键的超级扩展。它不抢鼠标的工作,而是把最枯燥的参数输入(查表、敲数字、选标准)交给文字,把最需要空间想象力的布局、曲面造型留给鼠标。这才是人机协作的正确姿势。
5. 我的实战心得:三个被低估的细节,决定项目成败
做了两年text-to-CAD,踩过无数坑,也攒下些“教科书不会写,但实操必踩”的细节。分享三个最痛的教训,帮你绕开我走过的弯路。
5.1 字体与符号:一个“Ø”字符,能让整个STEP文件失效
这是最隐蔽的坑。用户输入“hole Ø10mm”,系统解析时,若后端Python环境用的是utf-8编码,但OpenCASCADE的STEP导出器默认用ISO-8859-1,那么“Ø”字符会被转成乱码“”,导致STEP文件在SolidWorks中打开时报错:“Invalid character in file header”。我们花了三天排查,以为是模型几何错误,最后发现是编码问题。
解决方案极其简单,但必须写死在代码里:
# OpenCASCADE导出STEP前,强制设置编码 from OCC.Core.IFSelect import IFSelect_RetainCircumstances from OCC.Core.STEPControl import STEPControl_Writer writer = STEPControl_Writer() # 关键:设置STEP文件头编码为UTF-8 writer.SetName("Generated by text-to-CAD") writer.SetDescription("Model created from natural language input") # 手动写入UTF-8 BOM头 step_content = writer.WriteToString() # 获取字符串 with open("output.step", "wb") as f: f.write(b"\xEF\xBB\xBF") # UTF-8 BOM f.write(step_content.encode("utf-8"))更彻底的方案是:所有用户输入,在进入解析层前,统一转为Unicode Normalization Form C(NFC),确保“Ø”是标准Unicode字符,而非组合字符。这个细节,文档里从不提,但没它,你的服务在客户现场必崩。
5.2 单位陷阱:用户说“inch”,模型却按“mm”建,误差放大1000倍
用户输入“bolt 1/4-20 UNC, length 2 inch”,系统若默认单位是mm,就会建一个2mm长的螺栓——这是灾难性的。我们最初用正则匹配“inch”“mm”“cm”,但发现用户常写“2"”(英寸符号)、“2''”、“2in”,甚至“2 inches”。更糟的是,有些用户混用:“diameter 25mm, length 2 inch”。
破局点在于单位解析器必须独立于语义解析器。我们开发了一个专用模块:
- 先用正则提取所有数值+单位组合(如
25mm,2 inch,1/4-20); - 对每个组合,用预置映射表转换为标准单位(mm):
{"inch": 25.4, "in": 25.4, '"': 25.4, "cm": 10}; - 对分数螺纹
1/4-20,单独解析:1/4英寸=6.35mm,20牙/英寸=1.27mm螺距; - 最后,所有数值统一存为mm,建模引擎只认mm,杜绝单位混淆。
这个模块上线后,因单位错误导致的模型报废率从11%降至0.3%。记住:单位不是后处理,是建模的基石。
5.3 模型轻量化:10MB的STEP文件,用户等30秒,放弃率82%
text-to-CAD生成的模型,若包含大量小倒角、圆角、过渡面,STEP文件体积会爆炸。一个带12个M6螺纹孔的支架,STEP文件达15MB,用户下载需45秒(按公司平均网速),62%的人在第20秒就关闭页面。
我们采用三级轻量化策略:
- 建模层精简:在DSL中,默认关闭“高精度螺纹”(用圆柱代替真实螺纹),除非用户明确说“show thread detail”;
- 导出层压缩:用OpenCASCADE的
STEPControl_StepModelType设为STEPControl_AsIs(而非STEPControl_ManifoldSolidBrep),跳过冗余BRep表示; - 传输层优化:STEP文件生成后,用
stepzip工具打包(非ZIP,是STEP专用压缩),体积减少68%,且SolidWorks可直接打开.stp.zip。
最终,标准件STEP平均体积压到180KB,下载时间<3秒。用户留存率从38%升至89%。技术再炫,输在最后一公里——文件大小,就是用户体验的生死线。
最后分享一个个人体会:text-to-CAD的价值,从来不在“取代谁”,而在“释放谁”。当设计员不用再花20分钟查GB/T 5780表格、敲12个数字、点7次鼠标去建一个螺栓,他多出的时间,可以用来思考“这个支架的振动模态会不会影响传感器精度”,或者“有没有更轻量的拓扑优化方案”。技术的意义,是把人从重复中解放,去干只有人能干的事。这,才是text-to-CAD最该抵达的地方。