当前位置:   article > 正文

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

dspy算法

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

目录

相关论文

《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

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、印度理工学院孟买分校、微软等

总结

该论文提出了一种新型的编程模型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的简介

DSPy (Declarative Language Model Programming) 是一个革命性的框架,旨在简化构建复杂语言模型应用程序的过程。它由斯坦福大学的研究人员开发,允许开发人员专注于应用程序的高级逻辑,同时抽象掉许多低级细节。

DSPy 是一个用于算法优化语言模型(LM)提示和权重的框架,特别是在管道中多次使用 LM 时。要在没有 DSPy 的情况下使用 LM 构建复杂系统,通常需要:

(1)将问题分解为多个步骤,

(2)精心设计 LM 提示,直到每个步骤在孤立情况下都能很好地工作,

(3)调整这些步骤以确保它们协同工作良好,

(4)生成合成示例以调整每个步骤,

(5)使用这些示例微调较小的 LM 以降低成本。目前,这很困难且混乱:每次更改管道、LM 或数据时,所有提示(或微调步骤)可能都需要更改。

为了使这一过程更系统化且更强大,DSPy 做了两件事。首先,它将程序的流程(模块)与每个步骤的参数(LM 提示和权重)分开。其次,DSPy 引入了新的优化器,这些是 LM 驱动的算法,可以根据您想要最大化的指标来调整 LM 调用的提示和/或权重。

DSPy 可以常规地教会强大的模型如 GPT-3.5 或 GPT-4 以及本地模型如 T5-base 或 Llama2-13b 在任务上变得更加可靠,即具有更高的质量和/或避免特定的失败模式。DSPy 优化器会将相同的程序“编译”成适用于每个 LM 的不同指令、少样本提示和/或权重更新(微调)。这是一个新范式,其中 LM 及其提示淡化为一个可以从数据中学习的更大系统的可优化部分。简而言之,更少的提示,更高的分数,以及更系统的方法来解决 LM 的难题。

文档地址https://dspy-docs.vercel.app/docs/intro

文章地址:https://medium.com/@asadnhasan/dspy-revolutionizing-retrieval-augmented-generation-004d8c6a6f95

类比神经网络

当我们构建神经网络时,我们不会在手动编写的循环中使用经过手动调节的浮点数列表。相反,您可能会使用像 PyTorch 这样的框架来组合层(例如卷积或 Dropout),然后使用优化器(例如 SGD 或 Adam)来学习网络的参数。同样,DSPy 为您提供了合适的通用模块(例如 ChainOfThought、ReAct 等),以替代基于字符串的提示技巧。为了替代提示黑客和一次性合成数据生成器,DSPy 还为您提供了通用优化器(如 BootstrapFewShotWithRandomSearch 或 MIPRO),这些是更新程序中参数的算法。每当您修改代码、数据、断言或指标时,您可以重新编译程序,DSPy 将创建适合更改的新有效提示。

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 系统。一些潜在的发展包括:

>> 与更多样化的知识来源集成

>> 先进的多模态检索和生成

>> 改善上下文理解和利用

>> 增强的个性化能力

DSPy的安装和使用方法

1、安装

