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)
SketchAgent 搬到 3D:让冻结的 LLM 直接输出一个 Python list(每条是 4 个 3D 控制点的三次 Bézier 曲线),渲染 16 个视角算 CLIP 分数当 reward;再用 Training-Free GRPO(Reflexion / ExpeL 式“把高分和低分样本对比后写成文字经验,塞回 system prompt”)来改进 prompt。全程不更新权重,只更新一段文字规则清单。
图 1:上半是以往做法(Diff3DS、Dream3DVG 等)——把 3D Bézier 曲线渲染后用预训练扩散模型的 SDS loss 反传、逐个物体优化几十分钟;下半是本文——LLM 直接写曲线,CLIP reward 打分,把对比出的“经验”回写进 prompt。注意下半图特别强调“3D sketch 没有可验证的 ground truth”,这是选用相对比较而不是绝对打分的理由。
研究动机
问题难在哪 :3D 草图要同时满足“从每个角度看都像这个东西”和“线条之间在空间里真的连在一起”。LLM 只能输出数字,看不到自己画了什么;它对 3D 坐标的直觉很差,常常画出全挤在一个平面里、或控制点重合成一个点的曲线。
现有方法的问题 :(1)SDS 优化类 (Diff3DS、Dream3DVG、3Doodle):每个物体单独跑 60–120 分钟 GPU 梯度优化,线条常常碎、乱,不能交互;(2)LLM 画图类 (SketchAgent):免训练、能逐笔画,但只在 2D 画布上;(3)Training-Free GRPO 类免训练适配:依赖标量 reward 或 ground truth 答案,开放式创作任务两者都没有。
核心 insight :不需要知道“正确的 3D 草图长什么样”,只要能判断两张草图哪张相对更好 (用多视角 CLIP),就能让 LLM 自己总结“好的那张做对了什么”,并把总结写进 prompt,逐轮积累成 3D 绘图经验。
术语速查
论文借用了大量 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。
CKE Contrastive Knowledge Extraction,上面这整套“对比后总结经验”的流程的名字。
核心方法
图 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
−
+
reset
经验提取循环:唯一被“训练”的东西是左下角的经验库 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 差翻译成文字规则
采样 :每个训练 prompt 采 \(K=5\) 张草图(temperature 0.7,最长 32k tokens)。
配对 :按 CLIP 分数组成 \((S^+_i, S^-_j)\),要求 \(r_i>r_j\);论文称这是把 GRPO 的“组内比较”放宽成“任意两两比较”。
评判 :\(A_{\text{text}} = \text{LLM}(p_{\text{judge}}, T, S_i, S_j, E)\),让 LLM 解释好的那张在结构完整、空间连续、几何合理上赢在哪。
更新 :\(E \leftarrow \text{Update}(E, A_{\text{text}})\),Update ∈ {Add, Delete, Modify, Keep}。
图 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 条曲线”)来控制抽象程度。
图 6:曲线数量预算 8 → 128。8 条时是火柴人 / 骨架;32–64 条出现板条、花盆等细节;128 条变成密集线框,开始出现冗余重叠线。
5. 最关键的一句话
用多视角 CLIP 给 LLM 写的 Bézier 坐标列表打分,让 LLM 对比高低分样本写出文字规则并存进 prompt,以此代替梯度训练。
主要实验结果
数据集/benchmark :自建 prompt 集,类别来自 ModelNet40 和 QuickDraw(椅子、飞机、猫、自行车……);外加 Diff3DS 的 28 个复杂文字 prompt 和 37 张参考图。
指标 :CLIP-ST(16 视角与文字的平均 CLIP ViT-B/32 相似度,文字模板为“{C}, minimal 2d line drawing, on a white background, black and white.”)、CLIP-SI(与参考图的相似度)、AES(LAION aesthetic predictor,16 视角平均)。
定量对比(Table 1)
Method 需训练 Cat. CLIP-ST Cat. AES Fine CLIP-ST Fine AES Img CLIP-SI Img AES
Diff3DS ✓ 0.648 3.791 0.650 3.770 0.865 3.828
3Doodle ✓ - - - - 0.869 4.264
Dream3DVG ✓ 0.660 4.150 0.670 4.174 - -
3DrawAgent (DeepSeek-V3.2) ✗ 0.643 4.108 0.664 4.146 - -
3DrawAgent (Gemini-2.5 Pro) ✗ 0.649 4.161 0.669 4.175 0.873 4.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%。
图 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 更快,峰值几乎一样。
有无经验库 :0.5735 → 0.6643(+0.09),是全文最大的单项增益。
Group size K :K=5 最好;K=2 学得慢;K=10 不稳定(Ep 2 跌到 0.5612)。
是否需要 GT :GT=True 峰值 0.6648 vs GT=False 0.6643,几乎无差。论文解读为“不需要 GT”;另一种解读是“经验库学到的东西本来就跟具体几何无关”(见下文)。
随机配对 :说明 CLIP 排序确实提供了方向,不是“多加几条规则”本身起作用。
经验提取过程统计(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)
图 11:Text-to-3D,简单 prompt。
图 12:Text-to-3D,复杂 prompt。
图 13:Image-to-3D(一)。
图 14:Image-to-3D(二)。
局限与展望
图 8:典型失败。(a) 本该相交的线没接上(桌腿和桌面);(b) 漂浮的部件;(c) 复杂结构(婴儿车轮子等)变成一团重叠线。
已知局限(论文自述) :端点不相交、部件漂浮、复杂拓扑杂乱——CLIP 只看整体“像不像”,不管局部连接;经验库在 2–3 epoch 后变差,作者称为“over-reasoning”(后期规则太具体,反而限制 LLM);整体质量受底座 LLM 自身空间推理能力限制。
怀疑者会说:增益主要来自“修格式”,不是“学会 3D” (推测,论文未分开报告)。图 4 的 reward 是两极的:解析失败 = 0,成功的几乎全在 0.64–0.69。若约 15% 失败,平均 ≈ 0.85 × 0.66 ≈ 0.56,正好接近 base 的 0.5735;而 CKE 峰值 0.6643 恰好就是“成功样本”那一档的分数。图 4(d) 括号匹配率 0 → 0.95、图 5 最后一条“输出前自检 Python list 语法”也指向同一结论。GT=True 毫无帮助,也与“经验库主要学的是格式和通用守则”相符。要证伪,需要报告“只在解析成功的样本上”的 CLIP-S。
Reward 与评测指标高度重合 :经验提取用多视角 CLIP 打分,评测 CLIP-ST 也是同样 16 视角的 CLIP(附录写明 ViT-B/32)——等于在评测指标上做 prompt 优化。即便如此 CLIP-ST 也没超过 Dream3DVG。用户研究(30 人,40 个 prompt,只问“选最好的一个”)是唯一独立证据,样本量较小。
真正的新东西是什么 :(1)首次把“LLM 直接写 3D Bézier 控制点”系统化并与 SDS 方法正面比较,证明在 CLIP / AES 上能打平、成本低 50–100 倍;(2)Training-Free GRPO 从“有标准答案的数学题”迁移到“只有 CLIP 相对分数的开放创作”。“pairwise 代替 group”这一点本身很弱——实际仍是每个 prompt 采 K=5 组内比较,消融也是按 K 做的。
其他可疑点 :标题叫“Agent”、文中称“sequentially draw”,但实际是一次性输出整张草图,没有看图 → 改图的闭环;所有消融是单次运行,没有方差,而 K=10 和随机配对的大幅波动说明噪声不小;附录日志里单次 rollout 耗时 191 s 和 1130 s,与“约 2 分钟”的说法并不完全一致。
研究趋势 :这篇处在三条线的交点——LLM 作为程序化 3D 生成器(ShapeAssembly、CAD-as-code、Blender 脚本 agent)、免训练的“文字经验”式自我改进(Reflexion、ExpeL、Training-Free GRPO、prompt 优化),以及矢量 3D 草图(3Doodle、Diff3DS、Dream3DVG)。可见的下一步是:让 VLM 真正“看”渲染图并逐步修改(闭环 agent);用连接性 / 闭合性等几何 reward 补 CLIP 的盲区;或把积累的经验当数据,真的去做 RL 微调,看免训练版本和真训练版本差多少。