图解DSPy:Prompt的时代终结者?!

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调重新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模型领域最新技术跟踪。若对于如果构建生成级别的AI架构则可以关注AI架构设计专栏。技术宅麻烦死磕LLM背后的基础模型。

DSPy是一种编程模型,旨在改进语言模型 (LM)在复杂任务中的使用方式。传统上,LM使用特定的提示模板(Prompt)进行控制,这些模板是基本前期大量的尝试而找到的预设指令。DSPy通过将LM流水线抽象为文本转化图谱,例如被其他申明模块触发的LM的命令计算图谱。

Prompt Engineering

要理解DSPy,需要先理解提示词工程Prompt Engineering。提示词工程也称之为上下文提示词或者上下文学习。它指的是在不更新模型权重的情况下引导LLM的行为以获得预期结果的方法,它属于非参数的模型微调。

20%的EMNLP'23的出版物都是关于提示词工程,其中最受欢迎的字符串模板库有LangChain和LlamaIndex。

提示词工程很好用,简单,高效而且低开销。它在不占用GPU,5分钟之内可以通过调用API快速的试错,而且大部分的提示词可以用一到两句话来解释。

上图为提示词工程的示例,加上一句话“按照artstation的风格来”,结果大不一样。

但是提示词工程最大的问题是它很脆弱,而且缺乏系统性的方法来提升。很多的技巧需要大量的实验和启发式方法,结果不能普遍应用于所有 LLMs/VLM,甚至不能应用于同一LLM家族的不同版本,例如gpt 3->3.5->4。

在继续往下之前,先来复习下传统的Prompt Engineering有哪些?

Zero-Shot,直接提问将数据直接塞给LLM

Few-Shot,在提问的时候,列出一些例子然后和问题一起送给LLM回答。上面要引导大模型进行情感分析,然后列举了一些例子。这里好比你学了很多知识,但是考试的时候,总需要有人告诉你答题的规则。

Instruction-Prompt,在提问的时候,针对回答给出明确的指令。

Chain-OF-thought,在提问的时候,帮助大模型整理思维链,以便于大模型能够按照思维链进行回答。

Chain-OF-thought,可以配合zero-shot或者Few-shot进行提问,靠人工或者自动化生成的推导思维链作为上下文。

Program-OF-thought,在提问的时候,让大模型给出可以运行的代码,然后运行可以得到更加正确的答案。

当然基于PROMPT的原理,还可以外挂知识库,比如目前比较流行的RAG

以上为传统提示词工程的概览图

DSPy

对照传统的Prompt Engineering,DSPy其实覆盖了灰色部分:

那么什么是DSPy?

DSPy 是一个用于算法优化提示和 LM 权重的框架。然而,它的学习曲线是陡峭的,“是的,伙计,我到处都能看到DSPy,但还没有时间看。”——小编笑了~

DSPy有三个抽象,各位读者先记一下。分别为signatures(签名,这个取名不大贴切), modules(模块或者组件), 和teleprompters(提示器或者优化器)。

DSPy有两个特点,其一,它闭环了提示词工程。它将提示词工程从通常的手动和人工的过程转变为结构化、定义明确的机器学习工作流程(这个流程包括准备数据集、定义模型、训练、评估和测试)。这应该是最具革命性的方面。下图应该很形象地将这段文字表达了出来。

其二,它将逻辑和文本表达分离。说白了就是将传统的提示词工程通过一些语法糖,比较优雅的进行封装。

下面来一段让读者们感受下便捷性,首先要先预设下大模型

import dspy#设置大语言模型turbo = dspy.OpenAI(model='gpt-3.5-turbo-0125', api_key='KEYS', model_type='text')dspy.settings.configure(lm=turbo)

第二步定义一个类,看起来和PyTorch定义模型一个调调,只不过父类变成了dspy.Module。

class HelloQA(dspy.Module):    def __init__(self):        super().__init__()        self.prog = dspy.Predict("question -> answer")    #在这里定义基本的逻辑    def forward(self, question):        return self.prog(question=question)

