Prompt 自动优化:DSPy 与自动提示词工程(2026 年版)

1. 引言

手工编写 Prompt 是一门"炼金术":凭经验调整措辞、添加示例、调整格式,通过反复试错达到满意的效果。这种方式存在三个根本问题:

  1. 不可复现:好的 Prompt 高度依赖编写者的经验和直觉
  2. 不可扩展:每换一个任务或模型,就要重新调整
  3. 不可评估:难以量化 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 应用质量的团队,建议:

  1. 短期:学习并使用 DSPy,将核心 Prompt 转化为可优化的程序
  2. 中期:建立 Prompt 评估和持续优化的管线
  3. 长期:关注 Prompt 优化的理论进展和新方法

记住:最好的 Prompt 不是人写的,是数据和算法找到的。


Maurice | maurice_wen@proton.me