跳转到内容

DSPy:评测驱动的提示优化

  • 说清 DSPy 与编排框架的区别(它管 prompt 工程自动化,不管流程编排)
  • 用 Signature 声明任务、用 Module 选择执行策略
  • 跑通「示例集 + 指标 + 优化器」的自动优化流程

前面几章学的都是「怎么编排 Agent 的流程」,DSPy 解决的是另一个问题:怎么让 prompt 不再靠手工调。它的口号是「Program, don’t prompt」——把任务声明为类型化签名(Signature),用评测指标(metric)和示例集(trainset)让优化器(optimizer)自动调优 prompt。

它和 LangGraph 这类框架是正交的:一个优化单步质量,一个编排多步流程,两者可以组合使用。

第一步,用签名声明「任务是什么」(代替手写 prompt 字符串):

# 安装: pip install dspy
import dspy
lm = dspy.LM("openai/gpt-4o-mini") # 或 dspy.configure(lm=lm) 全局生效
dspy.configure(lm=lm)
class ExtractEvent(dspy.Signature):
"""Extract event details from an email.""" # 任务说明(会进入 prompt)
email: str = dspy.InputField() # 输入字段
event_name: str = dspy.OutputField() # 输出字段
date: str = dspy.OutputField()
extract = dspy.Predict(ExtractEvent) # Module:直接生成
result = extract(email="Meeting tomorrow 3pm at the cafe")
print(result.event_name, result.date) # 返回签名里声明的字段

第二步,是 DSPy 的灵魂——用数据自动改进 prompt

from dspy import Example
trainset = [
Example(email="...", event_name="Dentist", date="2026-09-01").with_inputs("email"),
# 10~20 个例子就足够驱动优化
]
def semantic_f1(gold, pred, trace=None):
"""指标:给输出打分,判断对不对(可自定义语义相似度)"""
return 1.0 if gold.event_name == pred.event_name else 0.0
from dspy.optimizers import BootstrapFewShot
optimizer = BootstrapFewShot(metric=semantic_f1)
optimized = optimizer.compile(extract, trainset=trainset) # 自动调 prompt
optimized.save("extract_v2.json")
from dspy.evaluate import Evaluate
evaluate = Evaluate(devset=trainset, metric=semantic_f1)
print(evaluate(optimized)) # 量化「优化了多少」

注意流程:先想清楚指标,再谈优化。指标没定义好,优化器「优化」出来的结果可能更差。

先自己回答,再看答案:

  1. Signature 和 Module 的分工是什么?
  2. 优化器需要哪两样东西才能工作?
  3. 为什么说「没有评测的 DSPy 只是普通封装」?
参考答案
  1. Signature 声明「任务是什么」(输入→输出字段),Module 决定「怎么做」(Predict 一步生成、ChainOfThought 先推理、ReAct 带工具循环)。
  2. 示例集(trainset)和指标(metric),优化器据此自动调 prompt 直到指标收敛。
  3. 因为 DSPy 的核心价值是用指标驱动自动优化;不评测就看不到优化收益,退化为普通 LLM 封装。
  • DSPy 管「prompt 工程自动化」,与编排框架正交,可组合使用
  • Signature 声明任务、Module 选择策略、Optimizer 自动调优
  • 先定指标再优化;优化效果要用 Evaluate 量化
DSPy 小测
x
1 / 3

DSPy 与 LangGraph 的关系是?