这个时候不用写提示词工程了,直接:

QA = HelloQA()response = QA.forward("How many legs does elephant has?")print(response.answer)

结果显示为“Elephant has four legs.”,就是这么干净漂亮!

Elephant has four legs.

小结

至此已经完成了DSPy的初步入门,上面的铺垫之后回头再看看DSPy的三大组件。

Signatures是声明性规范,它抽象出DSPy编程模型中模块的输入/输出行为。这些签名用于指定任务需要执行的操作,而不是如何提示语言模型执行任务。这种方法抽象了提示和微调过程,使其更加模块化。

Modules取代了现有的手动提示词技术,并且可以在管道中随意集成。它利用LM执行各种任务的程序块。DSPy中的每个模块都是参数化的,这意味着它具有可学习的参数,包括提示的细节、要使用的语言模型以及提示。它根据定义的Signatures处理输入,并根据该处理返回输出。

DSPy内置了如下几个模块:

dspy.Predict :基本预测变量

dspy.ChainOfThought:教LM在对Signatures响应之前逐步思考

dspy.ProgramOfThought:教LM 输出代码

dspy.ReAct:能够实现某个Signatures功能的代理(利用工具)

dspy.MultiChainComparison:可以比较多个 ChainOfThought 输出以产生最终预测

例如要实现RAG,分分钟的事情:

import dspyclass RAG(dspy.Module):    def __init__(self, num_passages=3):        self.retrieve = dspy.Retrieve(k=num_passages)        self.generate_answer = dspy.ChainOfThought("context, question -> answer")
    def forward(self, question):        context = self.retrieve(question).passages        return self.generate_answer(context=context, question=question)

Teleprompters优化管道中的所有模块,以便于获取最优的评估指标。DSPy 优化器,以前称为提词器,是一种算法,可以调整 DSPy 程序的参数(即提示和/或 LM 权重),以最大限度地提高指定指标,例如准确性。

借助DSPy可以用简洁明了的用Modules替换手工制作的提示词工程,而不会降低质量或表达能力。对Modules进行参数化并将提示视为优化问题,使DSPy能够更好地适应不同的LM。它的模块化能够构建更加具有实用性的应用以及更佳细腻的效果评估标准。

编译正确的Modules可将不同的 LM 的准确率从 4-20% 提高到 49-88%。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCASCADE开发指南<十四>:OCCT建模类之BRepPrimAPI_MakePipe创建管道

1、OpenCasCade拓扑几何 在Open CASCADE Technology (OCCT) 中,除了基本三维几何体建模类BRepBuilderAPI外,还提供了复杂模型的建模类,常用的有如下几种,他们可以单独使用或相互组合,通过OCCT提供的融合函数进行组装。例如:BRepOffsetAPI_ThruSections、BRepOffsetAPI_Ma…

Quick BI中lod_fixed函数数据计算过程解析

一、lod_fixed函数简介 lod_fixed{[声明维度1][,声明维度2]…:聚合表达式[:过滤条件]} [维度1][,维度2]...:声明维度,一方面如果外部筛选字段若不属于这里的声明维度则无效,另一方面这里声明的维度也内部聚合运算时的分组依据。使…

明日周刊-第12期

以前小时候最期待六一儿童节了,父母总会给你满足一个愿望,也许是一件礼物也许是一次陪伴。然而这个世界上其实还有很多儿童过不上儿童节,比如某些地区的小孩子,他们更担心的是能不能见到明天的太阳。 文章目录 一周热点航天探索火…

像艺术家一样工作:前言

名人名言 “艺术是盗窃” —— 巴勃罗毕加索 “不成熟的诗人模仿,成熟的诗人偷窃;对于偷窃得到的艺术,坏的诗人丑化它,好的诗人加入自己的理解,使它变得更好,至少会让它有点不同。最优秀的诗人&#xff0…

chat2-Client发送数据给Server

