让LLM学会实体建模
- 原文链接:Teaching LLMs how to solid model
- 作者:Will Patrick
- 日期: 2025-04-23
本文探讨了利用大型语言模型(LLM)通过编写程序化CAD(如OpenSCAD)代码来生成三维实体模型的可行性、现状及未来前景,并构建了一套评估体系来衡量不同模型的性能。
大型语言模型(LLM)已能生成简单的三维机械零件的 CAD 模型。我预见,它们很快将在这方面表现极其出色,达到令人瞩目的高水平。
- 请参阅 HackerNews 上的讨论
- 文本到 CAD 评估的 GitHub 仓库
- 结果仪表盘
AI 机械工程师
代码生成是 LLM 的首个突破性应用。那么,一个服务于机械工程的 AI 智能体将是怎样的呢?材料选择、可制造性设计、计算机辅助制造(CAM)以及现成零件的比较都将是 AI 机械工程师的重要功能。或许,最重要的是,AI 机械工程师将负责设计和优化 CAD 模型。传统的机械工程师通常使用“点击式”软件(如 Fusion 360、Solidworks 和 Onshape)进行 CAD 设计。AI 又将如何替代人工生成这些实体模型呢?
代码生成与 CAD 的结合
一个极具前景的方向是利用数百万现有 CAD 文件来训练生成模型。目前,多个 团队正积极研究这一方法,他们正在探索扩散模型和 Transformer 架构。我尤其欣赏欧特克研究中心的做法,他们将参数化基本体(点、曲线、形状、拉伸等)编码进 Transformer 架构。然而,据我所知,这些项目中的模型目前尚无法接受任意输入指令并生成所需的形状。
几周前,我受到最近 LLM 驱动 Blender 的案例启发,Blender 是一款广泛用于动画的开源建模工具。鉴于 LLM 在代码生成方面的卓越能力,或许可以利用 CAD 建模的程序化接口以类似方式生成实体模型。我立刻想到了OpenSCAD,这是一款开源的程序化 CAD 工具,其开发历史已超过 15 年。用户无需使用点击式软件创建实体模型,而是编写一段软件脚本,该脚本随后被渲染成实体 CAD 模型。
LLM 在编写 OpenSCAD 方面表现出色
为了验证这一想法,我在 Cursor 中创建了一个简单项目,制作了一个空白的 OpenSCAD 脚本(Cursor.scad),并添加了一些 Cursor 规则:
# Your rule content
- We're creating files to model things in open scad.
- All the OpenScad files you create will be in Cursor.scad. I've set up this file such that if you edit it, it will automatically be read by OpenScad (it's the open file in the program).
- If I want to save what you've done, I'll tell you and you should create a new file and put it in the Saved folder.
- That's it! Overtime, if needed, we could create documentation about how to use OpenScad.
- If I'm asking you to create a new design, you should delete the current contents of cursor.scad and add the new design into it.
- When I make requests you should always first develop a step by step plan. Then tell me the step by step plan. And then I'll tell you to start modeling.
- When you're going through the step by step plans, only execute one step at a time.
- When you've executed a step, ask the user if its right.
随后,我开始使用 Cursor 创建实体模型。
例如,我发出了指令:“创建一个 iPhone 手机壳”。

虽然它没有一次成功,但经过几次迭代(包括提供截图),我们最终创建了一个基本的手机壳。
你还可以利用 OpenSCAD 库(有许多公共库可用)。在这里,我使用一个库为法兰制作螺纹。

