浅析优化文本提示技术 —— TextGrad

news2024/11/18 23:26:58

引言

大模型领域,现在除了不断推出各种底层大模型外,还涌现了许多包含复杂组件的复合系统,包括框架、工具等。

TextGrad VS DSPy

先来从大的概念范围看看 TextGrad 与 DSPy 的对比:

  • TextGrad:

(1)将 LLM 文本反馈“反向传播”到各组件中,无需手动调整,实现优化复合系统;

(2)在实际的各种任务中,它具备多功能性,包括:问答场景、分子优化和治疗计划等;

(3)TextGrad 可显著提升性能,例如使用 GPT-4o 在 Google-Proof 问答任务中零样本准确率从51%提高到55%。

(4)TextGrad 通过提供自然语言梯度增强可解释性;

  • DSPy:

(1)引入一种编程模型,用于将语言模型管道抽象为文本转换,同时自动优化这些管道,以最大化实现响应目标。

(2)DSPy 把 LM 调用表示为参数化模块,使用编译器优化这些模块组合,实现LM管道的系统化开发和优化。

(3)DSPy在数学文字题等任务上有超过25%和65%的性能提升。

(4)DSPy 用较小的LM(如T5和Llama2)可实现与专家编写的提示链或专有LM系统相媲美的性能。

核心组件

TextGrad 遵循 PyTorch 语法,好处就是灵活且易于使用。

PyTorch 框架把智能系统视为计算图,其中变量是复杂函数调用的输入和输出。这个框架下,LLM 提供丰富、通用的自然语言提示,优化这些计算图变量,从代码片段到分子结构。TextGrad “反向传播” LLM 提供的文本反馈,从而改进各个组件。

TextGrad 关键组件包括:

  • 变量:计算图节点,包含非结构化数据(如文本)。

  • 函数:变量转换(如LLM调用、模拟器)。

  • 梯度:LLM 自然语言反馈,描述如何修改变量。

  • 文本梯度下降(TGD):一种优化器,基于当前值和文本梯度更新变量。

TextGrad 使用链式法则构建计算图,类似于传统的自动微分算法,用语言模型提供的自然语言反馈代替了数值梯度,这是最核心的贡献。

在“梯度下降”优化过程中,“梯度”生成、“校正量”添加、以及损失函数的计算,都变成了对语言模型的调用。

这种新颖的方法利用语言模型提供表达能力来指导优化过程。

应用示例

TextGrad 在不同的场景应用下都具备通用性,比如:

  1. TextGrad 通过优化代码片段,提高处理难题的能力。
  2. TextGrad 通过优化问题解决方案,提高了LLM解决复杂任务(如科学问题)能力。
  3. TextGrad 通过优化提示,提高大模型推理能力,并能提升性能。
  4. TextGrad 通过优化化学结构设计,体现其在药物研发中潜力。
  5. TextGrad 通过优化治疗计划,改进患者的治疗效果。

TextGrad 关键应用是解决方案优化,目标是改进复杂问题的解决方案,优化过程涉及一个计算图,其中解决方案是要优化的参数,损失函数是通过使用 LLM 评估得到的。

在每次迭代中,LLM 会提示当前问题、当前解决方案和需要评估或调查当前迭代的测试指令,这个过程会在优化过程中逐渐改进解决方案。

举例,以下是使用 TextGrad 进行解决方案优化的示例实现:

!pip install TextGrad # 可能需要在安装TextGrad后重新启动笔记本
import argparse
import concurrent
from dotenv import load_dotenv
from tqdm import tqdm
import TextGrad as tg
from TextGrad.tasks import load_task
import numpy as np
import random
load_dotenv(override=True)

# 如果使用Colab
from google.colab import userdata
OPENAI_API_KEY = userdata.get('OPENAI_API_KEY')
os.environ['OPENAI_API_KEY'] = OPENAI_API_KEY

def set_seed(seed):
    np.random.seed(seed)
    random.seed(seed)

def eval_sample(item, eval_fn, model):
    """
    该函数允许我们评估答案是否是对提示问题的好答案。
    """
    x, y = item
    x = tg.Variable(x, requires_grad=False, role_description="查询语言模型")
    y = tg.Variable(y, requires_grad=False, role_description="查询的正确答案")
    response = model(x)
    try:
        eval_output_variable = eval_fn(inputs=dict(prediction=response, ground_truth_answer=y))
        return int(eval_output_variable.value)
    except:
        eval_output_variable = eval_fn([x, y, response])
        eval_output_parsed = eval_fn.parse_output(eval_output_variable)
        return int(eval_output_parsed)