本文档描述了Client发送消息给Server, Server端打印接收的消息 一、Client 1.1.客户端的类Client.java中添加如下的start()方法 (表示启动客户端功能的方法),并调用 /**start方法,作为客户端开始工作的方法*/ public void start(){ …

【SpringMVC】_SpringMVC实现用户登录

目录 1、需求分析 2、接口定义 2.1 校验接口 请求参数 响应数据 2.2 查询登录用户接口 请求参数 响应数据 4、服务器代码 5、前端代码 5.1 登录页面login.html 5.2 首页页面index.html 6、运行测试 1、需求分析 用户输入账号与密码,后端校验密码是否正确&a…

Python-3.12.0文档解读-内置函数sum()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 sum(iterable, /, start0) 参数: 返回值: 注意事…

【风力发电】山顶的白色“大风车”你了解吗?

文章目录 术语定义 基本要求 外部条件 电气系统 控制系统 参考资料 术语定义 风力发电机组wind turbine generator system;WTGS,将风的动能转换为电能的系统。示例如下: 支撑结构support structure,风力发电机组的塔架和基础部分。 机舱…

NVIDIA NeMo - 训练本地化多语种 LLM

本文转载自:使用 NVIDIA NeMo 训练本地化多语种 LLM (2024年 5月 17日 By Nicole Luo and Amit Bleiweiss 第 1 部分 https://developer.nvidia.com/zh-cn/blog/training-localized-multilingual-llms-with-nvidia-nemo-part-1/ 第 2 部分 https://deve…

优盘打不开的困境与解决之道

在日常的工作和生活中,优盘作为一种便携式存储设备,因其小巧、轻便和容量大等特点而备受青睐。然而,当优盘突然无法打开时,我们往往会陷入一片混乱之中,担心存储在其中的重要数据会因此丢失。本文将详细解析优盘打不开…

服务器进不去conda环境问题

source ~/.bashrc 立即重新加载和应用 .bashrc 配置文件中的设置。当你对 .bashrc 文件进行了修改,比如添加或修改了环境变量、别名(alias)、函数等功能后,通常需要执行这个命令来让这些更改在当前终端会话中生效,而无需关闭并重新打开终端。…

牛客网刷题 | BC111 空心正方形图案

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 KiKi学习了循环&am…

解决mysql5.7版本中,子查询order by后,对子查询进行group by分组获取最新记录无效的问题

目录 场景简介原因示例mysql5.7之前的版本mysql5.7之后的版本解决1、使用having2、使用limit3、使用子查询获取目标数据ID 场景简介 子查询order by后,对子查询进行group by分组获取最新记录失败 应用场景:一对多的关系,通常需要取最新、最…

牛客网刷题 | BC107 箭形图案

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 KiKi学习了循环&am…

IO流(2)

缓冲流 字节缓冲流 利用字节缓冲区拷贝文件,一次读取一个字节: public class test {public static void main(String [] args) throws IOException {//利用字节缓冲区来拷贝文件BufferedInputStream bisnew BufferedInputStream(new FileInputStream(&…

【CTF MISC】XCTF GFSJ0008 low Writeup(LSB隐写+QR Code识别)

low 暂无 解法 用 StegSolve 打开,Green plane 1 中疑似隐藏有二维码。 使用大佬写的代码: from PIL import Imageimg Image.open("./low.bmp") img_tmp img.copy() pix img_tmp.load() width, height img_tmp.size for w in range(wid…

[论文精读]Supervised Community Detection with Line Graph Neural Networks

论文网址:[1705.08415] Supervised Community Detection with Line Graph Neural Networks (arxiv.org) 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 ⭐内涵大量可视…

基于Springboot开发的外卖餐购项目(后台管理+消费者端)

免费获取方式↓↓↓ 项目介绍039: 系统运行 后端登录页: http://localhost:8081/backend/page/login/login.html 消费端请求:消费端主页: http://localhost:8081/front/index.html 管理员账号 admin 123456 消费者不需要登录 采用技术栈 前端:Eleme…

嵌入式期末复习

一、选择题(20) 二、判断题(10) 三、填空题(10) 主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。常用的远程调试技术主要有 插桩/st…