LLMs之DSPy:DSPy(可优化RAG系统)的简介、安装和使用方法、案例应用之详细攻略
导读:该论文提出了一种新型的编程模型DSPy,用于设计基于预训练语言模型(PLM)的AI系统管道。
背景痛点:目前PLM系统管道通常需要通过大量的试错来手工设计提问模板,这种方法不可扩展且难以复用。
>> 现有的语言模型(LM)管道通常使用经过手动调整的"提示模板"字符串来实现,这种方法可能存在脆弱性和不可扩展性。缺乏系统的方法来设计和优化LM管道。
解决方案:提出了DSPy编程模型,将LM管道抽象为文本转换图,其中LM通过声明式模块被调用。DSPy将提问技巧抽象为参数化的模块,并将管道建模为计算图。它采用类型签名来定义各模块之间的输入/输出,而不是使用具体的文本提问模板。此外,它可以通过编译器自动优化管道中的各模块,例如通过采样 Demonstrations来自动生成有效的少量实例化提问。
DSPy的主要组成部分包括:
>> 自然语言签名 - 用于抽象提示和微调的类型化声明。
>> 参数化模块 - 将现有的提示技术(如链式思维等)翻译为可组合的模块。
>> 远程提示器 - 一种优化器,可自动生成有效的提示和示例,优化任意管道。
核心思路步骤:
>> 将各种提问技巧(如连锁思考、程序思考等)转化为可以推理任意签名的模块。
>> 参数化模块,使它们能通过迭代收集Demonstrations来学习实现签名所定义的变换行为。
>> 将PLM管道建模为文本转换图,模块之间通过Python控制流连接。
>> 定义编译器优化任意管道,常用策略包括Bootstrap少量示例、模型选择等。
>> 使用自然语言签名声明每个模块的输入/输出行为。
>> 将提示技术翻译为参数化的声明式模块,可被组合形成管道。
>> 编译器使用远程提示器,通过模拟管道并自举示例来优化每个模块。
优势:通过模块化和自动编译,DSPy可以有效减少依赖手工设计提问模板,同时允许利用更小型和更具成本效益的PLM构建高质量系统。
>> 无需手动提示字符串,而是从真正模块化的单元构建系统。
>> 支持对丰富的设计空间进行系统探索,在很高的程序抽象层次上工作。
>> 在几分钟到几十分钟的编译时间内,利用小型LM(如770M参数的T5)就可以实现强大的表现。
>> 简洁的程序就能表达和优化复杂的LM管道,解决数学词问题、多跳问答等任务。
总的来说,DSPy为开发和优化LM管道提供了一种系统的方法,通过声明式抽象和自动化优化来减少手动工作。它展示了使用小型LM构建出色系统的能力。
本文通过两个案例实验证明了这一点,例如仅通过几行DSPy程序且不使用人工提问模板,就可以利用LLAMA查询 answering任务取得46。9%的精确匹配率。
总之,DSPy提供了一个系统和模块化的方法来设计基于PLM的NLP管道,有助于探索这个领域的新可能。
目录
《DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines》翻译与解读
1.1、基于DSPy驱动的 RAG 系统:DSPy 控制器充当系统的大脑,协调不同模块并优化整个管道
(1)、利用GSM8K 数据集和 OpenAI GPT-3.5-turbo 模型来模拟 DSPy 中的提示任务
相关论文
《DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines》翻译与解读
地址 | |
时间 | 2023 年 10 月 5 日 |
作者 | 斯坦福大学、加州大学伯克利分校、卡内基梅隆大学、亚马逊 Alexa AI、Dashworks、印度理工学院孟买分校、微软等 |
摘要 | 机器学习社区正在迅速探索用于引导语言模型(LM)以及将它们组合成解决复杂任务的流水线的技术。不幸的是,现有的LM流水线通常是通过试错发现的冗长的“提示模板”实现的。为了开发和优化LM流水线,我们引入了DSPy,一种编程模型,它将LM流水线抽象为文本转换图(即通过声明性模块调用LM的命令式计算图)。DSPy模块是参数化的,这意味着它们可以通过创建和收集示例来学习如何应用提示、微调、增强和推理技术的组合。我们设计了一个编译器,可以优化任何DSPy流水线以最大化给定的度量标准。我们进行了两个案例研究,表明简洁的DSPy程序可以表达和优化复杂的LM流水线,这些流水线可以对数学问题进行推理,处理多跳检索,回答复杂问题,并控制代理循环。在短短几分钟的编译后,DSPy允许GPT-3.5和llama2-13b-chat自行启动管道,其性能优于标准的少量示例提示(通常分别超过25%和65%),以及专家创建的示例管道(分别最多达到54%和40%)。此外,DSPy编译的程序在与770M参数的T5和llama2-13b-chat等开放且较小的LM上具有竞争力,其性能与依赖专家编写的提示链的专有GPT-3.5方法相当。有关DSPy的更多信息,请访问此URL: |
DSPy的简介
DSPy (Declarative Language Model Programming) 是一个革命性的框架,旨在简化构建复杂语言模型应用程序的过程。它由斯坦福大学的研究人员开发,允许开发人员专注于应用程序的高级逻辑,同时抽象掉许多低级细节。
DSPy 是一个用于算法优化语言模型(LM)提示和权重的框架,特别是在管道中多次使用 LM 时。要在没有 DSPy 的情况下使用 LM 构建复杂系统,通常需要:
>> 将问题分解为多个步骤,
>> 精心设计 LM 提示,直到每个步骤在孤立情况下都能很好地工作,
>> 调整这些步骤以确保它们协同工作良好,
>> 生成合成示例以调整每个步骤,
>> 使用这些示例微调较小的 LM 以降低成本。
目前,这很困难且混乱:每次更改管道、LM 或数据时,所有提示(或微调步骤)可能都需要更改。为了使这一过程更系统化且更强大,DSPy 做了两件事。首先,它将程序的流程(模块)与每个步骤的参数(LM 提示和权重)分开。其次,DSPy 引入了新的优化器,这些是 LM 驱动的算法,可以根据您想要最大化的指标来调整 LM 调用的提示和/或权重。
DSPy 可以常规地教会强大的模型如 GPT-3.5 或 GPT-4 以及本地模型如 T5-base 或 Llama2-13b 在任务上变得更加可靠,即具有更高的质量和/或避免特定的失败模式。DSPy 优化器会将相同的程序“编译”成适用于每个 LM 的不同指令、少样本提示和/或权重更新(微调)。这是一个新范式,其中 LM 及其提示淡化为一个可以从数据中学习的更大系统的可优化部分。简而言之,更少的提示,更高的分数,以及更系统的方法来解决 LM 的难题。
DSPy 是一个强大的框架,它将 AI 系统的构建过程转变为编写代码的过程,并提供了一套完整的工具来优化和评估 AI 系统的性能。其模块化设计、多种优化器以及活跃的社区,使其成为构建和优化语言模型程序的优秀选择。 它不仅简化了开发流程,也为开源 AI 研究提供了新的可能性。DSPy 的生态系统致力于推动开源 AI 研究。它采用模块化范式,方便社区贡献者改进架构、推理策略和优化器。这使得 DSPy 能够持续改进,并为用户提供更多控制力和迭代速度。
文档地址:https://dspy-docs.vercel.app/docs/intro
文章地址:https://medium.com/@asadnhasan/dspy-revolutionizing-retrieval-augmented-generation-004d8c6a6f95
GitHub地址:GitHub - stanfordnlp/dspy: DSPy: The framework for programming—not prompting—language models
1、DSPy优化RAG系统
RAG系统将大型语言模型的功能与外部知识库相结合。该过程通常如下所示:收到查询→从知识库中检索相关信息→将检索到的信息与查询相结合→语言模型根据此组合输入生成响应。
DSPy 引入了构建 RAG 系统的新范式,具有以下几个主要优势:
>> 声明式编程:DSPy 允许开发人员描述他们希望系统做什么,而不是如何做。这种高级方法使设计和修改复杂的 RAG 管道变得更加容易。
>> 模块化架构:使用 DSPy,您可以轻松交换 RAG 系统的不同组件,例如检索器、排序器或语言模型,而无需重写大量代码。
>> 自动优化:DSPy 包含用于自动优化 RAG 管道的工具,减少手动调优的需要并提高整体性能。
>> 无缝集成:DSPy 可与流行的语言模型无缝协作,并且可以轻松集成到现有的 AI 工作流程中。
总的来说,DSPy为RAG系统的开发注入了新的活力,开辟了一种全新的构建和部署方式,值得AI开发者和研究人员探索和实践。
1.1、基于DSPy驱动的 RAG 系统:DSPy 控制器充当系统的大脑,协调不同模块并优化整个管道
1.2、DSPy 对 RAG 系统的好处
>> 提高灵活性:使用 DSPy,您可以轻松尝试不同的检索和排名策略,甚至组合多种策略,而无需重写整个代码库。
>> 增强性能:DSPy 的自动优化功能可以帮助调整您的 RAG 系统以获得更好的性能,通常超越手动调整的系统。
>> 更容易调试和迭代:DSPy 的声明性让您更容易理解 RAG 管道中发生的情况,从而促进更快的调试和迭代。
>> 可扩展性:随着 RAG 系统复杂性的增加,DSPy 的模块化架构允许您更有效地管理这种复杂性。
1.3、RAG 的未来与 DSPy
随着 DSPy 的不断发展,我们可以期待看到更强大和灵活的 RAG 系统。一些潜在的发展包括:
>> 与更多样化的知识来源集成
>> 先进的多模态检索和生成
>> 改善上下文理解和利用
>> 增强的个性化能力
2、类比神经网络
当我们构建神经网络时,我们不会在手动编写的循环中使用经过手动调节的浮点数列表。相反,您可能会使用像 PyTorch 这样的框架来组合层(例如卷积或 Dropout),然后使用优化器(例如 SGD 或 Adam)来学习网络的参数。同样,DSPy 为您提供了合适的通用模块(例如 ChainOfThought、ReAct 等),以替代基于字符串的提示技巧。为了替代提示黑客和一次性合成数据生成器,DSPy 还为您提供了通用优化器(如 BootstrapFewShotWithRandomSearch 或 MIPRO),这些是更新程序中参数的算法。每当您修改代码、数据、断言或指标时,您可以重新编译程序,DSPy 将创建适合更改的新有效提示。
3、核心概念
-
编程而非提示 (Programming, not Prompting): DSPy 的核心优势在于它将构建 AI 系统的过程从繁琐的提示词调整转变为编写结构化、声明式的 Python 代码。这使得迭代速度更快,也更容易维护和扩展。不再依赖于易碎的提示词,而是使用组合式的 Python 代码来指导语言模型 (LM) 生成高质量的输出。
-
模块 (Modules): 模块是 DSPy 的基石。它们允许开发者用代码定义 AI 行为的输入/输出,并选择合适的模块来实现具体的 LM 调用策略。DSPy 会将模块的签名扩展成提示词,并解析类型化的输出,从而构建出更符合人体工程学、可移植且可优化的 AI 系统。 这与传统的提示工程方法形成鲜明对比,后者通常需要反复调整提示词字符串。
-
签名 (Signatures): 签名定义了每个 AI 模块的输入和输出类型,例如
question -> answer: float
表示一个模块接收一个问题作为输入,并输出一个浮点数作为答案。 签名是模块化编程的关键,它使得模块可以组合和重用。 -
优化器 (Optimizers): DSPy 提供多种优化器来调整模块的提示词和权重,以提高 AI 系统的性能。优化器利用训练数据和评估指标,通过不同的策略来改进系统的输出质量。
4、主要功能模块
-
语言模型 (Language Models): DSPy 支持多种语言模型,包括 OpenAI、Anthropic、Databricks 等提供的模型,以及本地运行的模型。它提供统一的 API 来调用这些模型,并包含自动缓存等实用功能。
-
检索客户端 (Retrieval Clients): DSPy 集成了多种检索客户端,例如 Azure、ChromadbRM、FaissRM 等,方便用户连接不同的向量数据库,实现检索增强生成 (RAG) 等任务。
-
评估模块 (DSPy Evaluation): 提供了数据处理和指标计算功能,方便用户评估 AI 系统的性能。
-
优化模块 (DSPy Optimization): 提供了多种优化器,例如
dspy.BootstrapRS
、dspy.MIPROv2
和dspy.BootstrapFinetune
,用于优化模块的提示词和权重。
5、优化器详解
-
dspy.MIPROv2
: 这是一个强大的优化器,它通过三个阶段来优化提示词:引导阶段 (bootstrapping)、有根据的提案阶段 (grounded proposal) 和离散搜索阶段 (discrete search)。它利用训练数据和评估指标,迭代地改进提示词,从而提高系统的性能。 -
dspy.BootstrapFinetune
: 这个优化器通过微调语言模型的权重来提高性能。它使用训练数据来训练模型,并使用评估指标来评估模型的性能。 -
优化器组合: DSPy 允许组合不同的优化器,例如先使用
dspy.MIPROv2
优化提示词,然后使用dspy.BootstrapFinetune
微调模型权重,以获得更好的结果。
DSPy的安装和使用方法
1、安装
T1、pip本地安装
pip install dspy-ai
对于可选的 Pinecone、Qdrant、ChromaDB、Marqo 或 Milvus 检索集成,请包含以下额外内容
pip install "dspy-ai[pinecone]"
pip install "dspy-ai[qdrant]"
pip install "dspy-ai[chromadb]"
pip install "dspy-ai[marqo]"
pip install "dspy-ai[mongodb]"
pip install "dspy-ai[weaviate]"
pip install "dspy-ai[milvus]"
T2、在 Google Colab 中打开
地址:https://colab.research.google.com/github/stanfordnlp/dspy/blob/main/intro.ipynb
2、使用方法
(1)、利用GSM8K 数据集和 OpenAI GPT-3.5-turbo 模型来模拟 DSPy 中的提示任务
# 设置环境、定义自定义模块、编译模型以及使用提供的数据集和提词器配置严格评估其性能,利用GSM8K 数据集和 OpenAI GPT-3.5-turbo 模型来模拟 DSPy 中的提示任务
# 设置:在进入示例之前,我们先确保环境已正确配置。我们将从导入必要的模块并配置我们的语言模型开始
# 数据gsm8k_trainset集gsm8k_devset包含列表dspy.Examples,每个示例都有question和answer字段。
import dspy
from dspy.datasets.gsm8k import GSM8K, gsm8k_metric
# 设置语言模型。
turbo = dspy.OpenAI(model='gpt-3.5-turbo-instruct', max_tokens=250)
dspy.settings.configure(lm=turbo)
# 从 GSM8K 数据集中加载数学问题。
gsm8k = GSM8K()
gsm8k_trainset, gsm8k_devset = gsm8k.train[:10], gsm8k.dev[:10]
print(gsm8k_trainset)
# 定义模块:设置环境后,我们定义一个自定义程序,利用 ChainOfThought 模块进行逐步推理生成答案
class CoT(dspy.Module):
def __init__(self):
super().__init__()
self.prog = dspy.ChainOfThought("question -> answer")
def forward(self, question):
return self.prog(question=question)
# 编译并评估:继续使用BootstrapFewShot提词器对其进行编译
'''
请注意,这BootstrapFewShot不是优化提词器,即它只是创建并验证流程步骤的示例(在本例中为思路链推理),但不会优化指标。
其他提词器类似BootstrapFewShotWithRandomSearch并将MIPRO应用直接优化。
'''
from dspy.teleprompt import BootstrapFewShot
# 设置优化器:我们希望“引导”(即自生成)4-shot 示例的 CoT 程序。
config = dict(max_bootstrapped_demos=4, max_labeled_demos=4)
# 优化!这里使用 `gsm8k_metric`。通常,度量标准会告诉优化器它的表现如何。
teleprompter = BootstrapFewShot(metric=gsm8k_metric, **config)
optimized_cot = teleprompter.compile(CoT(), trainset=gsm8k_trainset)
# 评估:现在我们有了一个编译(优化)后的 DSPy 程序,让我们评估它在开发数据集上的表现
from dspy.evaluate import Evaluate
# 设置评估器,可以多次使用。
evaluate = Evaluate(devset=gsm8k_devset, metric=gsm8k_metric, num_threads=4, display_progress=True, display_table=0)
# 评估我们的 `optimized_cot` 程序。
evaluate(optimized_cot)
# 检查模型的历史记录:为了更深入地了解模型的交互,我们可以通过检查模型的历史记录来查看最近的生成结果
turbo.inspect_history(n=1)
(2)、如何使用DSPy定义一个基本的RAG系统
在此示例中,我们定义了一个带有检索器和生成器的简单 RAG 系统。该forward方法描述了系统中的信息流。DSPy 负责处理底层复杂性,让您专注于应用程序的高级逻辑。
import dspy
class RAG(dspy.Module):
def __init__(self):
self.retriever = dspy.Retrieve(k=3)
self.generator = dspy.ChainOfThought("You are a helpful AI assistant.")
def forward(self, query):
context = self.retriever(query)
response = self.generator(context=context, query=query)
return response
rag = RAG()
response = rag("What is the capital of France?")
print(response)
DSPy的案例应用
DSPy可以用于构建更加强大、高效和可适应的AI应用程序,尤其是在自然语言处理和信息检索领域。它为RAG系统带来了前所未有的灵活性和控制能力。未来,DSPy有望与更多不同的知识源集成、支持高级多模态检索和生成、提升上下文理解和利用能力、增强个性化功能等。
原文档中提供了多个使用案例,涵盖了数学推理、检索增强生成、分类、信息提取和智能体等多种任务。同时也提供了相应的教程,指导用户如何使用 DSPy 构建和优化 AI 系统。
1、问答系统
使用 RAG(检索增强生成)技术,结合 Milvus 和 Llama3 等工具,构建高效的问答系统。这类系统能够从大量数据中检索相关信息,并生成精确的回答 (Zilliz Vector Database)。
2、多跳问答
处理复杂的问答任务,如 HotPotQA,需要多次检索和答案生成,以获得最终答案 (DSPy Documentation | DSPy)。
3、商业应用
如 JetBlue 使用 DSPy 构建的 RAG 聊天机器人,相比传统方法具有更高的性能和效率 (Databricks)。