def eval_dataset(test_set, eval_fn, model, max_samples: int=None):
    if max_samples is None:
        max_samples = len(test_set)
    accuracy_list = []
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
        futures = []
        for _, sample in enumerate(test_set):
            future = executor.submit(eval_sample, sample, eval_fn, model)
            futures.append(future)
            if len(futures) >= max_samples:
                break
        tqdm_loader = tqdm(concurrent.futures.as_completed(futures), total=len(futures), position=0)
        for future in tqdm_loader:
            acc_item = future.result()
            accuracy_list.append(acc_item)
            tqdm_loader.set_description(f"准确率: {np.mean(accuracy_list)}")
    return accuracy_list

def run_validation_revert(system_prompt: tg.Variable, results, model, eval_fn, val_set):
    val_performance = np.mean(eval_dataset(val_set, eval_fn, model))
    previous_performance = np.mean(results["validation_acc"][-1])
    print("验证性能: ", val_performance)
    print("之前的性能: ", previous_performance)
    previous_prompt = results["prompt"][-1]

    if val_performance < previous_performance:
        print(f"拒绝的提示: {system_prompt.value}")
        system_prompt.set_value(previous_prompt)
        val_performance = previous_performance

    results["validation_acc"].append(val_performance)

set_seed(12)
llm_api_eval = tg.get_engine(engine_name="gpt-4o")
llm_api_test = tg.get_engine(engine_name="gpt-3.5-turbo-0125")
tg.set_backward_engine(llm_api_eval, override=True)

# 加载数据和评估函数
train_set, val_set, test_set, eval_fn = load_task("BBH_object_counting", evaluation_api=llm_api_eval)
print("训练/验证/测试集长度: ", len(train_set), len(val_set), len(test_set))
STARTING_SYSTEM_PROMPT = train_set.get_task_description()

train_loader = tg.tasks.DataLoader(train_set, batch_size=3, shuffle=True)

# 测试评估引擎的0样本性能
system_prompt = tg.Variable(STARTING_SYSTEM_PROMPT,
                            requires_grad=True,
                            role_description="系统提示语言模型")
model_evaluation = tg.BlackboxLLM(llm_api_eval, system_prompt)

system_prompt = tg.Variable(STARTING_SYSTEM_PROMPT,
                            requires_grad=True,
                            role_description="结构化系统提示,针对QA任务指定行为和策略的有一定能力的语言模型")
model = tg.BlackboxLLM(llm_api_test, system_prompt)

# 文本梯度下降优化器初始化评估模型的API和要优化的系统提示参数。
optimizer = tg.TextualGradientDescent(engine=llm_api_eval, parameters=[system_prompt])

results = {"test_acc": [], "prompt": [], "validation_acc": []}
results["test_acc"].append(eval_dataset(test_set, eval_fn, model))
results["validation_acc"].append(eval_dataset(val_set, eval_fn, model))
results["prompt"].append(system_prompt.get_value())

for epoch in range(3):
    for steps, (batch_x, batch_y) in enumerate((pbar := tqdm(train_loader, position=0))):
       

 pbar.set_description(f"训练步骤 {steps}. 轮次 {epoch}")
        optimizer.zero_grad()
        losses = []
        for (x, y) in zip(batch_x, batch_y):
            x = tg.Variable(x, requires_grad=False, role_description="查询语言模型")
            y = tg.Variable(y, requires_grad=False, role_description="查询的正确答案")
            response = model(x)
            try:
                eval_output_variable = eval_fn(inputs=dict(prediction=response, ground_truth_answer=y))
            except:
                eval_output_variable = eval_fn([x, y, response])
            losses.append(eval_output_variable)
        total_loss = tg.sum(losses)
        total_loss.backward()
        optimizer.step()

        run_validation_revert(system_prompt, results, model, eval_fn, val_set)

        print("系统提示: ", system_prompt)
        test_acc = eval_dataset(test_set, eval_fn, model)
        results["test_acc"].append(test_acc)
        results["prompt"].append(system_prompt.get_value())
        if steps == 3:
            break

上述代码演示了如何使用 TextGrad 库对语言模型的系统提示进行基于梯度的优化,从而提高在特定问答任务上的性能。

TextGrad 库简化了将梯度应用于提示并评估模型性能的过程。

据研究表明,通过在测试时使用 TextGrad 进行自我优化,可明显提升大模型的问答能力。

小结

