auto-prompt-让LLM作为优化器

prompt提示词2026年6月7日2

OPRO(Optimization by PROmpting)是什么?——把大模型当“无梯度优化器”

OPRO 的核心想法很朴素:把“优化问题”用自然语言写进 prompt 里,让 LLM 反复提出更好的候选解。每一轮把“历史候选解 + 它们的得分(value)”喂回给模型,模型据此产生新候选;外部再评估新候选的真实得分,如此循环。

你可以把它理解为一种通用的“黑箱优化(black-box optimization)”框架:

  • 不需要梯度(derivative-free)
  • 不要求可微
  • 只需要你能评估每个候选解的分数(objective value)

论文里把它用在:

  1. 线性回归(优化参数)
  2. 旅行商(优化路线)
  3. 提示词优化(优化指令,使任务准确率最大) ——这是你关心的重点

OPRO 的基本流程(迭代优化循环)

设目标是最大化一个函数 ( f(x) ),其中 (x) 是“候选解”(在 prompt 优化里,x 就是一条 instruction/prompt)。

OPRO 的迭代是:

  1. 初始化一批候选解 (x_1, x_2, ...)(可以人写、也可以让模型先生成)
  2. 评估每个候选的 value:(v_i = f(x_i))
    • 对 prompt 来说:(v_i) 可以是验证集准确率
  3. 构造一个“优化提示词(optimizer prompt)”,包含:
    • 任务描述(我们要优化什么)
    • 历史候选解列表
    • 每个候选的得分(value)
    • 生成新候选的要求(多样性、不要重复、探索改动方向)
  4. 让 LLM 生成新候选解(比如生成 10 个新 prompts)
  5. 评估新候选并把结果追加回 prompt
  6. 重复 3-5,直到预算耗尽或指标收敛

你会发现它和“进化算法/贝叶斯优化”有点像:
OPRO 用 LLM 作为“提出新点的提议器(proposer)”,而你用评估器给分。


关键点:OPRO 里的“value”是什么?

OPRO 的灵魂在于:把历史候选与其分数显式提供给 LLM。这相当于给模型一个“可学习的搜索轨迹”,模型会倾向于:

  • 模仿高分候选的结构与用词
  • 避免低分候选的缺陷
  • 在高分候选周围做局部改进,同时保持一定探索

在 prompt 优化中常见的 value:

  • 分类准确率 / F1
  • GSM8K 这种数学题的正确率
  • Big-Bench Hard 的任务平均准确率
  • 结构化任务的解析率 + 字段准确率(可以组合成一个标量分数)

OPRO 用于“提示词优化”时怎么做?

优化变量(decision variable)

  • 一段 instruction prompt(通常是零样本指令,可能包含格式要求、思考步骤要求等)

目标函数(objective)

  • 在验证集上的准确率(或你定义的综合指标)

评估器(evaluator)

  • 你用固定模型(可能同一个 LLM,也可能另一个)在验证集上跑,计算 accuracy
  • 注意:为了公平与可复现,通常固定:
    • temperature(常用 0 或很低)
    • 解码参数
    • 评估集
    • 输出解析规则

迭代策略

  • 每轮生成 N 个新 prompts(例如 8~20)
  • 评估后保留 top-k,并把它们连同分数写回下一轮的 optimizer prompt

它与 APE / GrIPS / ProTeGi 的区别(你可以这样记)

  • APE:从 exemplars 归纳指令 → 大量候选 → 打分 → paraphrase 迭代
    特点:偏“从样例归纳任务说明”

  • GrIPS:从一个起点 prompt 出发,用加/删/换/改写等离散操作做局部搜索
    特点:编辑算子更明确,可控微调

  • ProTeGi:用“输出 vs 标准答案”做批评,形成文本梯度,再据此生成改进 prompt;还用 bandit 选
    特点:误差驱动(error-driven),更“诊断式”

  • OPRO:把“候选 prompt + 准确率分数”作为优化轨迹,LLM 直接学着提出更高分候选
    特点:最通用、最像“黑箱优化”;不需要显式批评,也不需要预定义编辑算子
    代价:可能更依赖评估预算;也可能更像“分数驱动的提示词搜索”


适合与不适合的应用场景

适合

  1. 你能稳定评估一个候选解的分数
    • 例如有验证集、能算准确率/F1/EM
  2. 优化对象是“文本形式的解”
    • 提示词、规则集、策略说明、配置说明等
  3. 没有梯度、不可微、黑箱
    • 这正是 OPRO 的定位
  4. 任务很多样/跨任务
    • 只要能给分,OPRO 框架不变
  5. 你怀疑人类写的 prompt 不是最优
    • OPRO 擅长在大空间里找到反直觉但高分的表达

