2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

告别提示工程,未来属于DSPy(上)

发布日期:2024-09-01 22:44:30 浏览次数: 2783
作者:AI科技论谈

微信搜一搜,关注“AI科技论谈”

介绍DSPy框架的核心概念、编程模型、编译器功能,并通过简单的示例展示其应用。

在构建基于大型语言模型(LLMs)的应用程序时,我们常面临复杂性和脆弱性的双重挑战。这些应用程序通常依赖于手工调整的提示(prompts),对任何改动都非常敏感。为了应对这一难题,DSPy框架应运而生,它通过编程而非手工提示来增强应用程序的稳定性。

本文简要介绍DSPy框架的核心概念、编程模型、编译器功能,并通过简单的示例展示其应用。

1 DSPy介绍

DSPy(发音为“dee-es-pie”)是由斯坦福NLP团队开发的一个创新框架,专注于利用基础模型进行编程。与传统依赖手工提示的方法不同,DSPy强调通过编程来构建基于语言模型(LM)的应用,从而提高应用的稳定性和可靠性。

该框架通过分离程序的信息流和步骤参数(包括提示和模型权重),为构建基于LM的应用提供了一种系统化的解决方案。DSPy能够自动优化程序,以适应特定任务的提示或微调需求。

DSPy的核心特性包括:

  • 签名(Signatures):用以抽象和替代传统的手写提示和微调过程,让开发者能够专注于定义任务的预期结果,而非具体的提示方式。
  • 模块(Modules):将诸如链式思维(Chain of Thought)或ReAct等提示技术封装成模块,简化了提示策略的实现和应用。
  • 远程提示器(Teleprompters)与DSPy编译器:自动化了提示工程,开发者无需手动进行复杂的提示设计,DSPy编译器会根据设定的优化目标自动调整提示策略。

使用DSPy框架构建基于大型语言模型(LLM)的应用程序,其工作流程与训练神经网络颇为相似。以下是构建过程的简要步骤:

  1. 收集数据集:需要准备一些输入输出示例(如问题与答案对),这些数据将用于后续流程的优化。
  2. 编写DSPy程序:利用DSPy的签名和模块功能,定义程序逻辑和组件间信息流动,以完成特定任务。
  3. 定义验证逻辑:设置验证指标和优化器(远程提示器),以优化程序性能。
  4. 编译DSPy程序:DSPy编译器将综合训练数据、程序代码、优化器和验证指标,自动优化程序,包括调整提示或进行微调。
  5. 迭代改进:不断通过优化数据、程序或验证逻辑来重复这一过程,直至达到满意的性能水平。

1.1 比较DSPy、LangChain和LlamaIndex

LangChain、LlamaIndex和DSPy均为辅助开发者构建基于语言模型(LM)应用的框架,但它们在实现方式上存在很大差异。LangChain和LlamaIndex通常依赖于提示模板,这让应用对组件的任何变动都非常敏感。与此不同,DSPy通过将流程构建的重点从提示操作转移到更接近传统编程的方式,提供了一种更为稳固的方法。

DSPy的独特之处在于其新引入的编译器功能,这一功能能够在你更改应用程序的任何部分——无论是语言模型还是数据——时,自动消除了额外的提示工程或微调需求。开发者只需重新编译程序,即可轻松优化流程以适应新的变更。这样的设计大幅减少了开发工作量,使得DSPy在性能上能够与LangChain或LlamaIndex相媲美,甚至在某些情况下更胜一筹。

尽管LangChain和LlamaIndex已在开发者社区中广为人知,但DSPy作为一种新兴的替代方案,正迅速在该领域内获得关注和兴趣。

1.2 DSPy与PyTorch的联系

具有数据科学背景的用户在使用DSPy时,可能会迅速发现它与PyTorch在语法上的相似之处。

正如在PyTorch中可以灵活组合各种通用模块来构建神经网络模型,DSPy同样允许开发者在任何基于语言模型(LM)的应用中自由组合模块。此外,DSPy程序的编译过程,其中涉及自动优化模块参数,与PyTorch中使用优化器训练神经网络的过程颇为相似,都是通过自动化手段来调整模型的参数。

