DSPy: The End of Prompt Engineering - Kevin Madura, AlixPartners | 告别提示词工程:用DSPy构建模块化、可优化的AI程序
https://www.youtube.com/watch?v=-cKUW6n8hBU 告别提示词工程:用DSPy构建模块化、可优化的AI程序 通俗易懂的整体解释 想象一下,你以前指挥一个超级聪明的助手(大语言模型)做事,得事无巨细地写小纸条(提示词),比如“请用JSON格式输出,先思考再回答,语气要专业……”,这就像提示词工程,很繁琐,而且换一个助手(换模型)可能就得重写纸条。 现在,有
https://www.youtube.com/watch?v=-cKUW6n8hBU
告别提示词工程:用DSPy构建模块化、可优化的AI程序
通俗易懂的整体解释
想象一下,你以前指挥一个超级聪明的助手(大语言模型)做事,得事无巨细地写小纸条(提示词),比如“请用JSON格式输出,先思考再回答,语气要专业……”,这就像提示词工程,很繁琐,而且换一个助手(换模型)可能就得重写纸条。
现在,有了一个叫 DSPy 的新工具。它让你换个思路:不用再纠结于怎么写小纸条,而是像搭乐高积木一样,用Python代码来设计一个工作流程。
- 关键点:
- 从“写提示”到“写程序”:你不再跟模型说“你要怎么做”,而是定义一个函数,告诉它“输入是什么,输出是什么”(这叫签名)。至于中间怎么实现,交给DSPy和模型自己去搞定。
- 模块化:你可以把复杂的任务拆解成一个个小的、独立的模块(比如“情感分析模块”、“文档摘要模块”),像搭积木一样组合起来。
- 自动优化:这是最酷的一点。当你搭好程序后,DSPy可以像一个智能教练,通过反复测试,自动帮你调整那些藏在背后的提示词,让你的程序表现更好,或者换成更便宜的小模型也能达到同样的效果。
简单说,DSPy就是把“写提示词”这种手艺活,变成了“写代码”这种工程活,让你能更快、更稳定地开发基于大模型的应用程序。
视频采访内容分段详解
第一部分:开场与背景介绍 (开始时间 0% - 10%)
- 演讲目的与风格:演讲者Kevin Madura开场表示,本次分享会很随意,欢迎大家随时提问。他计划用一半时间讲概念,另一半时间演示代码。
- 听众调查:现场大部分人都听说过DSPy,但只有少数人在生产环境中日常使用。演讲者希望今天能转化更多人去尝试。
- DSPy的定义:DSPy是一个声明式框架,用于构建模块化软件。它不是用来迭代提示词的,而是用来构建真正的Python程序。
- 个人使用动机:作为一个技术顾问,Kevin经常面对各种不同的问题(如法律调查、流程改进、合同审查)。DSPy让他和他的团队能够非常快速地迭代,构建出解决这些问题的应用。
- 核心价值:DSPy最大的好处是能将你的逻辑分解成一个把大语言模型(LLM)当作一等公民的程序。你最终只是在调用一个函数,而这个函数恰好背后是个LLM。DSPy提供了关于输入和输出类型的保证,让你可以专注于构建程序本身。
第二部分:为什么推荐DSPy? (开始时间 10% - 20%)
- 恰到好处的抽象层级:DSPy不像LangChain那样会让你感觉受到限制。它不会让你去处理
choices、messages、content这些底层细节,也不需要你自己写字符串解析器。你只需要声明你的意图。 - 创建的是计算机程序:你是在构建一个程序,只是碰巧用了LLM。这比来回调整字符串式的提示词要高级得多。
- 系统思维与可迁移性:DSPy的创始人Omar提到,它是用“系统思维”构建的。关键在于,你设计的系统结构和控制流不会因为底层模型能力的快速变化而过时。你可以轻松地在不同模型之间切换,而无需重写整个程序。
- 便利性与精确性并存:DSPy提供了开箱即用的便利(如无需手动解析JSON),同时也保留了足够的精度和控制力。如果你想了解底层发生了什么,可以深入查看;否则,只需专注于你想做的事。
- 对模型和范式变化的鲁棒性:你可以保留程序的逻辑,同时灵活地嵌入不同的LLM。
第三部分:DSPy的六大核心概念 (开始时间 20% - 35%)
- 签名 (Signatures):这是DSPy最核心的概念。它用来指定你想要函数做什么,即定义输入和输出的类型。你可以用简单的字符串(如
"text -> sentiment")或更复杂的类(基于Pydantic)来定义。字段名本身就充当了微型提示词,会被传递给模型。这是DSPy强大又有点奇怪的地方。- 应对已有好提示词的情况:如果你已经有一个精心打磨过的提示词,完全可以将其作为系统指令注入到签名或模块中,作为优化的起点。
- 模块 (Modules):模块是逻辑上组织程序的方式,基于签名构建。它们类似于PyTorch中的模块概念。DSPy内置了许多常用模块(如
Predict,ChainOfThought,ReAct),你也可以创建自己的模块。例如,一个模块可以先调用LLM,再进行一些硬编码的业务逻辑。 - 工具 (Tools):在DSPy中,工具本质上就是Python函数。你可以很容易地将任何Python函数暴露给LLM使用(例如,一个天气查询函数、一个网络搜索函数)。
- 适配器 (Adapters):适配器位于签名和实际的LLM调用之间。它们负责将你的输入输出签名翻译成最终的提示词格式(如JSON、XML、BAML)。不同的适配器可能会影响模型的表现(性能差异可达5-10%)。
- 优化器 (Optimizers):这是DSPy最引人注目也最有争议的部分。优化器可以自动、量化地提升程序性能。它通过在后台迭代地调整发送给LLM的提示词来实现。这使得模型和用例之间的迁移成为可能,例如,你可以先用强大的模型优化程序,然后将其迁移到更便宜的小模型上,同时保持不错的性能。
- 指标 (Metrics):指标与优化器配合使用,用来定义什么是“成功”。优化器会利用指标来判断每次调整是否有效。指标可以是严格的(如完全匹配),也可以是主观的(如让另一个LLM来评判)。
第四部分:代码演示——基础用法 (开始时间 35% - 55%)
- 环境设置:演示了如何使用Phoenix(Arize的观测平台)来追踪LLM调用。定义了多个LLM(如Claude、Gemini、GPT-4.1 mini),并展示了如何在程序中混合使用它们。
- 简单的情感分类器:用一个极其简短的签名
"text -> sentiment"就创建了一个情感分类器。通过添加额外指令(如“数字越低越负面”)来微调结果。展示了DSPy内置的缓存和用量统计功能。 - 处理PDF文档(简易RAG):使用
attachments库轻松加载在线PDF(如英伟达的SEC Form 4表单)。无需关心OCR或图像提取的细节,直接将其作为输入传给模型,询问“总共卖出了多少股?”。 - 灵活的文档分析:
- 无结构输出:创建一个签名,让模型自己决定从文档中提取哪些重要信息,并以字典形式返回。
- 有结构输出:预先定义好一个Pydantic模型(如包含交易日期、类型、数量等字段),然后让模型按照这个严格的结构提取信息,方便后续用
.符号访问数据。
- 适配器对比:分别使用默认的JSON适配器和BAML适配器来处理同一个任务,并通过
inspect_history查看底层生成的提示词。展示了BAML适配器生成的提示词更简洁、更易读,在某些复杂场景下性能更好。 - 多模态示例:上传一张包含街道标志的图片,询问“现在可以在这里停车吗?什么时候必须离开?”。演示了DSPy处理图像输入的能力。
- 自定义模块:将上述的图像分析逻辑封装成一个Python类(模块),并在其中添加计数器等业务逻辑,展示了模块的可复用性和可扩展性。
第五部分:代码演示——进阶用法与优化器 (开始时间 55% - 75%)
- 工具调用(ReAct Agent):创建了一个“简历分析Agent”,它可以使用两个工具(Perplexity搜索和获取URL内容)来查找人物背景。演示了如何异步执行多个这样的Agent,并获取其工具调用的轨迹(trajectory)用于调试。
- 优化器(Jeepo)实战:以一个客服消息分类为例,展示了完整的优化流程。
- 创建一个包含多个签名和模块的程序。
- 定义基于数据集的指标(如“紧急程度是否匹配”)。
- 运行优化器,它会使用一个更强大的“教师模型”来提供反馈,迭代地改进提示词。
- 优化结果是一个新的、经过优化的程序模块,可以被序列化保存或直接调用。
- 综合案例:通用文件处理器:这是一个端到端的示例,演示了如何构建一个能处理多种文件(合同、SEC文件、城市基础设施图片)的单一DSPy程序。
- 路由逻辑:程序首先使用一个分类器判断文件类型。
- 差异化处理:如果是SEC文件,则提取特定信息;如果是合同,则进行递归摘要;如果是图片,则进行视觉解读。不同的处理步骤甚至可以调用不同的模型(如图片用Gemini,文本用GPT-4.1)。
- 文档边界检测:演示了如何通过将PDF页面转为图片,再用一个ReAct Agent进行自我反思和工具调用,来自动识别合同的章节边界(如主文档、附件一、附件二等)。
第六部分:问答环节与总结 (开始时间 75% - 100%)
- 优化器的经验:只要你有质量良好、结构清晰的数据(10-100个输入输出对),优化效果就很显著。优化器不仅能提升整体分数,还能按指标分解,帮助你理解模型的强项和弱项。
- 优化器的输出是什么:优化器的输出本质上就是一个优化后的程序模块,你可以像使用其他模块一样保存、加载和调用它。其核心是一个被动态构建的、更优的提示词字符串。
- 优化器的工作原理:它本质上是LLM引导的,即用AI来构建AI。它通过分析失败案例,发现你没有明说的潜在要求(如“名字必须大写”),并将其添加到提示词中。
- 成本与上下文管理:
- 成本:DSPy本身不昂贵,成本取决于你调用了多少次LLM。虽然签名会增加一些提示词长度,但这通常不是主要的成本驱动因素。
- 长上下文:如果你担心长上下文带来的成本和性能问题,可以在程序或适配器中加入上下文压缩的逻辑。演讲者认为,随着模型上下文窗口越来越大,这个问题未来可能会被抽象掉。
- 持续学习:可以将用户反馈(如点赞/点踩)收集起来,加入到训练数据集中,然后定期重新运行优化器,实现离线版本的持续优化。
- 总结:DSPy为你提供了构建任意复杂工作流所需的基本构件(primitives)。它让你能够构建模块化、可组合的系统,并且拥有自动优化的能力。
📰 Read the original article on Dev.to AI
Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.