一个非常巧妙的地方在于,LLM 可以利用其通用的机械工程知识。例如,在上方示例中,Cursor 为 M6 螺栓在管道上创建了孔洞,并且正确地将孔径设置得略大于 6 毫米,以便螺栓能够穿过。
bolt_hole_d = 6.5; // 用于M6螺栓的孔径
当然,这种方法的一个显著优势是生成的文件具有可编辑性,且 Cursor 默认会对设计中的所有关键元素进行参数化处理。在上述示例中,我要求它添加安装螺栓孔,它完成了,然后我手动将孔的数量从 4 个修改为 3 个。
// Flange parameter
flange_OD = 50; // Outer diameter of the flange in mm
flange_thickness = 10; // Thickness of the flange in mm
pipe_size = 1/2; // NPT Pipe Size
// Bolt hole parameters
num_bolts = 3;
bolt_hold_d = 6.5; // Diameter for M6 bolts
bold_hole_circle = 35; // Diameter for the bolt circle
构建 LLM -> OpenSCAD -> STL 的评估体系
这些初步结果令我印象深刻,但我希望了解更多。例如,模型的推理能力是否有助于它思考创建零件的步骤?于是,我决定开发一个评估工具,以测试不同 LLM 通过 OpenSCAD 生成实体模型的性能。
创建 CAD 设计评估的一个挑战是,大多数任务都有多种正确答案。例如,“制作一个 10 毫米长的 M3 螺钉”这样的任务可能有很多正确答案,因为任务中并未定义螺钉的长度、直径和头部样式。为了解决这个问题,我决定在评估中设计的任务都只有唯一的几何形状正确解释。
例如,以下是评估中的一个任务:
这是一个 3 毫米厚的矩形板,带有两个孔。
- 板的尺寸为 18 毫米 x 32 毫米。
- 从上方看,板上有两个钻穿的孔。在板的左下角,有一个孔,其中心点距短边(18 毫米边)3 毫米,距长边(32 毫米边)3 毫米。此孔直径为 2 毫米。
- 在板的左上角附近,有一个直径为 3 毫米的孔。其中心点距短边(18 毫米边)8 毫米,距长边(32 毫米边)6 毫米。
这种方法的好处在于,我们可以将每个任务评定为“通过”或“失败”,并且能够以自动化方式进行。我总共设计了 25 个 CAD 任务,其复杂度从单一操作(“一根外径 10 毫米、壁厚 2 毫米、长 50 毫米的管道”)到包含 5 个步骤的连续操作不等。对于每个任务,我使用 Autodesk Fusion 360 设计了一个参考 CAD 模型,然后导出一个 STL 网格文件。
随后,我着手编写自动化评估流程(当然,我本人并没有写太多代码)。
以下是评估流程的工作原理:
- 对于每个任务和模型,评估工具通过 API 将文本提示(以及系统提示)发送给 LLM。
- LLM 返回 OpenSCAD 代码。
- OpenSCAD 代码被渲染成 STL 文件。
- 生成的 STL 文件与参考 STL 文件进行自动化比对。
- 如果通过一系列几何检查,则该任务“通过”。
- 结果随后输出到仪表盘中。
graph LR
A[开始对每个任务和模型进行评估] --> B{将系统和任务提示发送给 LLM};
B --> C{LLM 返回 OpenSCAD};
C --> D{将 OpenSCAD 渲染成 STL};
D --> E{将生成的 STL 与参考 STL 进行比较};
E --> F[将评估结果输出到仪表板];【注:评估对每个“任务-模型”组合运行多次重复,并且评估是并行执行的,因为在进行全面评估时可能存在 1000 多个任务。】
以下是几何检查的工作原理:
- 生成的 STL 和参考 STL 使用迭代最近点(ICP)算法进行对齐。
- 对齐后的网格通过以下指标进行比较:
- 它们的体积(通过标准:差异 <2%)
- 它们的边界框(通过标准:差异 <1 毫米)
- 零件间的平均倒角距离(通过标准:差异 <1 毫米)
- 豪斯多夫距离(95%分位数)(通过标准:差异 <1 毫米)
- 要使评估“通过”,所有几何检查都必须通过。
评估流程仍存在若干可优化之处。特别是,假阴性(即模型其实做对了,但评估系统误判为失败)情况很常见(估计约 5%)。我还注意到,偶尔一些不正确的小特征(如小半径圆角)未能被自动化几何检查捕获。尽管如此,该评估流程仍足以揭示有趣的发现,并比较各种 LLM 的性能。
如果您想了解更多关于此评估工具的信息、使用它或查看任务详情,请访问GitHub 仓库。
最后,有许多方法可以改进此评估。以下是我接下来想做的一些事情:
- 增加更多任务,扩大覆盖范围
- 优化系统提示,特别是添加 OpenSCAD 文档和代码片段
- 创建使用草图和绘图作为输入的评估变体
- 添加另一个变体,测试 LLM 向现有 OpenSCAD 脚本和 STL 文件添加操作的能力
- 评估 LLM 修复现有 STL / OpenSCAD 代码中错误的能力
前沿模型的迅速进步
以下是 2025 年 4 月 22 日执行的一项评估运行结果。在此次评估中,15 种不同模型在 25 个任务上进行了测试,每个“任务-模型”组合运行 2 次重复。所有运行结果和配置详情可在此处查看。
结果表明,LLM 直到最近才在 OpenSCAD 实体建模方面表现出色。

