教会 LLM 如何进行实体建模:OpenSCAD 的实践
教会 LLM 如何进行实体建模
2025年4月23日 • 技术
事实证明,LLM 可以为简单的 3D 机械零件创建 CAD 模型。而且,我认为它们很快就会非常擅长。
AI 机械工程师
代码生成是 LLM 的第一个突破性应用。针对机械工程的 AI 代理会是什么样的?材料选择、面向制造的设计(design for manufacturing)、计算机辅助制造(CAM)以及现成零件的比较,都将是 AI 机械工程师的重要特征。也许最重要的是,AI 机械工程师将设计和改进 CAD 模型。机械工程师通常使用点击式软件(例如 Fusion 360、Solidworks 和 Onshape)设计 CAD。AI 如何生成这些实体模型呢?
代码生成与 CAD 的结合
一个有希望的方向是在数百万个现有 CAD 文件上训练生成模型。 多个 团队 正在积极研究这种方法,他们正在研究扩散模型(diffusion)和 Transformer 架构。我特别喜欢 Autodesk Research 将参数化图元(点、曲线、形状、拉伸等)编码到 Transformer 架构中的方法。但是,据我所知,这些项目中的模型还不能接受任意输入命令并生成所需的形状。
几周前,我受到了 最近使用 LLM 驱动 Blender 的启发,Blender 是一款广泛用于动画的开源建模工具。鉴于 LLM 非常擅长生成代码,也许可以以类似的方式使用 CAD 建模的编程接口来生成实体模型。我立即想到了 OpenSCAD,这是一款已开发超过 15 年的开源编程 CAD 工具。用户无需使用点击式软件来创建实体模型,而是编写一个软件脚本,然后将其渲染为实体 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; // Diameter for M6 bolts
当然,这种方法真正好的地方之一是文件是可编辑的,并且 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 任务,难度从单个操作(“一个 50 毫米长的管道,外径为 10 毫米,壁厚为 2 毫米”)到 5 个连续操作不等。对于每个任务,我使用 Autodesk Fusion 360 设计了一个参考 CAD 模型,然后导出了 STL 网格文件。
然后,我开始编程自动化评估流程(当然,我实际上并没有编写太多代码)。
以下是评估流程的工作方式:
- 对于每个任务和模型,评估系统通过 API 将文本提示(以及系统提示)发送到 LLM。
- LLM 返回 OpenSCAD 代码。
- OpenSCAD 代码被渲染成 STL 文件。
- 生成的 STL 文件根据参考 STL 文件进行自动检查。
- 如果任务通过了多个几何检查,则该任务“通过”。
- 然后将结果输出到仪表板。
开始评估,针对每个任务和模型 将系统 + 任务提示发送到 LLM LLM 返回 OpenSCAD 代码 将 OpenSCAD 渲染为 STL 将生成的 STL 与参考 STL 进行比较 将评估结果输出到仪表板 [注意:评估系统对每个任务 x 模型组合运行多个副本。并且评估系统并行执行,因为在运行完整评估时可能存在 1000 多个任务。]
以下是几何检查的工作方式:
- 使用迭代最近点(ICP)算法对齐生成的 STL 和参考 STL。
- 然后通过以下方式比较对齐的网格:
- 它们的体积(通过 = <2% 的差异)
- 它们的边界框(通过 = <1 毫米)
- 零件之间的平均倒角距离(通过 = <1 毫米)
- Hausdorff 距离(95% 百分位数)(通过 = <1 毫米)
- 要“通过”评估系统,必须通过所有几何检查。
评估流程还有一些可以改进的地方。特别是,误报很常见(估计:〜5%)。我还注意到,有时,自动化几何检查不会捕获不正确的小特征(例如小半径圆角)。尽管如此,评估流程仍然足够好,可以看到有趣的结果并比较各种 LLM 的性能。
如果您想了解更多关于评估系统的信息、使用它或查看任务,请查看 GitHub 存储库。
最后,有很多方法可以改进评估系统。以下是我接下来想做的一些事情:
- 更多具有更大覆盖范围的任务
- 优化系统提示,特别是添加 OpenSCAD 文档和代码片段
- 创建一个使用草图和绘图作为输入的评估变体
- 添加另一个变体,测试 LLM 向现有 OpenSCAD 脚本和 STL 添加操作的能力
- 评估 LLM 修复现有 STL / OpenSCAD 代码中错误的能力
前沿模型的快速改进
以下是 2025 年 4 月 22 日执行的评估运行的结果。在评估运行中,在 25 个任务上测试了 15 个不同的模型,每个任务有 2 个副本。运行中的所有结果和配置详细信息都可以在 这里 找到。
结果表明,LLM 只是在最近才擅长 OpenSCAD 实体建模。
CadEval 的结果。在此次运行中,每个模型尝试完成 25 个任务(每个任务 2 个副本)。“成功”意味着它们通过了与参考几何体进行比较的多个几何检查。
排名前 3 的模型都是在我从事该项目时推出的,排名前 7 的模型都是推理模型。与它们的前身,非推理模型相比,这些模型提供了巨大的性能提升。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 的 hull 操作,该操作与 loft 操作并不完全相同。OpenSCAD 没有内置的 loft 操作。
任务 20-24 都需要 5 个连续的操作,这些任务的平均成功率在 3.3% 到 30% 之间。以下是这 5 个任务的提示以及代表性的成功和失败。
失败可能很难发现。失败图像的绿色区域应在生成的 STL 中具有几何体,但没有(参考点云以绿色绘制)。同样,红色区域在生成的 STL 中具有几何体,但不应具有。
❮ ❯
初创公司
在过去的几个月中,两家不同的初创公司推出了文本到 CAD 产品,AdamCad 和 Zoo.dev。Zoo.dev 提供了一个 API 来使用他们的文本到 CAD 模型。Zoo 的 API 和文本到 CAD 产品的演示非常酷,并且看起来与我上面的 Cursor -> OpenSCAD 演示非常相似。
我们很高兴宣布推出 Zoo.dev,这是一个文本到 CAD API,可让您从文本描述生成 3D 模型。 我们已经为此工作了一年,我们终于准备好与世界分享它了。 这是一个关于我们构建的线程🧵 pic.twitter.com/Yd9Yd9Ixqm — Abhishek (@abhi1thakur) 2024 年 7 月 21 日
我将 Zoo 添加到评估流程中,以与 LLM -> OpenSCAD -> STL 进行比较。Zoo.dev API 不是生成 OpenSCAD,而是直接发送回 STL。Zoo 表示他们使用 专有数据集和机器学习模型。令我惊讶的是,与通过创建 OpenSCAD 生成 STL 的 LLM 相比,Zoo 的 API 的性能并不是特别好。尽管如此,我很高兴看到 Zoo.dev 的发展,并且我会很期待看到 Zoo.dev 未来模型的发布与创建 OpenSCAD 的 LLM 相比如何。
接下来是什么?
我认为这些初步结果是有希望的。Cursor(或其他编码代理)+ OpenSCAD 提供了一种以自动化方式生成实体模型的解决方案。
但是,我认为这种方法不会立即起飞并在 CAD 设计生态系统中迅速传播。当前的设置非常笨拙,我认为需要进行大量的产品改进才能使它更好地工作。与 Cursor、Windsurf 和其他工具如何为代码生成开发特定的 UX 和 LLM 工作流程类似,我认为需要大量的工作来开发对 CAD 生成有意义的工作流程和 UX。以下是我认为值得朝这个方向追求的一些想法:
- 将控制台日志和视口图像从 OpenSCAD 引入到 Cursor 中以进行迭代改进和调试的工具。
- 用于突出显示(和测量)零件的某些面、线或方面的 UI,这些面、线或方面被馈送到 LLM 以获取其他上下文。
- 绘图或草图输入,因此用户可以快速直观地传达他们的想法。
- 带有滑块的 UI,用于调整参数而不是编辑代码。
此外,我预计进一步的模型进步将继续解锁此应用程序。特别是,提高空间推理能力是一个 积极的研究领域。我认为,提高空间推理能力可以大大提高模型逐步设计零件的能力。
那么,文本到 CAD 何时成为机械工程师常用的工具?随着初创公司积极构建产品以及前沿模型的快速改进,我的猜测是大约 6-24 个月。
这会走向何方?
在中长期(2-10 年)内,我认为大多数零件将使用某种形式的 GenCAD 创建。让我推测一下。
- 最初,GenCAD 将用于创建适合现有装配体的零件。例如,您可能会说:“我需要一个适合这里的支架。” 并且,GenCAD 工具将创建一个与现有装配体组件完美连接的支架。想要分析三个具有 FEA 的变体?提出要求即可。我希望主流 CAD 套件(Autodesk、Solidworks、Onshape)直接将这些功能添加到其产品套件中。
- 从长远来看,我认为 GenCAD 将覆盖 CAD 套件的各个方面:草图、配合、装配、爆炸视图、CAM 刀具路径、渲染可视化和 CAE。想象一下,在设计评审中,您突出显示一个子组件并说“用 M6 沉头螺钉替换这些铆钉并重新生成 BOM”。模型、图纸和采购电子表格都会在几秒钟内更新。
我们正在观看 CAD 开始退出手动输入时代。就我个人而言,我对这一点感到非常兴奋。 × ENTER