TextGrad 是一种通过文本反馈反向传播优化大模型系统的新范式,DSPy 则专注于通过参数化模块和编译器优化实现LM管道的系统化开发和优化。

随着开发人员继续探索 TextGrad 和其他创新框架的能力,我们可以期待在人工智能系统优化方面看到更多突破性的进展~~

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.2.1 什么是Prompt
    • L2.2.2 Prompt框架应用现状
    • L2.2.3 基于GPTAS的Prompt框架
    • L2.2.4 Prompt框架与Thought
    • L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
    • L2.3.1 流水线工程的概念
    • L2.3.2 流水线工程的优点
    • L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
    • L3.1.1 Agent模型框架的设计理念
    • L3.1.2 Agent模型框架的核心组件
    • L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
    • L3.2.1 MetaGPT的基本概念
    • L3.2.2 MetaGPT的工作原理
    • L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
    • L3.3.1 ChatGLM的特点
    • L3.3.2 ChatGLM的开发环境
    • L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
    • L3.4.1 LLAMA的特点
    • L3.4.2 LLAMA的开发环境
    • L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1856864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PL理论深化】(3) 数学归纳法:归纳假设 (IH) | 结构归纳法 | 归纳假设的证明

&#x1f4ac; 写在前面&#xff1a;所有编程语言都是通过归纳法定义的。因此&#xff0c;虽然编程语言本身是有限的&#xff0c;但用该语言编写的程序数量是没有限制的&#xff0c;本章将学习编程语言研究中最基本的归纳法。本章我们继续讲解归纳法&#xff0c;介绍归纳假设和…

Jitter Injection详解

一、定义与作用 Jitter Injection&#xff0c;即抖动注入&#xff0c;是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整&#xff0c;以实现对整个通信系统的时延和抖动的控制。其主要作用包括&#xff1a; 改善传输质量&#xff1a;通…

振弦采集仪在地铁隧道工程安全监测中的应用实践

振弦采集仪在地铁隧道工程安全监测中的应用实践 河北稳控科技振弦采集仪是一种常用于结构监测领域的仪器&#xff0c;主要用于测量结构物振动的频率、幅值、相位以及动力特性等参数。在地铁隧道工程的安全监测中&#xff0c;振弦采集仪起着关键的作用。 随着城市的不断发展&am…

同城跑腿APP开发,随叫随到超方便!

随着移动互联网的发展和人们生活节奏的加快&#xff0c;越来越多的人们没有闲暇的时间来做一些繁琐的事情&#xff0c;比如说买药、挂号、排队、送花、取文件等等。如果没有时间去处理这些事情怎么办&#xff1f;开发同城跑腿APP&#xff0c;提供跑腿服务&#xff0c;随时办事随…

Vue核心指令解析:探索MVVM与数据操作之美

文章目录 前言一、Vue.js1. MVVM模式介绍2. 单页面组件介绍及案例讲解3. 插值表达式介绍及案例讲解 二、Vue常用指令详解1. 数据绑定指令v-textv-html 2. 条件渲染指令v-ifv-show 3. 列表渲染指令v-for循环数组介绍及案例讲解循环对象介绍及案例讲解 4. 事件监听指令v-on事件修…

【TB作品】MSP430G2553单片机,红外双机通信,红外通信程序

文章目录 NEC 红外通信协议实验步骤1. 硬件连接2. 程序说明红外发射部分红外接收部分 说明帮助 NEC 红外通信协议 NEC 红外通信协议是一种广泛应用于遥控器设备的红外通信协议。它采用脉冲宽度调制(PWM)来编码数据&#xff0c;并使用38kHz的载波频率进行传输。协议的特点如下&…

Java医院绩效考核系统源码:关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统

Java医院绩效考核系统源码&#xff1a;关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统 随着医疗技术的不断发展&#xff0c;医院绩效管理系统已经成为提升医疗服务质量和效率的关键技术之一。本文将介绍医院绩效管理系统的概念、开发环境、功能应用…

磁芯电感 晶谷电容可镀银浆用玻璃 晶谷电阻银浆料低温玻璃粉(耐强酸)

晶谷电阻银浆料低温玻璃粉&#xff08;耐强酸&#xff09;软化点在490至580度之间&#xff0c;线膨胀系数为&#xff08;75至95&#xff09;10-7&#xff0c;粒径为1.5至3微米&#xff08;可按要求订做&#xff09;&#xff0c;外观颜色为白色超细粉末&#xff0c;烧后颜色无色…

Python 的垃圾回收机制使用详解

