🤖 If DSPy is So Great, Why Isn't Anyone Using It?

⭐⭐⭐⭐⭐ 5星 | 作者: Skylar Payne | 来源: Hacker News
AI工程 DSPy 框架设计 工程实践
下载量对比:
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。但你应该像理解它为什么存在那样去构建。