CadEval 评估结果。在此次运行中,每个模型尝试完成 25 个任务(每个任务重复两次)。“成功”意味着通过了与参考几何形状进行比较的一系列几何检查。
排名前三的模型都是我在项目进行期间发布的,而排名前七的模型全部是具备多步推理能力的模型。与它们的非推理型前代模型相比,这些模型在性能上有了显著提升。Sonnet 3.5 是非推理型模型中表现最好的,而 Sonnet 3.7 在评估中仅略胜一筹(Sonnet 3.7 在思考时使用了 2500 个 token 的预算)。
深入分析这些结果,可以发现一些有价值的发现。首先,LLM 在生成能够正确编译并渲染成 STL 文件的 OpenSCAD 代码方面表现相当出色。换句话说,只有一小部分失败是由于 OpenSCAD 语法错误等问题造成的。Anthropic 的 Sonnet 模型在这方面表现最佳。

与上述评估运行相同,显示了每个模型渲染 STL 文件(并进行几何检查)的任务成功率百分比。
此外,我们还可以查看已渲染 STL 文件的任务的成功率。o3-mini 表现非常出色,其成功率几乎与完整版 o3 模型持平,而 Sonnet 3.7 似乎略逊于领先的 Gemini 2.5 Pro 以及 o1、o3、o4-mini 和 o3-mini 模型。

在已生成 STL 文件的任务中,成功通过所有几何检查的任务百分比。
最后,正如预期,Gemini 2.5 和 o4-mini 比完整的 o3 和 o1 模型运行成本显著更低且速度略快。

各模型每任务的估计成本。

生成 OpenSCAD 并渲染 STL 的每任务平均总时间。API 调用和接收 OpenSCAD 代码的时间远大于渲染 STL 的时间,后者不到 1 秒。
正如预期,有些任务很容易完成,有些则非常困难。

按任务划分的整体成功率。
总的来说,操作步骤越多的任务越具挑战性。

每个任务在 Fusion360 中手动完成需要 1 到 5 个操作。在评估中,有 5 个任务需要单一操作,5 个需要两次操作,以此类推。
任务 2、任务 3 和任务 6 是最简单的任务,在所有模型中成功率均超过 80%。以下是这些任务的示例成功案例。


只有 2 个任务的成功率为 0%,即任务 11 和任务 15。以下是这两个任务的提示及其代表性失败案例。


这些失败案例既有趣又截然不同。任务 11 是空间推理能力不足的一个典型例子。在图中突出显示的特定失败案例中,模型将吊环螺栓的柄部垂直于圆环挤出(而非在同一平面内)。任务 15 则是一种不同的失败模式。在附图中可能难以看清,但如果仔细放大,会发现生成的形状略大于参考形状(这是合理的,因为生成的 STL 未能通过体积检查)。从该示例的 OpenSCAD 代码来看,失败似乎是由于使用了 OpenSCAD 的凸包操作,它与放样操作并不完全相同。OpenSCAD 没有内置的放样操作。
任务 20-24 都要求 5 个连续操作,这些任务的平均成功率介于 3.3%至 30%之间。以下是这 5 个任务的提示以及代表性的成功和失败案例。





