← 返回资料站  /  AI for AI
论文 Prompt 优化 ★ 必读

DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines

DSPy:把 LM 流水线写成程序,让编译器自动优化 prompt
一句话把多步 LM 流水线抽象成声明式模块组成的 Python 程序,prompt(few-shot 示例、指令)当作可优化参数,由"编译器"(teleprompter)按 metric 自动搜索:GSM8K 上 GPT-3.5 从 24% 提到 88%(dev)、Llama2-13b 从 7% 提到 49%,自举出的 demonstrations 追平人写 CoT;ICLR 2024 spotlight,框架本身成了 prompt 优化方向的事实标准(37.6k stars,2026-08 仍活跃)。

这是什么

2023 年时构建多步 LM 系统的主流做法是手写长 prompt 模板,再靠试错微调字符串。论文把这类做法类比成"手工调神经网络权重":一段针对某模型调好的 prompt,换 pipeline、换 LM、换数据域就可能失效。DSPy(Demonstrate-Search-Predict 框架的第二代)提出用编程模型取而代之:LM 流水线是一张 text transformation graph,prompt 不再是手写常量,而是可以被优化器自动生成和选择的参数。

整个编程模型只有三个抽象:signature(自然语言类型的函数签名,声明这一步"做什么")、module(实现签名的参数化组件,如 Predict、ChainOfThought、ReAct,可像 PyTorch 层一样任意组合)、teleprompter(优化器,拿程序 + 少量训练样例 + metric,返回一个编译后的新程序)。设计上处处对标 PyTorch 的 define-by-run:先声明模块,再在 forward 里用任意 Python 控制流把它们连起来。

要注意论文和今天的框架是两个时间切面:论文验证的是 2023 年的 BootstrapFewShot 一族优化器和 GPT-3.5/Llama2-13b 时代的模型;此后 API 大改(teleprompter 更名 optimizer),主推优化器已换代成 MIPROv2(arXiv 2406.11695)和 GEPA(arXiv 2507.19457,本目录已收)。读这篇论文的价值在于理解"prompt 即参数、pipeline 即程序、优化即编译"这套范式的原始设计。

按论文 Table 1 重绘的 GSM8K dev 准确率。看两点:同一模型下,从 zero-shot 到 bootstrap 编译的提升(GPT-3.5:24.0→88.3)远大于换 prompting 技巧的提升;bootstrap 自举的 demonstrations(80.3)超过人写 CoT(78.6),这是"砍掉手工 prompt"主张的直接证据。
按论文 Table 1 重绘的 GSM8K dev 准确率。看两点:同一模型下,从 zero-shot 到 bootstrap 编译的提升(GPT-3.5:24.0→88.3)远大于换 prompting 技巧的提升;bootstrap 自举的 demonstrations(80.3)超过人写 CoT(78.6),这是"砍掉手工 prompt"主张的直接证据。

机制与做法

Signature:用字段名声明任务,而不是写 prompt

一个 signature 就是一组输入/输出字段(可带可选指令),简写如 "question -> answer" 或 "context, question -> search_query"。字段名本身携带语义:DSPy 会把 english_document -> french_translation 自动展开成英译法的提示词,并负责结构化格式与解析,避免用户程序里脆弱的字符串拼接。dspy.Predict("question -> answer") 一行就是一个完整可运行的 QA 程序。

按论文 Table 2 重绘的 HotPotQA answer EM(dev)。简单的两跳 multihop 程序 + bootstrap 编译全面胜过单跳 RAG 和 ReAct;编译后的 Llama2-13b(multihop ensemble 50.0)追平甚至超过多数 GPT-3.5 设置——模块组合 + 编译比模型大小更关键。
按论文 Table 2 重绘的 HotPotQA answer EM(dev)。简单的两跳 multihop 程序 + bootstrap 编译全面胜过单跳 RAG 和 ReAct;编译后的 Llama2-13b(multihop ensemble 50.0)追平甚至超过多数 GPT-3.5 设置——模块组合 + 编译比模型大小更关键。

