🤖 If DSPy is So Great, Why Isn't Anyone Using It?
AI工程
DSPy
框架设计
工程实践
下载量对比:
DSPy: 470万/月
LangChain: 2.22亿/月
DSPy: 470万/月
LangChain: 2.22亿/月
对于一个承诺解决 AI 工程最大挑战的框架,这个差距令人生疑。尽管使用 DSPy 的公司一致报告相同的好处:
- 可以快速测试新模型,即使当前 prompt 转移效果不佳
- 系统更可维护
- 更关注上下文而非基础设施
核心问题
DSPy 的问题不是它错了,而是它太难。抽象不熟悉,迫使你稍微不同的思考。而你现在想要的不是不同思考——只是让痛苦消失。
但我一直在观察同样的事情发生:人们最终会实现一个更糟糕的 DSPy 版本。
Khattab 定律: 任何足够复杂的 AI 系统都包含一个 bug 频发的、 informally-specified 的、半 DSPy 实现。
每个 AI 系统的自然演化
阶段 1:直接 API
client = OpenAI()
response = client.chat.completions.create(
model="gpt-5.2",
messages=[{"role": "user", "content": f"Extract: {text}"}]
)
阶段 2:配置化 Prompt
产品想要更快迭代。重新部署每个 prompt 变更太麻烦。于是把 prompt 存入数据库...
阶段 3:结构化输出
模型有时返回 "Company: Acme Corp" 而非纯 "Acme Corp"。于是添加 Pydantic 验证...
阶段 4:重试机制
添加 transient failure 处理和重试逻辑...
阶段 5:RAG
需要添加知识库来帮助改进提取...
阶段 6:评估基础设施
添加 evals 来衡量是否变好...
阶段 7:抽象层
class LLMModule:
def __init__(self, signature, prompt_key):
...
extract_company = LLMModule(
signature=CompanyExtraction,
prompt_key="extract_company_v3"
)
恭喜!你刚刚构建了一个更糟糕的 DSPy 版本。
DSPy 解决方案
import dspy
# 一行配置模型,随时切换
lm = dspy.LM("openai/gpt-5.2")
dspy.configure(lm=lm)
# Signature 定义类型化 I/O,无需 prompt 模板
class CompanyExtraction(dspy.Signature):
text: str = dspy.InputField()
company_name: str = dspy.OutputField()
confidence: float = dspy.OutputField()
# 模块将 signature 组合成管道
class CompanyExtractor(dspy.Module):
def __init__(self):
self.retrieve = dspy.Retrieve(k=5)
self.extract = dspy.ChainOfThought(CompanyExtraction)
def forward(self, text):
context = self.retrieve(text).passages
return self.extract(text=text, context=context)
一行切换模型:
dspy.configure(lm=dspy.LM("anthropic/claude-sonnet-4-20250514"))
evaluate(optimized) # 相同管道,不同模型
核心模式
| Signatures | 类型化输入输出。什么进,什么出,带 schema。 |
|---|---|
| Modules | 可组合单元,可独立测试、mock、链式调用。 |
| Optimizers | 改进 prompt 的逻辑,与运行它们的逻辑分离。 |
为什么好工程师写糟糕的 AI 代码
- 奇怪的反馈循环:无法单步调试 prompt,输出是概率性的
- 交付压力:让 LLM 工作像成就,干净架构像奢侈品
- 边界不清:prompt 既是代码又是数据
你应该怎么做
选项 1:使用 DSPy
接受学习曲线。读文档。构建一些玩具项目直到抽象 clicked。
选项 2:偷想法
不用 DSPy,但从第一天就按它的模式构建:
- ✓ 每个 LLM 调用都用类型化 I/O (Pydantic)
- ✓ 把 prompt 与代码分离
- ✓ 可组合单元:每个 LLM 调用都可测试、mock、链式
- ✓ 尽早建立评估基础设施
- ✓ 抽象模型调用:换 GPT-4 为 Claude 是一行代码改变
结论
DSPy 模式不是可选的。如果你的 AI 系统足够复杂,你会重新发明它们。唯一问题是你故意还是偶然去做。
你不必使用 DSPy。但你应该像理解它为什么存在那样去构建。