元提示与提示词自动优化:让模型帮你写提示

写出一条好提示往往比想象中更难。同一个任务,措辞、示例、结构稍有变化,模型输出质量可能天差地别。元提示(meta-prompting)的核心思想是:与其让人反复试错,不如让语言模型本身参与提示的生成与评价。本文从概念出发,依次介绍手动元提示模板、自动提示工程 APE、反馈驱动迭代,以及 DSPy 式的程序化优化,最后给出一个可直接运行的 Python 示例。

什么是元提示

元提示指的是「用模型去写提示、评提示、改提示」的一类方法。普通提示工程里,人是作者,模型是执行者;元提示把模型也变成提示的作者或评审,形成一条自我改进的回路。

它通常包含三种角色:

  • 生成器:给定任务描述,产出候选提示。
  • 执行器:用候选提示去实际完成任务。
  • 评价器:根据任务结果给提示打分,判断哪条更优。

这种思路的价值在于,模型对「什么样的指令更容易被自己理解」有一定直觉。借助它,我们可以把提示从手工艺品变成可被搜索、比较和迭代的产物。

手动元提示模板

在没有额外框架时,最实用的做法是一个「评审加改写」模板。你把初稿提示、任务背景和评估样本交给模型,让它以专家身份给出改进建议并产出新版提示。

下面是一段可直接复制的模板:

你是一名提示工程专家。请基于以下信息改进一条提示。

【任务目标】
{任务描述}

【当前提示初稿】
{初稿提示}

【几条评估样本及期望输出】
{样本与期望}

请先指出当前提示的三个不足,再产出一版改进后的提示,并使用「改进版提示」作为开头。

使用要点:

  • 给模型看真实样本与期望,而不是泛泛而谈「要更好」。
  • 要求它先诊断、再产出,避免只做表面润色。
  • 把改进结果与人写的版本并排测试,用同一批样本比较。

Anthropic 官方就提供过类似的元提示配方(metaprompt),用于从零生成并打磨提示,思路与上面模板一致。

自动提示工程 APE

APE(Automatic Prompt Engineer,自动提示工程师)把「找提示」形式化为一个搜索问题。其流程是:

  1. 用模型针对任务生成一批候选指令。
  2. 在评估集上运行每条候选,记录执行得分。
  3. 选出得分最高的指令;必要时再做语义聚类和二次生成。

论文《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 则把优化嵌入程序化管线。落地时记住三件事:评估集要小而稳、反馈必须可量化、每轮最佳提示都要留存以便回退。

参考与延伸阅读

  1. Zhou, Y. 等人(2022)。Large Language Models Are Human-Level Prompt Engineers(APE)。arXiv:2211.01910。
  2. Deng, M. 等人(2022)。RLPrompt: Optimizing Discrete Text Prompts with Reinforcement Learning。arXiv:2205.12548。
  3. Stanford NLP。DSPy:编程而非提示语言模型的框架。GitHub 仓库 stanfordnlp/dspy。
  4. OpenAI。Prompt engineering 官方指南(含提示迭代与评估建议)。OpenAI API 文档。
  5. Anthropic。Prompt engineering overview 与 Claude Cookbook 的 metaprompt 配方(用元提示生成与改进提示)。Claude 平台文档。
本文累计阅读