赞
踩
LLMs之DSPy:DSPy(可优化RAG系统)的简介、安装和使用方法、案例应用之详细攻略
目录
《DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines》翻译与解读
1.1、基于DSPy驱动的 RAG 系统:DSPy 控制器充当系统的大脑,协调不同模块并优化整个管道
(1)、利用GSM8K 数据集和 OpenAI GPT-3.5-turbo 模型来模拟 DSPy 中的提示任务
地址 | |
时间 | 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 (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 将创建适合更改的新有效提示。
RAG系统将大型语言模型的功能与外部知识库相结合。该过程通常如下所示:收到查询→从知识库中检索相关信息→将检索到的信息与查询相结合→语言模型根据此组合输入生成响应。
DSPy 引入了构建 RAG 系统的新范式,具有以下几个主要优势:
>> 声明式编程:DSPy 允许开发人员描述他们希望系统做什么,而不是如何做。这种高级方法使设计和修改复杂的 RAG 管道变得更加容易。
>> 模块化架构:使用 DSPy,您可以轻松交换 RAG 系统的不同组件,例如检索器、排序器或语言模型,而无需重写大量代码。
>> 自动优化:DSPy 包含用于自动优化 RAG 管道的工具,减少手动调优的需要并提高整体性能。
>> 无缝集成:DSPy 可与流行的语言模型无缝协作,并且可以轻松集成到现有的 AI 工作流程中。
总的来说,DSPy为RAG系统的开发注入了新的活力,开辟了一种全新的构建和部署方式,值得AI开发者和研究人员探索和实践。
>> 提高灵活性:使用 DSPy,您可以轻松尝试不同的检索和排名策略,甚至组合多种策略,而无需重写整个代码库。
>> 增强性能:DSPy 的自动优化功能可以帮助调整您的 RAG 系统以获得更好的性能,通常超越手动调整的系统。
>> 更容易调试和迭代:DSPy 的声明性让您更容易理解 RAG 管道中发生的情况,从而促进更快的调试和迭代。
>> 可扩展性:随着 RAG 系统复杂性的增加,DSPy 的模块化架构允许您更有效地管理这种复杂性。
随着 DSPy 的不断发展,我们可以期待看到更强大和灵活的 RAG 系统。一些潜在的发展包括:
>> 与更多样化的知识来源集成
>> 先进的多模态检索和生成
>> 改善上下文理解和利用
>> 增强的个性化能力
- 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]"
地址:https://colab.research.google.com/github/stanfordnlp/dspy/blob/main/intro.ipynb
-
- # 设置环境、定义自定义模块、编译模型以及使用提供的数据集和提词器配置严格评估其性能,利用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)
在此示例中,我们定义了一个带有检索器和生成器的简单 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可以用于构建更加强大、高效和可适应的AI应用程序,尤其是在自然语言处理和信息检索领域。它为RAG系统带来了前所未有的灵活性和控制能力。未来,DSPy有望与更多不同的知识源集成、支持高级多模态检索和生成、提升上下文理解和利用能力、增强个性化功能等。
使用 RAG(检索增强生成)技术,结合 Milvus 和 Llama3 等工具,构建高效的问答系统。这类系统能够从大量数据中检索相关信息,并生成精确的回答 (Zilliz Vector Database)。
处理复杂的问答任务,如 HotPotQA,需要多次检索和答案生成,以获得最终答案 (DSPy Documentation | DSPy)。
如 JetBlue 使用 DSPy 构建的 RAG 聊天机器人,相比传统方法具有更高的性能和效率 (Databricks)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。