不适合(或需要改造)

  1. 评估成本太高
    • 每轮要评估很多候选 prompt;如果每个 prompt 要跑很大验证集,会烧钱
    • 解决:小验证集预筛 + 大验证集复评;或用代理指标
  2. 目标高度主观且没有可靠打分
    • 需要人评/偏好模型,否则 value 信号不稳定
  3. 对安全合规极敏感
    • 搜索过程中可能产生不合规 prompt,需要过滤与审计
  4. 分数噪声很大
    • LLM 输出有随机性会导致同一 prompt 得分波动,需要固定解码或多次采样平均

至少 3 个实际中文例子:OPRO 的“优化提示词”怎么写

下面给你 3 个“optimizer prompt(让 LLM 生成新候选解)”的写法。它们共同结构是:

  • 任务与目标
  • 历史候选与分数
  • 生成新候选的硬约束(不要重复、改动方向、多样性、格式)

注意:OPRO 里真正的“评估”通常由外部脚本完成;这里展示的是“让 LLM 提新候选”的那段 prompt。


例子1:用 OPRO 优化 GSM8K 数学解题指令(最大化正确率)

Optimizer Prompt(第 t 轮)

你是一个优化器。目标:寻找一条用于解数学应用题的“指令提示词”,使其在验证集上的正确率尽可能高。

下面是历史候选指令及其验证集正确率(0~1):
1)正确率=0.62
指令:
「请逐步思考并给出答案。」

2)正确率=0.71
指令:
「请先列出已知条件与未知量,再列式计算,最后输出‘答案:’。」

3)正确率=0.68
指令:
「请分步推理,并在最后检查计算是否有误。」

请生成 8 条新的候选指令,要求:

  • 不要与以上指令重复或仅做同义改写
  • 可以引入:自检步骤、单位检查、合理性检查、避免跳步、输出格式约束
  • 指令长度不超过 120 字

输出格式:
候选1:...
候选2:...(共8条)

外部做法:对每条候选指令跑 GSM8K 验证集,得到分数,再喂回下一轮。


例子2:用 OPRO 优化“融资新闻抽取→JSON”的指令(最大化字段 F1 + 解析率)

Optimizer Prompt

你是一个优化器。目标:优化一条“信息抽取指令”,使模型从融资新闻中抽取字段时:

  • JSON 可解析率最高
  • 字段准确率最高(禁止编造)

历史候选与综合得分(0~100):
A)得分=74
指令:从文本抽取公司名/轮次/金额/投资方/时间,输出JSON。

B)得分=86
指令:只输出严格JSON;缺失填null;金额保留原文;不要推测。

C)得分=81
指令:先识别融资事件句,再抽取字段;输出JSON;无则null。

请生成 10 条新候选指令,必须满足:
1)只输出 JSON(指令本身可描述,但要求模型输出时只输出 JSON)
2)字段名固定为:公司名、融资轮次、融资金额、投资方、时间
3)缺失:公司名/轮次/金额/时间为 null;投资方缺失为 []
4)加入“输出前自检 JSON 合法性”的要求
5)尽量提出不同的改进思路(字段定义、优先级规则、反例约束等)

输出 10 条编号候选指令,每条不超过 180 字。


例子3:用 OPRO 优化客服“拒答合规”指令(最大化合规通过率)

假设你有一个自动审核器/规则引擎给每条候选 prompt 评一个“合规通过率”。

Optimizer Prompt

你是一个优化器。目标:生成一条客服系统提示词,使模型在面对违规请求时能够合规拒答、给替代方案;面对合规请求时正常帮助。优化目标是“合规通过率”最大。

历史候选与通过率:
1)0.88:遇到违规内容请拒绝回答。
2)0.92:拒答并说明原因,提供安全替代建议。
3)0.90:遵守政策,必要时引导用户咨询专业人士。

请生成 6 条新候选提示词,要求:

  • 不能引用具体政策原文,但要给清晰可执行规则
  • 必须包含:拒答模板 + 替代方案模板 + 澄清问题策略(当请求不明确时)
  • 语言简洁,不超过 200 字
  • 每条候选的结构要尽量不同(例如“先分类再响应”“先确认意图再决定”等)

输出格式:候选1~候选6。


工程落地要点(避免 OPRO 常见坑)

  1. 防止过拟合:留验证集/测试集;每轮只在训练/开发集上优化
  2. 分数要稳定:固定 temperature=0;或对同一 prompt 多次采样取平均
  3. 控制提示词长度:OPRO 容易越写越长;给长度惩罚或硬限制
  4. 保持多样性:别只喂 top-1;喂 top-k + 一些多样候选,避免陷局部最优
  5. 把约束写死:尤其是 JSON schema、标签集合等,防止候选偏离任务

如果你想把 OPRO 真正跑起来,我可以根据你的任务帮你设计两件最关键的东西:
1)objective/value 的定义(怎么把准确率、解析率、拒答合规等合成一个标量)
2)每轮 prompt 结构(候选展示方式、如何鼓励探索、如何防重复/防变长)。