
Agentic CAD 的十个检查器:每次模型更新后跑一遍的验收回路
David Bar 给 agentic CAD 配的十个检查器:规格、运动、几何、边、可制造性、紧固件、孔、图片、已接受问题、以及测试检查器本身,基于 build123d 用 Python 写成,每次模型更新后运行。
让一个 agent 去设计机器人,它会乐此不疲地改上两百遍。每一次修改都信心满满,但没有一次被检查过。改到第四十轮左右,肩部长出一面 0.4 mm 厚的壁,某个孔弄丢了它的螺钉,髋关节在屈曲 61 度时开始和电池托盘干涉。循环里没有任何东西察觉,因为唯一盯着几何的,正是刚刚改完几何的那个 agent。David Bar(@observie)在 CAD 里造机器人、以此理解机器人如何工作,他把自己的答案发成了一份清单:十个检查器,用 Python 基于 build123d 编写,每次模型更新后运行。不是十条 prompt,是十个程序。
这个区别就是整篇文章。Prompt 是请求模型小心一点;检查器是测量实体并让构建失败。把 Bar 的十条放在一起读,就是一份机械工程师的设计评审被编译成了代码,覆盖从意图到可制造零件的整条路径:规格、运动、几何、边、制造工艺、紧固件、孔、渲染图、已接受问题清单,最后是检查器自己。
00. 先说循环:每次模型更新都要有一个裁决
Bar 的框架只有一句话,却承担了大部分工作:告诉你的 agent 加上这些检查器,并在每次模型更新后运行它们。不是项目结束时,不是导出之前,也不是看着不对的时候,而是每次更新之后。这把设计循环从「agent 修改、agent 自己批准」变成一条被度量的流水线:每一次修改都必须通过一次独立的检验,才算进展。
flowchart TD
A[Agent 修改参数化模型] --> B[运行检查器套件]
B --> C{有检查器失败?}
C -- 是 --> D[失败报告:零件、特征、实测值 vs 限值]
D --> A
C -- 否 --> E[渲染图片与剖切]
E --> F[Agent 检查图片]
F --> G{画面上有问题?}
G -- 是 --> A
G -- 否 --> H[本次模型更新被接受]
这个形状带来两个性质。第一,失败是数据:检查器报告零件、特征、以及一个对照限值的数字,这比「感觉哪里不对」好得太多的修复提示。第二,「完成」的定义不再取决于 agent 的心情。套件是提出几何的模型与必须接受它的物理世界之间的契约。
01. 规格检查:对照意图测量零件,而不是对照它自己
测量成品零件的关键尺寸,确认它们与规格合理一致。Bar 把规格维护成一个 YAML 文件,里面是所有高层设计决策——这才是这里安静的使能条件:检查器要先拿到机器可读的意图,才能断言任何东西。参数化模型会愉快地满足它被给的每一个约束,同时悄悄违反一个没被给的约束:为强度加的圆角吃掉两毫米承诺的间隙,某个凸台移动后外壳长出包络之外。规格检查就是那条断言:实体仍然与文档一致。
02. 运动检查:扫过每个关节,盯住接触
让每个关节在全行程内走过数百个位置,确认没有运动件碰到另一个零件。这正是抓住「髋关节撞电池托盘」这类失败的检查器,也是写不好就会吃光 CPU 预算的那个:成本是零件对数 × 位置数 × 每次一个布尔求交。Bar 点出了让它便宜的两个技巧:用简单形体代替完整边界表示;跳过包围盒不相交的任何零件对。包围盒闸门在真正的几何计算开始之前就淘汰掉大部分零件对,代理形体则让剩下的测试快到每个关节每次更新可以跑数百个位置。
03. 几何检查:猎杀退化与过薄
找出极薄的面、极小的面、极短的边、过薄的壁;并确认一个本该对称的零件真的对称。这些缺陷在渲染里永远看不见,在机床上永远看得见:0.1 mm 的细碎面毁掉一条刀路,一条过短的边让圆角操作崩溃,一侧被手工改过之后「镜像」悄悄漂移。值得偷走的测量是射线投射测壁厚:壁厚不是 B-rep 在任何地方存储的量,所以只能去探测——从表面向实体内发射射线,量到出口的距离。检查器报告的于是是一个可以和工艺限值比较的数字,而不是一种印象。
04. 边检查:每条边要么有半径,要么有书面理由
确认每条边都有半径。如果某条边必须保持锋利,把它写进允许锋利边的清单。清单才是这个检查器真正的内容。「所有边都倒圆」不是任何人能遵守的设计规则——配合面、密封面、刃口、电接触面都合理地保持锋利——于是规则变成:每条锋利的边都是某个签过字的决定,按名字记在允许清单里。一条锋利且不在清单上的边不是风格选择,是疏漏,下一次运行检查器就会说出来。
05. 可制造性检查:一个实体、三种工艺、三种失效模式
机加工:确认刀具能到达所有表面,找出对刀具而言过尖的内角,找出过薄的壁。线材打印:测最小壁厚与需要支撑的面积。粉末床打印:找出会困住粉末的封闭空间。同一个实体可以对一种工艺完美、对另一种工艺不可能,而检查器编码的是你真正打算用的那种工艺。粉末那条是多数 CAD 评审完全忘记的:一个没有排粉孔的内腔,等于一个装满烧结粉末的零件,粉末是按公斤计价的,而发现时机是构建板出炉的那一刻。
06. 紧固件检查:螺钉来自库,而且必须装得进
从零件库使用标准螺钉与嵌件——Bar 用的是 bd_warehouse,build123d 的紧固件与嵌件库——然后对每个紧固件断言三件事:它以间隙穿过自己的孔;与它要进入的螺纹孔对齐;螺纹啮合到正确深度。建模范本硬件才是让检查有意义的前提:一个泛化的圆柱「螺钉」永远能装进去,而一颗有真实头部直径、真实杆径、真实螺纹长度的 M3 内六角圆柱头螺钉会立刻告诉你沉孔浅了 0.5 mm、或者啮合少了三圈。
07. 孔检查:不留孤儿孔
确认每个孔里都有紧固件。如果某个孔没有紧固件,写下这个孔的理由。这条规则听起来近乎官僚,直到你调试过它缺席的后果:一个无法解释的孔,要么是被某人删掉的螺钉,要么是没人记录的决策——减重孔、过线孔、销孔、通风孔。把理由强制写进模型,把两种情况都从考古变成一行注解,也给了检查器一份完整的答案表:每个孔要么被占用,要么有理由。
08. 图片检查:让 agent 看自己的作品
每次修改后生成零件的图片与剖切,并要求 agent 在宣布工作完成之前检查这些图片。数字能抓住你想到要量的一切;渲染能抓住你没想到要量的。剖切最重要,因为像 Bar 的四足机器人这样的机器,失败都活在外壳里面——PCB 堆叠与电池之间的干涉、长进线槽里的凸台——任何外观视图都永远看不见。要求 agent 在声称完成前检查图像,才是闭环的那一步:图片不是文档,是闸门。
09. 已接受问题:命名、划界、要小
给每个已接受的问题一个名字和一个小区域。真实设计带着已知偏差——刀具留下的痕迹、壁厚低于标称但零件仍然没问题的区域——一个不能豁免的检查器会一直喊狼来了,直到团队把它关掉。Bar 对豁免的约束才是锋利的部分:被接受的区域必须小,因为大的豁免区域会藏住新问题。形状改变之后,在一个笼统豁免里新生的缺陷,对本该抓住它的那个检查器是不可见的。给问题命名、把边界收得紧紧的,才能让每一份豁免可审计、让套件保持诚实。
10. 测试检查器:验证也需要验证
给每个检查器一个带已知错误的零件,只有当它找到那个错误之后才使用这个检查器。一个从未在任何东西上失败过的检查器,与一个永远返回 true 的检查器无法区分;而在一个每次更新都跑套件的循环里,一个静默死掉的检查器比没有更糟:它花掉 CPU,然后打印「通过」。所以套件要有自己的回归测试,用故意做坏的几何播种——一面 0.2 mm 的壁、一个没有螺钉的孔、一个在行程中段碰撞的关节——错过种子缺陷的检查器,自己就是 bug。
| # | 检查器 | 抓住什么 | 靠什么保持诚实或快速 |
|---|---|---|---|
| 1 | 规格 | 尺寸偏离设计意图 | 意图住在高层决策的 YAML 里 |
| 2 | 运动 | 关节行程内运动件相碰 | 代理形体 + 包围盒预筛,数百个位置 |
| 3 | 几何 | 细碎面、短边、薄壁、对称破坏 | 射线穿透实体探测壁厚 |
| 4 | 边 | 没人决定过的未倒圆边 | 允许锋利边的显式清单 |
| 5 | 可制造性 | 刀具到不了的表面、过尖内角、困粉、支撑面积 | 每种目标工艺一套规则:机加工、FDM、粉末床 |
| 6 | 紧固件 | 缺间隙、螺纹不对中、啮合过浅 | bd_warehouse 的真实目录硬件 |
| 7 | 孔 | 孤儿孔与未记录的设计决策 | 每个孔要么有紧固件,要么有书面理由 |
| 8 | 图片 | 没有指标为它而写的失败 | agent 必须在声称完成前检查渲染与剖切 |
| 9 | 已接受问题 | 豁免吞掉新缺陷 | 每份豁免命名并限定在小区域 |
| 10 | 测试检查器 | 静默永远通过的检查器 | 用已知错误的种子零件;检查器正确失败过才被信任 |
为什么这份清单能走出这一台机器人
CAD-as-code 让整个想法可以执行:当模型是一个程序,模型就能像程序一样被测试。Bar 的十个检查器几乎一对一地映射到软件工程师早已信任的测试词汇——对照规格的断言、跨运动接口的集成测试、以渲染形式存在的快照测试、以文档化抑制形式存在的豁免、以及给测试套件自己的回归测试。新的只有基底:被测单元是一个边界表示,而不是一个函数。
它也重新分配了智能的去向。没有检查器的 agent 把能力花在反复推导「上一次修改安全吗」上,并以稳定的比率答错。有检查器的 agent 把能力花在设计上,从一份点名零件、特征与数字的报告里读失败。第 00 节里的循环才是产品;十条只是把循环做实。对任何在 build123d、CadQuery 或其它可脚本化内核上跑 agentic CAD 的人,移植成本是一周的 Python,而它关掉的失效模式,是过去在机加车间才暴露的那些。
来源:X(Twitter)长文,作者 David Bar(@observie),《Tips for agentic CAD: tell your agent to add these checkers and run them after every model update》(x.com/observie/status/2109707995919606136,2026-10-12)。本文为全文翻译与改编;全部渲染图与视频来自原帖,循环图与汇总表为本版本补充。
原文来源:David Bar (X)https://x.com/observie/status/2109707995919606136