
把反向传播搬进文本空间:TextGrad 和它的「文本梯度」
过去十五年,深度学习能一路做大,背后有一个不起眼但关键的工具:自动微分。你定义一个损失函数,框架帮你把梯度一层层算回去,每个参数都知道该往哪个方向调。
但现在 AI 系统变了。
如今最强的应用不再是单个模型,而是一串 LLM 调用加上检索、代码执行、工具调用的组合——所谓 compound AI system(组合多个 LLM 的 AI 系统)。这类系统的全景图谱,可以参考 LLM 多智能体系统综述。这种系统的优化,自动微分帮不上忙。你拿不到梯度,因为 LLM 是黑盒,工具调用是不可微的。
那怎么办?工程师的默认做法是手工调:反复改 prompt,加 few-shot 示例,调整模块之间的衔接。有效,但费时,而且高度依赖经验。
Stanford 的 Mert Yuksekgonul 和 James Zou 团队提出了一个直接的回答:梯度不必是数字,也可以是一句话。他们把这个想法做成了一个叫 TextGrad 的框架,近期发表在 Nature 上。
论文地址:https://arxiv.org/abs/2406.07496
代码:https://github.com/zou-group/textgrad
梯度不必是数字:把反向传播搬进文本空间
TextGrad 的核心,是把 PyTorch 的自动微分搬到文本空间。
在标准 autograd 里,计算图的节点是张量,梯度是数值向量,反向传播靠链式法则把误差一层层往回传。TextGrad 做的事情类似,只是把每一样都换掉了:节点变成文本变量(prompt、代码片段、分子结构、放疗方案),梯度变成自然语言批评(“这段代码漏了边界条件""这个分子的侧链太疏水”),反向传播靠 LLM 完成。
具体怎么做的?关键是一个叫 ∇_LLM 的算子。给定一个变量、它的下游输出、以及下游已经收到的反馈,LLM 生成一段文本,说明这个变量应该怎么改。数学上写成:
其中 是要优化的变量, 是它的下游输出, 是下游已经收到的反馈。LLM 把三者拼成一个 prompt,生成”该改哪里、怎么改”的建议。

TextGrad 把任意 AI 系统建模成计算图。变量是文本,梯度是自然语言批评,LLM 充当梯度引擎。图源:论文 Figure 1。
这里有一个关键设计:∇_LLM 这个算子是全局通用的。
不管你优化的是一段代码还是一个分子结构,反向传播的 prompt 模板一模一样。你只需要告诉 LLM 三件事——这个变量是什么角色、它的上下文是什么、下游给了什么反馈——它就能给出修改建议。论文里的所有实验,从 LeetCode 到分子设计到放疗方案,用的都是同一套梯度算子,没有针对任务手工设计。
这套抽象的代价,是 TextGrad 必须假设当前 LLM 足够聪明,能理解一个变量在系统里的作用并给出有用的批评。这个假设在 GPT-4o 这一档模型上基本成立,但论文也承认,当任务超出 LLM 的理解范围时,梯度质量会下降。
换句话说,TextGrad 的能力上限,受限于当梯度引擎的那个 LLM。
一个算子,三种用法:TextGrad 怎么统一不同优化任务
同一个框架能套到多少场景?论文把 TextGrad 的用法分成三类,区别只在于”优化什么变量”,反向传播机制完全一样。
第一类是实例优化(instance optimization):直接优化某个具体解。比如对一道 LeetCode 题,把代码片段当变量,跑单元测试拿反馈,再让 LLM 改代码。分子设计、放疗方案也属于这一类——优化的是一次性产物,不要求泛化。
第二类是 prompt 优化(prompt optimization):找一个跨多个 query 通用的系统 prompt。用 minibatch 随机梯度下降的套路,每轮喂几个样本,收集反馈,更新 prompt。这是 TextGrad 和 DSPy、MIPROv2 这类传统 prompt 优化器正面竞争的领域。
第三类是测试时优化(test-time optimization):对单个问题,在推理阶段反复改进答案。不碰模型权重,也不优化可复用的 prompt,只针对眼前这个实例做迭代。本质上是 self-refine 的一种系统化做法。
这三类优化的区别只在于变量的角色。
实例优化里,变量是问题本身的解;prompt 优化里,变量是要复用到所有 query 的指令;测试时优化里,变量是当前这一次推理的中间结果。梯度计算、反向传播、优化器更新——这三层的机制完全相同。
也正因为它把这三类问题统一在同一个框架下,TextGrad 才能从一个任务切换到另一个任务时,几乎不改代码。这种通用性是它最大的卖点。
从 LeetCode 到抗癌药:五个实验,同一个框架
论文用五个领域验证通用性。数据嵌在叙事里看更清楚。
代码优化。在 LeetCode Hard 数据集上,gpt-4o 零样本完成率是 23%。加上 Reflexion(带一个 in-context 示例的反思机制)到 31%。TextGrad 在零样本设置下达到 36%——没借任何示例,纯粹靠反向传播改代码。换算下来,比 Reflexion 高出 5 个百分点。
科学问答。GPQA 是 PhD 级别的物理、生物、化学多选题,专家准确率 81%,gpt-4o 当时公开最好成绩 53.6%。TextGrad 在测试时对答案做三轮自我审视加多数投票,推到 55%——当时是 GPQA 上的已知最好结果。
换句话说,在测试阶段多花几轮计算让模型自我审视,连最强的模型都还能再榨出几个百分点。
推理 prompt 优化。这一组实验最能体现”弱模型 + 强梯度引擎”的组合价值。TextGrad 用 gpt-4o 当梯度引擎,去优化 gpt-3.5 的系统 prompt。Object Counting 任务上,gpt-3.5 的零样本准确率从 77.8% 被推到 91.9%——纯指令优化,没加任何 few-shot 示例。在 GSM8k 上,同一个流程把 gpt-3.5 从 72.9% 推到 81.1%,追平了带 8 个示例的 DSPy。
优化后的 prompt 变得很具体。原本的”Think step by step”,被改成了”先把问题复述一遍,分小步计算,每步核对,用标准数学符号”这种细颗粒度的操作指令。
分子设计。这一节最能体现 instance optimization 的威力。研究者把分子编码成 SMILES 字符串——一种用文本表示分子结构的格式——然后把 SMILES 当变量,同时优化两个目标:结合亲和力(Vina score,越低越好)和类药性(QED,越高越好)。这两个目标天然冲突,亲和力倾向于更大的分子,类药性倾向于更小的分子。

