LLMs之DSPy:DSPy(可优化RAG系统)的简介、安装和使用方法、案例应用之详细攻略

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》翻译与解读

DSPy的简介

1、DSPy优化RAG系统

1.1、基于DSPy驱动的 RAG 系统:DSPy 控制器充当系统的大脑,协调不同模块并优化整个管道

1.2、DSPy 对 RAG 系统的好处

1.3、RAG 的未来与 DSPy

2、类比神经网络

3、核心概念

4、主要功能模块

5、优化器详解

DSPy的安装和使用方法

1、安装

T1、pip本地安装

T2、在 Google Colab 中打开

2、使用方法

(1)、利用GSM8K 数据集和 OpenAI GPT-3.5-turbo 模型来模拟 DSPy 中的提示任务

(2)、如何使用DSPy定义一个基本的RAG系统

DSPy的案例应用

1、问答系统

2、多跳问答

3、商业应用


相关论文

《DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines》翻译与解读

地址

论文地址:https://arxiv.org/abs/2310.03714

时间

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.BootstrapRSdspy.MIPROv2dspy.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)​。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个处女座的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值