概要 在Python编程中,内存管理是一个非常重要的方面。为了帮助开发者管理内存,Python引入了垃圾回收(Garbage Collection)机制。本文将详细介绍Python中的垃圾回收,包括其工作原理、垃圾回收算法以及如何在实际项目中使用和优化垃圾回收。 一、垃圾回收的概念 垃圾回收是…

问题-python-爬虫无法爬取外网资源问题(python爬虫)

方法一&#xff1a; 这个报错通过关掉梯子就能解决&#xff0c;目前不清楚具体原理。 后续了解具体原理了&#xff0c;我会在这篇文章上更新具体分析—— 方法二&#xff1a; 也可以把这个东西打开&#xff0c;但是用完建议关掉。

期望30K,我的高并发架构知识体系

我最终还是上岸了&#xff0c;花了3天总结了几千字的高并发知识体系思维导图&#xff0c;分享出来希望能帮助有缘人吧&#xff0c;以下只是部分截图&#xff0c;文中末尾领取&#x1f447;&#x1f3fb;&#xff0c;免费&#xff0c;免费&#xff0c;免费&#xff0c;重要的事情…

移动硬盘盒:便携与交互的完美结合 PD 充电IC

在数字化时代的浪潮中&#xff0c;数据已成为我们生活中不可或缺的一部分。随着数据的不断增长&#xff0c;人们对于数据存储的需求也在不断增加。传统的存储设备如U盘、光盘等&#xff0c;虽然具有一定的便携性&#xff0c;但在容量和稳定性方面往往难以满足现代人的需求。而移…

Python爬虫-贝壳新房

前言 本文是该专栏的第32篇,后面会持续分享python爬虫干货知识,记得关注。 本文以某房网为例,如下图所示,采集对应城市的新房房源数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地…

MyBatis系列之分页插件及问题

概述 无论是C端产品页面&#xff0c;还是后台系统页面&#xff0c;不可能一次性将全部数据加载出来。后台系统一般都是PC端登录&#xff0c;用Table组件&#xff08;如Ant Design Table&#xff09;渲染展示数据&#xff0c;可点击列表的下一页&#xff08;或指定某一页&#…

“移”起AI+丨首创AI值守无人小店!中国移动视觉大模型加速落地

在城市里开设一家24小时便利店有多难&#xff1f;创业者常常面临着熬夜看店、全年无休的困境&#xff0c;而选择增加雇佣员工看店又会面临着成本高昂、利润微薄的问题。 日前在温州&#xff0c;一家AI无人值守便利店引发关注。在这家无人便利小店内&#xff0c;浙江移动试点部…

AI赋能天气:微软研究院发布首个大规模大气基础模型Aurora

编者按&#xff1a;气候变化日益加剧&#xff0c;高温、洪水、干旱&#xff0c;频率和强度不断增加的全球极端天气给整个人类社会都带来了难以估计的影响。这给现有的天气预测模型提出了更高的要求——这些模型要更准确地预测极端天气变化&#xff0c;为政府、企业和公众提供更…

头歌——机器、深度学习——图像生成

第1关&#xff1a;手写数字体生成 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;实现手写数字体的生成。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.生成器&#xff0c;2.判别器&#xff0c;3.GAN网络训练&#xff0c;4.手写数字体生成。 …

Gitee 的公钥删不掉

公钥管理里已经没有公钥了&#xff0c; 仓库里还有&#xff0c;这是怎么回事&#xff1f; 这两个好像又没什么关系。 那为啥要搞两处呢&#xff1f; 个人信息里的公钥一直就没有仓库里使用的公钥&#xff0c; 删掉个人信息里的也没什么影响。 在仓库管理页面导入新公钥提示已…

【论文速读】|利用大语言模型实现现实世界代码的翻译:一项针对翻译到Rust语言的研究

本次分享论文&#xff1a;Towards Translating Real-World Code with LLMs: A Study of Translating to Rust 基本信息 原文作者&#xff1a;Hasan Ferit Eniser, Hanliang Zhang, Cristina David, Meng Wang, Maria Christakis, Brandon Paulsen, Joey Dodds, Daniel Kroeni…

【服务器07】之【GitHub项目管理】及【Unity异步加载场景】

登录GitHub官网 GitHub: Let’s build from here GitHub 注册账号 登录账号 输入一个自定义名字&#xff0c;点击创建存储库就可以了 现在我们下载Fork Fork - a fast and friendly git client for Mac and Windows (git-fork.com) 免费的 下载完成之后点击File下的Clone …