当前位置: 首页 > news >正文

<论文>(斯坦福)DSPy:将声明式语言模型调用编译为自我优化的pipeline

一、摘要

        本文介绍斯坦福团队发表于2023年10月的论文《DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines》。该论文提出了一个高效简洁的大模型pipeline创建方式,使得我们可以在不需要编写并反复调整prompt的前提下实现大模型的高效调用和自我优化。相应的开源第三方库dspy也可以在github上找到,官方使用文档给出了更多的使用示例。

译文:

        机器学习社区正在迅速探索用于提示语言模型(LMs)的技术,以及将它们堆叠成解决复杂任务的pipeline的技术。不幸的是,现有的语言模型pipeline通常使用硬编码的 “prompt模板” 来实现,即通过反复试验发现的冗长字符串。为了采用更系统的方法来开发和优化语言模型pipeline,我们引入了DSPy,这是一种编程模型,它将语言模型pipeline抽象为文本转换图,即在命令式计算图中,通过声明式模块调用语言模型。DSPy模块是参数化的,这意味着它们可以(通过创建和收集示例)学习如何应用提示、微调、增强和推理技术的组合。我们设计了一个编译器,它将优化任何DSPy pipeline,以最大化给定的指标。我们进行了两个案例研究,表明简洁的DSPy程序可以表达和优化复杂的语言模型pipeline,这些pipeline可以对数学应用题进行推理、处理多跳检索、回答复杂问题以及控制智能体循环。在编译几分钟内,几行DSPy代码就能让GPT - 3.5和llama2 - 13b - chat自引导构建出优于标准少样本提示的pipeline(通常分别超过25%和65%),以及优于使用专家创建示例的pipeline(分别高达5 - 46%和16 - 40%)。除此之外,编译到像参数为7.7亿的T5和llama2 - 13b - chat这样开放且相对较小的语言模型的DSPy程序,与依赖专家编写的提示链用于专有GPT - 3.5的方法相比具有竞争力。

二、DSPy主要架构

        作者指出当前大语言模型领域虽蓬勃发展, prompting技术与多阶段pipeline构建备受关注,但现有的大模型开发框架普遍依赖人工试错得到的硬编码“prompt模板”,也就是要手动反复试验并精心制作一长串的prompt指令和示例,存在脆性且难以跨场景泛化的问题。为此,论文提出DSPy编程模型,将pipeline抽象为文本转换图,通过声明式模块调用LM(意味着构建新的大模型pipeline不再是处理自由格式的文本字符串,二是更接近于模块化编程,由编译器根据程序自动生成优化的大模型调用策略和prompts)。该模型的模块可参数化,能通过创建和收集演示来学习组合提示、微调等技术,且配备编译器以最大化给定指标,从而优化任意DSPy pipeline。

        DSPy为模型的自优化提出了三个核心概念:签名(signatures)、模块(modules)和提词器(teleprompters)。

1、签名

        与自由格式的prompt不同,DSPy程序使用signature签名来向大模型分配任务,这是一种简短的声明式规范,用于告知程序当前任务需要做什么。程序将自动解析给出的签名并将字段名称拓展为可供大模型使用的有意义的指令。如下图示例。

2、参数化和模板化模块

        DSPy签名只是定义了一个接口,并且就预期行为提供类似类型的prompt提示。其后,程序将会把提示技术转化为支持任何签名的模块化函数,例如思维链模块、多链比较模块和ReAct模块等。所有的这些模块都只需要几行代码即可实现调用。例如下图中的内置思维链的简化实现示例。

        甚至还支持调用外部工具,例如下面实现RAG的示例。

3、提词器

        作者构建了一个teleprompter提词器,作为接收程序、训练集和度量指标并返回一个新的优化后的程序的工具。不同的提词器可以采用不同的优化策略。下图中给出了少样本提示的模型优化策略。

 

http://www.lryc.cn/news/597921.html

相关文章:

  • 等保二级、三级配置表(阿里云)
  • RuoYi-Vue 项目 Docker 全流程部署实战教程
  • 【LeetCode数据结构】二叉树的应用(一)——单值二叉树问题、相同的树问题、对称二叉树问题、另一棵树的子树问题详解
  • [数据结构]#6 树
  • JVM Java虚拟机
  • 【Qt开发】信号与槽(一)
  • 机器学习入门指南它来了
  • LeetCodeOJ题:回文链表
  • Java学习----原型模式
  • vant-field 显示radio
  • 【Java】空指针(NullPointerException)异常深度攻坚:从底层原理到架构级防御,老司机的实战经验
  • 高级 JAVA 工程师卷 1
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-20,(知识点:热阻的概念,散热)
  • 专题:2025微短剧行业生态构建与跨界融合研究报告|附100+份报告PDF汇总下载
  • Python 使用环境下编译 FFmpeg 及 PyAV 源码(英特尔篇)
  • 第4章唯一ID生成器——4.1 分布式唯一ID
  • 中小企业安全落地:低成本漏洞管理与攻击防御方案
  • 深度分析Java内存模型
  • 企业级数据分析创新实战:基于表格交互与智能分析的双引擎架构
  • 【REACT18.x】CRA+TS+ANTD5.X实现useImperativeHandle让父组件修改子组件的数据
  • 赋能决策与创新的数据引擎:数据分析平台的价值与未来
  • 增强LLM最后隐藏层的意义与效果
  • 使用 MobaXterm 登录你的阿里云 ECS 实例
  • 常用的Typescript特性
  • python---元组(Tuple)
  • M3066ANL网络变压器,常用于NEC方案机顶盒等网络设备M3066AN实现网络信号的稳定传输与电气隔离保护
  • day 33打卡
  • 傅里叶转换(机器视觉方向)
  • 从 Shell 脚本到 Go 应用:使用 Kiro AI 助手完成 Harpoon 项目重构的完整实践
  • Android NDK与JNI深度解析