目录

3DrawAgent: Teaching LLM to Draw in 3D with Early Contrastive Experience


作者Hongcan Xiao, Xinyue Xiao, Yilin Wang, Yue Zhang, Yonggang Qi
机构Beijing University of Posts and Telecommunications; Jiangnan University; HaoHan Data
会议CVPR 2026 (Highlight)
链接https://arxiv.org/abs/2604.08042

SketchAgent 搬到 3D:让冻结的 LLM 直接输出一个 Python list(每条是 4 个 3D 控制点的三次 Bézier 曲线),渲染 16 个视角算 CLIP 分数当 reward;再用 Training-Free GRPO(Reflexion / ExpeL 式“把高分和低分样本对比后写成文字经验,塞回 system prompt”)来改进 prompt。全程不更新权重,只更新一段文字规则清单。

Figure 1
图 1:上半是以往做法(Diff3DS、Dream3DVG 等)——把 3D Bézier 曲线渲染后用预训练扩散模型的 SDS loss 反传、逐个物体优化几十分钟;下半是本文——LLM 直接写曲线,CLIP reward 打分,把对比出的“经验”回写进 prompt。注意下半图特别强调“3D sketch 没有可验证的 ground truth”,这是选用相对比较而不是绝对打分的理由。

研究动机

术语速查

论文借用了大量 RL 术语,但这里全部是“文字层面”的类比。下表给出它们在本任务里具体是什么。

论文术语在本文里具体是什么
Policy \(p_\theta\)冻结的 DeepSeek-V3.2 或 Gemini-2.5 Pro,加上 system prompt 和经验库 \(E\)。唯一会变的是 \(E\) 这段文字。
Action \(a_t\) / rollout一次 LLM 回复:<curves>[[[x,y,z]×4], ...]</curves>,一条曲线 = 4 个 3D 控制点。整张草图一次生成,不是一笔一笔交互。
Reward \(r_{\text{CLIP}}\)把曲线用 pydiffvg 渲染成 16 张 512×512 线稿,每张和文字算 CLIP 余弦相似度,取平均。解析失败 = 0。
Group size \(K\)同一个文字 prompt 采样 5 次(temperature 0.7),得到 5 张草图互相比较。
Semantic advantage \(A_{\text{text}}\)另一次 LLM 调用写的一段话:“高分那张为什么比低分那张好”,例如“低分那张把所有控制点放在同一 z 平面”。
Experience library \(E\)一个编号的文字规则列表(G0, G1, …),例如“对称物体用旋转曲面:轮廓线 + 环形线”。每轮用 ADD / DELETE / MODIFY / KEEP 编辑。
Epoch对约 100 个训练 prompt 各跑一遍“采样 → 打分 → 对比 → 改经验库”。实验只做了 4 个 epoch。
CKEContrastive Knowledge Extraction,上面这整套“对比后总结经验”的流程的名字。

核心方法

Figure 2
图 2:整体框架。(a) 文字或图片输入;(b) LLM 生成曲线、渲染 16 视角、CLIP 打分;(c) 经验提取器对比高低分样本并写出“为什么”;(d) 经验库被 ADD / KEEP / DELETE / MODIFY 更新,再作为 prompt 的一部分喂回同一个 LLM。
flowchart LR
  T["Text prompt"] --> L["Frozen LLM"]
  E["Experience E"] --> L
  L -->|"K=5 samples"| S["Bezier lists"]
  S --> R["Render 16 views"]
  R --> C["CLIP score"]
  C -->|"better vs worse"| J["Judge LLM"]
  J -->|"A_text"| U["Add Del Mod Keep"]
  U --> E
          
drag to pan · scroll to zoom
经验提取循环:唯一被“训练”的东西是左下角的经验库 E(一段文字)。推理时去掉右半边,只用 E + prompt 让 LLM 在 temperature 0.3 下一次生成。

1. 3D 草图语言 —— 把画图变成写 Python list

草图 \(S=\{C_1,\dots,C_N\}\),每条曲线是三次 Bézier \(B_i(t)=\sum_{j=0}^{3}\binom{3}{j}(1-t)^{3-j}t^jP_j\),\(P_j\in\mathbb{R}^3\)。System prompt 由六部分组成:角色(“你是专业 3D 艺术家”)、输出格式(只在 <curves> 标签内放 list)、数据类型约束(4 个点 × 3 个 float)、坐标系(原点居中,\([-0.8,0.8]^3\),右手系 +Z 朝上)、一个 ground truth 示例(“A benz car”的完整曲线)、禁止项(不许注释、变量赋值)。曲线数量不限。

<curves>
[[[-0.3, -0.5, 0.0], [-0.2, -0.5, 0.0], [0.2, -0.5, 0.0], [0.3, -0.5, 0.0]],
 ...
 [[0.15, -0.5, 0.65], [0.15, -0.4, 0.65], [0.15, 0.4, 0.65], [0.15, 0.5, 0.65]]]
</curves>

直观理解:LLM 本身不“看”,只是凭语言知识(“椅子 = 4 条腿 + 座面 + 靠背”)去猜坐标。上面是论文附录里一个“衣柜”的高分输出(reward 0.65)——大部分曲线其实是共线的直线段。

2. 多视角 CLIP 打分 —— 没有 ground truth 的 reward

