第 4 章
神谕游乐场
时间倒回2020年夏天,旧金山市场街南区的空气中还残留着疫情的寂静。当乔治夫开源的PRS源代码在SourceForge上继续以不到三位数的下载量沉睡,当通用魔法的Telescript专利过期后无人续费,当ShopBot的爬虫框架被吸收又停止更新——那些冬天里的壳还远没有等到被唤醒的时刻——OpenAI的办公室分散在员工的家中,API的发布没有发布会,没有新闻稿,甚至没有一篇像样的博客文章。只有一封邮件,发送给等待名单上的开发者,正文只有几行字,附着一组凭据和一个链接。点开链接,浏览器加载出一个极简的页面:左侧是输入框,右侧是输出区,顶部有几个滑块,标注着温度、最大长度、Top P。页面的背景是浅灰色,字体是系统默认的无衬线字体,没有任何装饰,没有任何设计。
这个页面叫Playground。开发者们打开它,在输入框里键入一行文字,按下回车,模型就开始续写。续写的内容有时合理,有时荒谬,有时精确得像在复述教科书,有时编造得像在梦呓。
没有人知道该怎么用这个工具,但所有人都感觉到一种模糊的兴奋:这能做什么?这个问题在2020年7月到9月之间,在Twitter、Reddit、Hacker News和微信群里反复出现,每次都伴随着一个精心设计的截图。
截图里,有人让GPT-3用莎士比亚的笔调写了一份披萨配方,有人让它用Python代码生成了2048游戏的网页版,有人让它根据一段产品描述自动生成了谷歌广告文案,有人让它模仿某个作家的风格续写了一段小说。这些截图在社交媒体上快速传播,每一张都像是一个谜题的答案,也像是一个更大的谜题的入口。它们共同宣告了一件事:大模型本身不是产品,怎么使用它才是。
但“怎么使用”这件事,在2020年夏天,还完全没有被工程化。它不是编程,没有固定的语法,没有可复现的逻辑。它更像一门手艺,一种直觉,一种在黑暗中摸索出来的经验。最早掌握这门手艺的人,很快获得了一个新头衔:提示词工程师。
这个头衔的诞生,本身就值得仔细审视。它出现在2020年秋天,最初出现在一些科技公司的招聘启事里,然后在Twitter上引发了争论。有人嘲笑它——“写提示词也算工程?”有人焦虑——“这是不是意味着AI要取代程序员了?”但更多的人在认真研究:“提示词工程”到底意味着什么?
它和传统的软件工程有什么区别?它需要什么样的技能?答案在实践中逐渐浮现。
提示词工程的核心不是写代码,而是写一段自然语言文本,让模型产生期望的输出。这段文本——提示词——可以是一个问题,可以是一段指令,可以是一组示例,也可以是一段角色扮演的设定。提示词工程师的工作,就是反复调整这段文本,直到模型的行为符合预期。这个过程不像编程,更像炼金术:你给模型一个配方,它有时产出金子,有时产出铅,你不知道为什么,你只能换个配方再试。
这种不确定性,在2020年秋天,催生了一套民间的知识体系。开发者在Twitter上分享他们的提示词模板,附带模型的输出截图,标注哪些有效、哪些无效。Reddit的r/GPT3板块变成了一个巨大的协作实验室,每天都有新的发现被贴出来,被讨论,被反驳,被改进。有人发现,在提示词前面加上“你是一个专家”会显著提高输出的质量。有人发现,用换行符把指令和示例分开会让模型更容易理解。
有人发现,在提示词末尾加上“让我们一步一步思考”会让模型的推理更准确——这个发现后来被证明如此重要,以至于它在2022年催生了一整条学术研究路线。但这些发现都是经验性的。没有人能从理论上解释为什么“你是一个专家”有效、“让我们一步一步思考”有效。在2020年,提示词工程更像是一个手艺行会,知识通过口口相传和截图分享,不通过论文和教科书。
一个人可以花几周时间磨练出对某个特定模型版本的直觉,然后在下一个API更新时发现这些直觉全部失效。这种脆弱性让提示词工程师们既骄傲又焦虑:骄傲于他们掌握了一种稀缺的、难以复制的技能,焦虑于这种技能可能随时变成废纸。
从工程史的角度看,提示词工程是“给智能套壳”这一古老问题在深度学习时代的第一代方案。它不创造新的模型能力,不修改模型的参数,不改变模型的架构。它只是找到一种方式,用自然语言约束模型的行为,让模型在给定的上下文中产生有用的输出。这不是代码,不比ELIZA的脚本复杂多少。
但它建立在一个庞大得多的参数基座上——GPT-3有1750亿个参数,这些参数从互联网的文本中学习到了人类语言的统计规律,而这种基座让语言本身的约束产生了不可思议的力量。
但这种力量有一个致命的缺陷:它没有地面真值。地面真值,在机器学习中,指的是可验证的正确答案。在图像识别中,一张图片到底是猫还是狗,这是可验证的。在语音识别中,一段音频到底对应哪段文字,这是可验证的。在代码生成中,一段代码能不能编译、能不能通过测试,这是可验证的。
但在文本生成中,一段文字“好不好”往往没有可验证的答案。一个营销文案是否有效,需要投放之后才知道。一个故事是否精彩,需要读者反馈才知道。一个对话是否“智能”,需要人类评估才知道。这些反馈都是延迟的、主观的、昂贵的。没有一个编译器可以告诉你,你的提示词正确还是错误。
这意味着,提示词工程师在2020年面对的,是一个没有调试器的开发环境。他们写一段提示词,得到一段输出,然后只能用自己的判断来评估输出的质量。
如果输出不好,他们不知道是提示词的问题,是模型的问题,还是任务的本质决定的。他们只能猜测,只能试验,只能在黑暗中摸索。这种状态,在软件工程史上有一个精确的类比:1950年代的程序员在穿孔卡片上写机器码,没有编译器,没有错误提示,只能通过程序的行为来判断代码是否正确。那种调试被称为“桌面检查”——坐在桌前,一行一行地读代码,在脑子里模拟机器的执行。提示词工程师在2020年做的,本质上就是桌面检查。
但正是在这种黑暗中,一些重要的规律开始浮现。最先注意到这些规律的人,是那些让模型做“可验证”任务的人。
2020年11月,一个独立开发者试图让GPT-3生成SQL查询。他给模型一段自然语言描述的需求,期望模型输出对应的SQL语句。他很快发现,如果只让模型生成SQL,然后手动检查,效率极低且不可靠。他开始在提示词中嵌入一个外部验证步骤:让模型生成SQL之后,自动用模拟数据库执行,如果执行出错,就向模型报告错误信息,让模型修正。
这个简单的改动——在提示词中嵌入一个循环——让他的SQL生成准确率提高了近30个百分点。这个开发者并不知道,他正在重新发现PRS在1980年代发明的东西:规划循环。模型生成一个计划,执行环境验证这个计划,反馈结果回到模型,模型修正计划。这个循环之所以有效,是因为SQL执行的结果是可验证的:要么成功返回数据,要么报错。地面真值存在,而且即刻可得。
另一个开发者尝试让GPT-3计算日期跨度。“从2020年3月15日到2021年7月22日,有多少天?”他输入这个问题,模型给出了一个数字。他手动验证,数字是错的。他换了几种提示词格式,模型还是给出错误答案。他意识到,日期计算涉及到精确的算术,而GPT-3在处理算术时经常出错——它在训练数据中见过很多日期,但并没有学会计算日期跨度的算法。
他最终放弃了让模型直接计算,而是在提示词中嵌入了一个外部计算器:让模型生成计算步骤,然后让一个Python脚本执行计算,把结果嵌入回输出中。这个方案有效了。
这又是一个循环:模型生成推理步骤,外部工具执行计算,结果反馈给模型。地面真值来自数学运算的可验证性——2+3要么等于5,要么不等于5。没有歧义,没有解释空间。
这些案例在2020年冬天仍然是个别的、零散的实验。它们出现在GitHub的issue区,出现在Reddit的技术帖子中,出现在开发者之间的私下交流中。它们没有汇聚成一套方法论,没有形成一套工具,没有催生一个框架。但它们揭示了一个深刻的规律:提示词工程的有效性,与任务的可验证性高度相关。当一个任务存在明确的地面真值时——代码能编译、SQL能执行、数学计算有唯一正确答案——提示词就有可能通过嵌入外部验证来系统性地提高质量。当一个任务没有地面真值时——创意写作、对话、营销文案——提示词工程师就只能在黑暗中摸索,依靠直觉和试错。
这个规律,在2021年夏天,被一个大规模的产品验证了。2021年6月,GitHub发布了Copilot的技术预览版。
这是一个集成在Visual Studio Code编辑器中的AI编程助手,底层模型基于OpenAI的Codex——一个在代码数据上微调过的GPT-3变体。Copilot的界面很简单:你在编辑器中写代码,它自动补全。你写一个函数名,它补全函数体。你写一条注释,它生成对应的代码。你写一个测试用例,它生成测试代码。Copilot在发布后的几个月内迅速成为技术圈的热门话题。开发者们在Twitter上分享Copilot的惊人表现:它补全了复杂的算法,它生成了让人眼前一亮的React组件,它甚至能从一段模糊的描述中猜出开发者想要什么。但更重要的是,Copilot也暴露了模型能力的边界:它有时会生成看似合理但完全错误的代码;它有时会引用不存在的API;它有时会生成安全漏洞。
这些错误在Twitter上被当作笑话传播,但在严肃的讨论中,一个更深层的观察被提了出来:Copilot之所以有效,不是因为它的代码总是正确的,而是因为代码正确与否是可以立即验证的。一个开发者用Copilot补全了一段代码,然后运行测试。测试通过,代码可用。测试不通过,开发者知道需要修改。这种即刻的红绿反馈,是编程作为人类活动独有的特征。
在文字处理中,没有“正确”的散文。在图像生成中,没有“正确”的画作。在对话生成中,没有“正确”的回答。但在编程中,代码要么编译,要么不编译。测试要么通过,要么失败。这种二元性,这种可验证性,让编程成为了第一个天然适合大模型落地的场景。
GitHub的CEO纳特·弗里德曼在2021年的一次内部采访中提到了一个数字:Copilot的技术预览版在发布后的几个月中,已经有超过40%的新代码是由AI生成的。这个数字后来被广泛引用,也被广泛质疑——40%的统计口径是什么?是字符数、行数、还是函数数?
AI生成的代码中,有多少经过了人工修改?但无论统计口径如何,这个数字指向了一个事实:在编程这个领域,AI辅助已经从玩具变成了工具。
这个转变之所以发生在编程领域,而不是在其他领域,不是偶然的。它不是因为Codex模型比其他模型更聪明——Codex本质上就是GPT-3,只是在代码数据上做了微调。它不是因为编程比其他任务更简单——编程是复杂的智力活动,出错率很高。它是因为编程有地面真值。编译器不会骗你,测试不会模棱两可,代码要么能跑,要么不能跑。这种确定性,让提示词工程师——或者说,让Copilot的用户——能够快速迭代,能够信任反馈,能够把AI的输出当作一个可验证的假设来对待,而不是当作一个神谕来膜拜。
这个对比,在2021年变得更尖锐了。同年,多个AI公司演示了基于大模型的通用助理:可以帮你订机票、订餐厅、管理日程的对话代理。这些演示在发布会上引人注目,但在实际使用中却频频出错。
一个AI助理可以流畅地描述它如何帮你订机票,但在实际执行订票操作时,它可能选错了日期、选错了航班、选错了舱位,甚至可能根本没有完成订票,只是生成了一个看起来像确认页面的文本。用户如果不仔细核对,可能在几周后才发现自己根本没有票。
为什么订票比编程更困难?不是因为订票的认知复杂度更高——订票的步骤是固定的,逻辑是简单的。是因为订票操作没有即刻的地面真值。一个AI助理声称它订了票,你怎么验证?你只能登录航空公司的网站,手动核对。这个验证过程是延迟的、费力的、容易被跳过的。
更糟糕的是,订票操作涉及到外部系统——航空公司的API、支付系统、日历应用——这些系统没有统一的接口,没有统一的错误处理,没有统一的反馈格式。一个AI助理在订票过程中遇到错误,它可能不知道发生了什么,可能假装知道了,可能编造一个合理的解释来掩盖失败。这些行为,在2021年的演示中,已经出现了。地面真值定律在这里露出了它的第一个尖角:智能体只在反馈可验证的领域先落地。
编程是第一个杀手场景,不是因为模型擅长编程,而是因为编程的输出是可验证的。通用助理反复跳票,不是因为模型不够聪明,而是因为缰绳无处着力——没有可验证的反馈,AI的行为就像在黑暗中游泳,你永远不知道它是在前进还是在挣扎。
2021年秋天,这个观察开始被一些技术评论者系统地提出。一篇发表在技术博客上的文章讨论了“AI的验证问题”,指出“AI的输出质量不取决于模型的能力,而取决于输出的可验证性”。这篇文章没有引起广泛关注,但它在小圈子内激起了共鸣。
一些提示词工程师开始有意识地选择任务:他们优先做代码生成、SQL查询、数据提取,而不是创意写作、对话生成、内容创作。不是因为前者更赚钱,而是因为前者让他们知道自己做得好不好。这种选择,在工程史上有一个名字:选择战场。在技术尚不成熟的阶段,聪明的工程师会选择那些有明确成功标准的战场。在计算机的早期,选择的是破译密码和弹道计算——有明确的对错。
在互联网的早期,选择的是电子邮件和文件传输——有明确的交付确认。在移动互联网的早期,选择的是定位服务和拍照——有明确的硬件反馈。在AI的早期,选择的是编程——有编译器和测试。每一次,战场的选择都不是随机的,不是由市场决定的,而是由“是否存在地面真值”这个工程约束决定的。
但2021年的Copilot,还有另一个被忽视的特征。它的工作方式是单次调用:你输入一段代码,它补全一段代码。没有多步推理,没有循环,没有工具调用。它不需要理解你的项目结构,不需要记住你之前做了什么,不需要在执行过程中调整策略。它只是在一个有限的上下文窗口内,根据当前文件的内容,生成一段补全。
这种单次调用的范式,在2021年看起来是能力边界,但在2022年将被证明是天花板。因为Copilot能做的,是那些可以在一个步骤内完成的任务。写一个函数,补全一行代码,生成一个测试用例。这些任务的地面真值是可即刻验证的。
但更复杂的任务——修复一个跨文件的bug、实现一个需要多步操作的功能、理解一个需要检索外部文档的API——需要多步推理,需要循环,需要在执行过程中不断调整策略。这些任务,Copilot做不到。不是因为模型不够强大,而是因为单次调用这个范式本身就限制了模型的行动空间。
一个简单的例子明这个限制。2021年秋天,一个开发者尝试让Copilot帮助他修复一个bug。这个bug跨越了三个文件,涉及到两个函数之间的状态传递。他描述了问题,但Copilot只能看到当前打开的文件,它给出的建议只是修复了表面症状,没有解决根本原因。开发者尝试了几种不同的提示方式,但问题始终没有解决。最终,他选择了手动修复,在三个文件之间来回切换,调整了状态传递的逻辑。
这个场景,如果放到2023年,会被一个循环智能体解决:模型读取错误信息,定位到相关文件,提出修改建议,执行修改,运行测试,根据测试结果决定下一步。
这个循环之所以有效,是因为每一步都有可验证的反馈:错误信息告诉你哪里出错了,测试结果告诉你修改是否有效。但这些循环机制,在2021年,还没有被系统地构建。提示词工程仍然停留在单次调用的范式中,智能体的循环——那种在PRS、Telescript和ShopBot中已经存在过的工程常识——还没有苏醒。2021年秋天,一个旧金山的技术会议间隙,几个在Playground上花费了大量时间的开发者聚在一起,讨论他们正在做的事情。他们谈到了提示词模板的分享,谈到了Twitter上的争论,谈到了谁谁谁又发现了一个新的提示词技巧。然后,一个人提了一个问题:“如果Copilot这么有用,为什么我们需要提示词工程师?”
这个问题在小组中引发了沉默。因为答案很明显:Copilot不需要提示词工程师。Copilot的用户是程序员,他们不需要写提示词,他们只需要在编辑器中写代码,AI自动补全。提示词这个角色,在Copilot中,被压缩到了用户正在写的代码本身——函数签名、注释、变量名——这些就是提示词。程序员不需要学习提示词工程,他们只需要继续做他们一直在做的事情。
这个观察,在后来被证明是脚手架悖论的一个早期实例:Copilot把提示词工程吸收进了产品,让提示词这个概念消失了——消失在用户正常的编码行为中。用户不需要知道什么是提示词,不需要学习提示词技巧,不需要在Twitter上分享提示词模板。他们只需要在编辑器中写代码,AI就会自动补全。
这种“压缩”,这种“吸收”,在2022年之后将反复出现:模型厂把缰绳层的创新吸收进训练、吸收进API、吸收进产品,让上一层的缰绳变得无关紧要。但在2021年秋天,这个观察还只是一个模糊的预感。
那些在会议间隙讨论的开发者们,没有人知道下一步会发生什么。他们只知道,他们正在做的事情——调整提示词、分享模板、在黑暗中摸索——可能不会持续太久。要么模型本身变得足够好,不需要精细的提示词工程;要么工具变得足够好,把提示词工程隐藏在产品界面之下。无论是哪种情况,提示词工程师这个职业,恐怕都只是一个过渡阶段。
2021年12月,一个开发者在他的个人博客上写了一篇文章,标题是“提示词工程的终结”。他在文章中写道:“我不认为提示词工程会成为一个独立的职业。不是因为提示词不重要,而是因为提示词太重要了,重要到它会被吸收进模型和工具中,成为产品的一部分,而不是一个需要人力维护的层。”这篇文章只有不到一千字,没有引起太多讨论。但它准确地描述了接下来两年将要发生的事情。Playground时代,从2020年夏天开始,到2021年冬天,已经持续了大约18个月。
在这18个月里,一个全球性的开发者社区围绕着一个极简的网页界面,把“使用大模型”这件事从一门神秘的技艺变成了一套可分享的经验。他们发现了提示词的威力,也发现了提示词的局限。他们发现,让模型产生有用的输出,不取决于模型,而取决于你对它说话的方式。
但他们也发现,这种方式无法系统化,无法工程化,无法规模化——除非有一种方式,让模型的输出变得可验证。Copilot是第一种方式。它选择了编程这个天然具有地面真值的战场,把提示词压缩进了编辑器的交互中,让模型输出变成了可编译、可测试的代码。它在2021年证明了一个原则:大模型的产品化,不在于模型本身的能力,而在于能否找到一个可验证的反馈循环。
这个原则,在2022年,将被ReAct论文和LangChain框架系统化地表达,将成为整个缰绳层工程的基石。但在2021年冬天,Copilot的成功还只是一个点状的案例,不是一个共识。
在提示词工程师的社区里,人们还在争论“提示词工程是不是工程”,还在分享“让GPT-3写出更好的营销文案”的模板,还在尝试让模型做创意写作、做对话、做那些没有地面真值的任务。这些尝试在接下来的两年里没有停止,但它们从未取得像编程那样的突破。通用助理的演示每年都在继续,每年都在跳票。创意写作工具不断涌现,不断被批评为“不够好”。对话AI不断进步,不断被用户发现漏洞。编程是唯一一个从“演示”变成“工具”的领域。这个事实,在2022年之后,将被反复验证,将成为一个被广泛接受的工程原则。
但在2021年冬天,它只是一个刚刚开始浮现的轮廓,一条在黑暗中隐约可见的裂缝。地面真值定律还没有被命名,但它的尖角已经刺穿了Playground的神谕迷雾。
2021年12月,GitHub Copilot结束了技术预览,开始在付费订阅下全面开放。同月,OpenAI发布了GPT-3的一系列更新,包括改进的指令遵循能力和更低的API价格。
Playground仍然在那里,界面仍然极简,输入框和输出区之间仍然没有工具、没有记忆、没有循环。但开发者们开始注意到一些变化:模型在遵循指令方面变得更好了,在拒绝不合适请求方面变得更好了,在保持一致性方面变得更好了。这些变化,在接下来的春天,将汇聚成一个爆炸性的产品——ChatGPT。而当ChatGPT发布时,整个世界将意识到,神谕游乐场不是终点,而是起点。真正的故事,在循环开始的地方,还没有被书写。