dspy
斯坦福NLP开源,用Python编程而非调Prompt的LLM应用编译器框架
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
斯坦福NLP开源,用Python编程而非调Prompt的LLM应用编译器框架
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下这个场景:你花了三天时间精心调优一个 RAG 系统的 Prompt,结果换了个模型(从 GPT-4 切到 Claude),整个系统效果断崖式下跌,之前的心血几乎归零。这不是你的问题——这是 Prompt 工程 这种工作模式的根本缺陷:它太脆弱、太不可复用、太依赖手工试错。
DSPy 想彻底解决这个问题。它的核心思想一句话概括:用 Python 代码来编程语言模型,而不是用自然语言来提示它。这句话听起来有点绕,但它的意义不亚于从手写汇编到高级语言的飞跃——让 AI 应用开发真正变成一项工程化的、可复用的、可优化的技术活动。
DSPy 由斯坦福大学 NLP 实验室的 Omar Khattab 主导开发,2023 年 10 月正式发布论文,并在 GitHub 上迅速积累超过 3.6 万颗星,成为 AI 应用开发领域最受关注的框架之一。
它的诞生源于一个深刻的观察:few-shot learning 本质上是在手工做机器学习。当你为一个任务写示例时,你实际上在做特征工程;当你调整示例顺序时,你在调超参数。但这两件事,完全可以交给算法自动完成。
DSPy 最初借鉴了斯坦福 NLP 之前的 ColBERT 检索模型经验(Khattab 的博士论文工作),将 late interaction 思想引入 LLM 输出适配层,逐步演化成一个完整的声明式编程框架。
DSPy 的设计哲学可以类比为编译器架构:
Signature("question -> answer") 描述了一个输入问题、输出答案的任务。ChainOfThought(思维链)、ReAct(推理+行动)、ProgramOfThought(程序思维),每个模块封装了一种 LLM 调用策略。
图1:DSPy 的模块化架构,开发者通过 Python 代码组合不同模块
整个流程是:开发者用 Python 定义任务签名 + 组合模块 -> DSPy 运行时编译成实际 Prompt -> Teleprompter 根据评估反馈自动优化。这就是 DSPy 中 S(Self-improving)的含义:系统会自己变强。
适配器决定了 DSPy 如何与不同格式的 LLM API 对话。随着模型生态多样化(OpenAI、Anthropic、Google、DeepSeek、Llama……),每个模型的输出格式各异。DSPy 的 dspy/adapters/ 目录包含:
| 适配器 | 适用场景 |
|---|---|
JSONAdapter | 需要结构化 JSON 输出(如工具调用、代码生成) |
ChatAdapter | 标准对话 API(Chat Completions 格式) |
XMLAdapter | 模型用 XML 标签包裹输出(GPT-4 常用) |
TwoStepAdapter | 先推理再回答的两阶段模式 |
BAMLAdapter | 配合 BAML schema 做类型安全生成 |
适配器通过 dspy/adapters/types/ 定义了 Audio、Document、Code、Tool、Image 等丰富的输出类型,DSPy 能原生处理多模态输入输出。
dspy/predict/ 包含 20+ 种预测器:
Predict——最简单,直接调用签名定义的任务ChainOfThought、ProgramOfThought、MultiChainComparison——让模型分步推理ReAct、ReAct_v2、CodeAct——在推理过程中调用外部工具或代码执行Parallel(并行执行多个路径)、BestOfN(从 N 次生成中选最优)Retry——自动重试失败的任务,并附带上一轮的反馈信息dspy/teleprompt/ 则是优化算法的核心库:
dspy/retrievers/ 支持多种向量检索后端(Weaviate、Databricks),而 dspy/datasets/ 内置了 GSM8K(数学推理)、HotpotQA(多跳问答)等标准评测数据集,方便开箱即用地验证系统质量。
图2:DSPy 的自动 Prompt 优化流程
安装只需一行命令:
pip install dspy
示例:构建一个简易 RAG 问答系统
import dspy
# 1. 定义任务签名
class RAGSignature(dspy.Signature):
context = dspy.InputField(desc="包含相关事实的上下文段落")
question = dspy.InputField()
answer = dspy.OutputField()
# 2. 加载预训练语言模型
llm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=llm)
# 3. 加载检索器
colbertv2 = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')
dspy.configure(rm=colbertv2)
# 4. 组合模块
class RAG(dspy.Module):
def __init__(self):
super().__init__()
self.retrieve = dspy.Retrieve(k=3)
self.generate_answer = dspy.ChainOfThought(RAGSignature)
def forward(self, question):
context = self.retrieve(question).passages
return self.generate_answer(context=context, question=question)
# 5. 运行
rag = RAG()
response = rag("What is the capital of France?")
print(response.answer)
没有一行 Prompt!所有如何找到答案的知识都被编码在 ChainOfThought 模块里,由 DSPy 的签名系统统一管理。
根据论文和社区反馈,DSPy 在多个任务上显著优于手工调优的 Prompt:
JSONAdapter + Retry,工具调用成功率大幅提升pyproject.toml 要求 Python >= 3.10, < 3.15,较老的 Python 环境无法使用DSPy 的出现代表了 AI 应用开发范式的一次重要转变:
从手工调参到自动优化:传统做法是写 Prompt -> 测效果 -> 改 Prompt -> 再测,这是一个人力密集型的线性过程。DSPy 把它变成了定义任务 -> 自动搜索最优配置 -> 交付,人力成本降低一个数量级。
从模型绑定到模型无关:由于 Prompt 是由编译器自动生成的,更换底层模型时只需要改一行配置,而不是重写所有 Prompt。这让应用具备了真正的模型可移植性。
研究热度持续攀升:2025 年 7 月最新论文 GEPA(Reflective Prompt Evolution)证明,DSPy 的优化方法已能在某些任务上超越强化学习(PPO)方法,同时实现成本更低。这条技术路线仍在快速演进。
截至 2026 年,DSPy 已发布 v3.2.1,Star 数突破 3.6 万,被广泛应用于 RAG 管道构建、Agent 系统开发、代码生成优化等多个领域。对于希望系统化构建 AI 应用的团队,DSPy 是目前最值得投入学习的框架之一。