下表总结了PyTorch和DSPy之间的类比:

2 DSPy编程模型详解

2.1 签名:抽象提示和微调

在DSPy框架中,每次调用语言模型(LM)时都必须使用自然语言签名,这种签名取代了传统的手工编写提示。签名本质上是一个简短的函数,它定义了需要执行的转换任务,而不是具体如何向LM发出指令(例如,“consume questions and context and return answers”)。

这种签名机制简化了程序的编写,它以输入和输出字段的组合形式存在,构成了签名的最简结构。

以下是一些常见的简写语法示例:

"question -> answer"

"long-document -> summary"

"context, question -> answer"

这些简写通常已足够使用。但在需要更细致控制的情况下,可以采用更详细的签名定义方式,这时签名由三个主要部分组成:

  • LM需要解决的子任务的描述。
  • 输入字段的详细描述。
  • 输出字段的详细描述。

例如,一个完整的签名定义可能如下所示:

class GenerateAnswer(dspy.Signature):
    """Answer questions with short factoid answers."""
    context = dspy.InputField(desc="may contain relevant facts")
    question = dspy.InputField()
    answer = dspy.OutputField(desc="often between 1 and 5 words")

与手工编写的提示不同,DSPy的签名可以通过示例引导自动编译成自我改进和适应流程的提示或微调,从而提高了程序的灵活性和效率。

2.2 模块:抽象提示技术

在DSPy中,模块化和参数化的设计理念使得各种提示技术得以抽象化,从而简化了将签名适应于具体任务的过程。这些模块能够应用提示、微调、增强和推理技术,以实现对DSPy签名的有效处理。

例如,ChainOfThought模块可以接受签名,并在处理输入时应用链式思维策略。以下是两种将签名传递给ChainOfThought模块的方法:

选项1:使用最小签名

generate_answer = dspy.ChainOfThought("context, question -> answer")

选项2:使用完整签名

generate_answer = dspy.ChainOfThought(GenerateAnswer)

在特定输入上调用模块时,可以像这样操作:

pred = generate_answer(context="Which meant learning Lisp, since in those days Lisp was regarded as the language of AI.",
                       question="What programming language did the author learn in college?")

DSPy还提供了其他几个模块,包括但不限于:

  • dspy.Predict:处理输入输出字段,生成指令,并为指定签名创建模板。
  • dspy.ChainOfThought:继承自Predict,增加链式思维处理功能。
  • dspy.ChainOfThoughtWithHint:提供推理提示选项,增强ChainOfThought模块。
  • dspy.MultiChainComparison:增加多重链比较功能。
  • dspy.Retrieve:从检索模块检索信息。
  • dspy.ReAct:组合思考、行动和观察的步骤。

这些模块可以组合使用,通过继承dspy.Module并定义__init__forward方法来实现复杂的信息流控制。例如,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(GenerateAnswer)

    def forward(self, question):
        context = self.retrieve(question).passages
        prediction = self.generate_answer(context=context, question=question)
        return dspy.Prediction(context=context, answer=prediction.answer)

这样的设计不仅提高了代码的可读性和可维护性,还让整个处理流程更加直观和灵活。

推荐书单

《LANGCHAIN入门指南:构建高可复用、可扩展的LLM应用程序》

这本书专门为那些对自然语言处理技术感兴趣的读者提供了系统的LLM应用开发指南。全书分为11章,从LLM基础知识开始,通过LangChain这个开源框架为读者解读整个LLM应用开发流程。第1~2章概述LLM技术的发展背景和LangChain框架的设计理念。从第3章开始,分章深入介绍LangChain的6大模块,包括模型I/O、数据增强、链、记忆等,通过大量代码示例让读者了解其原理和用法。第9章通过构建PDF问答程序,帮助读者将之前学习的知识应用于实践。第10章则介绍集成,可拓宽LangChain的用途。第11章为初学者简要解析LLM的基础理论,如Transformer模型等。

本书以LangChain这个让人熟悉的框架为主线,引导读者一步一步掌握LLM应用开发流程,适合对大语言模型感兴趣的开发者、AI应用程序开发者阅读。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