微信扫码
与创始人交个朋友
我要投稿
ChatGPT 4o
Claude3 Opus
Qwen 2.5
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的核心思想
TextGrad的核心思想,是将LLM应用视为一个计算图(Computation Graph),以自然语言为媒介实现不同组件之间的"梯度"传递。如下图所示,TextGrad将每个组件的输入输出都抽象为一个variable,并通过LLM生成的自然语言critique,来指导输入variable的修改方向,最终优化输出variable。这一过程有点类似于PyTorch的反向传播,只不过传播的不再是数值梯度,而是文本形式的反馈。
这种统一的语言交互界面赋予了TextGrad极强的普适性。它可以和任意支持自然语言I/O的LLM模型无缝协作,也不要求计算图中的其他函数可微。这使得它非常适合集成retrieval、tool calling等plug-and-play能力,构建灵活多变的复合AI pipeline。
反向传播:批判即梯度
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)
优化过程:文本驱动的"梯度下降"
有了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自我修正和提升
得益于其语义化的优化接口,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的异同:互补与融合
我们不妨将TextGrad与当下备受瞩目的DSPy范式做一个对比。DSPy把LLM视作一个全微分(Differentiable)的程序,通过引入连续嵌入使其支持梯度传播和端到端学习。DSPy需要开发者显式地设计soft prompt,来控制LLM的行为。
ICLR2024重磅 | DSPy或将手写Prompt推进历史,悄悄学会DSPy,一线技术圈很缺你这类人才
从本质上看,TextGrad的意义远不止于优化pipeline的性能,它向我们展示了一种通过语言实现AI自我认知、自我修正的可能性。这条"Language-Driven Optimization"的道路,或许是目前很多“幻觉问题”的一剂良药。
五种Prompt降低幻觉,其实LLM一直在“讨好奉承”你,而你并不自知却在反“拍马屁”
TextGrad用语言打通了不同认知模块之间的屏障。它让LLM参与到了自己的迭代优化中,通过内省、评判、创造等high-level的认知能力实现持续进化。提升认知是有一些成本的。为了区分一下受众,我设置了一个赞赏群,本文的论文和代码都在这个群里,欢迎你来讨论。群里也为你准备了开群4月11日以来每篇公众号文章后的近八十份资料,包括开群以来本公众号文章的Prompt模板、模块和一些DSPy的代码文件、论文和完整示例,还有部署一些应用的Dockerfile,等你来一起讨论。仅赞赏一篇文章200元入群的机会只剩下不到十个,需要的话请抓紧机会。另外,如果你有更多关于论文里Prompt的问题也可以到群里来,我会耐心解答你的问题。
<本文完结>
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-21
2024-04-11
2024-07-09
2024-08-13
2024-07-18
2024-10-25
2024-07-01
2024-06-17