Module:把 prompting 技术泛化成可组合、可参数化的层

核心模块 Predict 存三样东西:signature、所用 LM、demonstrations 列表(初始为空)。ChainOfThought、ProgramOfThought、MultiChainComparison、ReAct 等内置模块把文献里的 prompting 技巧翻译成对任意 signature 通用的函数——实现都只有几行:比如 ChainOfThought 只是在签名前插入一个 rationale 输出字段再调 Predict。每个模块的可优化参数有三类:调用哪个 LM、指令/字段前缀、以及最重要的 demonstrations(对 frozen LM 是 few-shot 例子,对小模型是微调数据)。

论文附录 D 对照展示了社区流行库里动辄几百行的手写 reasoning prompt——DSPy 的立场是这些都应该由编译器针对具体 pipeline 和 LM 自动生成。

Teleprompter(编译器):三阶段优化

阶段一,候选生成:递归找出程序里所有 Predict 模块,用 teacher 程序(默认就是待编译程序的 zero-shot 版)在训练输入上模拟运行,透明地记录每个模块的多阶段 trace,用 metric 过滤,通过的 trace 就成为各模块的候选 demonstrations——本质是拒绝采样。关键的标签效率:训练样例只需要最终输出的标签(甚至可以没有,取决于 metric),中间步骤的"标注"全部自举出来,所以换 pipeline 只需重新编译,不需重新标数据。

阶段二,参数优化:对候选 demonstrations/指令做离散搜索,论文用随机搜索和 Optuna(TPE);BootstrapFinetune 则把 demonstrations 变成微调数据直接更新小模型权重。阶段三,高阶程序优化:改变程序控制流本身,论文只用了最简单的 ensemble(多份自举程序并行跑 + majority voting)。

teleprompter 可组合:设 teacher=compiled_rag 就能用大模型编译出的程序去监督小模型(如 Flan-T5-large)的微调,构成"贵程序教便宜程序"的蒸馏链。

实验设置与成本

两个 case study:GSM8K 数学题(200 训练 / 300 dev / 1.3k test)和 HotPotQA fullwiki 多跳问答(ColBERTv2 检索 Wikipedia 2017 abstracts)。所有程序都只由 2-4 个通用模块组合而成,没有任何任务特定的手写 prompt。编译在分钟到几十分钟量级:即使最贵的设置也只需运行程序几千次(10-20 个 trial × 150-300 个验证样例),可并行。

关键结果

实证核查

