AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


晒衣服的数学题放倒一片SOTA模型,和DSPy互补的TextGrad:让Prompt梯度传播自动迭代优化
发布日期:2024-06-20 13:14:14 浏览次数: 2173 来源:AI修猫Prompt



生成式人工智能正处于从单一模型训练向复杂系统优化的范式转变中。如何高效协调大语言模型(LLM)等AI组件,自动优化端到端任务性能,成为当前最紧迫的挑战之一。要说AI界卷不卷,还得看斯坦福大学,这两天,斯坦福大学的研究者提出了TextGrad框架为这一难题提供了一种全新的解决方案,从同是斯坦福发布的DSPy上借鉴了PyTorch的精髓,用梯度反向传播的方式来实现自动优化。本文将深入剖析TextGrad的核心理念和优化机制,剖析其广阔的应用前景,并与当下流行的DSPy等框架进行比较,展望语言驱动优化的未来图景。

图片由小鱼提供
一切要从一道简单的数学常识类问题开始,在阳光下晒干25件衬衫需要1小时,晒30件衣服需要多久?这是一个小朋友都会的问题,却让现在SOTA模型们全部放倒,生成的答案全是1.2小时。正确答案是:The drying time will be 1 hour for 30 shirts, as the drying rate remains constant under the same conditions。30 件衬衫的烘干时间为 1 小时,因为在相同条件下烘干速度保持不变。大家有兴趣可以测试一下。

ChatGPT 4o

Claude3 Opus

Qwen 2.5

Deepseek


TextGrad能不能得到正确答案呢?还是用deepseek来测试:

API响应: {'id': 'e5ce5b14d9b9f1ce7a294a12305632f6', 'choices': [{'index': 0, 'message': {'content': '<IMPROVED_VARIABLE>The drying time will be 1 hour for 30 shirts, as the drying rate remains constant under the same conditions.</IMPROVED_VARIABLE>', 'role': 'assistant'}, 'finish_reason': 'stop', 'logprobs': None}], 'created': 1718261864, 'model': 'deepseek-chat', 'system_fingerprint': 'fp_a49d71b8a1', 'object': 'chat.completion', 'usage': {'prompt_tokens': 384, 'completion_tokens': 38, 'total_tokens': 422}}
3次迭代,优化后答案: The drying time will be 1 hour for 30 shirts, as the drying rate remains constant under the same conditions.
最终优化答案: The drying time will be 1 hour for 30 shirts, as the drying rate remains constant under the same conditions.


TextGrad的核心思想

01

TextGrad的核心思想,是将LLM应用视为一个计算图(Computation Graph),以自然语言为媒介实现不同组件之间的"梯度"传递。如下图所示,TextGrad将每个组件的输入输出都抽象为一个variable,并通过LLM生成的自然语言critique,来指导输入variable的修改方向,最终优化输出variable。这一过程有点类似于PyTorch的反向传播,只不过传播的不再是数值梯度,而是文本形式的反馈。

这种统一的语言交互界面赋予了TextGrad极强的普适性。它可以和任意支持自然语言I/O的LLM模型无缝协作,也不要求计算图中的其他函数可微。这使得它非常适合集成retrieval、tool calling等plug-and-play能力,构建灵活多变的复合AI pipeline。

反向传播:批判即梯度

02

TextGrad通过prompt反复询问LLM,对当前output variable的评价,并就如何改进input variable提供反馈,从而实现端到端的"梯度"传播。以一个简单的2-stage LLM系统为例:

# Stage 1: LM generates prediction from a prompt and the question
Prediction = LLM(Prompt + Question)

# Stage 2: Another LM critiques and scores the prediction
Evaluation = LLM(Critique_Prompt + Prediction)

我们的目标是优化第一个LLM的Prompt,提高整体Evaluation分数。于是TextGrad先用Critique_Prompt询问第二个LLM,对Prediction的评价以及改进建议;再把这个"梯度"反馈给第一个LLM,要求它据此修改Prompt。多轮迭代后,Prompt将收敛到一个最优值。

实践中,开发者需要为每个LLM stage定制Critique_Prompt。这个prompt一般会包含以下内容:

- 任务目标,即优化方向;

- 当前output variable及其role; 

- 上一轮传递来的反馈;

- 历史对话上下文。

LLM需要根据这些信息,发挥自己的推理能力,对前一阶段的输出提出切实可行的修改意见。这对LLM的分析、评判和创造能力提出了很高要求。如何设计prompt以诱导LLM产生高质量的critique,是TextGrad的一大关键。但你也可以用一个LLM去定义:

# 设置反向传播引擎
tg.set_backward_engine("deepseek-chat", override=True)

优化过程:文本驱动的"梯度下降" 

03

有了LLM生成的"梯度"信息,TextGrad还需要一个优化器(Optimizer),负责更新原variable的值。这个过程有点类似于深度学习中的梯度下降,因此TextGrad将其称为Textual Gradient Descent(TGD):

# TGD(文本梯度下降)替代SGD
optimizer = tg.TGD(parameters=[answer]) # 初始化优化器

# TextLoss是一个自然语言指定的损失函数,用于描述如何评估推理
loss_fn = tg.TextLoss(evaluation_instruction) # 初始化损失函数

其中Feedback即上一阶段LLM生成的对Prompt的改进建议。TGD从中提取关键信息,对Prompt做一次更新,得到新的版本Prompt_new。之后重新走一遍Predict - Critique - TGD的循环,直到Evaluation满足目标为止。

与传统优化器一样,TGD也支持minibatch、momentum等技巧。比如下面这段伪代码展示了一个TextGrad版本的minibatch梯度下降:

# 初始化语言模型的系统提示
system_prompt = tg.Variable("You are a helpful language dmodel. Think step by step.",
                             requires_grad=True)

