DSpY(常写作 DSPy,全称 DSP Optimizer)是由斯坦福大学 DSP 团队 开发的开源提示工程框架,核心目标是让大语言模型(LLM)自动生成、筛选和优化最优提示策略,无需人工手动设计复杂的提示模板(如 Medprompt 的手动组合策略),是一套 "用 LLM 自身优化 LLM 推理效果" 的端到端解决方案。
简单来说:Medprompt 是 "人工设计的高效提示策略",而 DSpY 是 "自动化生成 / 优化提示的工具框架"------ 前者是 "具体的方法",后者是 "能自动找到最优方法的工具"。
一、核心定位与特性
1. 核心价值
解决传统提示工程的痛点:人工设计提示模板耗时耗力、效果依赖经验、难以适配复杂任务;DSpY 通过自监督迭代 + 模块化设计,让模型自主学习最优提示逻辑,大幅降低人工干预成本。
2. 关键特性
| 特性 | 说明 |
|---|---|
| 自动化提示生成 | 无需手动写提示模板,框架自动生成、筛选、迭代最优提示(包括少样本示例、思维链模板等) |
| 模块化设计 | 将提示工程拆解为可复用的基础模块(检索、生成、评估),支持自由组合适配不同任务 |
| 自监督优化 | 用模型自身的输出作为反馈,迭代优化提示策略(比如用 LLM 评估自己生成的回答质量,再调整提示) |
| 多模型适配 | 兼容 GPT-4/Claude/LLaMA/Mistral 等主流大模型,无需针对单一模型定制 |
| 低代码门槛 | 只需定义任务的 "输入输出格式",无需编写复杂的提示逻辑,框架自动完成优化 |
二、核心组件与工作流程
1. 核心组件
DSpY 将提示工程拆解为 3 类核心模块,可灵活组合:
- Signature(签名) :定义任务的输入输出格式(核心,相当于 "任务说明书")。比如网络安全任务的 Signature 可定义为:
输入:网络安全问题 → 输出:推理链 + 攻击/漏洞类型。 - Module(功能模块) :基础执行单元,常见的有:
Retrieve:检索与问题相关的背景信息(对应 Medprompt 的 "动态少样本选择");Generate:根据提示生成回答(对应 Medprompt 的 "自生成思维链");Evaluate:评估生成结果的质量(比如判断回答是否准确、推理链是否完整)。
- Optimizer(优化器) :核心驱动,自动迭代优化提示策略,常见的有:
BootstrapFewShotOptimizer:优化少样本提示的示例选择(替代 Medprompt 的手动少样本选择);ChainOfThoughtOptimizer:自动生成最优的思维链(CoT)提示模板;Promptagator:迭代优化提示的措辞和逻辑。
2. 典型工作流程(以网络安全攻击识别为例)
无需手动构建样本库或设计提示模板,只需定义任务目标,DSpY 会自动完成以下步骤:
步骤1:定义任务Signature
→ 比如:输入=网络安全问题,输出=推理链+攻击类型
步骤2:初始化模块
→ Generator(用GPT-4生成回答)+ Evaluator(用GPT-4评估回答准确性)
步骤3:优化器自动工作
→ ① 生成少量初始提示示例;② 用Evaluator评估示例效果;③ 筛选最优示例和提示逻辑;④ 迭代优化
步骤4:输出最终结果
→ 用优化后的提示处理新问题,自动生成高质量推理链+答案
三、DSpY vs Medprompt(核心对比)
由于你此前关注 Medprompt,通过对比更易理解两者的定位差异:
| 对比维度 | DSpY | Medprompt |
|---|---|---|
| 核心定位 | 开源提示工程框架(自动化工具) | 特定提示策略(手动设计的组合技巧) |
| 核心逻辑 | 让模型自动生成 / 优化提示,自监督迭代 | 人工组合 "动态少样本 + 自生成 CoT + 选项洗牌" |
| 人工干预 | 低(仅需定义任务目标) | 高(需手动构建样本库、设计提示模板) |
| 适用场景 | 通用复杂任务(问答、摘要、代码、推理等,可自定义) | 以医学为主的专业问答(可迁移到其他领域,但需手动适配) |
| 灵活性 | 高(模块化组合,适配任意任务) | 中(仅适配 "问答 + 选项" 类任务) |
| 上手成本 | 低(无需提示工程经验) | 高(需理解提示策略的底层逻辑) |
四、实际应用示例(网络安全场景)
以下是用 DSpY 解决 "识别网络攻击类型" 的极简代码示例(核心逻辑):
# 1. 导入DSpY核心库
import dspy
from dspy.optimizers import BootstrapFewShotOptimizer
# 2. 配置模型(以GPT-4为例)
gpt4 = dspy.OpenAI(model='gpt-4o', api_key='你的API密钥')
dspy.settings.configure(lm=gpt4)
# 3. 定义任务Signature(输入输出格式)
class AttackDetection(dspy.Signature):
"""识别网络攻击类型,需输出详细推理链"""
question = dspy.InputField(desc="网络安全问题")
reasoning_chain = dspy.OutputField(desc="详细推理链,含特征分析、排除逻辑")
attack_type = dspy.OutputField(desc="具体攻击类型")
# 4. 定义生成模块(根据Signature生成回答)
class AttackDetector(dspy.Module):
def __init__(self):
super().__init__()
self.generate_answer = dspy.ChainOfThought(AttackDetection) # 自动生成思维链
def forward(self, question):
return self.generate_answer(question=question)
# 5. 初始化优化器(自动优化少样本提示)
optimizer = BootstrapFewShotOptimizer(
metric=lambda pred, gold: pred.attack_type == gold.attack_type, # 评估标准:攻击类型准确
max_bootstrapped_demos=3, # 自动生成3个最优示例
)
# 6. 少量原始样本(无需手动写思维链)
train_data = [
dspy.Example(question="服务器收到大量SYN包无ACK响应,资源耗尽", attack_type="SYN洪水攻击").with_inputs("question"),
dspy.Example(question="钓鱼邮件附件触发文件加密,弹出勒索提示", attack_type="勒索病毒攻击").with_inputs("question"),
]
# 7. 自动优化提示策略
optimized_detector = optimizer.compile(AttackDetector(), trainset=train_data)
# 8. 处理新问题(自动生成推理链+答案)
new_question = "员工点击钓鱼邮件后,主机向外发送大量未知流量,文件被加密"
result = optimized_detector(question=new_question)
# 输出结果
print("推理链:", result.reasoning_chain)
print("攻击类型:", result.attack_type)
输出结果(自动生成,无需手动设计提示):
推理链: 1. 特征分析:核心触发条件为钓鱼邮件附件,核心现象为文件加密+向外发送未知流量;2. 排除逻辑:SYN洪水攻击无文件加密特征,SQL注入无邮件触发和文件加密特征,挖矿病毒仅CPU占用高无加密;3. 结论:符合勒索病毒攻击的核心特征(钓鱼触发、文件加密、异常流量)。
攻击类型: 勒索病毒攻击