你盯着屏幕,把“请用幽默语气回复”改成“请用轻松诙谐的方式回答”,又试了“像老朋友聊天那样”,跑了十几次,挑出一个看着顺眼的。整个过程全凭感觉,主观、低效,永远只在你能想到的三五种措辞里打转。你要是习惯了这套“试到看着顺眼”的手工炼丹术,下面这个方法可能会让你把手里的提示词草稿直接删掉。
论文《大型语言模型是人类水平的提示工程师》(Zhou等人,2022)提出了一个让人想掀桌子的结论:既然模型能写文章、能翻译,为什么不让它自己设计提示词?自动提示工程师(APE)彻底抛弃了“手工微调句子”的老路,把提示词写作当成一个搜索问题来处理。给它几个输入输出的例子,让模型生成一堆候选指令,再用同一套模型客观地给每个候选打分,最后留下得分最高的那条。整个过程没有人工评判环节。
APE最优雅的地方,是让模型同时扛起两份活儿。提案模式下,模型读几个例子,逆向推出任务到底怎么回事,然后吐出候选指令。执行模式下,它又原原本本地跑一遍每个候选指令,看哪个真能准确完成任务。不需要微调,不碰梯度,纯粹靠采样指令和评估指令。在指令归纳基准测试上,APE发现的提示词,表现跟人类精心打磨过的持平,甚至更胜一筹。
别再写“你该怎么做”,直接甩给模型一叠例子
手工调参的时候,你脑子里要先把任务转译成一段祈使句,描述给模型听。APE把这一步甩开了。你不再需要写出“请输出反义词”这种万能句式,只要扔一组示范对就行:
happy → sad
hot → cold
fast → slow
up → down
就这四组词,里面藏着“给个相反的意思”这条任务定义。APE把这些示范分成两堆:一小撮给提案模型看,帮它悟出指令;剩下那些捏在手里当考试卷子。被藏起来的那部分,是整个机制能老实说话的关键——它只测指令的泛化能力,不看候选指令是不是死记硬背了示范。一旦某个指令只是记住“happy对应sad”却搞不定“up”,考试分数立刻露馅。
三步循环,零人工干预
整个流程被拆成三拍,循环往复,完全没有人类拍脑袋的环节。
第一拍:提案(正向生成)。把事先留好的一小撮示范输入给模型,带着一股“你猜猜这些输入到输出之间到底发生了什么”的劲儿,让它产生候选指令。采样时使用非零温度,确保生成多样性,你会得到一个五花八门的池子:
- “写出输入词的反义词。”
- “给出这个词的反面。”
- “把词语的意思翻转。”
- “输出一个与输入词相关的词。”
这一步本质上是让模型从示例反推任务规则。有些候选指令精准捕捉到“相反含义”,有些偏到“相关词”上去了——全看采样运气和模型对任务的理解角度。但没关系,接下来有客观的裁判。
第二拍:评分。这是整个APE最狠的一刀。对每个候选指令,把它套到所有被藏起来的考题上,逐个运行,统计完全匹配的次数。用代码来表示就是:
async function score(instruction, heldout) {let correct = 0;for (const ex of heldout) {const pred = await llm(`${instruction}\nInput: ${ex.in}\nOutput:`);if (pred.trim().toLowerCase() === ex.out) correct++;return correct / heldout.length; // 在从未见过的例子上精确匹配率}这种“执行准确率”不参杂任何文采判断,只看干的活对不对。另一种经典的打分方式也常被提及——直接用模型给正确答案分配的对数概率来衡量,这种方式更顺滑、更省钱。无论哪种,评判标准彻底去掉了“我看着顺眼”的主观成分。
第三拍:挑选。按分数从高到低排个队,取最靠前的那几行。在反义词任务里,“写出输入词的反义词”可能拿到83%的准确率,脱颖而出;“输出一个与输入词相关的词”直接掉到17%。被挑中的不是读起来最漂亮的句子,而是实证最管用的那条指令。
在优胜者周围撒网:蒙特卡洛精炼
单单一轮往往撞不到天花板。APE后面补了一个迭代式蒙特卡洛步骤:把当前最佳指令当作新一轮的起跳点,让模型再围绕它产生一批变体,再次打分、筛选。这就相当于在得分最高的那座山头附近精细搜索,一点点往上拱。随着迭代的次数增加,候选池里那些模棱两可、容易把任务带偏的表述会逐渐被淘汰,留下的指令越来越贴近任务核心。
为什么这个方法值得你拆掉之前的调参习惯
手工调提示词最大的问题不是累,而是你永远在“你觉得好”的牢笼里打转。你试了三种说法,就停在那三种里,说不定第四种能把准确率再拉高十个点,但你没想过那么写,甚至觉得那么写别扭。APE用搜索代替内省,用客观分数代替审美偏好,它探索到的措辞可能根本不是人类会想出来的样子——但就是更管用。
另一个戳人神经的地方是:它把提示词工程从“描述任务”变成了“示范任务”。很多抽象的目标用一两句祈使句根本说不清,比如“把客服回复的语气调成既专业又有人情味”。但如果你甩过去五十组原始对话和期望回复,APE能从这些例子里提炼出远比你会写的更精准的指令。从此,你不需要先用人话把需求翻译一遍再喂给模型,直接让模型自己去样例里闻出味道。
反常识的点还在于:没有任何微调、没有任何梯度更新,纯粹靠着对同一个模型反复采样和验证,就把它的输出质量活生生硬拉上去。你用的是同一个模型,只不过从“它听你指挥”变成了“它自己给自己定作战计划”。这是把模型当成一个指令发现器来用,而不是一个指令执行器。
手写提示词这件事,迟早会像手工管理内存一样,被自动化的搜索和优化接管。APE给出的不是一个更舒服的编辑器,而是一套彻底不靠人脑猜测的工作流。下次再有人让你坐下来精修三段提示词,你不如直接扔给他一堆例子,然后让模型自己去找那句真正能干活的话。
热门跟贴