元提示与提示词自动优化:让模型帮你写提示
写出一条好提示往往比想象中更难。同一个任务,措辞、示例、结构稍有变化,模型输出质量可能天差地别。元提示(meta-prompting)的核心思想是:与其让人反复试错,不如让语言模型本身参与提示的生成与评价。本文从概念出发,依次介绍手动元提示模板、自动提示工程 APE、反馈驱动迭代,以及 DSPy 式的程序化优化,最后给出一个可直接运行的 Python 示例。
什么是元提示
元提示指的是「用模型去写提示、评提示、改提示」的一类方法。普通提示工程里,人是作者,模型是执行者;元提示把模型也变成提示的作者或评审,形成一条自我改进的回路。
它通常包含三种角色:
- 生成器:给定任务描述,产出候选提示。
- 执行器:用候选提示去实际完成任务。
- 评价器:根据任务结果给提示打分,判断哪条更优。
这种思路的价值在于,模型对「什么样的指令更容易被自己理解」有一定直觉。借助它,我们可以把提示从手工艺品变成可被搜索、比较和迭代的产物。
手动元提示模板
在没有额外框架时,最实用的做法是一个「评审加改写」模板。你把初稿提示、任务背景和评估样本交给模型,让它以专家身份给出改进建议并产出新版提示。
下面是一段可直接复制的模板:
你是一名提示工程专家。请基于以下信息改进一条提示。
【任务目标】
{任务描述}
【当前提示初稿】
{初稿提示}
【几条评估样本及期望输出】
{样本与期望}
请先指出当前提示的三个不足,再产出一版改进后的提示,并使用「改进版提示」作为开头。
使用要点:
- 给模型看真实样本与期望,而不是泛泛而谈「要更好」。
- 要求它先诊断、再产出,避免只做表面润色。
- 把改进结果与人写的版本并排测试,用同一批样本比较。
Anthropic 官方就提供过类似的元提示配方(metaprompt),用于从零生成并打磨提示,思路与上面模板一致。
自动提示工程 APE
APE(Automatic Prompt Engineer,自动提示工程师)把「找提示」形式化为一个搜索问题。其流程是:
- 用模型针对任务生成一批候选指令。
- 在评估集上运行每条候选,记录执行得分。
- 选出得分最高的指令;必要时再做语义聚类和二次生成。
论文《Large Language Models Are Human-Level Prompt Engineers》在 24 个 NLP 任务上做了实验,结果显示自动生成的指令在 19 个任务上达到或优于人工标注的指令。APE 的关键是把提示当成可被评分的「程序」,用搜索代替拍脑袋。
一个最小化的 APE 思路如下:
生成阶段:给模型任务描述,要求它产出 20 条不同措辞的指令。
评分阶段:每条指令在 50 条样本上跑零样本,记录准确率。
选择阶段:取准确率最高的 5 条,按语义聚类后请模型综合成最终版。
反馈驱动迭代
自动生成解决「从零起步」,反馈驱动解决「持续改进」。这类方法用一个奖励信号不断告诉优化器「这条提示好不好」,再据此调整。
RLPrompt 是其中的代表:它用一个轻量策略网络生成离散提示,并以大模型在任务上的表现为奖励,用强化学习训练策略网络。论文还发现,优化出的提示常常是语法不通的「乱码」,却能在不同模型间迁移并保持效果,这说明模型偏好的指令未必符合人类语言习惯。
另一类思路是「进化式」迭代:保留表现好的提示,做改写、重组、扩充示例等变异,再用评估集筛选下一代。核心循环可以概括为:
初始化提示种群 -> 在评估集上打分 -> 保留高分个体 -> 变异生成新一代 -> 重复直到收敛
实践建议:
- 反馈必须可量化,例如准确率、格式合规率、人工评分。
- 评估集要小而稳,避免分数噪声淹没真实差异。
- 记录每轮最佳提示,方便回退到更优历史版本。
DSPy 式的程序化优化
与手动调提示不同,DSPy 的思路是「编程而非提示」。你用 Python 声明任务的模块与步骤,把提示和示例当作可优化的参数,由编译器在给定评估集上自动搜索最优写法。
DSPy 的关键转变:
- 你写的是逻辑流程(先检索、再推理、再作答),不是固定文案。
- 优化器负责挑选示例、调整指令,使整条管线在指标上达标。
- 换模型或换数据时,重新编译即可,不必重写提示。
这适合多步骤管线,例如检索增强生成、带工具的智能体。当提示嵌在复杂代码流中时,程序化优化比手工微调更可维护。
实操示例
下面是一段用 LLM 优化提示的 Python 示例。它让模型基于任务说明和评估样本产出改进版提示,并对比新旧提示在样本上的表现。示例采用 OpenAI 兼容接口,你需要先配置好 API Key。
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
TASK_DESC = "把用户的问题分类为『技术』『售前』『投诉』三类之一。"
DRAFT_PROMPT = "请对下面的问题分类。"
SAMPLES = [
("你们的 API 怎么鉴权?", "技术"),
("企业版报价是多少?", "售前"),
("工单三天没回复,太差了", "投诉"),
]
def call_model(prompt: str, user_input: str) -> str:
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": prompt},
{"role": "user", "content": user_input},
],
)
return resp.choices[0].message.content.strip()
def improve_prompt(draft: str) -> str:
meta = f"""你是提示工程专家。请改进下面这条提示,用于任务:{TASK_DESC}
当前提示:{draft}
请先指出三个不足,再产出改进版,并以「改进版:」开头。"""
return call_model(meta, "请输出改进结果。")
def score(prompt: str) -> float:
correct = 0
for text, label in SAMPLES:
if call_model(prompt, text) == label:
correct += 1
return correct / len(SAMPLES)
if __name__ == "__main__":
old_score = score(DRAFT_PROMPT)
better = improve_prompt(DRAFT_PROMPT)
new_prompt = better.split("改进版:", 1)[-1].strip()
new_score = score(new_prompt)
print("旧提示得分:", old_score)
print("新提示得分:", new_score)
print("改进版提示:", new_prompt)
运行前请准备评估样本并控制调用成本。若得分没有提升,可让模型看到错误样本后再迭代一轮,或扩充样本数量。
小结
元提示把模型从「执行者」变成「提示的作者与评审」,让提示优化从经验试错走向可搜索、可评分、可迭代。本文覆盖了四条路径:手动元提示模板适合快速起步;APE 把提示当作可搜索的程序;RLPrompt 与进化式方法用反馈信号持续打磨;DSPy 则把优化嵌入程序化管线。落地时记住三件事:评估集要小而稳、反馈必须可量化、每轮最佳提示都要留存以便回退。
参考与延伸阅读
- Zhou, Y. 等人(2022)。Large Language Models Are Human-Level Prompt Engineers(APE)。arXiv:2211.01910。
- Deng, M. 等人(2022)。RLPrompt: Optimizing Discrete Text Prompts with Reinforcement Learning。arXiv:2205.12548。
- Stanford NLP。DSPy:编程而非提示语言模型的框架。GitHub 仓库 stanfordnlp/dspy。
- OpenAI。Prompt engineering 官方指南(含提示迭代与评估建议)。OpenAI API 文档。
- Anthropic。Prompt engineering overview 与 Claude Cookbook 的 metaprompt 配方(用元提示生成与改进提示)。Claude 平台文档。