DSPy:编程——而非提示——基础模型
[2024年6月] 优化多阶段语言模型程序的指令和示例
[2023年10月] DSPy:将声明式语言模型调用编译为自我改进的流水线
[2024年7月] 微调和提示优化:两个更好地协同工作的重要步骤
[2024年6月] 提示作为自动优化的训练超参数
[2024年1月] 极端多标签分类的上下文学习
[2023年12月] DSPy断言:自我完善语言模型流水线的计算约束
[2022年12月] 演示-搜索-预测:为知识密集型自然语言处理任务组合检索和语言模型
文档: DSPy文档
DSPy是一个用于算法优化语言模型提示和权重的框架,特别适用于在流水线中多次使用语言模型的情况。如果不使用DSPy而直接使用语言模型构建复杂系统,通常需要:(1)将问题分解为步骤,(2)精心设计提示,使每个步骤单独运行良好,(3)调整步骤使其协同工作,(4)生成合成示例来调整每个步骤,以及(5)使用这些示例微调较小的语言模型以降低成本。目前,这个过程既困难又混乱:每次更改流水线、语言模型或数据时,所有提示(或微调步骤)可能都需要更改。
为了使这个过程更系统化和更强大,DSPy做了两件事。首先,它将程序的流程(模块
)与每个步骤的参数(语言模型提示和权重)分离。其次,DSPy引入了新的优化器
,这些优化器是由语言模型驱动的算法,可以根据您想要最大化的指标
来调整语言模型调用的提示和/或权重。
DSPy可以常规地教导强大的模型(如GPT-3.5
或GPT-4
)和本地模型(如T5-base
或Llama2-13b
)在任务中变得更加可靠,即提高质量和/或避免特定的失败模式。DSPy优化器将把相同的程序"编译"成不同的指令、少样本提示和/或权重更新(微调),以适应每个语言模型。这是一种新范式,在这种范式中,语言模型及其提示退居幕后,成为可以从数据中学习的更大系统中可优化的部分。**总之,**更少的提示工作,更高的分数,以及一种更系统化的方法来使用语言模型解决困难任务。
目录
如果您需要帮助思考您的任务,我们最近为社区创建了一个Discord服务器。
与神经网络的类比
当我们构建神经网络时,我们不会手动编写遍历手动调整的浮点数列表的循环。相反,您可能会使用像PyTorch这样的框架来组合声明式层(例如,Convolution
或Dropout
),然后使用优化器(例如SGD或Adam)来学习网络的参数。
同理!DSPy为您提供了正确的通用模块(例如,ChainOfThought
、ReAct
等),这些模块取代了基于字符串的提示技巧。为了替代提示黑客和一次性合成数据生成器,DSPy还为您提供了通用优化器(BootstrapFewShotWithRandomSearch
或BayesianSignatureOptimizer
),这些是更新程序参数的算法。每当您修改代码、数据、断言或指标时,您都可以再次"编译"您的程序,DSPy将创建符合您更改的新的有效提示。
简短问答
DSPy优化器调整什么? 每个优化器都不同,但它们都试图通过更新提示或语言模型权重来最大化您程序的指标。当前的DSPy优化器
可以检查您的数据,模拟程序的轨迹以生成每个步骤的好/坏示例,根据过去的结果提出或改进每个步骤的指令,在自生成的示例上微调您的语言模型的权重,或结合几种方法来提高质量或降低成本。我们非常欢迎合并新的优化器,探索更丰富的空间:您目前手动进行的大多数提示工程、"合成数据"生成或自我改进步骤可能都可以概括为作用于任意语言模型程序的DSPy优化器。
我应该如何将DSPy用于我的任务? 使用DSPy是一个迭代过程。首先定义您的任务和想要最大化的指标,并准备一些示例输入——通常不需要标签(或者如果您的指标需要,只需要最终输出的标签)。然后,通过选择内置层(模块
)来构建您的流水线,为每个层指定一个签名
(输入/输出规范),然后在Python代码中自由调用您的模块。最后,使用DSPy优化器
将您的代码编译成高质量的指令、自动生成的少样本示例,或更新的语言模型权重。
如果我有更好的提示或合成数据生成想法怎么办? 太好了。我们鼓励您考虑是否最好将其表达为一个模块或优化器,我们很乐意将其合并到DSPy中,让每个人都能使用。DSPy不是一个完整的项目;它是一个持续努力,旨在创建结构(模块和优化器)来取代黑客式的提示和流水线工程技巧。
DSPy代表什么? 这是一个长故事,但现在的反向缩写是Declarative Self-improving Language Programs, pythonically(声明式自我改进语言程序,Python风格)。
1) 安装
您只需要:
pip install dspy-ai
要安装main
分支的最新版本:
pip install git+https://github.com/stanfordnlp/dspy.git
默认情况下,DSPy从pip安装最新的openai
。但是,如果您在OpenAI更改其API之前安装了旧版本openai~=0.28.1
,该库也能正常使用。两者都受支持。
对于可选的(按字母顺序排列)Chromadb、Groq、Marqo、Milvus、MongoDB、MyScaleDB、Pinecone、Qdrant、Snowflake或Weaviate检索集成,请包含以下额外内容:
pip install dspy-ai[chromadb] # 或 [groq] 或 [marqo] 或 [milvus] 或 [mongodb] 或 [myscale] 或 [pinecone] 或 [qdrant] 或 [snowflake] 或 [weaviate]
2) 文档
DSPy文档分为教程(逐步说明如何使用DSPy解决任务)、指南(如何使用API的特定部分)和示例(展示用法的独立程序)。
A) 教程
级别 | 教程 | 在Colab中运行 | 描述 |
---|---|---|---|
初级 | 入门 | 介绍DSPy的基本构建模块。通过HotPotQA任务处理复杂问答。 | |
初级 | 最小工作示例 | 不适用 | 使用DSPy构建并优化一个非常简单的思维链程序,用于数学问答。非常简短。 |
初级 | 编译棘手任务 | 不适用 | 教导语言模型推理逻辑陈述和否定。使用GPT-4为GPT-3.5引导少样本思维链演示。在ScoNe上建立了最先进的结果。由Chris Potts贡献。 |
初级 | 本地模型和自定义数据集 | 同时说明两个不同的内容:如何使用本地模型(特别是Llama-2-13B)以及如何使用自己的数据示例进行训练和开发。 | |
中级 | DSPy论文 | 不适用 | DSPy论文的第3、5、6和7节可以作为教程使用。包括解释的代码片段、结果以及对抽象和API的讨论。 |
中级 | DSPy断言 | 介绍在生成带引用的长篇问题回答时应用DSPy断言的示例。在零样本和编译设置下呈现比较评估。 | |
中级 | 复杂程序的微调 | 教导本地T5模型(770M)在HotPotQA上表现出色。仅使用200个标记答案。不使用手写提示、不调用OpenAI,也不使用检索或推理的标签。 | |
高级 | 信息提取 | 解决从长文章(生物医学研究论文)中提取信息的问题。结合上下文学习和检索,在BioDEX上取得最先进的结果。由Karel D'Oosterlinck贡献。 |
其他人们认为有用的资源:
- 2023年11月在ScaleByTheBay的DSPy演讲。
- 与MLOps Learners的DSPy网络研讨会,时间稍长,包含问答环节。
- 社区提供的DSPy实践概述:Connor Shorten解释DSPy,code_your_own_ai解释DSPy,AI Bites的DSPy速成课程,Unify解释DSPy论文
- 访谈:Weaviate播客现场采访,您还可以在YouTube上找到6-7个其他远程播客,涵盖不同的视角/受众。
- DSPy中的跟踪使用Arize Phoenix:跟踪提示和DSPy程序步骤的教程
- DSPy:不是普通的提示工程,为什么它对未来的提示工程至关重要,以及为什么提示工程师学习它具有挑战性。
- 使用Parea AI在DSPy中进行跟踪和优化追踪:跟踪和评估DSPy RAG程序的教程
B) 指南
如果您是DSPy新手,最好按顺序阅读。之后,您可能会经常参考这些指南,例如复制/粘贴可以编辑用于自己DSPy程序的代码片段。
C) 示例
DSPy团队认为复杂性必须有理由。我们认真对待这一点:除非我们能够通过实证证明这种复杂性通常会带来质量或成本的改善,否则我们绝不会发布复杂的教程(上面)或示例(下面)。其他框架或文档很少执行这种规则,但在DSPy示例中您可以依赖它。
在examples/
目录和顶级目录中有许多示例。我们欢迎贡献!
您可以在Twitter/X上找到@lateinteraction发布的其他示例。
一些其他示例(不全面,欢迎通过PR添加更多):
- Michael Ryan 在各种不同任务上对 DSPy 优化器进行的基准测试
- Karel D'Oosterlinck 的复杂极端多类分类 IReRa
- Haize Lab 使用 DSPy 进行红队测试,查看他们的 DSPy 代码
- 应用 DSPy 断言
- 在 DSPy 中编译来自 LangChain 的 LCEL 可运行程序
- AI 反馈,或在 DSPy 中编写基于语言模型的指标
- Michael Ryan 在各种不同任务上对 DSPy 优化器进行的基准测试
- Saiful Haq 通过编译获得改进的印度语言自然语言推理
- Chris Levy 的 DSPy 在 BIG-Bench Hard 示例上的应用
- @jrknox1977 使用 Ollama 与 DSPy 结合实现 Mistral(量化版)
- 使用 DSPy,"非常规自动提示的惊人有效性"(论文)由 VMware 的 Rick Battle 和 Teja Gollapudi 撰写,以及TheRegister 的采访
- Juan Ovalle 使用 DSPy 和 vLLM 优化开源语言模型在文本到 SQL 任务上的性能
- 类型化 DSPy(由 @normal-computing 贡献)
待添加:多伦多大学在临床自然语言处理方面的最新研究成果链接,Plastic Labs 的心智理论 (ToM) 研究,以及 Replit 的 DSPy 流水线。
Connor Shorten 在 Weaviate 的 DSPy 食谱中也有一些最新的精彩示例。YouTube 上的教程。
D) 可视化
为了可视化优化过程中的进展,LangWatch 提供了 DSPy 可视化工具,通过检查正在优化的提示、签名和演示,以及正在评估的示例、语言模型调用和成本,帮助理解和调试优化器:
3) 语法:你掌控工作流程 —— 这是自由形式的 Python 代码!
DSPy 隐藏了繁琐的提示工程,但它清晰地展示了你需要做出的重要决策:[1] 你的系统设计会是什么样的?[2] 你的程序行为有哪些重要约束?
你可以用自由形式的 Python 模块来表达你的系统。DSPy 将调优你的程序质量,无论你以何种方式使用基础模型:你可以使用循环、if
语句或异常进行编码,并在任何你认为适合你的任务的 Python 控制流中使用 DSPy 模块。
假设你想构建一个简单的检索增强生成(RAG)系统用于问答。你可以像这样定义自己的 RAG
程序:
class RAG(dspy.Module):
def __init__(self, num_passages=3):
super().__init__()
self.retrieve = dspy.Retrieve(k=num_passages)
self.generate_answer = dspy.ChainOfThought("context, question -> answer")
def forward(self, question):
context = self.retrieve(question).passages
answer = self.generate_answer(context=context, question=question)
return answer
一个程序有两个关键方法,你可以根据需要进行编辑。
你的 __init__
方法声明了你将使用的模块。在这里,RAG
将使用内置的 Retrieve
进行检索,使用 ChainOfThought
生成答案。DSPy 提供了通用模块,可以适应你自己的子任务形式 —— 而不是为特定应用预构建的函数。
使用语言模型的模块,如 ChainOfThought
,需要一个签名。这是一个声明性规范,告诉模块它预期要做什么。在这个例子中,我们使用简写签名表示法 context, question -> answer
来告诉 ChainOfThought
它将获得一些 context
和一个 question
,并且必须生成一个 answer
。我们将在下面讨论更高级的**签名**。
你的 forward
方法表达了你想用模块进行的任何计算。在这种情况下,我们使用模块 self.retrieve
搜索一些 context
,然后使用模块 self.generate_answer
,它使用 context
和 question
生成 answer
!
现在你可以在零样本模式下使用这个 RAG
程序。或者编译它以获得更高质量。零样本使用很简单。只需定义程序的一个实例,然后调用它:
rag = RAG() # 零样本,未编译版本的 RAG
rag("法国的首都是什么?").answer # -> "巴黎"
下一节将讨论如何编译我们简单的 RAG
程序。当我们编译它时,DSPy 编译器将注释其步骤的演示:(1) 检索,(2) 使用上下文,(3) 使用思维链回答问题。从这些演示中,DSPy 编译器将确保它生成一个有效的少样本提示,可以很好地与你的语言模型、检索模型和数据配合使用。如果你使用的是小型模型,它会微调你的模型(而不是提示)来完成这个任务。
如果你后来决定在管道中需要另一个步骤,只需添加另一个模块并再次编译。也许添加一个模块,在搜索过程中考虑聊天历史?
4) 两个强大的概念:签名和电子提词器
注意: 我们将很快把电子提词器重命名为优化器。这不会影响它们的功能,但会简化使用的术语。
为了使编译你编写的任何程序成为可能,DSPy 引入了两个简单的概念:签名和电子提词器。
4.a) 使用 dspy.Signature
声明语言模型的输入/输出行为
当我们在 DSPy 中为语言模型分配任务时,我们将所需的行为指定为签名。签名是 DSPy 模块输入/输出行为的声明性规范。
与其投入精力去研究如何让你的语言模型完成子任务,不如使用签名来告诉 DSPy 子任务是什么。之后,DSPy 编译器将弄清楚如何为你的大型语言模型构建一个复杂的提示(或微调你的小型语言模型),专门针对你的签名、你的数据和你的管道。
签名由三个简单的元素组成:
- 语言模型应该解决的子任务的最小描述。
- 一个或多个输入字段的描述(例如,输入问题),我们将提供给语言模型。
- 一个或多个输出字段的描述(例如,问题的答案),我们将从语言模型中期望得到。
我们支持两种表示签名的方式。简写签名表示法用于快速开发。你只需为你的模块(例如,dspy.ChainOfThought
)提供一个字符串,格式为 input_field_name_1, ... -> output_field_name_1, ...
,字段之间用逗号分隔。
在前面的 RAG
类中,我们看到:
self.generate_answer = dspy.ChainOfThought("context, question -> answer")
在许多情况下,这种简单的签名就足够了。然而,有时你需要更多控制。在这些情况下,我们可以使用完整的表示法来表达更全面的签名,如下所示。
class GenerateSearchQuery(dspy.Signature):
"""编写一个简单的搜索查询,以帮助回答复杂问题。"""
context = dspy.InputField(desc="可能包含相关事实")
question = dspy.InputField()
query = dspy.OutputField()
### 在程序的__init__函数中
self.generate_answer = dspy.ChainOfThought(GenerateSearchQuery)
你可以选择为每个输入或输出字段提供prefix
和/或desc
键,以细化或约束使用你的签名的模块的行为。子任务本身的描述在文档字符串中指定(即"""编写一个简单的..."""
)。
4.b) 使用dspy.teleprompt.*
让DSPy自动优化你的程序
定义RAG
程序后,我们可以对其进行编译。编译程序将更新存储在每个模块中的参数。对于大型语言模型,这主要体现在创建和验证良好的示例以包含在你的提示中。
编译依赖于三个方面:(可能很小的)训练集、验证指标以及你从DSPy中选择的teleprompt。Teleprompters是强大的优化器(包含在DSPy中),可以学习引导和选择有效的提示,用于任何程序的模块。(名称中的"tele-"意味着"远程",即远程自动提示。)
DSPy通常只需要很少的标注。例如,我们的RAG
管道可能只需要几个包含问题及其(人工标注的)答案的示例就能很好地工作。你的管道可能涉及多个复杂步骤:我们的基本RAG
示例包括检索上下文、思维链和答案。然而,你只需要为初始问题和最终答案提供标签。DSPy将引导任何支持你管道所需的中间标签。如果你以任何方式更改管道,引导的数据也会相应改变!
my_rag_trainset = [
dspy.Example(
question="Gary Zukav的第一本书获得了哪个奖项?",
answer="国家图书奖"
),
...
]
其次,定义你的验证逻辑,这将表达你的程序或单个模块行为的一些约束。对于RAG
,我们可能会表达一个简单的检查,如下所示:
def validate_context_and_answer(example, pred, trace=None):
# 检查金标准和预测答案是否相同
answer_match = example.answer.lower() == pred.answer.lower()
# 检查预测答案是否来自检索的上下文之一
context_match = any((pred.answer.lower() in c) for c in pred.context)
return answer_match and context_match
不同的teleprompters在优化成本与质量等方面提供各种权衡。对于RAG
,我们可能会使用一个简单的teleprompt,称为BootstrapFewShot
。为此,我们使用验证函数my_rag_validation_logic
实例化teleprompt本身,然后针对一些训练集my_rag_trainset
进行编译。
from dspy.teleprompt import BootstrapFewShot
teleprompter = BootstrapFewShot(metric=my_rag_validation_logic)
compiled_rag = teleprompter.compile(RAG(), trainset=my_rag_trainset)
如果我们现在使用compiled_rag
,它将调用我们的语言模型,使用包含少量示例的丰富提示,展示在我们数据上进行基于思维链的检索增强问答。
5) Pydantic类型
有时你需要的不仅仅是字符串输入/输出。 例如,假设你需要找到
from pydantic import BaseModel, Field
from dspy.functional import TypedPredictor
class TravelInformation(BaseModel):
origin: str = Field(pattern=r"^[A-Z]{3}$")
destination: str = Field(pattern=r"^[A-Z]{3}$")
date: datetime.date
confidence: float = Field(gt=0, lt=1)
class TravelSignature(Signature):
""" 从给定的电子邮件中提取所有旅行信息 """
email: str = InputField()
flight_information: list[TravelInformation] = OutputField()
predictor = TypedPredictor(TravelSignature)
predictor(email='...')
这将输出一个TravelInformation
对象列表。
还有其他方法可以创建类型化签名。比如
predictor = TypedChainOfThought("question:str -> answer:int")
这应用了思维链,并保证返回一个整数。
甚至还有一种受tanuki.py启发的方法,在定义模块时可能会很方便:
from dspy.functional import FunctionalModule, predictor, cot
class MyModule(FunctionalModule):
@predictor
def hard_question(possible_topics: list[str]) -> str:
"""根据其中一个主题编写一个难题。它应该可以用数字回答。"""
@cot
def answer(question: str) -> float:
pass
def forward(possible_topics: list[str]):
q = hard_question(possible_topics=possible_topics)
a = answer(question=q)
return (q, a)
6) 常见问题:DSPy适合我吗?
DSPy的理念和抽象与其他库和框架有显著不同,所以通常很容易决定DSPy是否适合你的用例。
如果你是NLP/AI研究人员(或正在探索新管道或新任务的从业者),答案通常是毫无疑问的是。如果你是从事其他工作的从业者,请继续阅读。
[5.a] DSPy与简单的提示包装器(OpenAI API、MiniChain、基本模板)的比较
换句话说:_为什么我不能直接将提示写成字符串模板?_好吧,对于极其简单的设置,这_可能_就足够了。(如果你熟悉神经网络,这就像用Python的for循环表达一个小型两层神经网络。它勉强可以工作。)
然而,当你需要更高的质量(或可控的成本)时,你就需要迭代探索多阶段分解、改进提示、数据引导、仔细微调、检索增强和/或使用更小(或更便宜、本地)的模型。使用基础模型构建的真正表达能力在于这些部分之间的交互。但每次你改变一个部分,你可能会破坏(或削弱)多个其他组件。
DSPy清晰地抽象出这些交互中外部于你实际系统设计的部分(_并且_强大地优化它们)。它让你专注于设计模块级的交互:用10或20行DSPy表达的_相同程序_可以轻松编译成GPT-4
的多阶段指令、Llama2-13b
的详细提示或T5-base
的微调。
哦,你也不再需要在项目核心维护冗长、脆弱、特定于模型的字符串了。
[5.b] DSPy与应用开发库如LangChain、LlamaIndex的比较
注意:如果你使用LangChain作为自己提示字符串的简单包装器,请参考回答[5.a]。
LangChain和LlamaIndex是针对使用语言模型进行高级应用开发的流行库。它们提供了许多_开箱即用_的、预建的应用模块,可以与你的数据或配置插接。实际上,确实许多用例真的_不需要_任何特殊组件。如果你对使用某人的通用、现成的提示来处理PDF问答或标准文本到SQL感到满意,只要它易于在你的数据上设置,那么你可能会在这些库中找到非常丰富的生态系统。
与这些库不同,DSPy内部不包含针对特定应用你可以构建的手工制作的提示。相反,DSPy引入了一组非常小但更强大和通用的模块,这些模块可以学习在你的管道中针对你的数据提示(或微调)你的语言模型。
DSPy提供了完全不同程度的模块化:当你改变数据、调整程序的控制流程或更改目标语言模型时,DSPy编译器可以将你的程序映射到一组新的提示(或微调),这些提示是专门针对这个管道优化的。正因为如此,你可能会发现DSPy以最少的努力为你的任务获得最高的质量,前提是你愿意实现(或扩展)你自己的简短程序。简而言之,DSPy适用于当你需要一个轻量级但自动优化的编程模型时 — 而不是一个预定义提示和集成的库。 如果你熟悉神经网络:
这就像PyTorch(代表DSPy)和HuggingFace Transformers(代表更高级别的库)之间的区别。如果你只想使用现成的
BERT-base-uncased
或GPT2-large
,或对它们进行最小程度的微调,HF Transformers使这变得非常简单。然而,如果你想构建自己的架构(或大幅扩展现有架构),你就必须迅速转向像PyTorch这样更加模块化的工具。幸运的是,HF Transformers确实是用PyTorch这样的后端实现的。我们同样对DSPy的常见应用的高级封装感到兴奋。如果这是使用DSPy实现的,你的高级应用也可以以静态提示链无法实现的方式显著适应你的数据。如果你想在这方面提供帮助,请提出一个issue。
[5.c] DSPy与Guidance、LMQL、RELM、Outlines等生成控制库的比较
Guidance、LMQL、RELM和Outlines都是令人兴奋的新库,用于控制LM的单次完成,例如,如果你想强制执行JSON输出模式或将采样限制在特定的正则表达式内。
这在许多场景中非常有用,但通常专注于单个LM调用的低级结构化控制。它并不能确保你获得的JSON(或结构化输出)对你的任务来说是正确或有用的。
相比之下,DSPy自动优化你程序中的提示,使其与各种任务需求保持一致,这也可能包括生成有效的结构化输出。话虽如此,我们正在考虑允许DSPy中的Signatures表达类似正则表达式的约束,这些约束由这些库实现。
测试
要运行测试,你首先需要克隆仓库。
然后通过poetry安装包: 注意 - 你可能需要
poetry install --with test
然后运行所有测试,或特定的测试套件,使用以下命令:
poetry run pytest
poetry run pytest tests/PATH_TO_TEST_SUITE
贡献快速入门
参见CONTRIBUTING.md获取DSPy贡献的快速入门指南。
团队、贡献者和致谢
项目负责人:Omar Khattab
项目导师:Chris Potts、Matei Zaharia、Heather Miller
核心库:Arnav Singhvi、Herumb Shandilya、Sri Vardhamanan、Cyrus Nouroozi、Amir Mehr、Kyle Caverly,特别感谢Keshav Santhanam、Thomas Ahle、Connor Shorten
提示优化:Krista Opsahl-Ong、Michael Ryan、Josh Purtell,特别感谢Karel D'Oosterlinck、Eric Zhang
微调和强化学习:Dilara Soylu、Isaac Miller、Souradip Chakraborty
PL抽象:Shangyin Tan、Manish Shetty、Peter Zhong
应用:Jasper Xian、Saron Samuel、Alberto Mancarella、Faraz Khoubsirat、Saiful Haq、Ashutosh Sharma
特别感谢Rick Battle、Dhar Rawal、Insop Song、Tom Dorr、Igor Kotenkov、Corey Zumar、Lisa Li、David Hall、Ashwin Paranjape、Chris Manning、Avi Sil。
DSPy标志由Chuyi Zhang设计。
📜 引用和进一步阅读
要及时了解或了解更多信息,请在Twitter上关注@lateinteraction。
如果你在研究论文中使用DSPy或DSP,请按以下方式引用我们的工作:
@article{khattab2023dspy,
title={DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines},
author={Khattab, Omar and Singhvi, Arnav and Maheshwari, Paridhi and Zhang, Zhiyuan and Santhanam, Keshav and Vardhamanan, Sri and Haq, Saiful and Sharma, Ashutosh and Joshi, Thomas T. and Moazam, Hanna and Miller, Heather and Zaharia, Matei and Potts, Christopher},
journal={arXiv preprint arXiv:2310.03714},
year={2023}
}
@article{khattab2022demonstrate,
title={Demonstrate-Search-Predict: Composing Retrieval and Language Models for Knowledge-Intensive {NLP}},
author={Khattab, Omar and Santhanam, Keshav and Li, Xiang Lisa and Hall, David and Liang, Percy and Potts, Christopher and Zaharia, Matei},
journal={arXiv preprint arXiv:2212.14024},
year={2022}
}
你还可以阅读更多关于框架从Demonstrate-Search-Predict到DSPy的演变:
- DSPy Assertions: Computational Constraints for Self-Refining Language Model Pipelines(学术论文,2023年12月)
- DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines(学术论文,2023年10月)
- 发布DSPy,框架的最新迭代(Twitter帖子,2023年8月)
- 发布DSP编译器(v0.1)(Twitter帖子,2023年2月)
- 介绍DSP(Twitter帖子,2023年1月)
- Demonstrate-Search-Predict: Composing retrieval and language models for knowledge-intensive NLP(学术论文,2022年12月)
注意:如果你在寻找Demonstrate-Search-Predict(DSP),即DSPy的前一个版本,你可以在这个仓库的v1分支上找到它。