DSPy
DSPy 是一个开源框架,它通过带类型的签名和模块构建 LLM 流水线,然后针对某个指标优化提示词。
DSPy 是一个开源 Python 框架,用于通过代码而非手写提示构建基于大型语言模型(LLM)的应用。开发者声明每个步骤的输入和输出,将这些步骤组合成程序,再让 DSPy 优化器编写并调整提示,或者调整模型的权重,以最大化一组示例上的某项指标。这个名称是 Declarative Self-improving Python(声明式自改进 Python)的缩写;该项目将自身描述为用于编程而非提示语言模型的框架。斯坦福大学的 Omar Khattab 及其同事在 2023 年 10 月的论文 DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines 中介绍了该框架。编译只需几分钟,几行 DSPy 代码就能让 GPT-3.5 和 Llama-2-13B-chat 构建的流水线分别比标准 few-shot 提示高出 25% 以上和 65% 以上;与使用专家编写示例的流水线相比,性能最高分别提升 46% 和 40%。
签名、模块与优化器#
- 签名:以类型化方式声明某个步骤的输入和输出,可以像
"question -> answer"一样内联编写,也可以声明为在文档字符串中说明任务的类。签名说明步骤的作用,并将提示的措辞留给 DSPy 处理。 - 模块:运行签名的策略。
dspy.Predict会调用模型一次;dspy.ChainOfThought会像思维链提示那样在答案前添加推理字段;dspy.ReAct则会以ReAct 提示的方式运行工具调用循环。模块可以像 PyTorch 层一样组合成多步骤程序,例如检索增强生成(RAG)流水线:先编写搜索查询、检索段落,再根据这些段落作答。 - 适配器:将签名转换为发送给模型的聊天消息,再将模型回复解析回类型化字段。
- 优化器:根据某项指标改进程序的算法。
BootstrapFewShot会在训练示例上运行程序,并将通过指标检查的执行轨迹保留为示例;MIPROv2会搜索候选指令和示例集合;BootstrapFinetune则通过微调将程序蒸馏到模型权重中。
优化循环与模型训练过程类似,只不过参数是提示:
2025 年的 GEPA 优化器可通过 dspy.GEPA 使用,它会读取程序的执行轨迹和文本反馈,让 LLM 反思问题所在,再据此不断改进指令。在六项任务中,它的表现平均比强化学习方法 GRPO 高 6%,最高高出 20%,同时使用的 rollout 最多减少 35 倍;它的表现也比 MIPROv2 高出 10% 以上。
从签名到提示#
DSPy 会根据签名生成提示,因此同一个程序可以针对新模型重新优化,而不必重写。这里的输入是来自 Ultralytics YOLO26 的检测摘要:Results.verbose() 会将预测模式的结果以简短字符串形式返回各类别的计数,签名可以将其作为文本接收,让优化器根据真实目标检测输出调整推理步骤。格式化消息无需模型或 API 密钥:
import dspy
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
class SceneQA(dspy.Signature):
"""Answer a question about a photo from the objects a detector found in it."""
detections: str = dspy.InputField()
question: str = dspy.InputField()
answer: str = dspy.OutputField()
# The adapter turns the signature and inputs into the chat messages the model will receive
inputs = {"detections": results[0].verbose(), "question": "How many people are in the photo?"}
messages = dspy.ChatAdapter().format(SceneQA, demos=[], inputs=inputs)
for message in messages:
print(f"--- {message['role']} ---\n{message['content']}")系统消息列出了输入和输出字段、DSPy 用于解析回复的 [[ ## field ## ]] 标记,以及作为优化目标的文档字符串;用户消息则包含检测器的计数。优化器会通过改写优化目标并向消息中添加示例来改进程序,同时保持 Python 代码不变。