T1、pip本地安装

  1. pip install dspy-ai
  2. 对于可选的 Pinecone、Qdrant、ChromaDB、Marqo 或 Milvus 检索集成,请包含以下额外内容
  3. pip install "dspy-ai[pinecone]"
  4. pip install "dspy-ai[qdrant]"
  5. pip install "dspy-ai[chromadb]"
  6. pip install "dspy-ai[marqo]"
  7. pip install "dspy-ai[mongodb]"
  8. pip install "dspy-ai[weaviate]"
  9. 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 中的提示任务

  1. # 设置环境、定义自定义模块、编译模型以及使用提供的数据集和提词器配置严格评估其性能,利用GSM8K 数据集和 OpenAI GPT-3.5-turbo 模型来模拟 DSPy 中的提示任务
  2. # 设置:在进入示例之前,我们先确保环境已正确配置。我们将从导入必要的模块并配置我们的语言模型开始
  3. # 数据gsm8k_trainset集gsm8k_devset包含列表dspy.Examples,每个示例都有question和answer字段。
  4. import dspy
  5. from dspy.datasets.gsm8k import GSM8K, gsm8k_metric
  6. # 设置语言模型。
  7. turbo = dspy.OpenAI(model='gpt-3.5-turbo-instruct', max_tokens=250)
  8. dspy.settings.configure(lm=turbo)
  9. # 从 GSM8K 数据集中加载数学问题。
  10. gsm8k = GSM8K()
  11. gsm8k_trainset, gsm8k_devset = gsm8k.train[:10], gsm8k.dev[:10]
  12. print(gsm8k_trainset)
  13. # 定义模块:设置环境后,我们定义一个自定义程序,利用 ChainOfThought 模块进行逐步推理生成答案
  14. class CoT(dspy.Module):
  15. def __init__(self):
  16. super().__init__()
  17. self.prog = dspy.ChainOfThought("question -> answer")
  18. def forward(self, question):
  19. return self.prog(question=question)
  20. # 编译并评估:继续使用BootstrapFewShot提词器对其进行编译
  21. '''
  22. 请注意,这BootstrapFewShot不是优化提词器,即它只是创建并验证流程步骤的示例(在本例中为思路链推理),但不会优化指标。
  23. 其他提词器类似BootstrapFewShotWithRandomSearch并将MIPRO应用直接优化。
  24. '''
  25. from dspy.teleprompt import BootstrapFewShot
  26. # 设置优化器:我们希望“引导”(即自生成)4-shot 示例的 CoT 程序。
  27. config = dict(max_bootstrapped_demos=4, max_labeled_demos=4)
  28. # 优化!这里使用 `gsm8k_metric`。通常,度量标准会告诉优化器它的表现如何。
  29. teleprompter = BootstrapFewShot(metric=gsm8k_metric, **config)
  30. optimized_cot = teleprompter.compile(CoT(), trainset=gsm8k_trainset)
  31. # 评估:现在我们有了一个编译(优化)后的 DSPy 程序,让我们评估它在开发数据集上的表现
  32. from dspy.evaluate import Evaluate
  33. # 设置评估器,可以多次使用。
  34. evaluate = Evaluate(devset=gsm8k_devset, metric=gsm8k_metric, num_threads=4, display_progress=True, display_table=0)
  35. # 评估我们的 `optimized_cot` 程序。
  36. evaluate(optimized_cot)
  37. # 检查模型的历史记录:为了更深入地了解模型的交互,我们可以通过检查模型的历史记录来查看最近的生成结果
  38. turbo.inspect_history(n=1)

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

在此示例中,我们定义了一个带有检索器和生成器的简单 RAG 系统。该forward方法描述了系统中的信息流。DSPy 负责处理底层复杂性,让您专注于应用程序的高级逻辑。

  1. import dspy
  2. class RAG(dspy.Module):
  3. def __init__(self):
  4. self.retriever = dspy.Retrieve(k=3)
  5. self.generator = dspy.ChainOfThought("You are a helpful AI assistant.")
  6. def forward(self, query):
  7. context = self.retriever(query)
  8. response = self.generator(context=context, query=query)
  9. return response
  10. rag = RAG()
  11. response = rag("What is the capital of France?")
  12. print(response)

DSPy的案例应用

DSPy可以用于构建更加强大、高效和可适应的AI应用程序,尤其是在自然语言处理和信息检索领域。它为RAG系统带来了前所未有的灵活性和控制能力。未来,DSPy有望与更多不同的知识源集成、支持高级多模态检索和生成、提升上下文理解和利用能力、增强个性化功能等。

1、问答系统

使用 RAG(检索增强生成)技术,结合 Milvus 和 Llama3 等工具,构建高效的问答系统。这类系统能够从大量数据中检索相关信息,并生成精确的回答​ (Zilliz Vector Database)​。

2、多跳问答

处理复杂的问答任务,如 HotPotQA,需要多次检索和答案生成,以获得最终答案​ (DSPy Documentation | DSPy)​。

3、商业应用

如 JetBlue 使用 DSPy 构建的 RAG 聊天机器人,相比传统方法具有更高的性能和效率​ (Databricks)​。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/963906
推荐阅读
相关标签
  

闽ICP备14008679号