AI 写 CAD 代码,核心就靠 “两步走”

之前聊过,传统 CAD 建模得手动写代码或拖拽,又麻烦又有门槛。CAD Coder 的目标特简单:你用文字描述需求(比如 “画个 20×15×10mm 的长方体”),AI 直接输出能运行的 CADQuery 脚本,还得形状精准、不报错。

这背后其实就两个关键步骤:SFT 让 AI “会写”,GRPO 让 AI “写好”。咱们顺着之前的疑问,一步步拆明白,不搞复杂术语~

在这里插入图片描述


一、SFT:先给 AI 打基础,让它 “看得懂需求、写得出代码”

SFT 说白了就是 “监督微调”,相当于给预训练大模型(LLM)上 “CAD 代码入门课”,核心是教它 “文字需求→CAD 代码” 的对应关系。

1. 具体怎么做?就 3 步:

  • 先攒数据:找一堆 “文字描述 + 对应 CADQuery 代码” 的配对(比如 “生成长方体”→ 对应的 box () 代码);

  • 训练目标:让模型学 “猜下一个代码单词”—— 比如前面写了cq.Workplane("XY").,模型得猜到下一个是box(20,15,10),猜错了就扣分(用的是交叉熵损失,不用记名字,知道是 “猜词扣分” 就行);

  • 结果:模型学会后,输入文字能生成语法正确、能运行的 CAD 代码,但可能有小问题 —— 比如尺寸差一点,或者代码写得冗余(能跑但不最优)。

2. 为啥要有 SFT?

就是给后续优化打地基!如果直接让模型上强化学习(GRPO),它连 CAD 语法都不懂,生成的全是错代码,后续优化根本没法搞。SFT 先让模型 “入门”,保证输出的代码 “能跑”,GRPO 再负责 “跑好”。


二、GRPO:给 AI “挑错改进”,从 “能跑” 到 “跑好”

SFT 的问题很明显:只学了 “文字→代码” 的表面映射,不管几何形状对不对、代码优不优。GRPO 就是来解决这个的,它是强化学习的一种,核心逻辑是 “多试几种方案,选最好的,让模型记下来”。

1. GRPO 完整流程(咱们结合之前的疑问拆):

咱们拿 “画 20×15×10mm 长方体” 这个需求举例,一步步看它怎么运作:

步骤 1:写提示词(不用复杂,说清需求就行)

直接说清楚 “要啥 + 要求”:

“用 CADQuery 语法画个长方体,长 20mm、宽 15mm、高 10mm,脚本要能运行,尺寸别错,代码越简单越好”

步骤 2:同一模型生成多组脚本(重点回应你的疑问!)

这里关键是:用的是 SFT 训练后的同一个模型,参数没改

  • 为啥能生成多组不同的?因为大模型生成时是 “概率采样”(比如调个 temperature=0.7),不是固定输出 —— 就像同一个人做同一道题,可能用不同解法,模型参数不变,也能从 “可能的代码分布” 里抽不同写法;

  • 生成多少组?论文里是 8 组,比如其中两组:

# 一组简洁的(最优)

import cadquery as cq

result = cq.Workplane("XY").box(20,15,10)

show_object(result)
# 一组冗余的(能跑但麻烦)

import cadquery as cq

sketch = cq.Workplane("XY").rect(20,15)  # 先画矩形

result = sketch.extrude(10)  # 再拉伸

show_object(result)
步骤 3:跑脚本、生成几何模型

把 8 组脚本逐一带入 CADQuery 运行:

  • 能跑的:生成对应的 3D 模型(输出点云 / 网格数据);

  • 跑不了的(语法错、参数错):直接淘汰,奖励分 0 分。

步骤 4:给每组脚本打分(按 CAD 的需求来)

打分不看 “代码顺不顺”,只看 3 个实用维度,总分加起来:

  • 几何保真度(最关键):生成的模型和目标形状差多少?用 Chamfer 距离算,差得越少分越高(比如完美匹配得 0.7 分,差一点得 0.5 分);

  • 可执行性:能跑就加 0.2 分,跑不了 0 分;

  • 格式合规:代码简洁、符合 CADQuery 语法加 0.1 分,冗余啰嗦扣 0.1 分。

步骤 5:算 “相对优势” 和 “不跑偏” 的约束
  • 优势值:比如 8 组的平均得分是 0.8 分,某组得 1.0 分,它的优势值就是 0.2(比平均好);某组得 0.6 分,优势值就是 - 0.2(比平均差)—— 核心是让模型知道 “和自己的其他方案比,哪个更好”;

  • KL 散度:简单说就是 “不让模型忘本”—— 优化时不能偏离 SFT 教的基础语法,比如不能为了追求高分,生成语法错误的代码(权重 β=0.01,轻微约束就行)。

步骤 6:调整模型参数(还是同一个模型!)

把优势值、KL 散度代入 GRPO 的损失函数,核心逻辑是:

  • 给 “优势值高” 的脚本加权:让模型以后更愿意生成这类优质代码(比如之前生成简洁版的概率 20%,优化后涨到 50%);

  • 限制更新幅度:用 clip (1-ε,1+ε)(ε=0.2),避免模型一下子跑偏;

  • 最终:反向传播更新模型参数,把 “选出来的好方案” 记到模型里。

步骤 7:重复迭代

用批量的提示词(比如画圆柱、正方体、复杂零件)重复上面 1-6 步,直到模型生成的代码,大部分都能精准跑对几何形状。

2. GRPO 到底牛在哪?

  • 用 “多组对比” 代替 “单组评判”:避免奖励函数有误差(比如某组代码刚好踩中高分点),让模型知道 “同需求下哪个方案真的好”;

  • 贴合 CAD 的实际需求:不纠结代码 “通不通顺”,只在乎 “能不能跑、形状对不对”;

  • 不丢基础:KL 散度约束让模型不忘 SFT 教的语法,不会为了高分乱生成。


三、之前的核心疑问,再总结一遍

1. 生成多组用的是同一模型参数吗?

对!参数完全不变,靠大模型的 “概率采样”,从同一个输出分布里抽不同写法 —— 就像同一个学生做同一道题,试不同解法。

2. 无论哪组胜出,调整的都是同一个模型?

没错!GRPO 的目标是优化模型的 “输出概率”:让优质代码的生成概率变高,劣质的变低,相当于把 “好解法” 固化到模型里,以后再遇到类似需求,优先输出优质代码。

3. 为啥非要生成多组,不能单组优化?

  • 没对比就没好坏:单组代码不知道自己是优是劣,多组才能算 “相对优势”;

  • 过滤误差:绝对评分(比如 Chamfer 距离)可能不准,多组对比能抵消误差;

  • 覆盖更多方案:CAD 建模有多种合法写法,多组能让模型学到 “哪种写法更靠谱”。


最后说两句

CAD Coder 的逻辑其实很简单:SFT 教 AI “会写 CAD 代码”,GRPO 教 AI “写好 CAD 代码”。整个框架最妙的就是 GRPO 的 “多组对比 + 领域奖励”—— 不搞虚的,只盯着 “能运行、形状准” 这两个核心需求优化。

如果想复现这个逻辑,重点抓 3 个点:多组采样的参数(比如生成 8 组、temperature=0.7)、奖励函数的设计(几何保真度占比最高)、KL 惩罚的权重(β=0.01 差不多),这三个直接影响最终效果~

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