这些失败案例可能难以察觉。失败图像中的绿色区域本应在生成的 STL 中包含几何体,但却没有(参考点云以绿色绘制)。同样,红色区域在生成的 STL 中包含了几何体,但本不应如此。
初创公司
在过去的几个月里,有两家不同的初创公司推出了文本到 CAD 的产品:AdamCad 和 Zoo.dev。Zoo.dev 提供了一个 API,用于使用他们的文本到 CAD 模型。Zoo 展示的 API 和文本到 CAD 产品演示非常出色,看起来与我上面提到的 Cursor -> OpenSCAD 演示非常相似。
我将 Zoo 也引入评估流程,与 LLM -> OpenSCAD -> STL 方案进行对比测试。Zoo.dev 的 API 不是生成 OpenSCAD 代码,而是直接返回 STL 文件。Zoo 声称他们使用了专有数据集和机器学习模型。令我惊讶的是,与 LLM 通过创建 OpenSCAD 生成 STL 文件的方法相比,Zoo 的 API 表现并未特别出色。尽管如此,我仍对 Zoo.dev 的发展感到兴奋,并期待 Zoo.dev 未来推出的模型与 LLM 生成 OpenSCAD 的方案相比表现如何。
接下来会怎样?
我认为这些初步结果很有前景。Cursor(或其他代码代理)结合 OpenSCAD 提供了一种自动化生成实体模型的解决方案。
然而,我认为这种方法尚未准备好在 CAD 设计领域中迅速普及。目前的设置过于笨重,需要大量的产品改进才能使其更好地运作。类似于 Cursor、Windsurf 及其他工具为代码生成开发了特定的用户体验(UX)和 LLM 工作流,我预计为 CAD 生成开发合理的工作流和用户体验也需要大量工作。以下是我认为值得在此方向上探索的一些想法:
- 能够将 OpenSCAD 的控制台日志和视口图像引入 Cursor 的工具,以实现迭代改进和调试。
- 一个用户界面,用于高亮(和测量)零件的特定面、线或特征,并将这些信息反馈给 LLM 以获取额外的上下文。
- 绘图或草图输入,以便用户能够快速直观地表达他们的想法。
- 一个带有滑块的用户界面,用于调整参数,而不是直接编辑代码。
此外,我预计模型的进一步发展将继续解锁这一应用。特别是,提高空间推理能力是一个活跃的研究领域。我设想,空间推理能力的提升将极大地改善模型逐步设计零件的能力。
那么,文本到 CAD 何时能成为机械工程师的常用工具呢?随着初创公司积极开发产品以及前沿模型的迅速进步,我猜测大概在 6 到 24 个月内。
未来展望
在中长期(2-10 年),我设想大多数零件将通过某种形式的生成式 CAD(GenCAD)创建。请允许我对此进行一些推测。
- 最初,GenCAD 将用于创建能与现有装配体完美契合的零件。例如,你可能会说:“我需要一个能安装在这里的支架。”然后,GenCAD 工具就会创建一个与现有装配组件完美连接的支架。想要用有限元分析(FEA)分析三个变体?直接提出要求即可。我预计主流 CAD 套件(Autodesk、Solidworks、Onshape)将在其软件平台中直接集成这些功能。
- 从长远来看,我设想 GenCAD 将渗透到 CAD 套件的各个方面:草图、配合、装配体、爆炸图、CAM 刀具路径规划、渲染可视化和计算机辅助工程(CAE)。想象一下,在设计评审中,你突出显示一个子装配体并说:“将这些铆钉替换为 M6 沉头螺钉,并重新生成物料清单(BOM)。”模型、图纸和采购清单都会在几秒钟内更新。
我们正目睹 CAD 开始走出手动输入时代。就我个人而言,对此感到非常兴奋。