Prompt 自动优化:DSPy 与自动提示词工程(2026 年版)
AI 导读
Prompt 自动优化:DSPy 与自动提示词工程(2026 年版) 1. 引言 手工编写 Prompt 是一门"炼金术":凭经验调整措辞、添加示例、调整格式,通过反复试错达到满意的效果。这种方式存在三个根本问题: 不可复现:好的 Prompt 高度依赖编写者的经验和直觉 不可扩展:每换一个任务或模型,就要重新调整 不可评估:难以量化 Prompt A 比 Prompt B 好多少...
Prompt 自动优化:DSPy 与自动提示词工程(2026 年版)
1. 引言
手工编写 Prompt 是一门"炼金术":凭经验调整措辞、添加示例、调整格式,通过反复试错达到满意的效果。这种方式存在三个根本问题:
- 不可复现:好的 Prompt 高度依赖编写者的经验和直觉
- 不可扩展:每换一个任务或模型,就要重新调整
- 不可评估:难以量化 Prompt A 比 Prompt B 好多少
自动提示词工程(Automatic Prompt Engineering, APE)旨在用算法替代人工试错,让 Prompt 优化变成一个可量化、可复现、可自动化的工程过程。其中最具代表性的框架是斯坦福大学的 DSPy。
2. 自动 Prompt 优化的谱系
手工 Prompt Engineering
|
v
模板化 Prompt(固定格式 + 变量填充)
|
v
Prompt 搜索(枚举/采样多种表述)
|
v
Prompt 优化(基于评估反馈自动迭代)
|
v
程序化 Prompt(DSPy:声明式 + 编译式)
2.1 各层级的技术代表
| 层级 | 技术 | 代表工具 | 自动化程度 |
|---|---|---|---|
| 手工 | 人工编写 | ChatGPT/Claude | 0% |
| 模板化 | Jinja/f-string 模板 | LangChain PromptTemplate | 10% |
| Prompt 搜索 | 穷举/采样 | APE (Zhou et al. 2022) | 50% |
| Prompt 优化 | 梯度/反馈迭代 | OPRO, PromptBreeder | 70% |
| 程序化 | 声明式编程 + 编译 | DSPy | 90% |
3. DSPy 框架详解
3.1 什么是 DSPy
DSPy(Declarative Self-improving Language Programs, Pythonically)是斯坦福 NLP 组开发的框架。其核心思想是:
不要写 Prompt,写程序。让编译器为你生成最优 Prompt。
传统方式:
人类 → 手写 Prompt → LLM → 输出 → 人类评估 → 修改 Prompt → 循环
DSPy 方式:
人类 → 定义签名(输入→输出) → 定义模块(推理结构) → 编译(自动优化) → 最优 Prompt
3.2 DSPy 的三大核心概念
3.2.1 签名(Signature)
签名定义了任务的输入和输出,类似于函数签名。
import dspy
# 简单签名(字符串语法)
classify = dspy.Predict("sentence -> sentiment")
# 完整签名(类语法)
class SentimentClassification(dspy.Signature):
"""对给定句子进行情感分类。"""
sentence: str = dspy.InputField(desc="待分析的中文句子")
sentiment: str = dspy.OutputField(desc="情感类别:积极/消极/中性")
confidence: float = dspy.OutputField(desc="置信度,0-1 之间")
签名的作用是将 Prompt 工程从"怎么说"转变为"要什么"。你只需声明任务的语义,DSPy 负责生成实际的 Prompt。
3.2.2 模块(Module)
模块定义了推理的结构,类似于 PyTorch 中的 nn.Module。
class RAGAnswer(dspy.Module):
def __init__(self, num_passages=3):
super().__init__()
self.retrieve = dspy.Retrieve(k=num_passages)
self.generate = dspy.ChainOfThought("context, question -> answer")
def forward(self, question):
context = self.retrieve(question).passages
answer = self.generate(context=context, question=question)
return answer
DSPy 提供了多种内置模块:
| 模块 | 说明 | 对应的 Prompt 技术 |
|---|---|---|
dspy.Predict |
基础预测 | 直接 Prompt |
dspy.ChainOfThought |
链式思维 | CoT |
dspy.ProgramOfThought |
程序化思维 | 生成代码后执行 |
dspy.ReAct |
推理+行动 | ReAct Agent |
dspy.MultiChainComparison |
多路径比较 | Self-Consistency |
dspy.Retrieve |
检索 | RAG |
3.2.3 优化器(Optimizer / Teleprompter)
优化器是 DSPy 的核心创新:基于训练数据和评估指标,自动搜索最优的 Prompt。
from dspy.teleprompt import BootstrapFewShot
# 定义评估指标
def accuracy_metric(example, prediction, trace=None):
return example.answer == prediction.answer
# 创建优化器
optimizer = BootstrapFewShot(
metric=accuracy_metric,
max_bootstrapped_demos=4,
max_labeled_demos=16
)
# 编译(优化)
optimized_rag = optimizer.compile(
RAGAnswer(),
trainset=train_examples
)
3.3 DSPy 的优化器全览
| 优化器 | 原理 | 适用场景 | 数据需求 |
|---|---|---|---|
BootstrapFewShot |
从训练集中自动挑选最优 Few-shot 示例 | 通用 | 少量标注数据 |
BootstrapFewShotWithRandomSearch |
随机搜索 + Few-shot | 通用(更稳定) | 少量标注数据 |
MIPRO |
多指令优化 | 复杂任务 | 中等数据 |
MIPROv2 |
MIPRO 改进版 | 复杂任务(推荐) | 中等数据 |
BootstrapFinetune |
生成训练数据后微调模型 | 大规模部署 | 较多数据 |
COPRO |
坐标提升优化指令 | 指令优化 | 中等数据 |
SignatureOptimizer |
直接优化签名描述 | 签名调优 | 少量数据 |
3.4 DSPy 实战示例
示例 1:情感分析
import dspy
# 1. 配置 LLM
lm = dspy.LM("openai/gpt-4o-mini")
dspy.configure(lm=lm)
# 2. 定义签名
class SentimentAnalysis(dspy.Signature):
"""分析中文电商评论的情感倾向。"""
review: str = dspy.InputField(desc="中文商品评论")
sentiment: str = dspy.OutputField(
desc="情感分类:positive/negative/neutral"
)
reason: str = dspy.OutputField(desc="判断依据,一句话")
# 3. 定义模块
class SentimentClassifier(dspy.Module):
def __init__(self):
super().__init__()
self.classify = dspy.ChainOfThought(SentimentAnalysis)
def forward(self, review):
return self.classify(review=review)
# 4. 准备训练数据
train_examples = [
dspy.Example(
review="这个手机壳质量很好,手感也不错",
sentiment="positive"
).with_inputs("review"),
dspy.Example(
review="收到货发现有划痕,很失望",
sentiment="negative"
).with_inputs("review"),
# ... 更多示例
]
# 5. 编译优化
from dspy.teleprompt import BootstrapFewShot
optimizer = BootstrapFewShot(
metric=lambda ex, pred, _: ex.sentiment == pred.sentiment,
max_bootstrapped_demos=4
)
optimized_classifier = optimizer.compile(
SentimentClassifier(),
trainset=train_examples
)
# 6. 使用
result = optimized_classifier(review="发货速度很快,包装也很用心")
print(f"情感: {result.sentiment}")
print(f"原因: {result.reason}")
示例 2:多步 RAG 问答
class MultiStepRAG(dspy.Module):
def __init__(self):
super().__init__()
self.decompose = dspy.ChainOfThought(
"question -> sub_questions: list[str]"
)
self.retrieve = dspy.Retrieve(k=3)
self.answer_sub = dspy.ChainOfThought(
"context, sub_question -> sub_answer"
)
self.synthesize = dspy.ChainOfThought(
"question, sub_answers: list[str] -> final_answer"
)
def forward(self, question):
# 步骤 1:分解问题
decomposition = self.decompose(question=question)
# 步骤 2:逐一检索和回答子问题
sub_answers = []
for sub_q in decomposition.sub_questions:
context = self.retrieve(sub_q).passages
sub_answer = self.answer_sub(
context=context, sub_question=sub_q
)
sub_answers.append(sub_answer.sub_answer)
# 步骤 3:综合最终答案
final = self.synthesize(
question=question, sub_answers=sub_answers
)
return final
3.5 DSPy 的优势与局限
优势:
| 优势 | 说明 |
|---|---|
| 声明式编程 | 关注"做什么"而非"怎么写 Prompt" |
| 自动优化 | 基于数据和指标自动找最优 Prompt |
| 模型无关 | 换模型后重新编译即可,无需重写 Prompt |
| 可组合 | 模块可以嵌套组合,构建复杂管道 |
| 可评估 | 内置评估框架,量化 Prompt 效果 |
| 可复现 | 相同的代码 + 数据 + 编译 = 相同的结果 |
局限:
| 局限 | 说明 |
|---|---|
| 学习曲线 | 需要理解新的编程范式 |
| 调试难度 | 编译后的 Prompt 是黑盒 |
| 数据依赖 | 需要一定量的标注数据 |
| 编译成本 | 优化过程需要大量 LLM 调用 |
| 社区规模 | 相比 LangChain 社区较小 |
4. 其他自动 Prompt 优化方法
4.1 OPRO(Optimization by PROmpting)
Google DeepMind 提出的方法,核心思想是用 LLM 本身来优化 Prompt。
流程:
1. 初始化一组 Prompt 候选
2. 在评估集上测试每个 Prompt 的得分
3. 将 Prompt + 得分作为上下文,让 LLM 生成新的 Prompt
4. 重复 2-3 直到收敛
Meta-Prompt 示例:
"以下是一些提示词及其在任务上的得分:
提示词 1: '请分类以下文本的情感' - 得分: 72%
提示词 2: '判断这段话是积极还是消极的' - 得分: 78%
提示词 3: '作为情感分析专家,请...' - 得分: 85%
请生成一个新的提示词,目标是获得更高的得分。"
4.2 PromptBreeder
DeepMind 的另一个方法,借鉴了遗传算法的思想。
初始种群:N 个 Prompt
|
v
变异操作:LLM 生成 Prompt 的变体
|
v
交叉操作:组合两个 Prompt 的优势
|
v
选择操作:保留得分最高的 Prompt
|
v
重复直到收敛
4.3 TextGrad
利用 LLM 提供的"文本梯度"来优化 Prompt。
# TextGrad 的核心思想
# 1. 前向传播
prompt = "请将以下英文翻译为中文"
output = llm(prompt + input_text)
# 2. 评估
loss = evaluate(output, ground_truth)
# 3. 文本梯度(LLM 生成的改进建议)
gradient = llm(f"""
当前 Prompt: {prompt}
当前输出: {output}
期望输出: {ground_truth}
评估得分: {loss}
请分析 Prompt 的问题,并建议如何修改以获得更好的输出。
""")
# 4. 更新
new_prompt = llm(f"""
当前 Prompt: {prompt}
改进建议: {gradient}
请生成改进后的 Prompt。
""")
4.4 方法对比
| 方法 | 优化对象 | 搜索策略 | 需要标注数据 | 实现复杂度 |
|---|---|---|---|---|
| OPRO | Prompt 文本 | 元提示迭代 | 是 | 低 |
| PromptBreeder | Prompt 文本 | 遗传算法 | 是 | 中 |
| TextGrad | Prompt + 中间变量 | 文本梯度下降 | 是 | 中 |
| DSPy | 示例 + 指令 + 结构 | 多种优化器 | 是 | 高 |
5. 企业落地实践
5.1 什么时候需要自动 Prompt 优化
| 信号 | 说明 |
|---|---|
| Prompt 迭代超过 10 次 | 人工调优效率太低 |
| 需要适配多个模型 | 手工为每个模型写 Prompt 不现实 |
| 有量化评估指标 | 可以定义明确的优化目标 |
| 有标注数据 | 至少 50-100 条标注样本 |
| 需要生产级可靠性 | 不能容忍 Prompt 脆弱性 |
5.2 企业 Prompt 优化管线
数据准备 优化阶段 部署阶段
────────── ────────── ──────────
1. 收集真实输入 3. 选择优化方法 6. A/B 测试
2. 标注黄金答案 - DSPy (推荐) 7. 监控指标
- OPRO (轻量) 8. 持续优化
4. 配置评估指标
5. 运行优化
- 编译/搜索
- 验证集评估
- 选择最优
5.3 评估指标设计
| 任务类型 | 推荐指标 | 说明 |
|---|---|---|
| 分类 | 准确率 / F1 | 标准分类指标 |
| 生成 | BLEU / ROUGE / BERTScore | 自动评估 |
| 抽取 | 精确匹配 / 部分匹配 | 信息抽取标准 |
| 对话 | 人工评分 / GPT-4 评分 | 开放式任务 |
| RAG | 忠实度 + 相关性 + 完整性 | RAG 三维评估 |
5.4 成本估算
以 DSPy BootstrapFewShot 为例,优化 100 个训练样本:
| 阶段 | API 调用次数 | 预估成本(GPT-4o) |
|---|---|---|
| Bootstrap 生成示例 | ~100-200 | $0.50-1.00 |
| 候选评估 | ~500-1000 | $2.50-5.00 |
| 验证集评估 | ~100-200 | $0.50-1.00 |
| 总计 | ~700-1400 | $3.50-7.00 |
对比人工优化 Prompt 可能需要的数小时工作量和数百次试错调用,自动优化在成本上通常更优。
6. DSPy 与 LangChain 的关系
| 维度 | DSPy | LangChain |
|---|---|---|
| 核心理念 | 编译式:声明任务 → 自动生成 Prompt | 组合式:手写 Prompt → 组装管道 |
| Prompt 来源 | 自动生成/优化 | 人工编写 |
| 优化能力 | 内置(核心特性) | 无(需外部工具) |
| 编排能力 | 有(Module 组合) | 强(LCEL/LangGraph) |
| 学习曲线 | 较陡(新范式) | 中等(概念多) |
| 生态规模 | 小但增长中 | 大(最广泛的 LLM 框架) |
| 最佳场景 | 需要系统化优化 Prompt | 需要快速搭建 LLM 应用 |
互补使用:DSPy 优化出最优 Prompt 后,可以导出为纯文本 Prompt,嵌入 LangChain 管道中使用。
7. 前沿研究方向
7.1 Prompt 优化的理论化
研究者正在尝试建立 Prompt 优化的理论基础:
- Prompt 空间的几何结构
- 优化的收敛性保证
- 泛化能力的量化
7.2 多任务/多模型联合优化
一个 Prompt 同时在多个任务和多个模型上优化,找到"鲁棒"的 Prompt。
7.3 强化学习驱动的 Prompt 优化
将 Prompt 优化建模为强化学习问题:
- 状态:当前 Prompt
- 动作:修改操作
- 奖励:评估指标
7.4 与推理模型的结合
o1/o3 等推理模型内置了隐式 CoT。如何优化与这些模型交互的 Prompt(简化而非复杂化)是一个新方向。
8. 最佳实践总结
| 实践 | 说明 |
|---|---|
| 先手工后自动 | 先用手工 Prompt 建立 baseline,再用自动优化提升 |
| 投资评估数据 | 好的标注数据是自动优化的基础 |
| 从 DSPy 开始 | DSPy 是目前最成熟的自动 Prompt 优化框架 |
| 监控生产效果 | 自动优化的 Prompt 在生产中可能退化 |
| 版本管理 | 对优化后的 Prompt 进行版本控制 |
| 保留可解释性 | 理解优化器为什么选择了这个 Prompt |
9. 结论
自动 Prompt 优化代表了 Prompt 工程从"手艺"到"工程"的进化。DSPy 是这一领域最重要的框架,它将 Prompt 编写从一次性的文本创作转变为可编译、可优化、可复现的程序化过程。
对于认真对待 LLM 应用质量的团队,建议:
- 短期:学习并使用 DSPy,将核心 Prompt 转化为可优化的程序
- 中期:建立 Prompt 评估和持续优化的管线
- 长期:关注 Prompt 优化的理论进展和新方法
记住:最好的 Prompt 不是人写的,是数据和算法找到的。
Maurice | maurice_wen@proton.me