
1. 从一句话到三维实体Text2CAD到底在解决什么问题第一次听到“Text2CAD”这个词我脑子里蹦出来的画面是对着电脑说一句“给我画一个带四个安装孔的方形法兰盘”屏幕上就自动长出一个可以旋转、可以标注、可以直接导出加工的三维模型。这个画面放在五年前还属于科幻范畴但这两年随着大模型能力的快速迭代它已经变成了一个真真切切有人在做的工程方向。Text2CAD拆开来看就是Text文本到CAD计算机辅助设计的转换核心目标是把人类用自然语言描述的设计意图自动翻译成参数化、可编辑、可制造的CAD模型。这件事为什么值得单独拿出来聊因为传统CAD建模的门槛实在不低。一个刚入行的机械设计新人光是搞清楚草图约束、基准面选择、特征顺序这些概念就得花上几个月。而大量有设计需求的人——比如做非标自动化的工程师、搞创客项目的爱好者、甚至只是想把一个想法快速可视化的产品经理——他们脑子里有清晰的几何形状但手上没有熟练的建模技能。Text2CAD要填的就是这道鸿沟让描述直接变成模型把“会建模”这件事从技能问题降维成表达问题。我个人的判断是Text2CAD短期内不会取代专业CAD工程师但它会极大改变建模的起点。以前是从空白草图开始一笔一笔画以后可能是从一句描述生成一个粗糙的初始模型工程师再在这个基础上做精修和参数调整。这个转变的意义在于它把重复性的、模式化的建模劳动压缩掉让人把精力集中在真正需要判断力的地方——结构合理性、工艺可行性、装配关系这些机器暂时还搞不定的东西。这篇文章适合谁看如果你是CAD老手想了解AI到底能帮上什么忙、边界在哪里我会把技术路线和实际能力讲清楚如果你是刚接触CAD的新人想看看有没有捷径能跳过枯燥的入门阶段我也会给出目前可用的工具和实操思路如果你是对AI工程感兴趣的技术人我会拆解背后的核心原理和实现路径。不吹不黑只讲我实际验证过和深入研究过的东西。2. 拆解Text2CAD的技术骨架它凭什么能把文字变成模型2.1 核心思路文本理解加几何生成的组合拳Text2CAD本质上是一个跨模态生成任务输入是自然语言输出是三维几何。这个过程中间要跨越好几道鸿沟语言是离散的符号序列几何是连续的空间坐标语言描述往往是模糊的、有歧义的而CAD模型要求精确的尺寸和约束关系。所以整个系统必须同时具备两种能力——准确理解文本意图以及把意图翻译成合法的几何表示。目前主流的技术路线可以分成两大派。一派是“参数化序列生成”路线代表思路是把CAD建模过程看作一个操作序列比如“画矩形→拉伸→打孔→倒角”模型学习的是从文本到操作序列的映射。另一派是“直接几何生成”路线用扩散模型或者隐式表示直接生成三维形状再后处理成CAD格式。两派各有优劣我后面会详细对比。先说说为什么参数化序列生成这条路更受工程界青睐。原因很简单CAD的灵魂在于可编辑。一个不能改尺寸、不能调整特征顺序的模型在工程上价值有限。参数化序列生成的模型天然带有建模历史你可以回头把“拉伸高度50mm”改成“80mm”整个模型自动更新。而直接生成的三维网格或者点云改起来就麻烦得多。所以如果你问我Text2CAD的未来主流方向我押注在参数化序列生成上。2.2 文本编码让机器听懂“带四个孔的方形板”文本理解这一环现在基本是大模型的天下。早期做法是用BERT这类编码器把文本转成向量但这种方式对复杂描述的理解能力有限。比如“一个边长100毫米、厚度10毫米的方形板四个角各有一个直径8毫米的安装孔孔中心距边缘15毫米”——这句话里有尺寸、有数量、有位置关系传统编码器很难完整捕捉。现在更靠谱的做法是用大语言模型做语义解析把自然语言拆解成结构化的设计参数。具体来说模型需要输出一个类似JSON的结构形状类型是“板”长宽是100×100厚度10特征列表包含四个孔孔径8位置约束是距边缘15。这个过程叫“语义槽填充”本质上是一个信息抽取任务。大模型在这里的优势是泛化能力强你没见过的描述方式它也能理解个八九不离十。但这里有个坑大模型对数字的精确处理能力并不稳定。你让它生成一个“直径8毫米”的孔它可能给你输出“直径约8毫米”或者干脆算错位置。所以实际系统里通常会在LLM后面加一层规则校验把关键尺寸做数值约束确保生成的参数在工程上合理。这个细节很多论文里不写但真正做落地的人都知道没有这层校验生成结果根本没法用。2.3 几何生成从操作序列到三维实体文本解析完之后下一步是把结构化参数变成实际的几何操作序列。这里涉及到一个关键问题CAD建模的操作顺序是有讲究的。先拉伸再打孔和先打孔再拉伸结果可能完全不同。所以模型不仅要预测“做什么操作”还要预测“按什么顺序做”。目前效果比较好的方案是采用类似代码生成的思路把CAD操作定义成一套领域特定语言DSL。比如用类似Python的语法描述建模过程sketch create_sketch(planeXY) rect draw_rectangle(sketch, width100, height100) extrude(rect, distance10) for pos in [(15,15), (85,15), (15,85), (85,85)]: hole create_circle(sketch, centerpos, radius4) cut_extrude(hole, throughTrue)模型学习的就是从文本到这段代码的映射。这种表示方式的好处是可解释、可编辑、可验证。生成的代码可以直接在FreeCAD、OpenSCAD这类开源CAD里执行也可以转换成商业CAD软件能识别的格式。训练数据的来源是个大问题。要训练一个靠谱的Text2CAD模型需要大量“文本-模型”配对数据。目前公开的数据集规模都不算大而且质量参差不齐。有些研究团队的做法是用程序化生成的方式造数据随机生成参数化模型然后用模板生成对应的文本描述。这种方式能快速扩充数据量但缺点是文本描述比较机械和真实用户的表达方式有差距。更理想的做法是从CAD社区收集真实的建模脚本和对应的设计说明但这种数据获取成本很高。2.4 三种技术路线的对比与选型建议我把目前主流的三种技术路线整理成了一张表方便你根据自己需求做判断技术路线核心原理优势劣势适用场景参数化序列生成文本→操作序列→CAD脚本可编辑、可解释、支持参数修改依赖高质量序列数据训练难度大工程设计、需要后续修改的场景直接几何生成文本→隐式表示→网格/点云生成速度快形状多样性强不可参数化编辑精度有限概念可视化、快速原型检索式生成文本→匹配已有模型库实现简单结果可靠只能生成库内已有的形状标准件选用、模板化设计如果你是想做实际工程应用我建议从参数化序列生成入手虽然训练难度大但产出物的可用性最高。如果只是想做概念展示或者快速验证想法直接几何生成路线见效更快。检索式方案适合特定垂直场景比如标准件库的智能选用但通用性差。3. 动手实操搭建一个简易Text2CAD流程的完整步骤3.1 环境准备与工具选型要自己跑通一个Text2CAD的流程你不需要从头训练一个大模型。更务实的做法是用现成的大语言模型做文本解析然后接一个开源的参数化CAD引擎做几何生成。我实测下来比较顺手的组合是用大模型API做语义理解用CadQuery或者FreeCAD的Python接口做几何构建。CadQuery是我比较推荐的一个库它是一个基于Python的参数化CAD脚本工具语法简洁文档也还算友好。安装很简单pip install cadquery如果你更习惯FreeCAD的生态也可以用它自带的Python控制台FreeCAD的脚本能力更强但学习曲线稍微陡一点。选哪个取决于你后续要不要做GUI交互——CadQuery更适合纯脚本自动化FreeCAD适合需要可视化操作的场景。大模型这一端你可以用任何支持结构化输出的模型。关键是要让它按照你定义的JSON格式返回解析结果。我一般会在提示词里把输出格式写死并且给几个示例这样模型输出的稳定性会高很多。3.2 文本解析环节的提示词设计提示词的质量直接决定了解析结果的可用性。我踩过的坑是一开始提示词写得太随意模型返回的JSON格式五花八门有时候字段名对不上有时候数值带单位有时候不带后处理写得我头大。后来我固定了一套模板效果稳定很多。核心思路是让模型扮演一个“CAD参数提取器”的角色明确告诉它需要提取哪些字段每个字段的类型和单位是什么。比如你是一个CAD参数提取助手。请将用户的设计描述转换为以下JSON格式 { shape_type: box|cylinder|plate|flange, dimensions: {length: 数值, width: 数值, height: 数值}, features: [ {type: hole, diameter: 数值, positions: [[x,y],...]}, {type: fillet, radius: 数值, edges: all|top|bottom} ], units: mm } 所有尺寸单位为毫米位置坐标以模型中心为原点。这个提示词的关键点在于限定了形状类型的枚举值避免模型自由发挥明确了单位避免后续换算混乱给出了位置坐标的参考系避免孔位算错。实测下来加了这几条约束之后解析准确率能从六七成提升到九成以上。3.3 从JSON到CAD模型的代码实现拿到结构化参数之后下一步就是用CadQuery把它变成实际的几何体。我写了一个简化的示例展示从JSON到模型的完整过程import cadquery as cq import json def build_model(params): p json.loads(params) dims p[dimensions] # 创建基础形状 if p[shape_type] plate: model cq.Workplane(XY).box( dims[length], dims[width], dims[height] ) # 添加特征 for feat in p.get(features, []): if feat[type] hole: for pos in feat[positions]: model (model.faces(Z).workplane() .center(pos[0], pos[1]) .hole(feat[diameter])) elif feat[type] fillet: model model.edges().fillet(feat[radius]) return model # 示例调用 params { shape_type: plate, dimensions: {length: 100, width: 100, height: 10}, features: [ {type: hole, diameter: 8, positions: [[-35,-35],[35,-35],[-35,35],[35,35]]} ], units: mm } result build_model(params) cq.exporters.export(result, output.step)这段代码跑通之后你会得到一个STEP格式的三维模型文件可以直接用任何CAD软件打开。注意孔位坐标那里我用了相对于中心的偏移量因为CadQuery的workplane默认以面中心为原点。如果你用绝对坐标需要先做一次坐标变换这个细节很容易搞错。3.4 参数校验与容错处理上面那段代码是理想情况下的流程实际跑起来你会遇到各种边界情况。比如模型返回的孔径大于板厚或者孔位跑到板子外面去了或者特征顺序导致布尔运算失败。这些问题不处理的话程序直接报错退出体验很差。我的做法是在生成几何之前加一层参数校验。校验规则包括所有尺寸必须为正数孔径不能超过板厚的合理比例一般不超过板厚的3倍孔位必须在板子轮廓内且留有余量倒角半径不能超过相邻边的最小长度。这些规则用简单的if-else就能实现但能挡掉大部分低级错误。如果校验不通过不要让程序直接崩溃而是返回一个友好的错误提示告诉用户哪个参数有问题、应该怎么改。这个体验上的细节决定了你的工具是“能用”还是“好用”。4. 实际效果与边界Text2CAD目前能做什么、不能做什么4.1 简单规则形状基本可用但需要人工复核我拿十来个不同类型的描述做了测试涵盖方形板、圆柱体、法兰盘、支架这类常见零件。结果是对于结构简单、描述清晰的模型Text2CAD生成的准确率相当高。比如“100×100×10的板四角各一个直径8的孔孔中心距边缘15”这种描述生成出来的模型基本一次到位尺寸和位置都对得上。但一旦描述里出现模糊表述比如“适当大小的孔”“靠近边缘的位置”模型就开始自由发挥了。它可能会给你一个直径10的孔也可能给直径6的位置也是随机的。所以我的经验是用Text2CAD的时候描述必须尽可能精确把所有关键尺寸都写清楚。你省掉的每一个数字都会变成后面修改的工作量。另一个问题是特征顺序。有些描述里没有明确说先做什么后做什么模型自己排的顺序可能不是最优的。比如先倒角再打孔可能导致孔的位置落在倒角面上加工时不好处理。这种问题在简单模型上不明显但零件一复杂就暴露出来了。4.2 复杂曲面和自由形状目前基本搞不定Text2CAD目前的能力边界非常清晰它擅长处理规则几何对自由曲面基本无能为力。你让它生成一个“流线型的汽车外壳”或者“有机形态的椅子”它要么给你一个粗糙的近似形状要么直接摆烂输出一个方块。原因在于参数化序列生成这条路本身就依赖预定义的操作原语。拉伸、旋转、打孔、倒角这些操作能覆盖大部分机械零件但覆盖不了雕塑类的自由形态。自由曲面建模需要的是NURBS控制点调整、放样、扫掠这些高级操作而这些操作的参数空间太大模型很难从文本直接预测。所以如果你做的是工业设计、消费品外观这类需要自由曲面的工作Text2CAD暂时帮不上大忙。但如果你做的是机械结构件、钣金件、标准零件那它的可用性就高很多。4.3 尺寸精度别指望一次到位大模型对数字的处理能力是个硬伤。我测试中发现即使提示词里明确要求“所有尺寸精确到毫米”模型偶尔还是会输出“约50mm”或者“50.0mm左右”这种表述。更麻烦的是当描述里涉及尺寸链计算时比如“孔中心距边缘的距离是板宽的四分之一”模型算出来的结果有时候对有时候错。所以我的建议是把Text2CAD生成的模型当作初稿不要直接用于生产。所有关键尺寸必须人工复核一遍该改的改该约束的约束。这个复核过程比从零建模快得多但绝对不能省。4.4 与现有CAD工作流的衔接Text2CAD生成的模型要真正用起来必须能导入到你日常使用的CAD软件里。目前CadQuery和FreeCAD都支持导出STEP和STL格式这两种格式主流CAD软件都能识别。STEP保留了几何信息但丢失了建模历史STL只有网格没有精确几何。如果你需要后续在SolidWorks或者中望CAD里继续编辑STEP是更好的选择。但这里有个现实问题不同CAD软件对STEP的解析质量参差不齐。我遇到过CadQuery导出的STEP在某个软件里打开后圆角变形成多边形的情况。所以导出之后一定要在目标软件里检查一遍确认几何没有丢失或变形。5. 踩坑记录与常见问题排查5.1 模型输出格式不稳定的排查思路这是最常见的问题同样的提示词模型有时候返回标准JSON有时候夹带解释文字有时候字段名拼错。排查思路分三步走。第一步检查提示词里有没有明确说“只返回JSON不要任何其他文字”。第二步在代码里加一层JSON提取逻辑用正则把花括号内容抠出来再解析。第三步如果还是不稳定换用支持结构化输出Structured Output的API接口强制模型按schema返回。我自己的做法是在提示词末尾加一句“如果无法解析返回空JSON对象”这样至少不会因为格式错误导致程序崩溃。5.2 几何生成失败的典型原因CadQuery报错最常见的原因是布尔运算失败。比如在已经打了孔的位置再打一个孔或者倒角半径太大导致几何自相交。排查方法是把操作序列打印出来一步一步执行看在哪一步报错。如果是布尔运算失败尝试调整操作顺序或者把大特征拆成小特征分步执行。另一个坑是坐标系混乱。CadQuery的workplane会改变当前坐标系如果你在多个面上操作很容易搞混方向。我的经验是每步操作后都打印一下当前workplane的原点和方向确认符合预期再继续。5.3 常见问题速查表问题现象可能原因排查方法解决方案模型返回非JSON格式提示词约束不够强检查返回文本开头加“只返回JSON”约束或换结构化输出接口孔位偏移坐标系原点不一致打印workplane原点统一使用相对坐标或绝对坐标布尔运算失败特征重叠或自相交逐步执行操作序列调整操作顺序拆分复杂特征导出STEP后变形格式兼容性问题在目标软件中检查尝试导出为IGES或直接使用STL尺寸偏差大模型数值计算错误对比输入输出数值加数值校验层关键尺寸人工复核5.4 几个容易被忽略的实操细节第一个细节单位统一。大模型有时候会把毫米和厘米搞混尤其是当描述里没有明确写单位的时候。我的做法是在提示词里强制要求所有尺寸转换为毫米并且在代码里再做一次单位校验。第二个细节特征命名。如果你生成的模型要给别人用给每个特征起个有意义的名字很重要。比如“安装孔1”比“孔1”清楚得多。CadQuery支持给特征打标签这个功能在复杂模型里特别有用。第三个细节版本兼容。CadQuery和FreeCAD都在持续更新不同版本的API可能有变化。如果你把代码分享给别人最好注明测试通过的版本号避免别人跑不起来。6. 我对Text2CAD后续发展的一些判断从实际使用体验来看Text2CAD目前还处于“能用但不够好用”的阶段。它在简单规则零件上的表现已经可以接受但离“描述即所得”的理想状态还有距离。最大的瓶颈不在文本理解而在几何生成的可靠性和精度控制。大模型可以很好地理解你要什么但把它精确地做出来还需要很多工程上的打磨。我比较看好的一个方向是“交互式修正”。与其追求一次生成完美模型不如让用户可以在生成结果上做增量修改。比如生成之后说“把四个孔改成六个孔均匀分布”系统在已有模型基础上做局部调整而不是从头重新生成。这种方式更符合实际设计流程也更容易保证结果的可控性。另一个值得关注的点是多模态输入。纯文本描述有时候说不清楚空间关系如果能结合草图或者参考图片生成准确率会高很多。已经有研究在做文本加草图的联合输入效果比纯文本好不少。如果你现在就想用Text2CAD做点实际的东西我的建议是从最简单的场景开始标准件生成、模板化零件、参数化族库的快速创建。这些场景对精度要求相对宽松容错空间大而且确实能省时间。等流程跑顺了再逐步尝试更复杂的零件。别一上来就挑战自由曲面那是给自己找不痛快。最后分享一个我在实际项目中总结的小技巧把常用的零件描述做成模板只留几个关键尺寸作为变量。比如“法兰盘模板外径{OD}内径{ID}厚度{T}螺栓孔数量{N}孔径{D}”。这样每次生成的时候只需要填几个数字比每次写完整描述靠谱得多也快得多。这个思路本质上是用工程化的方法弥补AI的不稳定性实测下来很管用。