图解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%。

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

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

相关文章

多元联合分布建模 Copula python实例

多元联合分布建模 Copula python实例 目录 库安装 实例可视化代码 库安装 pip install copulas 实例可视化代码 import numpy as np import pandas as pd from copulas.multivariate import GaussianMultivariate# Generate some example data np.random.seed(42) data = …

ChatTTS:开源最强文本转真人语音工具

目录 1.前言 2.详细介绍 2.1 什么是ChatTTS 2.2 项目地址: 2.3 应用特点: 3.如何安装和使用 3.1.谷歌colab 3.1.1.点击链接 3.1.2 进行保存 3.1.3 按照流程依次点击运行 3.1.4 填写自己需要转的文字 3.2 本地运行 3.2.1 下载或克隆项目源码到本地 3.2.2 …

算法每日一题(python,2024.05.31)

题目来源(力扣. - 力扣(LeetCode),简单) 解题思路: 二次遍历,第一次遍历用哈希表记录每个字母的出现次数,出现一次则将它的value值赋为True,将它的下标赋为key值&#x…

HTTPS加密

一.加密是什么 加密就是把明文(要传输的信息)进行一系列的变换,生成密文. 有加密就有解密,解密就是把密文进行一系列的变换,生成明文. 在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥. 加密解密到如今已经发展成了一个独立的学科 : 密…

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

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

力扣20 有效的括号

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

【智能算法】红嘴蓝喜鹊优化算法(RBMO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年,S Fu受到自然界中红嘴蓝喜鹊社会行为启发,提出了红嘴蓝喜鹊优化算法(Red-billed Blue Magpie Optimizer, RBMO)。 2.算法原理 2.1算…

MicroBlaze 处理器参考指南

概述 本章包含MicroBlaze功能的概述和详细信息MicroBlaze架构包括Big-Endian或Little-Endian位反转格式,32位或64位通用寄存器,虚拟内存管理,缓存软件支持,和AXI4-Stream接口 简介 MicroBlaze嵌入式处理器软核是一个精简指令集…

[JS] 前端充分使用console.log()有效输出(2024-6-1)

将变量包装在对象中 不要使用 console.log(url, url2, baz),而是使用 console.log({ url, url2, baz })。 如果你比较这两者,你会发现这有多么有用:拥有 url 和 url2 键可以避免这两个 URL 之间的混淆。 在日志前加上唯一字符串前缀 在应用…

开箱即用的Spring Boot 企业级开发平台【毕设项目推荐】

项目概述 基于 Spring 实现的通用权限管理平台(RBAC模式)。整合最新技术高效快速开发,前后端分离模式,开箱即用。 核心模块包括:用户、角色、职位、组织机构、菜单、字典、日志、多应用管理、文件管理、定时任务等功能…

牛客网刷题 | BC107 箭形图案

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

【计算机毕业设计】359微信小程序校园失物招领系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Android学习之ION memory manager

目录 what is ION? ION原理 ION数据结构 用户空间 API ION API what is ION? ION是Google的内存管理器,用来支持不同的内存分配机制,如CARVOUT(PMEM),物理连续内存(kmalloc), 虚拟地址连续但物理不连续内存(vmalloc), IOM…

智慧校园的应用场景有哪些

在21世纪的教育挑战中,如何利用科技手段优化教育资源分配,提升教学质量?智慧校园给出了答案。基于信息化的教育改革,智慧校园不仅提升了校园管理的效率,更通过一系列智能化应用,重塑了教学、学习和交流的方…

搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

多个短视频剪辑成一个视频:四川京之华锦信息技术公司

多个短视频剪辑成一个视频&#xff1a;创作中的艺术与技术 在数字时代&#xff0c;短视频以其短小精悍、内容丰富的特点&#xff0c;迅速成为社交媒体上的热门内容形式。然而&#xff0c;有时单一的短视频难以完全表达创作者的意图或满足观众的观赏需求。因此&#xff0c;将多…

【Qt秘籍】[007]-LineEdit Pushbutton控件

Qt的中有着各种各样的控件&#xff0c;相较于传统C/C的输出默认只能在控制台实现&#xff0c;Qt中可以有不同的接口实现各种不同的功能&#xff0c;下面我们将实现不同功能的输出 hello world&#xff01; 标签Label 【Qt秘籍】[006]-Label实现Hello World程序-编程第一步-CSD…

C语言王国——内存函数

目录 1 memcpy函数 1.1 函数表达式 1.2 函数模拟 2 memmove函数 2.1 函数的表达式 2.2 函数模拟 3 memset函数 3.1 函数的表达式 3.2 函数的运用 4 memcmp函数 4.1函数的表达式&#xff1a; 4.2 函数的运用 5 结论 接上回我们讲了C语言的字符和字符串函数&#…

MAC帧

基本问题 数据链路层的协议有很多&#xff0c;但是都有三个基本问题&#xff1a;封装成帧&#xff0c;透明传输和差错检测。 封装成帧 封装成帧&#xff08;Framing&#xff09;就是在一段数据的前后分别添加首部和尾部&#xff0c;这样就构成了一个帧。帧是数据链路层的传送…

vue中使用WebSocket心跳机制与Linux中的心跳机制

WebSocket心跳机制 一、WebSocket简介 WebSocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术&#xff0c;属于应用层协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。 二、WebSocket事件与方法 …