DSPy:评测驱动的提示优化
你将学会什么
Section titled “你将学会什么”- 说清 DSPy 与编排框架的区别(它管 prompt 工程自动化,不管流程编排)
- 用 Signature 声明任务、用 Module 选择执行策略
- 跑通「示例集 + 指标 + 优化器」的自动优化流程
前面几章学的都是「怎么编排 Agent 的流程」,DSPy 解决的是另一个问题:怎么让 prompt 不再靠手工调。它的口号是「Program, don’t prompt」——把任务声明为类型化签名(Signature),用评测指标(metric)和示例集(trainset)让优化器(optimizer)自动调优 prompt。
它和 LangGraph 这类框架是正交的:一个优化单步质量,一个编排多步流程,两者可以组合使用。
第一步,用签名声明「任务是什么」(代替手写 prompt 字符串):
# 安装: pip install dspyimport 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 Exampletrainset = [ 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 BootstrapFewShotoptimizer = BootstrapFewShot(metric=semantic_f1)optimized = optimizer.compile(extract, trainset=trainset) # 自动调 promptoptimized.save("extract_v2.json")
from dspy.evaluate import Evaluateevaluate = Evaluate(devset=trainset, metric=semantic_f1)print(evaluate(optimized)) # 量化「优化了多少」注意流程:先想清楚指标,再谈优化。指标没定义好,优化器「优化」出来的结果可能更差。
先自己回答,再看答案:
- Signature 和 Module 的分工是什么?
- 优化器需要哪两样东西才能工作?
- 为什么说「没有评测的 DSPy 只是普通封装」?
参考答案
- Signature 声明「任务是什么」(输入→输出字段),Module 决定「怎么做」(Predict 一步生成、ChainOfThought 先推理、ReAct 带工具循环)。
- 示例集(trainset)和指标(metric),优化器据此自动调 prompt 直到指标收敛。
- 因为 DSPy 的核心价值是用指标驱动自动优化;不评测就看不到优化收益,退化为普通 LLM 封装。
- DSPy 管「prompt 工程自动化」,与编排框架正交,可组合使用
- Signature 声明任务、Module 选择策略、Optimizer 自动调优
- 先定指标再优化;优化效果要用
Evaluate量化