Created
Aug 14, 2024 01:47 PM
Favorite
Favorite
Priority
备注
推荐
🌟🌟🌟🌟🌟
类型
DSPy
随着LLM的兴起,另一个概念也开始被大家所了解,软件2.0。这是一种新兴的软件开发范式,由前特斯拉和OpenAI的AI专家Andrej Karpathy在2017年提出。它利用机器学习模型,尤其是深度神经网络,来自动化和优化软件的编程过程。与传统的软件开发(软件1.0)相比,软件2.0的核心在于通过学习大量数据集和优化算法,能够自动生成和改进代码,而不再依赖于人类程序员手动编写的详细指令。在软件2.0中,源代码通常由两部分组成:1)定义了目标行为的数据集;2)给定代码大致结构,但需要填充细节的神经网络结构。训练神经网络的过程就是将数据集编译成二进制文件的过程,从而得到最终的神经网络。本文我们介绍Github上一个使用软件2.0范式的开源项目DSPy,应该可以激发大家一些有意思的创意。
项目地址 https://github.com/stanfordnlp/dspy
构建LLM复杂系统的挑战考虑一下,如果你想搭建个LLM复杂系统,那么传统的步骤需要:
  1. 将问题分解为多个步骤。
  1. 对每个步骤进行良好的提示,使其单独运行良好。
  1. 调整各个步骤以实现良好协作。
  1. 生成合成示例来微调每个步骤。
  1. 使用这些示例对较小的 LLM 进行微调以降低成本。
  1. 而且每次需要优化流程、LLM或者数据,可能就得重新设置Prompt或微调步骤。
    DSPy是什么DSPy(Declarative Language Model Programming)是一个由斯坦福大学的研究人员开发的开源项目,旨在通过声明式编程来优化大型语言模型(LLM)的应用开发,处于融合大型语言模型 (LLM)和检索模型 (RM)以解决复杂任务的前沿。通过强调以编程为中心的方法超越了传统的Prompt技术,从而将基于 LLM 的流程开发转向更结构化、更高效的编程范式。
    notion image
    DSPy把程序的流程和每个步骤的参数分开处理,这样你就不用每次都从头开始;其次,DSPy引入了一些新的优化器,这些优化器也是基于LLM的,可以根据你想要提升的指标,自动调整LLM的Prompt或权重。
    DSPy的工作流程使用 DSPy 构建基于 LLM 的应用程序的工作流程如下所示。有点像训练神经网络的工作流程:
    1. 收集数据集:组合一系列输入输出示例(例如问答对)以完善您的管道。
    1. 开发 DSPy 程序:使用签名和模块制定程序逻辑,详细说明信息流以解决您的特定任务。
    1. 建立验证逻辑:根据验证指标和优化器(提词器)创建增强程序的标准。
    1. 使用 DSPy 进行编译:利用 DSPy 编译器,结合您的训练数据集、程序、优化器和验证指标来增强您的程序(例如,通过快速优化或微调)。
    1. 不断迭代完善:参与完善数据集、程序或验证逻辑的迭代循环,以达到管道所需的性能水平。
        notion image
    当我们构建神经网络时,我们不会对手动调整的浮点数列表编写手动for 循环。相反,您可以使用PyTorch之类的框架来组合层(例如或),然后使用优化器(例如 SGD 或 Adam)来学习网络的参数。DSPy提供了正确的通用模块(例如ChainOfThought、ReAct),它们取代了基于字符串的提示技巧。为了取代Prompt技巧和一次性合成数据生成器,提供了通用优化器(BootstrapFewShotWithRandomSearch、MIPRO),它们是更新程序中参数的算法。每当您修改代码、数据、断言或指标时,您都可以再次编译程序,DSPy将创建更改后适合的新Prompt。
    DSPy 编程模型DSPy 的核心是引入一种结构化的、以编程为中心的方法,旨在提高语言模型应用程序的效率和有效性。下面详细介绍 DSPy 编程模型的三个基本组件以及它们如何彻底改变开发过程:
    • Signatures(签名):概述预期的行为,告诉LLM输入和输出是什么。
    • Modules(模块):构建利用大型语言模型 (LLM) 的程序的基础组件。
    • Optimizer(优化器):旨在调整 DSPy 程序的设置,包括Prompt和语言模型 (LM) 权重
    Signatures(签名)DSPy 中将任务分配给 LLM 时,将所需的行为指定为签名,是 DSPy 模块输入/输出行为的声明性规范。签名允许您告诉 LLM它需要做什么,而不是指定应该如何要求 LLM 执行此操作。与函数签名的工作方式类似,DSPy 签名通过详细描述输入和输出参数及其类型来工作,它采用并行概念进行操作,但有几个显著的区别:
    • 与主要描述参数的传统函数签名不同,DSPy 签名可以主动塑造和控制模块的行为。
    • DSPy Signatures 中使用的术语至关重要;它清楚地传达了语义角色,区分了“question”和“answer”或“sql_query”和“python_code”等元素。
    为什么使用签名?DSPy 编写签名的方法提供了一种更结构化、更灵活、更可重复的方法。DSPy 编译器的任务是根据手头的数据和设定的管道,专门为概述的签名制作优化的Prompt或微调 LLM。这个过程通常不是通过创造力,而是通过广泛的实验和直接的度量优化,来超越人类在Prompt创建方面的能力。签名可以定义为一个短字符串,其中的参数名称定义输入/输出的语义角色。
    1. 问答:"question -> answer"
    1. 情绪分类:"sentence -> sentiment"
    1. 摘要:"document -> summary"
    签名还可以有多个输入/输出字段。
    1. 检索增强问答:"context, question -> answer"
        notion image
    1. 带推理的多项选择题回答:"question, choices -> reasoning, selection"对于字段,任何有效的变量名都可以!字段名应该具有语义意义,但要从简单开始,不要过早优化关键字!将这种黑客行为留给 DSPy 编译器。例如,"document -> summary"、"text -> gist"、"long_context -> tldr"。
    notion image
    Modules(模块)DSPy 模块是构建利用大型语言模型 (LLM) 的程序的基础组件。
    • 每个内置模块都抽象出一种提示技术(如思路链或 ReAct)。至关重要的是,它们被泛化以处理任何DSPy 签名。
    • DSPy 模块具有可学习的参数(即,组成提示和 LM 权重的小片段),可以被调用(调用)来处理输入和返回输出。
    • 多个模块可以组合成更大的模块(程序)。DSPy 模块直接受到 PyTorch 中的 NN 模块的启发,但应用于 LLM 程序。
    你可能已经知道各种提示模型的技术,包括以“你的任务是...... ”或“你是...... ”等短语作为提示,采用思路链式方法,提示“让我们一步一步思考不要编造任何东西”或“仅使用提供的上下文。“,或者用诸如“不要编造任何东西”或“仅使用提供的上下文”之类的指令来结束提示。DSPy 模块设计有模板和参数来封装这些提示策略。本质上,它们通过应用提示、微调、增强和推理方法来为特定任务定制 DSPy 签名。使用 ChainOfThought 模块初步实现“context, question -> answer” 的签名
    notion image
    DSPy有很一些内置的模块可以使用,详细教程可以参考官网
    • dspy.Predict:基本预测器。不修改签名。处理学习的关键形式(即存储指令和演示并更新到 LM)。
    • dspy.ChainOfThought:教导 LLM 在做出签名回应之前逐步思考。
    • dspy.ProgramOfThought:教导 LLM 输出代码,其执行结果将决定响应。
    • dspy.ReAct:可以使用工具来实现给定签名的代理。
    • dspy.MultiChainComparison:可以比较多个输出以ChainOfThought产生最终预测。我们还有一些函数式模块:
    • dspy.majority:可以进行基本投票,从一组预测中返回最受欢迎的回应。
    DSPy 只是 Python 代码,它使用您喜欢的任何控制流中的模块。有时内部会有一些魔法compile来跟踪您的 LLM 调用。这意味着,你可以自由调用模块,无需为链式调用做任何奇怪的抽象。这基本上是 PyTorch 针对运行定义/动态计算图的设计方法。
    Optimizer(优化器)DSPy 优化器旨在调整 DSPy 程序的设置,包括提示和语言模型 (LM) 权重,旨在增强特定指标,例如准确性。DSPy 具有多种内置优化器,每种优化器都采用不同的方法。本质上,DSPy 优化器需要三个关键组件:
    1. DSPy 程序:这可以是简单的单一模块(如dspy.Predict ),也可以是涉及多个模块协同工作的更复杂的设置。
    1. 指标:通过分配分数来评估程序输出的函数,分数越高表示性能越好。
    1. 一组训练输入:即使数量不多(约 5 到 10 个示例),可能不完整(仅包含程序的输入而没有相应的输出),也可能足够了。
    DSPy 能够处理有限的数据,这意味着您可以从一个小数据集开始,并仍然取得令人印象深刻的成果。但是,如果您可以访问更大的数据集,DSPy 能够利用它来产生更好的结果。给定损失函数和一些训练数据,传统的深度神经网络(DNN)可以通过梯度下降进行优化。DSPy 程序由多个 LLM 调用组成,这些调用堆叠在一起作为 DSPy 模块。每个 DSPy 模块都有三类内部参数:(1) LLM 权重、(2) 指令和 (3) 输入/输出行为的样本。给定一个指标,DSPy 可以使用多阶段优化算法优化这三个指标。这些算法可以结合梯度下降(用于 LLM 权重)和离散 LLM 驱动的优化,即用于制作/更新指令和创建/验证演示。DSPy 演示就像少数样本示例,但功能强大得多。它们可以根据您的程序从头开始创建,并且可以通过多种有效方式优化它们的创建和选择。在许多情况下,我们发现编译产生的提示比人工编写的提示更好。这并不是因为 DSPy 优化器比人类更有创造力,而只是因为他们可以更系统地尝试更多的东西,并直接调整指标。
    DSPy 与 LangChain、LlamaIndex等框架LangChain和LlamaIndex等创新等创新技术在许多使用大型语言模型 (LLM) 的人员的工具包中,它们找到了自己的位置,解决了独特的挑战并增强了模型功能。然而,处理涉及复杂逻辑的任务或根据特定需求定制模型仍然会带来挑战。DSPy 的出现,旨在简化我们与 LLM 的互动方式。DSPy 秉承编程至上的理念,力求简化传统上需要复杂快速制作或密集模型调整的任务。DSPy 和 LangChain 可视为制作由语言模型驱动的应用程序的得力助手。LangChain 擅长将复杂问题分解为易于管理的部分,生成结构化的输出以改进 DSPy 的功能——想象一下将注意力集中在诸如更精确地发现谎言之类的棘手任务上。LlamaIndex 通过增强从海量数据集中筛选和检索精确信息的能力而成为人们关注的焦点,使其成为那些希望充分利用语言模型进行详细和准确数据探索的人不可或缺的盟友。另一方面,DSPy 的优势在于减少了手动提示制作的需求。它的工具包允许对任何语言模型进行微调以追求特定目标,从而使模型更加通用并能适应新的挑战或数据集。DSPy适用于需要轻量级但自动优化的编程模型的情况,而不是预定义提示和集成的库。如果您熟悉神经网络:这就像 PyTorch(即代表DSPy)和 HuggingFace Transformers(即代表更高级的库)之间的区别。
    DSPy编译可能昂贵且慢为了反映编译指标,官方介绍了一个实验以供参考,该实验SimplifiedBaleen使用dspy.BootstrapFewShotWithRandomSearch优化器对gpt-3.5-turbo-11067 个候选程序和 10 个线程的模型进行编译。报告称,编译此程序大约需要 6 分钟,需要 3200 次 API 调用、270 万个输入令牌和 156,000 个输出令牌,总成本为 3 美元(按 OpenAI 模型的当前定价)。编译 DSPy optimizers会产生额外的 LLM 调用,但通过最小化执行来弥补这一开销,以最大限度地提高性能。这为提高较小模型的性能提供了途径,方法是使用较大的模型编译 DSPy 程序,以在编译时学习增强的行为,并在推理时将此类行为传播到经过测试的较小模型。
    Loading...