30 秒看懂
Sander Schulhoff 花了 20 小时,为一个二分类任务手写提示词(prompt)。同样的带标签数据交给 DSPy 之后,它在留出的测试集上赢了他。他与 Nathan Labenz 在 The Cognitive Revolution 播客上拆解了 The Prompt Report:少样本提示(few-shot prompting)的设计规则能让准确率在 0% 到 90% 之间摆动,防御提示注入(prompt injection)为何仍像一场必输的游戏,以及智能体(Agent)和开放式生成任务上还有哪些地方会失败。
- 1Sander 采纳的是 Simon Willison 的界定:提示注入(prompt injection)涉及写在提示词(prompt)里的开发者指令;越狱(jailbreaking)则只是用户和模型之间的事。他曾经弄错过,被公开指出,之后写文章谈了自己的转变。
- 2他没有在论文里搜索 delve 这个词。经过 5 轮通读,Nathan 仍然一个也没找到。用 AI 帮忙写作没问题,用得粗糙一眼就能看出来,这正是他要删掉的东西。
- 3少样本提示(few-shot prompting)和上下文学习(in-context learning)不是一回事。按 Brown 等人 2020 年的定义,即便只是一句“给我讲个恐龙的故事”,也属于上下文学习;少样本只是指定任务的一种方式。
- 4示例顺序可以让准确率从 0% 变到 90%先把所有正例排在一起,再排所有负例,会让模型对下一条的预测产生偏向。应该随机打乱;手工精心设计的顺序,几乎从来赢不过随机。
- 5Sander 认为,人类反馈强化学习(RLHF)可能会降低准确率,它用正确性换来了聊天时的讨人喜欢。在笑话、风格模仿和随机数生成上,基础模型仍然更好;只有奖励信号是“代码能不能跑”,而不是“看起来好不好”,代码能力才会提升。
- 6专家手工打磨了 20 小时提示词(prompt),DSPy 只用不到 20 个示例,仍然在测试集上赢了。有标签时,自动化提示词优化确有其用;没有标准答案(ground truth)作为信号,它就没有可以爬升的方向。
按章节阅读完整文稿
Learn Prompting 如今把企业课程做成可以重新构建的流水线
Nathan Labenz 再次请 Sander Schulhoff 做客 The Cognitive Revolution。Sander 创办了 LearnPrompting.org,并组织过两人在 1 月聊过的 HackAPrompt 竞赛。这次的主题是 The Prompt Report,这是一份 78 页的综述,讲的是随着模型能力一同爆发的各种提示技术。与此同时,最初的教程网站已经变成一家向企业销售生成式 AI 课程的创业公司,Sander 正在找第一位全职通才,帮忙做视频和商务方面的工作。
咨询公司的高管一直告诉他,别人推销给他们的课程都过时好几年,而且修起来很痛苦。他的解法,是把教学视频当成编译好的软件来对待:先写脚本,让 ElevenLabs 朗读,等客户几个月后想改动,就运行一个 Python 脚本,整段视频重新生成。至今仍没有哪个智能体(Agent)能从头到尾完成“帮我做一个关于提示词的视频,覆盖这些主题,去查这些网站”这类任务。团队正在自己搭建这条流水线,中间有大量笨拙的工具串联。
提示注入(prompt injection)不是越狱,防御仍在落败
Sander 说,自 1 月以来,HackAPrompt 没有再冒出什么大的新攻击类型。微软的 Skeleton Key 很像是这次竞赛里已经覆盖过的技术。真正引发争论的是术语。他相当笃定地认同 Simon Willison 最初的定义:提示注入(prompt injection)指的是提示词里的开发者指令加上用户输入;越狱(jailbreaking)则只是用户在和模型对话。这种区分主要为了清晰,也是尊重最先提出这个说法的人,并不涉及什么高风险的法律界线。
他以前也把定义弄错过。HackAPrompt 之后,Willison 批评了论文的措辞;Sander 重读后认同对方说得对,更新了论文,并在 Learn Prompting 上写了一篇文章谈自己的转变。Nathan 问到 Anthropic 的 many-shot(多样本)越狱,以及从消费级聊天界面里拿到系统提示词的 Pliny。Sander 对 many-shot 不以为然:HackAPrompt 的参赛者早就往提示词里塞满了一堆少样本示例。按 Willison 的定义,Pliny 的工作大多属于提示注入,尽管 Pliny 和圈子里的其他人都称之为越狱。
Nathan 原本希望 OpenAI 的分层指令遵循(系统提示优先,其次是用户,形成一个优先级级联)能把这个问题封住。Pliny 则持相反的看法:模型越强,就越容易被注入,部分原因是攻击面更大,包括嵌在图片里的提示词。Sander 没有偏爱的防御方案。他喜欢 Lakera 的一场竞赛,那场竞赛用了会自适应的系统提示,每一次成功的注入都会被吸收,就像疫苗吸收病原体那样;但他仍然认为,“这里的防御始终是一场必输的游戏”。
他之前觉得自动化越狱不值一提,后来参加了 Haize Labs 的内测,看着这个产品在几秒钟内就越狱成功,任意目的都能得手:造炸弹的说明、种族歧视的输出。这是他第一次见到真的有团队做到这一点。训练第二个模型来识别攻击,并不能打动他。他认为,这个问题应当由模型开发者在训练或架构上解决,而不是靠应用层的过滤器。Nathan 提到 Anthropic 的 Golden Gate Claude 式特征检测,以及 Dan Hendrycks 的断路器(circuit-breaking)研究,后者会把有害的内部表征转向拒绝回答。Sander 不愿押注某条具体路线。
这份综述花了 9 个月、44 个关键词和上千次人工判断
这篇论文最初是一次转向。Sander 在马里兰大学 Philip Resnik 教授指导下,想测量生成式 AI 究竟能让人在一项任务上快多少。他发现已经有大约 13 项这样的研究,样本量从 11 人到几千人不等,但他意识到,一个像样的实验要花 6 到 9 个月,超出了一个学期的时间。他对自己说,做一份提示技术综述,3 到 4 个月就能搞定。“能有多难?”结果花了 9 个月。
他从马里兰大学的 NLP 实验室招人,在 Startup Shell(一家学生运营的孵化器)的 Discord 上发帖,请来一位 OpenAI 的合作者,读论文时就给作者们写邮件。项目后期,他又请来 4 位自杀预防专家,做一个检测社交媒体帖子中自杀意图的案例研究。顾问们建议用主题建模,看看文献到底在关注什么。得出的主题与他之前勾勒的章节对得上:文本提示,然后是多模态、多语言、智能体(Agent)和评估。
让 GPT-4 读完整个 arXiv,再由它判断什么算提示技术,成本太高。团队用 44 个关键词检索 arXiv、Semantic Scholar 和 ACL Anthology,去掉重复结果,然后由人工审阅了大约 1000 篇论文。凡是需要微调(fine-tuning)的一律排除。他们用这些标签去提示一个模型来筛选其余论文,写作期间也持续抓取新论文。合作者 Michael Ilie 负责这条流水线。整轮运行要花好几个小时,所以草率的测试既浪费时间,也浪费钱。
用 AI 写作没问题,用得粗糙一眼就看得出
Nathan 在 PDF 里搜了一下,确认“delve”这个词一次都没出现。Sander 自己没有去搜。论文是人写的,不过人们可能少量用过 ChatGPT,他也从没对模型惯用词做过查找替换。他真正在意的是质量。在大型研究团队里,他会碰到一些段落,明显是生成出来却没有修改的:措辞说不通,一看就知道。问题出在这里,不在用没用 AI 本身。
他至少对 70 多页的正文做了 5 轮通读,最后又逐词读了一遍,把那些糟糕的生成内容删掉。他其实很惊讶,居然一个 delve 都不剩,他原以为会留下几个。接着他讲解高级技术的分类,其中大多数需要代码或流水线:少样本提示(few-shot)、思维链(chain-of-thought,是一族生成技巧,而不是单一技巧)、任务分解、角色提示、风格提示、集成(ensembling)和自我批评。要不要把任务分解和思维链合并,是一场真正的争论,因为两者都是把问题拆成步骤。另一种图谱,让技术同时归属于几个类别,也同样说得通。Nathan 开玩笑说,这个领域需要为提示词配一个稀疏自编码器,看看任意一段文字里哪些技术处于“激活”状态。
六条少样本(few-shot)设计建议:通常有用,偶尔也会适得其反
在 Sander 看来,最有价值的是少样本设计,以及文献里仍需澄清的一个概念:少样本提示(few-shot prompting)和上下文学习(in-context learning)不是一回事。按 Brown 等人 2020 年的 GPT-3 论文 Language Models are Few-Shot Learners,哪怕只让 ChatGPT“给我讲个恐龙的故事”,也属于上下文学习,因为在提示词里指定新任务正是它的核心。过去模型只针对一项工作训练,现在描述工作就行。少样本只是其中一种形式。他把这篇论文读了 20 多遍,还请 OpenAI 的合作者内部核对过。其他引用 Brown 的论文,仍把两者混为一谈。
报告中的图 2.3 列出了 6 条建议。每一条在某次具体运行中都可能拉低准确率,但综合起来是有帮助的。数量:示例越多越好,但要和成本、延迟权衡。顺序:随机打乱。如果先放所有正例、最后放所有负例,模型可能会一直预测它刚刚见过的那个类别。同一组示例,仅仅因为顺序不同,准确率就可能落在 0% 到 90% 之间,“超级出人意料,老实说相当让人抓狂”,因为没有可靠的办法找到最优顺序。Nathan 问,精心设计的顺序能不能赢过随机。Sander 说通常不能,那些胜出看起来更像运气。
二分类任务里,标签分布应当平衡,除非真实世界本身就是偏斜的。如果 90% 的案例都是正例,那么 9:1 的示例配比可以提高整体准确率;要让示例贴合数据,而不是硬造一枚公平的硬币。标签质量依然重要。有些论文发现错误标签影响不大,但人们常常从杂乱的数据集里自动构建提示词,所以干净的标签,才是给自己争取机会的办法。格式:选一种常见的。Sander 几乎总是用 Q: 作为输入、A: 作为输出。一篇提示词挖掘(prompt mining)论文发现,与预训练数据中常见的问答格式保持一致,能提高准确率。他把这比作在更平滑的损失曲面上做优化。模型从没见过的奇怪分隔符,会让这个曲面变得更崎岖。
最后一条是相似度。在推理时,检索出与测试样本相似的示例,再把它们放进提示词里,这是一种类似检索增强生成(RAG)的动态提示。其他论文主张多样性;Sander 的经验是,相似的示例更可靠,只有在特定情况下,多样性才有帮助。他还挑剔了用词:数据集里的一条数据叫 example(样本),放进提示词之后才叫 exemplar(示例)。团队自己的实验主要跑在 GPT-3.5 上,也用了一些 GPT-4。要在公开 API 上把他们想测的每种技术、每个模型都跑一遍,大约需要一个月。他仍然认为,这 6 条规则在 OpenAI、Claude 和谷歌的模型上同样适用,而且论文里的每种技术都可以用标准的大语言模型(LLM)实现。
多一个空格也可能有影响,人类反馈强化学习(RLHF)或许是代价之一
Nathan 问,句子之间多加一个空格就能把提示词搞砸,即使 temperature 为 0,这种说法有多靠谱。他多年来一直习惯句间用两个空格,现在考虑为了模型表现而改掉。Sander 是句间只用一个空格的人,他说这确实是一个可靠性问题,报告的可靠性与对齐部分有讨论,但随着模型进步,问题应该会消退。GPT-4 比 GPT-3 稳健得多。他写提示词时,不会逐个消融单词;他假定小改动不会有太大影响,尽管他知道有时会有影响。
他并不觉得是人类反馈强化学习(RLHF)把这些怪癖磨掉的。他主张,RLHF 已被证明会降低准确率,这是正确与讨人喜欢之间的取舍。Nathan 的经验与此一致:在写笑话、模仿某位知名作家的风格和生成随机数方面,基础模型都胜过经过 RLHF 调优的模型。代码能力会不会变好,取决于学习信号。如果奖励是“代码能不能跑”,那信号就很强;如果是“人喜不喜欢代码的样子”,信号就弱得多,不该指望它白送一个准确率的提升。
Sander 在试图弄清信用分是怎么算出来的时候,被 GPT-4 的拒答搞得很恼火。模型先说这个公式是专有的,接着又说连一个示例公式“可能有害”。他写代码时仍然主要用 ChatGPT 和 Claude,而不是基础模型,除非某篇研究论文要求用基础模型。Nathan 一直在 Together AI 上比较 Llama 的指令版和基础版,他怀疑:如果你想要的是高方差、跳出框框的点子,比如一个双关的播客标题、一个更怪的笑话,那么基础模型会赢,而不是看所有生成结果的平均分。
开放式任务没有干净的多数投票
对于一个乱糟糟的任务,Nathan 的默认建议是:坐下来花几个小时,写出金标准示例,把推理写得痛苦地清楚:线索是什么,逻辑在哪里跳跃,然后再来一遍,写得更清楚。大多数真实工作并不是带标准答案字母的选择题基准测试。Sander 几乎一字不差地附和。他见过的最常见的失败,是人们把一堆指令丢过去,然后抱着希望。“至少展示 3 个该怎么做的示例,真的、真的很有帮助。”
集成(ensembling)大多默认存在一个确定的正确答案:让模型跑 10 次,取多数票。Nathan 想找到一种办法,在开放式任务上投入更多算力,比如给小企业生成 Waymark 视频脚本,这类任务没有唯一正确的输出,但好坏之分很明显。Sander 的回答有点让人失望。你可以把流程串起来:先出一稿,再用带准则的修改提示词修订,然后分段批评。你还可以给多个智能体(Agent)分配角色:写作者、语法检查员、风格检查员。他读过多智能体辩论的论文,但认为现在还不值得实现。他大概也不会去实现这套自我批评流水线。
Nathan 的替代方案,是先靠自举过渡到微调:用最好的模型生成,让人工挑出喜欢的,再微调,然后扩展边缘情况的覆盖。在 Waymark,收益最大的,是在思维链推理数据上做微调,而不是在输入输出对上做微调。往每条提示词里塞 20 个示例,比微调更贵、也更慢,尽管微调本身也不便宜。评估仍然没有自动化。他们有结构化的评估,但因为边缘情况,并不完全信任它们,所以仍然会看数据,并亲自使用产品。Sander 对这个想法的喜欢程度,和他对提示词流水线的差不多:可能有帮助,但并不保证。
同一个问题换几种语言问,再用图像来思考
谈到多语言提示,枯燥的建议依然是:先翻译成英文,完成难的部分,再翻译回来。Sander 在这一章里最喜欢的技巧,是多语言集成(ensembling):用几种语言执行同一个任务,再把结果合并。Nathan 以前从没见过这种做法;这也正是 Sander 最喜欢的。除此之外,那一节里他没有其他想特别提醒的大惊喜。
在多模态工作里,他最喜欢的是思维链图像提示(chain-of-image prompting)。比如一个视觉推理问题:直线 y = x 和这个圆有交点吗?模型会把两者画出来,渲染成一张图(比如用一个 SVG 的 Python 包),看着图片,问自己它们是否相交。这就是以图像为步骤的思维链。视频则是另一回事。Runway 的 Gen-3,无论是他自己上手,还是一位专攻视频提示的朋友上手,都“极其难搞”:你必须描述得异常具体,更接近早期 GPT-2 或 GPT-3 的提示方式,而不是 ChatGPT 那种。他还没试过 Sora 或 Kling。
Nathan 注意到提示词的篇幅之大:为几秒钟的 Gen-3 视频,要写整整几段的构图和转场说明,这有点像 DALL-E 3 在幕后把用户粗略的提示词扩写一样。对于给语言模型输入图片,他发现叠加网格、分割图或专门的 OCR,效果更好。前沿模型读扫描的管道零件目录时,会把零件编号弄得乱七八糟;把编号用 OCR 转成文字、保留图纸,同样的模型就突然能返回正确的 SKU。Sander 大多只做文本,最近做过的内容生成实验除外。
智能体(Agent)看似有前景,却还不能替你付账单
Sander 也认同一种主流看法:智能体(Agent)还不太管用。他喜欢 ReAct 这类简单循环,并认为当工具非常具体时,工具调用可以很可靠。他接下来想要的,是把工具调用当作一等公民的架构,而不是微调一个吐出魔法字符串的模型;再加上强化学习(RL),让模型学会行动,并自己生成奖励信号。“希望强化学习最终也能迎来它的 NLP/LLM 时刻。”
实际用起来,连他也觉得智能体(Agent)让人抓狂。他没法说:“我刚收到一封邮件,要付款给某人,去我的网银网站,把这么多钱转给他们。”这本该是几条网址串起来的事情,但现在做不到。Nathan 一句话点评:这听起来也是清空银行账户的快捷方式。Sander 同意,安全问题非常大。除此之外,他在智能体那一章里没有发现什么隐藏的宝贝:方法很多,一些狭窄的任务做得还行,但没有哪个能完成人们真正想要的那种简单的跨多个网站的琐事。
20 小时的手艺输给了 DSPy,还有一条规则:谁都不信
聊到后半段,Nathan 才抖出这条最重要的线索。Sander 花了大约 20 小时,为一个二分类任务打磨提示词,对结果很满意。随后,他的导师用同一批示例数据跑了 DSPy。Sander 不确定这个名字该怎么读:是“dispy”,还是一个字母一个字母地读;Omar Khattab 曾在马里兰大学做过演讲,但 Sander 仍然记不住官方读法。DSPy 用同样的数据生成的提示词,在测试集上把他“彻底打败了”。
他现在可以说,只要有标准答案(ground truth)标签可供优化,自动化提示工程就是有效的。他不认为它能优化任何提示词,因为它需要一个可以爬升的信号。这是一个黑盒框架:它可以调用闭源模型的 API,不需要模型权重。他给它的示例不到 20 个;数据集本身只有几百条。“我绝对没想到,自己会输给一个自动化提示工程系统。”如果你手里有带标签的数据,他认为你就应该用上。
Nathan 想到把一个提示词教练产品化:它带着这套分类法跟着你。Sander 暂时把这件事留给别人。Learn Prompting 在文档之上做了一个检索增强生成(RAG)聊天机器人,但要稳定地为任意领域的提示词打分,而且让人愿意为此付费,这一点还不清楚。他在 360 度评估中得到的管理心得更加尖锐:“谁都不信,包括你自己。”落到实处,就是每个拉取请求都要跑测试和持续集成(CI)流水线,包括他自己的,这样风格检查和回归问题就溜不进来。他不会再推荐做一次系统性文献综述,因为它花的时间是原计划的两倍。他仍然很庆幸自己做了,也庆幸社区有了这张地图。The Prompt Report 有 78 页,免费。
同频道的其他文章
1:25:56EN → 简体中文
2:17:48EN → 简体中文
2:00:51EN → 简体中文
1:26:46EN → 简体中文
1:10:12EN → 简体中文
1:30:54EN → 简体中文