教AI画画,九个评分维度不如四个——把“绝对打分”换成“和好作品比一比”,模型自己就把代码从1.35万token压到2千以下。它验证了一件事:奖励函数不是越复杂越好,当五把尺子量同一件事,模型只会原地打转。差别在于,相对判断撑开了学习空间,人工锚点定好了“什么叫好”。
一个 prompt 改不动一笔,他们决定让模型"写代码来画画"
用强化学习教AI画画,关键不在像不像,而在怎么让机器学审美——一个项目从奖励函数开始卡住。
用主流 AI 生图的人都有过这种体验:想改一束花的颜色,必须重新写整段提示词,再赌一次模型会给你想要的结果。Surya 在 2026 年 3 月发表的项目笔记里把这个限制写成了起点——“图像不可编辑,唯一的交互入口是 prompt。”
他和 Cameron 想绕开这条死胡同:让模型直接写 p5.brush(一种基于 p5.js 的水彩笔刷库)的 JavaScript 草图,渲染出的 PNG 退成副产品,代码本身才是产物。用户改代码就是在改画。
真正让他们卡住的,是更深一层的问题。强化学习(让模型在"试错—打分"循环里自己摸索最优策略的方法)能教会模型下棋、答数学题,因为对错有客观判据;可“好看”没有标准答案。Surya 在笔记里直接摊牌:奖励太硬,模型会收敛到一种偷懒的解法;奖励太松,模型会原地打转。设计问题本身,变成了奖励函数的问题。
团队包括 Surya、Cameron、Alex Wang,训练对象是 Qwen 3.5。整个训练在一个四步循环里跑了数千次:模型拿到“画一朵水彩木槿”这样的提示词,写出一份完整 JS 草图;草图在沙箱化的 Puppeteer 浏览器里渲染成 PNG;另一组裁判模型把 PNG 和参考池里随机抽出的两幅画对比,挑出更好的那张;胜负转成奖励信号,通过 GRPO(一种按组内相对名次更新参数的强化学习算法)回灌给模型,循环重启。参考池里的画作由作者逐张人工分级,“心水”级样本进入对比池,每一轮评判,模型都在和这些被认定“好”的作品比。
项目页只放了画作截图、训练流程图和论文答辩视频,没有公布完整的奖励曲线或消融实验(逐一去掉某项变量看效果的研究方法)数据。后续那场“九维评分塌缩成四维、再把绝对打分换成两两对比”的实验,是这次重写的真正戏肉——它也是下一节要拆的东西。
九个裁判,其实在测同一件事
奖励函数不是越多越好——当五把尺子量的是同一个尺寸,模型只会原地打转。
第一版奖励函数塞了九项信号:代码能不能跑通、用没用对 p5.brush 这套画笔库、长度有没有到目标档位、HPSv3(一种用人类偏好数据训练出来的评分模型)给几分,再加 GPT-5.4 和 Gemini 组成"委员会"判断是否贴合提示词,最后还有可识别度、美感、技法、纵深四个独立裁判。看着齐全,但模型训练到 0.65 奖励就再不动了。每次吐出来的图都长一个样:一朵五瓣平贴的剪纸花,奖励分数还在涨,画本身没有任何进步。
把九个信号拆开单独看,问题就藏不住了。四个质量裁判和"贴合提示词"之间的相关性高达 0.85 到 0.95——换个说法,五个人拿着五把不同的尺子,量出来却几乎是一样的数字。这五把尺子其实在量同一件东西。
代码长度奖励占总分约三分之一,但到第 30 步就饱和了(已经达到上限,再涨不动了),之后对模型来说这段信号等于零梯度(提示"该往哪改进"的方向信号,趋近于零就是没方向),它从中学不到任何新东西。唯一还在变化的是 HPSv3,但权重只有 0.10——微弱得像背景噪音。
裁判团自己先内卷了。它一遍遍告诉模型同一件事:做一朵贴题的、可识别的、技法尚可的花。模型听懂了,于是精确地交付了这件事——一朵永远五瓣的剪纸花。奖励函数把"什么是好"拆得太细,反而堵死了模型探索的空间。
这背后是一个被低估的工程常识:奖励函数不是越复杂越能反映"审美",当多维信号高度相关,复杂度只是在重复确认同一个判断。最反直觉的一点是——把打分维度从九个砍到四个、把"打几分"换成"和好作品比一比",模型反而学会了更简洁的代码画出有构图意识的作品。下一个问题是:这把尺子到底该怎么造,下一节拆给你看。