解析器提取 <curves> 内容,校验格式和数值范围后,用基于 pydiffvg 的批量渲染器透视投影到 16 个固定相机(fov ≈ 60°,2 px 深灰线,白底),然后算:

\[ r_{\text{CLIP}} = \frac{1}{V}\sum_{v=1}^{V}\cos\big(E_I(I_v),\,E_T(T)\big),\quad V=16 \]

渲染器虽然“可微”,但本文从不反传梯度,只用它出图。

3. 对比经验提取(CKE)—— 把 reward 差翻译成文字规则

  1. 采样:每个训练 prompt 采 \(K=5\) 张草图(temperature 0.7,最长 32k tokens)。
  2. 配对:按 CLIP 分数组成 \((S^+_i, S^-_j)\),要求 \(r_i>r_j\);论文称这是把 GRPO 的“组内比较”放宽成“任意两两比较”。
  3. 评判:\(A_{\text{text}} = \text{LLM}(p_{\text{judge}}, T, S_i, S_j, E)\),让 LLM 解释好的那张在结构完整、空间连续、几何合理上赢在哪。
  4. 更新:\(E \leftarrow \text{Update}(E, A_{\text{text}})\),Update ∈ {Add, Delete, Modify, Keep}。
Figure 5
图 5:经验库随步数的演化。早期规则偏“拆成部件、保持对称”;后期变成“三个维度都要变化控制点,别塌成平面”“曲线段用不同控制点、直线段用共线点”;最后还学会了“输出前检查 Python list 语法和嵌套”。

直观理解:这是 prompt 工程的自动化版本。人工 prompt 工程师会看几张失败的图,然后在 prompt 里加一句“不要让控制点重合”——CKE 让 LLM 自己做这件事。

4. 推理 —— 带经验一次生成

\(o = p_\theta(o\mid T, E)\):把 \(E\) 作为额外 prompt 段落拼进上下文,temperature 0.3,报告 Pass@1。图像输入(Image-to-3D)只能用多模态的 Gemini。也可以在文字里加数量约束(“正好用 16 条曲线”)来控制抽象程度。

Figure 6
图 6:曲线数量预算 8 → 128。8 条时是火柴人 / 骨架;32–64 条出现板条、花盆等细节;128 条变成密集线框,开始出现冗余重叠线。

5. 最关键的一句话

用多视角 CLIP 给 LLM 写的 Bézier 坐标列表打分,让 LLM 对比高低分样本写出文字规则并存进 prompt,以此代替梯度训练。

主要实验结果

定量对比(Table 1)

Method需训练Cat. CLIP-STCat. AESFine CLIP-STFine AESImg CLIP-SIImg AES
Diff3DS✓0.6483.7910.6503.7700.8653.828
3Doodle✓----0.8694.264
Dream3DVG✓0.6604.1500.6704.174--
3DrawAgent (DeepSeek-V3.2)✗0.6434.1080.6644.146--
3DrawAgent (Gemini-2.5 Pro)✗0.6494.1610.6694.1750.8734.255

读法:CLIP-ST 上 Dream3DVG 仍然最好,本文只是“打平”(差 0.001–0.011);AES 本文略好。卖点不是分数更高,而是不训练、单个物体约 2 分钟、0.09 美元就能接近 SDS 方法。用户研究(30 人、40 个 prompt)中 3DrawAgent 得票 46.66%,Dream3DVG 36.67%,Diff3DS 16.67%。

Figure 3
图 3:(a) 类别级、(b) 细粒度文字、(c) 图像输入的定性对比。Diff3DS 线条碎乱;Dream3DVG 轮廓对但结构松;本文线条更少、更“设计师式”,部件分明。

成本(Table 3 / 4)

~2 min每个物体(SDS 方法 60–120 min)
$0.09每个物体(SDS 方法 $0.8–1.5)
~$11一整次 CKE:100 prompt × 3 epoch × K=5

消融实验(Table 2 / 5)

ModelNet40 测试集 CLIP-S 随经验提取 epoch 的变化(DeepSeek)。Ep 0 = 无经验的 base(0.5735)。CLIP 选对(Ours,K=5)在 Ep 2 达峰 0.6643 后回落;随机配对在 Ep 2 掉到 0.5595,低于 base;K=10 反而比 K=2 差;给 ground truth(GT=True)只让 Ep 1 更快,峰值几乎一样。

经验提取过程统计(Figure 4)

Figure 4
图 4:单个任务 200 次 rollout。(a) 曲线间平均相似度(高 = 退化成重复直线);(b) 曲线数量(个别超过 500 条);(c) reward 两极分化:约 30 次 = 0.0,约 170 次落在 0.6–0.7;(d) 括号匹配率随迭代从 0 升到 ~0.95。
更多生成结果(附录 Figure 11–14)
Figure 11
图 11:Text-to-3D,简单 prompt。
Figure 12
图 12:Text-to-3D,复杂 prompt。
Figure 13
图 13:Image-to-3D(一)。
Figure 14
图 14:Image-to-3D(二)。

局限与展望

Figure 8
图 8:典型失败。(a) 本该相交的线没接上(桌腿和桌面);(b) 漂浮的部件;(c) 复杂结构(婴儿车轮子等)变成一团重叠线。