# 构建语言模型
model = tg.BlackboxLLM(system_prompt)

# 定义TGD优化器
optimizer = tg.TGD(parameters=[system_prompt])

for batch_X, batch_y in data_loader:
    optimizer.zero_grad()
    
# 前向传播
    Preds = model(batch_X)
    loss = tg.sum([loss_fn(pred, y) for pred, y in zip(Preds, batch_y)])
# 反向传播以获取梯度
    loss.backward()

# TGD更新参数
    optimizer.step()

这里的关键点是把多个样本的loss求和,一次性做反向传播,与PyTorch的minibatch训练几乎一模一样。

TextGrad还支持面向自然语言约束的优化。比如在生成答案时,我们可以要求TGD严格遵循"The last line of your response should be of the following format: 'Answer: $LETTER' where LETTER is one of ABCD"这样的格式限制。通过在prompt中植入各种soft constraint,可以更精细地控制LLM的行为。

让LLM自我修正和提升

04

得益于其语义化的优化接口,TextGrad在多个领域展现出了广阔的应用前景,为LLM注入了自我修正和持续进化的能力。

在推理型任务中,TextGrad可以通过优化QA prompt,将GPT-3.5等中小模型的zero-shot性能提升30%以上,逼近GPT-4的表现。这意味着我们只需要用高端LLM(如GPT-4)在少量样本上优化一个高质量的prompt,就能复用到更廉价的模型上,用更低的成本获得媲美SOTA的性能。国产模型用这个方法也可取得和GPT 4o相差无几的效果。TextGrad还能针对一个复杂推理任务,优化其中某些关键step的output,最终使整个pipeline产生更可靠的结果。

在代码生成中,TextGrad可以就代码的正确性、效率等维度提供反馈,帮助CodeGen等模型迭代优化其生成结果。实验表明,仅用5步迭代,TextGrad优化的GPT-4就将APPS竞赛的通过率从31%提高到36%,超越人类专家水平。可以想见,通过引入单元测试、时间空间复杂度等更细粒度的反馈,TextGrad有望实现真正意义上的程序合成。

在分子发现等科学任务中,TextGrad能够同时兼顾药效和毒性等多个优化目标。它将分子式(SMILES)表示为variable,每一步都询问对接引擎和QSAR模型对当前分子的评价,并据此"编辑"分子式,最终得到一个在多个指标上都最优的分子结构。这为AI辅助药物设计开辟了一条新的道路。

我们还可以用TextGrad来"编辑"放射治疗计划。它将各器官的照射剂量权重视为variable,每次都让LLM评估当前计划并提出修改意见,最终在肿瘤杀伤和正常组织保护之间找到最佳平衡。实验表明,TextGrad优化的计划显著优于人工设计,极大提高了患者的预后。

与DSPy的异同:互补与融合

05

我们不妨将TextGrad与当下备受瞩目的DSPy范式做一个对比。DSPy把LLM视作一个全微分(Differentiable)的程序,通过引入连续嵌入使其支持梯度传播和端到端学习。DSPy需要开发者显式地设计soft prompt,来控制LLM的行为。

ICLR2024重磅 | DSPy或将手写Prompt推进历史,悄悄学会DSPy,一线技术圈很缺你这类人才

相比之下,TextGrad通过语言接口实现了更高层的抽象。它将prompt、question、output等都视为variable,不要求其可微,因此兼容性更强。TextGrad也不需要手工设计prompt,自动搜索最忧的任务描述直接参与优化。这让开发者从prompt engineering中解放出来,有望自动找到更棒的in-context learning范式。
尽管二者在形式上大相径庭,但TextGrad和DSPy有不少互补之处。一方面,我们可以用DSPy的架构实现可微的LLM module,嵌入到TextGrad的pipeline中以提速收敛。另一方面,我们也可以用TextGrad自动生成DSPy所需的prompt,再用可微引擎执行,实现即插即用的微分编程。
当然,TextGrad的一些缺点也是显而易见的。由于缺乏显式的梯度信息,其收敛速度和稳定性可能比不上DSPy。而且"critiquing"本身也是一项具有挑战性的任务,TextGrad能否始终生成可靠、中肯的反馈还有待验证。和DSPy相比也缺乏社区支持,这需要LLM在优化过程中保持自我认知,避免过于自信或走入死胡同。
未来,TextGrad和DSPy有望实现更紧密的融合。比如用TextGrad发现新的架构,引导DSPy的神经网络搜索;再用DSPy的架构初始化变量,加速TextGrad的收敛。这两大范式的交叉结合,必将成为未来AI优化的重要方向。

从本质上看,TextGrad的意义远不止于优化pipeline的性能,它向我们展示了一种通过语言实现AI自我认知、自我修正的可能性。这条"Language-Driven Optimization"的道路,或许是目前很多“幻觉问题”的一剂良药。

五种Prompt降低幻觉,其实LLM一直在“讨好奉承”你,而你并不自知却在反“拍马屁”

TextGrad用语言打通了不同认知模块之间的屏障。它让LLM参与到了自己的迭代优化中,通过内省、评判、创造等high-level的认知能力实现持续进化。提升认知是有一些成本的。为了区分一下受众,我设置了一个赞赏群,本文的论文和代码都在这个群里,欢迎你来讨论。群里也为你准备了开群4月11日以来每篇公众号文章后的近八十份资料,包括开群以来本公众号文章的Prompt模板、模块和一些DSPy的代码文件、论文和完整示例,还有部署一些应用的Dockerfile,等你来一起讨论。赞赏一篇文章200元入群的机会只剩下不到十个,需要的话请抓紧机会。另外,如果你有更多关于论文里Prompt的问题也可以到群里来,我会耐心解答你的问题。

<本文完结>



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询