扎实论文声称与开源代码一致,范式被大规模采用且有第三方独立验证;但论文数字多为 dev 集、用的是 2023 年的模型,且社区对框架工程体验(抽象难懂、依赖良好 metric)的批评持续存在——这些是工程争议,不构成对论文声称的否定。
编译后的简短 DSPy 程序超过标准 few-shot prompt(GPT-3.5 +25%、llama2-13b +65%)和专家手写示范(最高 +46%)。
代码全开源(github.com/stanfordnlp/dspy,MIT),论文的 BootstrapFewShot/签名/Predict 抽象至今仍在框架里可直接复跑同类实验。第三方独立验证方向一致:Jomsborg Lab 用 DSPy 优化 Phi-3 在 GSM8K 报 90%(medium.com/@JacekWo/phi3-on-steroids-6576a3401351);Skanda Vivek 的独立评测承认 DSPy 一次迭代生成的 prompt(含 CoT + few-shot)达到其手工调 5 分钟的水平(medium.com/emalpha/dspy-does-it-live-up-to-the-hype-6e56c2c6e7a0)。注意论文表格主对比都在 dev(n=300),test 只报了代表性设置。
"几行代码 + 几分钟编译"即可自举高质量 pipeline,可取代手工 prompt engineering。
有前提:需要可自动判分的 metric 和一批训练输入。HN 讨论(news.ycombinator.com/item?id=41213561)的核心质疑正是"magic sauce 是 well-defined metric,现实业务常常没有",顶楼批评抽象"混乱、convoluted"、少见 toy example 之外的应用;辩护方给出 Databricks 企业落地博客和 STORM 等真实系统。2026-03 的第三方分析(skylarbpayne.com/posts/dspy-engineering-patterns)给出量化对比:DSPy 月下载 4.7M vs LangChain 222M,结论是"问题不在错,而在难"——采用它的公司报告的收益(换模型快、可维护性好)与论文主张一致。
DSPy 是通用的、可持续演进的编程模型(而非一次性论文代码)。
这条被时间验证:repo 37,663 stars、2026-08-28 仍在 push、未归档;README 显示同一编程模型后续长出 MIPROv2(arXiv 2406.11695)、BetterTogether(2407.10930)、GEPA(2507.19457)等优化器,GEPA 即本目录收录条目。代价是 API 与论文明显脱节(teleprompter 更名 optimizer、论文里的 dspy.Retrieve/ColBERTv2 工作流已边缘化),且 643 个 open issues 里不乏新模块的质量问题(如 #10256 ReActV2 无 async 路径、#9938 MIPROv2 在 zero-shot 模式下 crash)——按论文复现概念没问题,但别期望论文代码片段原样能跑。
发表与同行评审。
ICLR 2024 spotlight(openreview.net/forum?id=sY5N0zY5Od),非 cherry-pick 的宣传性说法;S2 引用数 949(2026-08)。

与我们方向的关系

这是"用程序化方法自动改进 AI 系统"(ai4ai)这条线的地基:它第一次把 prompt、demonstrations、乃至小模型权重统一成同一个优化问题的参数,把"调 prompt"变成"跑编译"。目录里的 GEPA 就是作为 DSPy 优化器发布的,MIPROv2 也是——不理解 signature/module/optimizer 这套抽象,就看不懂后续这一族工作在优化什么。

可直接借鉴的三个机制:(1) 拒绝采样式 bootstrap——用 metric 过滤成功 trace 作为中间步骤的免标注监督,这个想法在任何多步 agent 的自我改进里都能复用;(2) metric 本身可以是另一个 LM 程序,评价器和被评价者同框优化;(3) teacher=编译后的大模型程序 → 蒸馏小模型的 compile 链,是低成本部署的现成配方。做实验时的实用提醒:直接用 2026 年的 DSPy + MIPROv2/GEPA,论文里的 BootstrapFewShot 只当 baseline。

阅读笔记

这篇论文没有一张真正的插图——所有 figure 环境都是代码 listing,正文论证全靠代码和两张结果表,所以本条目的两张图是我们按论文 Table 1/2 重绘的。读数字时注意:主要对比在 dev 集(n=300),模型是 GPT-3.5 和 Llama2-13b-chat,绝对数字早已过时,该看的是"编译 vs 不编译"的相对差距和"小模型编译后追平大模型"的模式。teleprompter 这个名字论文自己都承认起得怪,后来改叫 optimizer。

材料清单

TeX 源码
已存档:Raw/dspy/source/
代码仓库github.com/stanfordnlp/dspy
37663★ · 最近推送 2026-08-28
官方文档dspy.ai/
当前版本 API 与教程(与论文时期差异大,以此为准)
OpenReviewopenreview.net/forum?id=sY5N0zY5Od
ICLR 2024 spotlight,含评审意见
后续优化器 MIPROv2arxiv.org/abs/2406.11695
论文优化器的换代版:联合优化指令与 demonstrations
第三方批评与采用分析skylarbpayne.com/posts/dspy-engineering-patterns/
2026-03:下载量对比、"难而非错"的采用障碍分析
HN 讨论news.ycombinator.com/item?id=41213561
对抽象设计与 metric 前提的典型质疑与辩护

同类条目