大家好,我是木木。
今天给大家分享一个声明式的 Python 库,dspy。
dspy
很多人做 LLM 应用时,会一直改 Prompt:加一句约束、换一个例子、再补一个格式说明。dspy 的思路不太一样,它更像是在说:别只手写 Prompt,要把 AI 程序写成可组合、可评估、可优化的模块。
所以它很适合放在这组 Agent/LLM 框架的最后讲。前面几个库更偏“流程和工具”,dspy 更偏“声明任务、评估效果、自动优化提示和程序行为”。
项目地址:https://github.com/stanfordnlp/dspy
官方文档:https://dspy.ai
三大特点
声明式任务
用 Signature 描述输入输出,而不是把所有要求堆进一段 Prompt 字符串。
模块化程序
Predict、ChainOfThought、ReAct 等模块可以像普通 Python 组件一样组合,适合构建可维护 AI 程序。
可评估优化
DSPy 强调数据、指标和优化器,让系统不只是“感觉更好”,而是能用样本和 metric 迭代。
最佳实践
安装方式:python -m pip install dspy==3.2.1
下面的 Demo 不配置真实 LM,也不调用外部 API。它展示 DSPy 的 Signature、Example、Prediction 和 Evaluate 这些核心概念。
功能一:定义输入输出签名
这段代码解决什么问题:把“问题进来,答案出去”这种任务表达成结构,而不是写成一大段 Prompt。后续模块会基于这个签名组织调用。
importos,warnings,loggingos.environ['LITELLM_LOG']='ERROR'warnings.filterwarnings('ignore')logging.getLogger().setLevel(logging.ERROR)importdspytry:dspy.disable_logging()exceptException:passclassQA(dspy.Signature):"""回答用户问题。"""question:str=dspy.InputField()answer:str=dspy.OutputField()module=dspy.Predict(QA)print('module:',type(module).__name__)print('signature:',module.signature.__name__)print('inputs:',', '.join(module.signature.input_fields))print('outputs:',', '.join(module.signature.output_fields))
Signature 的价值在于把任务边界变清楚。你不再只是维护字符串,而是在维护“这个 AI 组件应该吃什么、吐什么”。
功能二:用样本和预测表达效果
这段代码解决什么问题:AI 程序需要样本来评估。DSPy 的 Example 可以指定输入字段,Prediction 表示程序输出,这样后面才能用指标判断好坏。
importos,warnings,loggingos.environ['LITELLM_LOG']='ERROR'warnings.filterwarnings('ignore')logging.getLogger().setLevel(logging.ERROR)importdspytry:dspy.disable_logging()exceptException:passexample=dspy.Example(question='DSPy 关注什么?',answer='编程而不是手写提示词').with_inputs('question')prediction=dspy.Prediction(answer='编程而不是手写提示词')print('input keys:',', '.join(example.inputs().toDict().keys()))print('label:',example.answer)print('prediction:',prediction.answer)print('match:',example.answer==prediction.answer)
这一步看起来简单,但很关键。没有样本和指标,Prompt 优化就容易变成玄学;有了样本和指标,迭代才有方向。
环境与版本信息
- Demo 环境:Windows 11,Python 3.11
- 当前包要求 Python:
>=3.10,<3.15 - 关键依赖版本:
litellm 1.83.0、gepa 0.0.27 - 官方定位:Programming, not prompting, LMs
高级功能
这段代码解决什么问题:给 AI 程序配置评估集和 metric,跑出一个可量化分数。真实项目里,优化器会依赖这些样本和指标来改进程序行为。
importos,warnings,loggingos.environ['LITELLM_LOG']='ERROR'warnings.filterwarnings('ignore')logging.getLogger().setLevel(logging.ERROR)importdspyfromdspy.evaluateimportEvaluatetry:dspy.disable_logging()exceptException:passexample=dspy.Example(question='DSPy 关注什么?',answer='编程而不是手写提示词').with_inputs('question')defprogram(question):returndspy.Prediction(answer='编程而不是手写提示词')defmetric(example,pred,trace=None):returnexample.answer==pred.answerresult=Evaluate(devset=[example],metric=metric,display_progress=False)(program)print('score:',result.score)print('items:',len(result.results))print('metric ok:',result.score==100.0)
DSPy 的优化能力要建立在好数据和好指标上。指标设计得差,优化器也只会把系统带向错误目标。
适用场景
- 你想把 Prompt 工程升级成可声明、可评估、可优化的 AI 程序
- 你在做 RAG、分类、抽取、Agent 或多阶段推理流程
不适用场景
上线检查
- 先定义清楚 Signature,再考虑模块和优化器。
总结
dspy 的核心不是“又一个 Prompt 框架”,而是把 LLM 应用当成可编程、可评估、可优化的软件。它适合那些已经不满足于手写 Prompt,想用工程方法迭代 AI 行为的团队。