深入讲解如何通过上下文工程优化AI模型效能,对写Prompt和用AI编程的程序员有直接的工作流改进价值。
欢迎阅读最新一期《No Dumb Questions》。在这个系列中,Stack Overflow 最不懂技术的作者会向技术人员提出那些人们不敢问的简单问题。本期,Phoebe 邀请了 Stack 的数据科学总监 Michael Foree,一起探讨导致最近 AI 应用瓶颈的原因、AI 上下文究竟是什么,以及为什么上下文工程对 AI 系统的未来如此重要。此外,Michael 还分享了我们每个人可以如何成为更优秀的上下文工程师。
Phoebe Sajor:嗨,Michael,非常感谢你来参加最新一期《No Dumb Questions》。所以……现在大家无时无刻不在谈论 AI,但我听说 AI 已经撞上了一堵墙,这些工具的应用和演进都不及预期。我经常听到“AI 瓶颈”这个说法。那么,什么是 AI 瓶颈?我们为什么要关心它?
Michael Foree:从我参与的各种交流中,我也注意到了 AI 应用受阻的现象。几个月前,我参加了一场会议,并调查了与会者如何使用 AI。参会者总体上都是技术人员,但其中也有一些坚定的非技术人士。受访者的构成非常有意思,既有 CTO、工程师和分析师,也有平面设计师和项目经理,他们都向我分享了自己使用 AI 的情况。那是六个月前的事,对我来说是一次非常好的交流和学习机会。
我经常听到的一种说法是:AI 已经具备足够的能力,能够完成人们希望它完成的大多数事情。它似乎真正欠缺的,是与我们日常实际工作内容之间的连接。
我听到过一个具体的例子:AI 能够阅读并回复电子邮件,但它缺少邮件往来的实际上下文。它能够理解“嘿,这是某人发给我的邮件”,却无法掌握这个人是谁,也不了解我与对方在邮件线程、Slack 以及各种会议中进行过哪些交流。它缺失了围绕这封邮件本身的所有信息。因此,当我使用 AI 回复邮件时,必须从其他工作平台复制粘贴与这次对话有关的内容,才能让自己最喜欢的 AI 回复这一封邮件。
但只要 AI 获得了这些上下文,我就可以提出一个非常简单的问题,比如:“嘿,AI,我该怎么回复?”然后它就会生成一份回复。但我仍然要来回修改一两轮。之后,我才能把内容从 AI 工具复制到电子邮件程序中。完成这一切以后,我终于可以点击邮件的发送按钮。
PS:回复一封邮件而已,听起来要做很多工作。
MF:确实如此!更重要的是,AI 完全有能力完成我刚才列出的每一项独立任务。独立运行的 AI 工具所缺少的是正确的上下文。仔细想想,回复一封邮件其实需要大量上下文;如果想让 AI 完美且自主地回复邮件,它就需要建立所有这些连接。通常,它甚至没有连接到你正在使用的电子邮件工具,而这是能够回复邮件最基本的前提。
此外,其中还有一个非常小的环节,需要人类作出判断并表示:“差不多了,但还不完全对。”接着,AI 工具需要能够修正问题,再由人类表示认可并说:“好了,现在没问题了。发送吧。”目前已有的 AI 工作流中同样缺少这一环节。
PS:这就是所有人都在谈论的 AI 工作流中的“人在回路”环节!
MF:没错。Phoebe,从 CTO 到平面设计师,与所有这些人的交流都告诉我:目前 AI 存在上下文工程方面的问题。AI 缺少的是正确的上下文。现在,AI 无法开箱即用地判断:“哦,这就是为什么这个人决定必须回复这封邮件,而且必须立即回复的具体背景。”要正确处理回复邮件这样看似简单的任务,理解人类的判断和上下文至关重要。AI 无法自行判断:“还有一些与这封邮件相关的周边对话,我要确保在回复中纳入这些上下文。”即使是你每天都在使用的、最喜欢的 AI,也根本无法访问所有这些信息。它们分散在我们工作中使用的无数工具里,彼此形成了信息孤岛。
要让自主处理邮件之类的工作流真正运转起来,需要人类付出实实在在的努力。人类必须进行一些设置和实施工作,告诉 AI:“AI 工具,我希望你能够访问所有这些邮件。”很好,现在它拥有邮件上下文了。但它还需要访问你的简报、RFP,以及你正在处理的其他所有内容。因此,人类还必须连接自己的 Google Drive,并告诉它:“我希望你能够访问这些文档。”好了,但企业内部产生的所有相关信息怎么办?人类还得说:“我希望你能够访问 Slack 频道。”好了,现在它终于拥有所有相关上下文了。但即使完成了这一切,设置工作仍然没有结束。接下来,人类还必须授予 AI 权限,让它真正能够发送邮件。他们必须进入这个工作流并设置:“我还希望你在收到我的指令后,能够点击邮件发送按钮。”
就我个人而言,作为一名用户,我不知道自己是否愿意费这么大劲来设置这一切,因为我最多可能每天只用一两次,甚至可能一个月才用一两次。为了偶尔写一封邮件,真的值得专门设置这些东西吗?
PS:是啊,感觉还不如自己写邮件省事。
MF:我的意思是,如果计算一下投入与价值之间的权衡,最终,设置这一切所花的时间确实会得到回报。但许多人都在问自己:这种回报足以证明今天投入这些精力是值得的吗?在企业环境中,部署新软件所需的投入还要更高。我认为,AI 应用的瓶颈就出现在这里。我是否觉得今天就能获得足够多的收益,值得我去设置这一切?大多数时候,答案是否定的。我们会想:“实际上,我还有很多问题要解决,还有很多其他事情要做。我没有时间或耐心手动设置一个邮件回复工具。我不会去解决这个问题。”我不断发现的正是这种情况。
PS:我之前没有意识到,即使是写一封邮件这样简单的事情,也需要投入这么多上下文工程工作。此外,企业拥有如此庞大的数据量,使用这类数据所产生的 token 成本,似乎远高于自己写邮件的成本。你是否认为,成本以及处理企业级数据量的难度,也是造成 AI 瓶颈的部分原因?
MF:是的。如果思考一下我刚才所描述的上下文工程部分,很显然,你必须查看许多不同的数据。想想一封邮件涉及的每一条数据,以及为了组织这封邮件的回复,我们必须采取的每一个操作,就会发现我们人类需要吸收大量不同的数据。在 AI 中,这一切都会变成上下文工程。
哦,Joe 给我发了一封邮件——这是一条数据。接着,根据我已经掌握的关于 Joe 有多重要的上下文,我知道自己必须立即回复。这又是一条数据。当我查看他刚刚发来的邮件时,我意识到这里其实有一整个被我遗忘的邮件线程。其中有一些我需要吸收的数据。于是,我会在整个邮件线程中来回查看。对人类来说,这似乎相当直观。但如果认真分析,就会发现这里需要作出判断。我是否应该浏览其余邮件,找出 Joe 发来的其他邮件,并判断每一封是否与我要给出的回复有关?Joe 是否提到了某些特定关键词,可以帮助我决定回复中需要包含哪些内容?哦,他想了解 XYZ 项目的最新进展。作为人类,我可能会想:“好吧,XYZ 项目最新的进展在哪里?是在 Slack 或 Jira 中,还是在我参加过的一场 XYZ 项目会议里?”
作为一个人,我可能很快就能识别出,这是了解项目 XYZ 的最佳地点。但对于 AI 来说,去寻找这些不同的东西……他们通常会被淹没在不相关的上下文中,或者分心。在这种情况下,分散注意力这个因素变得相当关键,它与成本密切相关。此外,分散注意力的另一面还有一个问题:AI 缺乏它本应了解的信息。你可以这样理解分散注意力——如果我告诉我的 AI:"嘿,我想跳过这根圆木,顺便说一句,那边有蓝莓。现在告诉我,我怎样才能跳过这根圆木?"它会认为蓝莓是相关的,并会给我一个关于蓝莓的答案。同样地,除非它被特别训练来寻找,否则它不会想到要问是否有水坑,或者圆木有多大。它必须被专门训练来关注圆木的大小。但如果它不知道要问这个问题,它就会猜测。它被训练来猜测。
所以,对于给 Joe 的邮件这个例子,它会被我文档中关于项目 XYZ 的所有无关内容、所有提到 Joe 的邮件,以及我团队在 Slack 上关于这个项目的所有讨论所干扰。它会吸收所有这些干扰信息,然后给出一个不符合 Joe 邮件具体上下文的回应。这些干扰信息会消耗时间和 token。
最新推出的 LLM 在排除干扰内容方面做得更好了。他们更善于判断何时说"是的,并且……"他们提出更多后续问题。但他们必须被训练来做这件事。三年前,他们在判断何时猜测、何时请求额外上下文、何时不分散注意力方面表现得非常糟糕。所以他们进步了很多,但还有一个附带因素。他们在处理公开可用的信息方面做得更好了。
比如跳过一根圆木。没错,你可以训练它问"圆木有多大?"但这完全不同于特定公司及其具体流程的私有专有信息。大多数 AI 实验室无法获得我们的专有信息来训练我们特定的流程。而且你也不会想要他们这样做,因为那是专有机密!
但这对与 AI 合作的公司来说是一个挑战。要让 AI 真正发挥作用,它需要理解你们的具体流程。这正是我们现在在 Stack Internal 上所做的工作。它有助于缓解一些私有专有信息的问题。我们不是在私有专有信息上训练任何 LLM 或 AI。我们只是创建一个知识连接器,让 AI 获得它需要的上下文。我们通过引入人类来验证 AI 使用的专有信息,从而创建这种上下文工程。现在,AI 可以说:"嘿,有人问了一个关于这个的问题。根据我看到的,我相当确定答案是这样的。但你实际上是这个特定流程的专家。你能确认我的回答是否正确吗?"这样,具有相关专业知识的人类就可以介入说:"实际上,在这种情况下、这种场景下,你应该这样做。"
这涉及到一种大 AI 实验室根本无法获得的上下文工程的圣杯,因为没有人想把自己的专有数据卖给他们。这是机密的,是我作为一家企业的秘密武器的一部分,所以不,你不能碰它。
PS:你提到和来自分析师到平面设计师的各种各样的人交过谈。你会说,在不同的行业和不同的人之间,上下文工程对每个人都是一个问题吗?无论我是工程主管还是从事平面设计的承包商,AI 采用的瓶颈最终都归结为上下文和分散注意力吗?
MF:答案是肯定的,但在不同的行业中表现方式各不相同。在我与非技术人士的访谈中,最突出的问题是他们缺乏可用的连接工具。例如,有一个人给他们的客厅拍了张照片,想要重新设计——改变油漆或窗帘,或重新布置家具。他们拍了照片,提交给了他们最喜欢的 AI,AI 能够正确识别出窗帘和油漆的最佳色彩搭配。它可以指出如何重新安排家具以改善动线。它可以建议你应该重新油漆这个还是应该移动那件家具。但工具的连接存在中断,导致他们无法快速迭代。
他们必须从电脑前起身,用手机给客厅拍照,通过邮件发给自己的电脑,然后在主电脑上提出所有这些问题。在我与他们的访谈中,我不想像是在说"难道没有这样的应用吗?"因为确实有。但这让我意识到,技术本身是可行的,但工具之间的连接不足。这种连接断裂在涉及自主智能体时会产生一个特别的问题。比如,我想重新油漆我的墙,给我推荐什么颜色。我可能会希望它显示附近有相应颜色油漆的商店。如果它真的很有帮助,它应该让我在不离开 AI 工具的情况下购买那种油漆。
这不应该是很难的事情吧?Google Maps 已经解决了"我在哪儿,附近有哪些油漆店"的问题。而某个油漆店肯定乐意向一个机器人卖油漆。这应该是一个双赢的局面。那为什么我们还不能这样做呢?为什么还没有解决这个问题?
在我看来,这种连接缺乏不是一个特别难解决的问题。问题在于需要有人去做这个工作,但我们没有足够的动力去真正解决和连接这些不同的东西。这回到了我之前说的关于设置自主邮件回复的问题。如果你每个月只用它来处理一两封邮件,你今天实际能受益多少呢?我们还需要权衡,用 AI 买一桶油漆所需的所有工作——连接到 Google Maps、提供信用卡信息、分享关于你最喜欢的本地油漆店的上下文——是否值得这么做。
用个例子来说明。你可以用 AI 生成购物清单。但与其手写清单,你可以这样说:"这是我家人的名单。他们有这些过敏症。我们需要早餐、午餐和晚餐。我没有太多时间做饭,因为很忙。"你可以让 AI 为你生成这个清单。但一旦你说"现在帮我下单订购这些食物",你就卡住了。有很多杂货店提供在线订购,只要你用他们的应用。但他们不会以这种方式暴露 API。对他们来说,暴露 API 仅仅是为了让你的 AI 替你购物是个安全风险。而且你一个人的 AI 购物行为不会激励其他人从他们的商店购买,那又有什么意义呢?我认为只有 Instacart 这样的平台提供某种激励。如果我开发一个应用程序做完全我刚才说的那些事情,然后当人们使用它时作为应用开发者获得一小笔提成。但很少有杂货店会激励我这样的人去开发这样的应用。所以没人会去做,因为凭什么呢?我可以做我的正常工程工作就好……
PS:……自己去超市。
MF:是的,完全同意。即便这样的应用对购物者和杂货店都真的很有用,也没人愿意花时间去做。对于任何读这篇文章的人,你其实可以凭感觉编程开发一个应用,做完全我刚才描述的那些事,然后接入你本地杂货店的 API。这不是什么火箭科学。你可能完全免费就能做完。发布出去。我相信人们会用它、喜欢它,也许这会成为一个开始。找到资金来做这个,因为未来是美好的,对吧?我们不必各自购物和制作清单。有更好的办法。我们可以做得更好,伙计们。未来就在现在。让我们开始吧。
PS:是的,未来就在现在!我最近写了一篇关于在 AI 时代做建筑者和工匠的文章,正好呼应你的观点——似乎我们已经进入了一个阶段,任何人都能比以往任何时候都更快地构建任何东西。这确实为我们打开了无限的可能性,对吗?从技术角度来说,你发现我们变得更有创造力了吗?关于 AI,有些讨论说它让我们的创造力降低了。但从我的个人经验来看,恰好相反。在你与人们的对话中,你发现 AI 让人们更有创造力还是更没有创造力?
MF:是的,Phoebe,我同意你的看法,它为人们提供了一种新的创作途径。我举一个自己的例子——我非常喜欢摄影。我最初接触的是胶片摄影和黑白摄影,因为我可以真正沉浸其中,享受很多乐趣。后来数码摄影出现了,再后来手机也能拍照了。黑白胶片摄影真的、真的、真的很难入门。我有一台相机,却从来不用。现在我用手机拍出的照片,与以前用胶片相机拍出的照片完全不同。所以从一个角度看,数码摄影让胶片摄影变得不那么流行了;但从另一个角度看,一种全新的艺术形式被创造出来,并迅速蓬勃发展。现在,我们可以低成本制作视频并发布到 YouTube,也可以随时随手自拍。“自拍”这个概念,是在我开始接触摄影之后才出现的。
我认为,对于编程或使用 AI 创造事物来说,传统艺术表达的某些部分也会逐渐被淘汰。这其实有点令人伤感。但我认为,其他形式的表达也确实正在被创造出来。由于门槛降低了,其他所有人都能把代码作为实现目标的手段。现在,写代码不再只是因为我想写代码,而是因为使用代码能够帮助我实现某个目标,或者创造出以前从未存在过的东西。还有,Phoebe,我不了解你的编程背景,但你大概一个下午就能创建出一个帮你购买日用品的应用。
就我个人而言,几年前我上过一门关于使用 AWS 云服务的课程。此前我从未托管过网站,但仅仅一个下午,我就从连 AWS 几个字母都快拼不出来——
MF:——变成了成功上线自己托管的网站。现在,我可以在 AWS 上拥有自己的个人网站,让它做我想做的任何事情。这并不是因为我知道如何管理服务器机架和网络,而是因为 AWS 通过云服务把这件事变得简单了许多。在我看来,AI 正在做同样的事情。
PS:我们手中似乎掌握了许多强大的工具,但上下文的问题依然存在。对于我们的读者,你认为上下文工程的第一步是什么?我们怎样利用上下文工程,让 AI 变得更有用?
MF:我想借鉴一下我家小学生所学的课程。他们正在教孩子们“观察与好奇”。你看看周围的世界,停顿一下,然后问:“这里发生了什么?我正在观察的这个事物,有哪些很酷、不同、独特或值得注意的地方?”这会迫使孩子们喘口气、停下来,然后再对事物得出结论。在思考上下文工程时,这一点同样适用。再说一次,这并不是什么高深莫测的科学。但你确实必须思考正在发生什么,以及要把那封邮件发给 Joe,你需要什么上下文。你确实需要停下来,把自己的思考说出来:“好,如果由我来写这封邮件,我会参考哪些信息源,又会排除哪些信息源?”这是人类会自动完成、但 AI 不会自动完成的事情。因此,进行上下文工程时,你必须先观察,再产生疑问。你必须强迫自己仔细梳理正在做的每一件事,并思考:“我可能需要了解这项信息、那项信息,或者另外某项信息。”然后,你需要把它们写下来,再处理下一封邮件,并重复同样的过程。
随着这个过程不断进行,你会得到一份清单,其中列出了邮件回复应用应该有权访问的各种信息源和内容。你也会发现问题出在哪里——我的邮件回复应用还需要拒绝那些看起来像这样、这样、这样以及这样的无关信息。
这其实非常基础。但困难在于,我们人类做得太频繁了,所以会自动完成这个过程。除非你教会 AI,否则 AI 不会自动这样做。因此,你必须先停下来仔细思考——为什么我要排除某些信息?哪些内容会造成干扰?然后再开始构建它。用凭感觉编程把它做出来。接下来,你还必须测试自己的上下文工程。在一个模拟场景中,我会让 AI 对某项内容作出回复。好吧,它的回复并不是我预期的。我想知道,它为什么认为自己应该查看这项内容,而不是另一项内容。这本身会变成一种创造性的解决问题过程。你必须稍微挠挠头,努力把问题理清楚。怎样才能排除这部分干扰信息?又或者,问题可能在于你忘记向 AI 提供它所需要的某条特定上下文。等它能够正常工作后,你就可以真正发挥创造力了。怎样为它增添亮点,让它真正有用?怎样扩展它,让它变得更酷?也许你希望在某个地方记录下来,你曾经发送过一封关于某某事情的邮件——这会帮助你构建出更好的上下文架构。
但上下文工程始于观察与好奇。这就是我想鼓励读者去做的事情。你必须停下来,思考自己正在做什么。
PS:尤其是在如今这个 AI 时代,我认为我们很多人都没有停下来思考。上下文工程似乎要求我们逆转过去对 AI 形成的所有认知。我们一直前进得太快了:别思考,直接做。现在钟摆又摆向了相反的方向——哦,实际上,我们需要停下来稍微思考一下。
PS:你有机会与很多人交流过 AI 瓶颈,以及人们如何使用 AI。你认为 AI 的未来会发生什么?你觉得我们需要如何改变使用 AI 的方式,才能真正从中受益?
MF:根据我经历过的交流,我认为 AI 未来发展的一个症结在于人们对 AI 的态度两极分化。人们带着一些先入为主的观念,认为 AI 非常出色,能够解决他们的所有问题。事实并非如此。但在另一个极端,人们认为 AI 是有史以来最糟糕的东西,将会毁灭人类。事实同样并非如此。我认为,AI 在某些事情上比人类做得更好。那就充分利用这一点。我也认为,AI 在另一些事情上不如人类。那也要充分认识并利用这一点。它只不过是另一种技术;作为一个社会,我们会把它纳入日常生活并与之协作。我不认为它会消失。我认为,就像对待我们拥有的任何工具一样,了解它在哪里有效、在哪里无效,才是明智而审慎的做法。适合使用它时,就学会使用它;不适合时,就不要使用它。
PS:把工具交到聪明人手中,对社会而言一直都是件好事。希望我们能把正确的工具交到正确的人手中。