TextGrad 对每个蛋白质靶点优化 10 轮。生成的分子在和已批准临床药物的比较中,结合亲和力相当,类药性更高,结构却完全不同。图源:论文 Figure 2。
58 个蛋白质靶点上的结果是:TextGrad 生成的分子,在和已批准临床药物用同一个损失函数评估时,Vina score 相当,QED 更高,而且结构相似度很低——它找到了和现有药物不同的分子骨架。论文特别指出,TextGrad 不需要训练集,靠的是传统化学信息学工具加 LLM 的通用推理能力。
放疗方案。前列腺癌的放疗计划本质是一个权重调优问题:给靶区(肿瘤)、膀胱、直肠、股骨头分别分配权重,数值优化器再根据权重算出照射方案。过去靠医生和物理师手工试错。TextGrad 把这组权重当成一个文本变量,用 gpt-4o 做梯度下降。

TextGrad 优化放疗方案的权重参数。5 轮迭代后,靶区剂量更精准、剂量分布更均匀,膀胱和直肠的受量都低于临床手工方案。图源:论文 Figure 3。
五个真实患者案例上,TextGrad 优化的方案在靶区平均剂量、D95(95% 体积接受的最小剂量)上超过了临床手工方案,同时膀胱和直肠的受量更低。论文承认这只是 in silico 验证,真正的临床落地还需要实验和临床试验,但方向已经清晰。
五个领域,一个框架,同一套梯度算子。
文本梯度的边界:它还没解决什么
TextGrad 不是没有弱点。论文自己在 Discussion 里也点出了几个。
最明显的局限是搜索策略。TextGrad 的优化循环是贪心的——每轮从当前最好的候选迭代,拿到反馈就更新,不留多份备选。这和标准梯度下降的行为一致,但在 prompt 优化这类高度非凸的问题上,贪心容易卡在局部最优。后来的 GEPA 论文正是从这一点切入:它维护一个 Pareto 前沿,从多个”在不同样本上领先”的候选里采样,避免单点迭代困死在一个方向(详见 GEPA 论文解读)。在 GPT-4.1 Mini 上的对比,GEPA 的 aggregate 提升 +12.19%,TextGrad 是 +6.11%——差距主要来自搜索策略。
换句话说,TextGrad 证明了”文本梯度”这个方向可行,但没穷尽搜索策略上的设计空间。
第二个局限是稳定性。自然语言梯度天然有噪声——同一个变量,同一条反馈,LLM 两次给的建议可能不完全一样。论文提到未来可以借鉴数值优化里的方差缩减、自适应梯度(Adam 之类的思路)来改善收敛。这些在数值优化里成熟,搬到文本空间还需要重新设计。
第三个局限是应用范围。框架目前主要面向离线优化——先优化好 prompt 或方案,再部署。和工具调用、检索增强这类运行时组件的深度整合还没做。论文把这件事列为未来工作。
分子和放疗的结果也需要打一个折扣。in silico 的分子优化和真实合成、生物活性测试之间还有距离;放疗方案目前只验证了五个病例,临床落地需要更大规模的对照试验。论文在这一节的态度是克制的:展示了方向,不夸大成果。
这更像是一个起点。
当梯度变成一句话
深度学习的上一波革命,靠的是把”求导”这件事自动化。你不用手算梯度,框架替你算,于是复杂网络才能训练起来。
TextGrad 想做的事类似——把”给反馈”这件事自动化。只不过这一次,梯度不是一串数字,而是一句话。
当 AI 系统从单个模型变成一串组件的组合,从一次前向传播变成多次调用加工具协作,优化的对象也变了。我们要优化的不再只是权重,还有指令、代码、方案、结构——任何能写成文本的东西。TextGrad 提供了一种统一的视角:把它们都当成计算图里的变量,用 LLM 当梯度引擎,用自然语言当反向传播的载体。
框架本身还很粗糙,搜索策略、稳定性、运行时整合都有改进空间。但它指出的方向值得认真对待。
也许下一代 AI 系统的优化工具,长得不会像 PyTorch,而更像一个会写代码、会做化学、会读病历的反向传播引擎。