Prompt自动优化:DSPy实战指南——用代码而不是「感觉」来优化Prompt
一个Prompt工程师的觉醒 小李是一名Prompt工程师。她每天的工作是:写Prompt、测试、看结果、改措辞、再测试、再看结果、再改措辞…循环往复。她感觉自己像在"炼金"——加一点"请",加一点"专业",加一点"step by step",然后祈祷效果变好。 直到她发现了DSPy。 DSPy(Declarative Self-improving Python)是Stanford NLP实验室开发的框架,它的核心理念是:Prompt不应该手工编写,而应该通过算法自动优化。 DSPy的核心概念 DSPy有三个核心概念,理解了这三个概念,你就理解了DSPy: 概念一:Signature(签名)。 定义模型的输入输出接口。例如:“question -> answer"表示输入一个问题,输出一个答案。“context, question -> answer"表示输入上下文和问题,输出答案。Signature是DSPy中"任务定义"的方式。 概念二:Module(模块)。 定义任务的处理逻辑。最简单的模块是dspy.Predict(直接预测),更复杂的模块包括dspy.ChainOfThought(思维链推理)、dspy.ReAct(推理+行动)等。Module是DSPy中"Prompt结构"的抽象。 概念三:Optimizer(优化器)。 根据训练数据和评估指标,自动搜索最优的Prompt。DSPy提供了多种优化器:BootstrapFewShot(自动生成Few-shot示例)、BootstrapFinetune(自动生成微调数据)、MIPROv2(多步交互式优化)等。 实战:用DSPy优化一个客服Prompt 假设你有一个客服AI,需要将用户的投诉分类为"退款"“换货"“投诉"“咨询"四类。原始Prompt是手写的,准确率约为78%。我们来看看DSPy如何将准确率提升到93%。 第一步:定义Signature和Module import dspy class CustomerClassification(dspy.Signature): """将客户消息分类为退款、换货、投诉、咨询""" message = dspy.InputField() category = dspy.OutputField(desc="退款、换货、投诉或咨询") classify = dspy.ChainOfThought(CustomerClassification) 第二步:准备训练数据 只需要20-50个标注样本,DSPy就能自动优化。 trainset = [ dspy.Example(message="我买的东西坏了,要求退款", category="退款"), dspy.Example(message="想换个颜色可以吗", category="换货"), # ... 更多样本 ] 第三步:定义评估指标并优化 def accuracy_metric(example, pred, trace=None): return pred.category == example.category optimizer = dspy.BootstrapFewShot(metric=accuracy_metric) optimized_classify = optimizer.compile(classify, trainset=trainset) 结果: 经过DSPy优化后,分类准确率从78%提升到了93%。DSPy自动生成了最优的Few-shot示例和推理链,效果远超手工调优。 DSPy的三大优势 优势一:可复现。 手工Prompt优化的过程是"黑箱”——你改了措辞,效果变好了,但你不确定为什么会变好。DSPy的优化过程是透明的、可复现的——同样的数据和指标,每次运行会得到相同的优化结果。 ...