图解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,一经查实,立即删除!

相关文章

时序动作定位 | PivoTAL:弱监督时间动作定位的先验驱动监督(CVPR 2023)

<PivoTAL: Prior-Driven Supervision for Weakly-Supervised Temporal Action Localization> 论文:PivoTAL: Prior-Driven Supervision for Weakly-Supervised Temporal Action Localization (thecvf.com) 创新点: 定位驱动的监督框架:定位视角:文章提出的PivoTAL方法…

chap6 RNN

循环神经网络&#xff08;RNN&#xff09; 问题描述&#xff1a; 利用循环神经网络&#xff0c;实现唐诗生成任务 数据集&#xff1a; 唐诗 题目要求&#xff1a; 补全程序&#xff0c;主要是前面的3个空和生成诗歌的一段代码&#xff0c;pytorch需要补全对应的rnn.py文件…

多元联合分布建模 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)

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

HTTPS加密

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

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

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

力扣20 有效的括号

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

8月编程语言排行榜:揭秘热门语言背后的力量与魅力

8月编程语言排行榜&#xff1a;揭秘热门语言背后的力量与魅力 随着技术的不断进步和创新&#xff0c;编程语言的世界也在不断变化和演进。每年的8月&#xff0c;全球知名编程社区TIOBE都会公布最新的编程语言排行榜&#xff0c;为我们揭示了哪些语言正在引领着技术的潮流。在这…

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

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

MicroBlaze 处理器参考指南

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

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

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

PCL 指数函数回归(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 指数回归与之前所提到的线性回归类似,我们只需要变换一下指数的形式,如下所示: y = a ∗ e b x y = a * e^{bx}

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

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

牛客网刷题 | BC107 箭形图案

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

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

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

Qt | QFile 类(文件)

01、QFile简介 一、QFile 基本原理 1、QFile 基础 ①、QFile 类继承自 QFileDevice 类,QFileDevice 又继承自 QIODevice类。 ②、QFile 类提供了一个用于读取/写入文件的接口,是一种读写二进制文件、文本、资源的 I/O 设备。 ③、默认情况下 QFile 假定为二进制,即不对存…

WebClient 快速入门 (使用 WebClient 发起 HTTP 请求)

1.简介 执行异步 HTTP 请求&#xff1a;WebClient 允许你发送 GET、POST、PUT、DELETE 等各种 HTTP 请求&#xff0c;并且这些请求都是异步的&#xff0c;不会阻塞调用线程。 处理响应&#xff1a;你可以使用 WebClient 来处理 HTTP 响应&#xff0c;包括获取响应体、响应头和…

Ubuntu系统中的输入法

在Ubuntu中安装了搜狗拼音输入法后&#xff0c;想要使用它&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 安装Fcitx输入法框架&#xff08;如果尚未安装&#xff09; 打开终端&#xff08;Terminal&#xff09;。执行以下命令以更新软件源&#xff08;确保软件列表是…

Android学习之ION memory manager

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