想象你是一家餐厅的主厨,老板让你研发一道新招牌菜。你有两条截然不同的路:一是办一场试菜大会——让后厨每位厨师都端出自己设计的候选菜,请评委盲测打分,最后把最高分那道菜端上菜单;二是主厨修炼——你每做一版就自己尝一口、记下问题,下一轮立刻调整火候与调料,如此反复打磨,让菜越做越好吃。 在大模型的世界里,优化提示词(Prompt)也有同样的两条路,它们叫 APE 和 OPRO。Prompt 是给 AI 的“点单口令”,口令写得好,AI 回答才够准。过去大家全靠人肉试错,改一遍跑一遍,又慢又累。而 APE 和 OPRO 让 AI 自己当厨师、自己当评委,帮我们自动找出更好的口令。读完这篇,你会明白这两种“以 AI 优化 AI”的魔法是怎么运作的,以及该在什么场景下选哪一把。
掌握 APE 与 OPRO,你就能把“写提示词”从手工活升级为自动化流水线,用机器代替人反复试错,成为团队里那个“能自动变出更好 AI 指令”的人。
可视化演示
上方展示APE生成评估选择流水线,下方展示OPRO迭代改进循环,粒子流动模拟优化过程,点击按钮切换不同视角
本节配有交互动效(进入视口后自动加载,约 3KB)。
APE与OPRO双路径总览 APE通过生成评估选择最优Prompt OPRO利用LLM自身迭代改进 APE适合冷启动场景 OPRO适合持续优化场景 两种自动优化技术覆盖不同应用场景
概念对比
试菜大会和主厨修炼,听起来都是为了“做出好菜”,但方法论完全不同。试菜大会强调广度:一次召集很多厨师,各显神通,然后靠评委筛出赢家;主厨修炼强调深度:一个人反复做、反复尝、反复改,靠时间换质量。
在 Prompt 自动优化领域,这两种思路分别对应 APE 和 OPRO。APE(Automatic Prompt Engineer,自动提示词工程师)的做法是:先自动生成一大批候选提示词,再让它们在目标任务上真实跑一遍,最后按得分挑出最优的那个。OPRO(Optimization by PROmpting,通过提示词进行优化)的做法是:把“如何改进提示词”这个问题也交给大模型,让模型看着历史提示词和得分,自主写出下一版更好的提示词。
两者的核心差异在于是否依赖迭代闭环。APE 是一次性海选,候选之间互不影响;OPRO 是逐轮递进,后一轮建立在前一轮的基础上。如果任务评估成本低、候选空间容易枚举,APE 更直接;如果任务复杂、需要不断逼近上限,OPRO 的迭代特性更有优势。用数学语言统一表达,两者都在求解同一个目标:
回到餐厅的比喻:试菜大会和主厨修炼最终都想端出一道招牌菜,APE 用“人多力量大”取胜,OPRO 用“熟能生巧”取胜。你选哪条路,取决于厨房有多少原料、评委有多闲,以及你有多急着上新菜。
D 上,挑出那个让平均分数最高的提示词 p*。APE 靠海选逼近它,OPRO 靠迭代逼近它。- 目标提示词
p*表示最终想要的、能让评估得分最高的那个提示词。 - 求最大参数
argmax的含义是从所有候选里挑出使后面式子取得最大值的那个,而不是真的把最大值算出来。 - 期望得分
E[f(p, x)]表示对数据集D中所有输入x求平均后的表现,避免只在个例上好用。
APE流程
试菜大会有一套标准动作:广撒网、真打分、取最高。首先是广撒网——每位厨师自由发挥,端出五花八门的候选;接着是真打分——每道菜都要让评委实际品尝;最后取最高——得分最高的那道菜被端上菜单。
APE 完整复刻了这套流程。第一步候选生成(Candidate Generation),用大模型批量写出多种提示词变体,比如让模型换措辞、换顺序、换示例;第二步任务执行(Execution),把每个候选提示词真实地喂给目标任务模型,记录它的输出;第三步自动评估(Evaluation),用预设的评估函数给每组输出打分;第四步最优选择(Selection),挑出得分最高的提示词作为最终结果。
在评估环节,最常用的指标是任务准确率(Accuracy)。假设评估集有 N 个问题,模型用某个提示词答对了其中一部分,准确率就是:
回看试菜大会:APE 的价值在于把“广撒网”自动化了——不是人肉写十个提示词,而是让大模型一口气生成几十上百个变体,再靠评估函数这个“铁面评委”公平打分。即使你没有灵感,它也能靠数量撞出惊喜。
I 是一个“计数器”,y_i 是参考答案,y_i^hat 是模型输出。答对一笔、分数加一,最后除以总数得到正确率。- 求和累加
Σ把 N 个样本的结果一个个加起来,每答对一题记一笔。 - 指示函数
I(y_i = y_i^hat)表示“如果模型输出和参考答案一致,这一项就是 1,否则是 0”。 - 取平均除以
N后得到 0 到 1 之间的准确率,1 表示全对。
评估机制
试菜大会的灵魂是评委。评委的打分标准如果歪了,选出来的菜必然不对。比如评委只爱甜味,那不管顾客爱不爱吃,端上桌的都会是甜口菜。Prompt 自动优化也一样:评估机制决定了优化方向,方向错了,再努力的优化也是白费。
评估机制里最核心的是奖励函数(Reward Function)。它把提示词的表现压缩成一个数字,供算法排序比较。实际项目中,奖励函数通常不只包含准确率,还要综合考虑成本、延迟、输出长度等因素。一个典型的奖励函数长这样:
评估的实施方式也有讲究。自动化评估适合有标准答案的任务(比如分类、抽取),用代码批量比对即可;人工评估适合开放式生成任务(比如写文案、讲故事),让真人按维度打分。实践中常常两者结合:自动化跑粗筛,人工只检查前几名。评委团队越专业,招牌菜越稳。
- 质量收益
α × Acc(p)把准确率乘上权重 α,Acc 越高,奖励越大。 - 成本惩罚
β × Cost(p)把调用 API、消耗 Token 的成本折算成惩罚项,成本越高扣分越多。 - 净奖励两者相减得到综合评分 R(p),分数越高代表提示词越值得选用。
OPRO流程
主厨修炼的秘诀是闭环:做一道、尝一口、记一笔,下一道立刻调整。OPRO 把这种闭环搬进了大模型里——让一个聪明的大模型当“主厨”,负责阅读历史记录并思考下一版提示词该怎么改。
OPRO 的第一步是确定优化器模型(Optimizer LLM),它通常是一个能力较强的通用大模型。第二步是轨迹采样(Trajectory Sampling):把每一轮尝试过的提示词及其得分收集起来,形成一份“试菜笔记”。第三步是迭代更新(Iterative Update):优化器阅读笔记,写出一个新提示词,然后跑任务、打分、加入笔记。第四步是检查终止条件(Termination),比如达到预设轮数、分数不再上升或预算耗尽。
迭代更新的过程可以写成:
OPRO 的迷人之处在于,它让大模型“学会了自己进步”。第一轮可能只是把措辞改通顺,到了第五轮就会发现“加上示例会显著提分”这类隐藏规律。就像主厨越做越懂食材的脾性,OPRO 越迭代越懂这份任务的脾气。
M_opt 是那个“主厨大模型”,T_t 是截至第 t 轮的试菜笔记,p_{t+1} 是它写出的下一版提示词。- 当前版本
p_t是第 t 轮正在使用的提示词,相当于这一版菜。 - 历史轨迹
T_t = {(p_i, s_i)}是之前所有提示词和分数的集合,相当于主厨的试菜笔记。 - 优化器思考
M_opt(p_t, T_t)表示大模型结合当前版本和笔记,输出下一版提示词。
实战落地
纸上谈兵终觉浅。真要把自动优化跑起来,需要像开一家新菜研发厨房那样做好四件事。
第一,数据准备。先冻结一份评估集,比如 200 条带标准答案的问题。它就像试菜大会的评委团,之后的每一次打分都在这同一批评委面前进行,保证公平可比。第二,环境配置。选好目标任务模型和优化器模型,配置 API 密钥和预算上限。第三,运行迭代。程序化地执行“生成候选→执行任务→打分→(OPRO 则更新轨迹)”循环,把每一轮的提示词和分数存成日志。第四,结果分析。对比优化前后的效果,计算改进幅度:
新手最容易忽略的是评估集与测试集分离。如果一直在同一批数据上打分,优化器会像应试教育一样“背答案”。正确做法是保留一份从未参与打分的测试集,等优化结束后做最终验证。厨房里这叫“给评委留一道隐藏菜”——防止厨师记住评委口味后专门讨好。
A_base 是初始提示词的得分,A_new 是优化后的得分,差值相对初始值的百分比就是改进率。比如从 0.80 提到 0.90,改进率就是 12.5%。- 绝对进步
A_new - A_base算出优化后比优化前高了多少分。 - 相对化除以
A_base把进步变成“相对比例”,这样不同难度的任务之间也能公平比较。 - 转百分比乘以 100% 变成直观的百分数,方便向团队汇报。
效果与选型
两家餐厅都做出了招牌菜,到底该学哪家?这要看你的预算、时间窗口和任务性质。
从效果上看,APE 和 OPRO 都能显著提升提示词质量。许多公开实验显示,自动优化后的提示词在分类、推理、代码生成等任务上能带来 5% 到 20% 的准确率提升。成本上,APE 的消耗集中在“一次性大批量生成+执行”;OPRO 的消耗集中在“多轮迭代”——轮次越多,Token 开销线性增长。优势上,APE 简单直接、易并行,适合快速拿到一个不错的结果;OPRO 上限更高、能发现人类想不到的写法,但流程更慢、更难调。劣势上,两者共享同一个命门:评估函数设计不好,优化得越用力,错得越离谱。
选型时可以用一个综合评分公式帮自己决策:
回到餐厅:如果你明天就要上新菜,选择试菜大会(APE),快速推出一个高分作品;如果你要打磨镇店之宝、不介意多花时间,选择主厨修炼(OPRO),把口味推向极致。聪明的餐厅往往两手都用——先用 APE 找方向,再用 OPRO 精雕细琢。
S 是“方案总得分”,Acc 是准确率,Latency 是延迟,Cost 是花费。三个权重 w 代表你对三者的在乎程度,加起来越高的方案越适合你。- 权重偏好
w_1, w_2, w_3是你对准确率、延迟、成本分别有多在乎,数值由业务需求决定。 - 三个因子准确率是收益所以是加号,延迟和成本是代价所以是减号。
- 综合决策
S越高代表该方案越契合当前约束,据此选择 APE、OPRO 或两者结合。
AI 应用场景
电商客服意图识别提示词优化
阶段:Prompt自动优化(APE候选生成与评估)
解决的问题:客服机器人需要把用户问题准确分类为“退换货、物流、价格、售后”等意图。人工写的分类提示词经常边界模糊,比如“我的快递裂了”该算物流还是售后,靠人肉调参效率极低。
具体案例:某电商团队准备了 200 条历史对话作为评估集,用 APE 让大模型生成 50 个候选分类提示词,逐条跑任务并按准确率打分,一轮筛选后分类准确率从 0.81 提升到 0.89,全程不需要人工改一句 Prompt。
代码注释与文档生成优化
阶段:OPRO迭代优化与轨迹采样
解决的问题:大模型生成的 API 文档经常漏掉参数说明、风格前后不一。人工维护文档模板费时费力,而且容易跟不上代码迭代。
具体案例:某开发者工具团队将历史提示词及其文档覆盖率得分整理成轨迹,让 OPRO 优化器大模型反复迭代。到第 5 轮时,优化器自己总结出“每个参数应独立一行+附带默认值说明”的写法,文档覆盖率从 0.76 升到 0.90。
营销文案风格迁移
阶段:APE与OPRO组合使用
解决的问题:同一款产品的卖点,要分别写成小红书种草风、知乎干货风和朋友圈短文案,风格差异大,人工逐个调 Prompt 成本高。
具体案例:某增长团队先用 APE 快速生成各风格的候选模板并粗筛,再用 OPRO 以“点赞率预估分”为优化目标迭代 5 轮,最终将互动率指标提升了 12%,文案产出时间从每人每天 3 篇提升到 20 篇。
Python 演示
import random class APEOptimizer: """APE自动优化Prompt的简化演示。 候选生成 -> 任务执行 -> 自动评估 -> 最优选择 """ def __init__(self, prefixes): self.prefixes = prefixes self._candidate_list = [] self._scores = [] def _generate(self, num): suffixes = ["请分步骤回答", "请给出例子", "先写结论再解释", "请用简洁语言"] for _ in range(num): prefix = random.choice(self.prefixes) suffix = random.choice(suffixes) self._candidate_list.append(prefix + "," + suffix) def _execute(self, prompt): # 模拟真实任务:输出与参考答案进行比对 target_words = ["分步骤", "例子", "结论", "简洁"] hit = sum(1 for word in target_words if word in prompt) length = len(prompt) if 12 <= length <= 30: hit += 1 return hit def _evaluate(self): self._scores = [self._execute(p) for p in self._candidate_list] def _select(self): best_index = max(range(len(self._scores)), key=lambda i: self._scores[i]) return self._candidate_list[best_index], self._scores[best_index] def run(self, num=4): self._generate(num) self._evaluate() return self._select() if __name__ == "__main__": opt = APEOptimizer(["请回答以下问题", "请帮我分析"]) best_prompt, best_score = opt.run(num=4) print("最优 Prompt:", best_prompt) print("得分:", best_score)
suffixes = ["请分步骤回答", ...]候选生成的“备选调料”,相当于给提示词加不同风格的后缀self._candidate_list.append(prefix + "," + suffix)把组合出的候选提示词装进“参赛名单”hit = sum(1 for word in target_words if word in prompt)模拟任务执行时检查候选里是否包含加分关键词self._scores = [self._execute(p) for p in self._candidate_list]给每个候选提示词打分,对应试菜大会评委环节best_index = max(range(len(self._scores)), key=lambda i: self._scores[i])找出得分最高的候选的索引opt.run(num=4)一键启动“试菜大会”,自动完成生成→执行→评估→选择
常见误区
误区很多人看到两者名字里都带“自动优化”,流程又都是“生成+评估”,就觉得它们是同一个方法,随便选一个实现就行。
正解两者机制不同。APE 是一次性海选:生成一批候选,评估后直接选最优,候选之间互不影响。OPRO 是迭代式修炼:优化器大模型阅读历史轨迹后逐轮改写,后一轮依赖前一轮。就像试菜大会是一次性选出赢家,主厨修炼是反复试做让菜越来越好。
为何常见:论文标题都强调“自动”,流程示意图又都有“生成候选”和“打分”两个环节,表面高度相似,容易被误认为同一种方法。
误区第一次跑出高分就任务完成,直接把优化后的提示词上线,再也不碰。很多人连独立的测试集都没留。
正解评估集相当于“评委团”,评委说好吃不代表所有顾客都爱吃。提示词可能过拟合评估集,在新数据上掉点。正确做法是保留一份从未参与打分的测试集,并且定期用线上真实数据重新评估。
为何常见:人天生相信“分数=质量”,看到准确率提升就开心,忽略了分数是相对特定数据集而言的。
误区评分只设置一个准确率,别的都不管,觉得指标越多越麻烦。
正解准确率只反映“答没答对”,没考虑回答长度、调用成本、输出格式等。奖励函数最好是综合评分,比如准确率加一个长度惩罚项。就像评委既要看味道,也要看摆盘和上菜速度,多维度打分才公平。
为何常见:写准确率最省事,下意识觉得把评估做得复杂会拖慢优化速度。
误区名字里有"automatic",就觉得可以把任务丢给 APE/OPRO,人彻底撒手等着收结果。
正解人其实在设计评估函数和划分评估集这两个环节里起着决定性作用。评估函数定歪了,自动优化只会飞快地优化出一个错误答案。好比试菜大会,评委标准如果定错,选出的菜自然不对。
为何常见:“自动”二字容易让人联想到全自动驾驶,忽略了流程中仍有需要人把关的关键环节。
面试题
Q1. APE 的英文全称是?
- A.Automatic Prompt Evaluator
- B.Automatic Prompt Engineer← 正确答案
- C.Advanced Prompt Enhancer
- D.Automated Prompt Executor
答案:B。APE 即 Automatic Prompt Engineer(自动提示词工程师),核心是自动生成候选并评估。A 把 Engineer 错写成 Evaluator,C、D 分别是编造的 Enhancer 和 Executor,都不是论文中的原称。
Q2. OPRO 中主要负责“思考如何修改提示词”的是?
- A.小规模文本分类器
- B.大语言模型本身← 正确答案
- C.人工规则引擎
- D.简单线性回归模型
答案:B。OPRO 的核心洞察是让大语言模型自己充当优化器(Optimizer LLM),阅读历史轨迹后写出新提示词。A、D 规模太小,不具备复杂的改写推理能力;C 人工规则则谈不上“自动优化”。
Q3. 关于 APE 与 OPRO,以下说法正确的是?
- A.APE 先生成一批候选提示词← 正确答案
- B.OPRO 是逐轮迭代优化← 正确答案
- C.APE 会直接训练任务模型
- D.两者都需要评估环节← 正确答案
答案:ABD。APE 是“生成候选→执行→评估→选择”,OPRO 是“优化器迭代改写→评估→再改写”,因此 A、B、D 正确。两者都只优化 Prompt,不修改任务模型的参数,C 错误。
Q4. APE 流程中“任务执行”环节主要做什么?
- A.把所有候选拿去重新训练
- B.用候选提示词运行任务采集结果← 正确答案
- C.删除没用的候选提示词
- D.计算提示词的字符长度
答案:B。任务执行是将每个候选提示词真实喂给目标任务模型,记录其输出,供后续评估打分。A 是训练阶段的事,C 属于筛选步骤,D 只是评估时可能考虑的维度之一,都不是执行环节的核心。
Q5. 以下哪些属于候选提示词的常见生成方式?
- A.人工编写一批种子提示词← 正确答案
- B.用大模型改写扩展提示词← 正确答案
- C.直接随机打乱单词顺序
- D.从历史日志中抽取已有提示词← 正确答案
答案:ABD。候选生成可以人工写种子、让大模型改写扩写、或从日志里抽取历史提示词。C 随机打乱单词顺序会破坏语法结构,几乎不会产生有效候选,不属于常见生成方式。
Q6. 设计奖励函数时的最佳实践是?
- A.只保留准确率一个指标
- B.综合考虑准确率与调用成本← 正确答案
- C.完全委托给概率模型决定
- D.不设置任何约束条件
答案:B。好的奖励函数应同时包含质量项(如准确率)和代价项(如成本、延迟),用权重平衡。A 太单一容易顾此失彼;C、D 等于放弃对优化方向的把控,可能导致越优化越偏。
Q7. OPRO 中的“轨迹”(trajectory)指的是什么?
- A.反向传播中的梯度路径
- B.历史提示词及对应得分的集合← 正确答案
- C.输入序列的语义向量编码
- D.推理时的注意力权重矩阵
答案:B。OPRO 的轨迹是“试菜笔记”,即每一轮尝试过的提示词和它拿到的分数。优化器模型阅读轨迹后才知道哪些写法有效。A 是神经网络训练概念,C、D 与提示词优化无关。
Q8. 自动优化提示词时,评估集的主要作用是?
- A.决定任务模型的参数规模
- B.用来给候选提示词打分排序← 正确答案
- C.用于预训练大语言模型
- D.没有实质性作用
答案:B。评估集是固定的“评委团”,所有候选提示词在同一批数据上跑分,分数高低决定谁被选中。A、C 涉及模型训练层面,与 Prompt 优化无关。
Q9. 当 API 调用成本成为优化瓶颈时,最优策略是?
- A.直接放弃所有评估环节
- B.先用小模型近似打分做粗筛← 正确答案
- C.无限制增加候选数量碰运气
- D.只优化一轮就立即停止
答案:B。小模型打分成本低,先粗筛掉明显差的候选,再让强模型精评前几名,能大幅节省成本。A 会导致没有方向;C 反而放大成本;D 可能错过更优解。
Q10. 提示词过拟合评估集的表现有哪些?
- A.评估集得分高但新数据得分低← 正确答案
- B.提示词包含数据集特有词汇← 正确答案
- C.换了其他任务依然表现良好
- D.评估集得分明显低于随机水平
答案:AB。过拟合表现为“只对评委有效”——评估集分数虚高,换新数据就掉点,甚至提示词里混入了数据集特有的词汇。C 是泛化好的表现,D 表示连评估集都没学好,两者都不是过拟合的特征。