[音乐]
大家好,我想我们可以开始了。几个月前,我做了一件有点荒谬的事情。我拿了一个编码代理(coding agent),将其指向我们团队的云沙箱托管环境,并让它尝试破坏它,然后我让它在后台运行了一整夜。这次演讲主要关于我们发现了什么。我叫凯文,在亚马逊 Bedrock Agent Core 工作。这是一个沙箱托管环境或平台。我们做的不仅仅是这些,我们还提供代理、身份验证、记忆功能、运行时环境和沙箱网关等任何你希望用来构建和托管代理的工具。
事情的起因基本上是我仔细审视了客户如何使用我们的平台,并且我认为行业中的许多人都看到互联网上的许多平台组件其实就是代理,而且它们越来越多地托管在沙箱中。我想今天的演讲可能会带你了解云托管沙箱环境中可能存在的各种架构。这让我开始思考,我如何能够模拟客户的行为,并以代理使用我们平台的方式来测试服务?因此,我认为我们要做的第一件事是创建一个抽象或接口。
这个接口允许编码代理以及应用程序以符合它们原生习惯的方式与我们的服务进行交互。如今我们知道前沿模型对 MCP 协议非常熟悉,所以我们花了一两天时间创建一个 MCP 服务器来暴露对我们环境和平台的访问权限,以便快速启动。第二部分是对此进行完善。我们花了一些时间寻找可以公开的工具,并对一些运行进行了冒烟测试等。
例如,我们手动进行的一些测试包括编写一个 Python 代码文件并执行它,或者将一个 Python 文件转换为 Java。然后我们意识到我们要扩大测试领域,让编码代理去做更多的事情。所以我们要求简单地编写一千个跨十个领域的测试。“一千”这个数字相当随意,只是为了撒下大网看看能捕获到什么。这需要一些完善,因为我们知道一千个测试需要几个小时并且会消耗大量 Token。
因此我们做了诸如凭据管理、凭据注入处理等工作,以及当测试失败时该怎么办。是服务问题还是 MCP 层的问题?这些是我们让代理去弄清楚的事情。架构实际上非常简单,但也非常强大,我想我们在日常开发中可能都见过这种模式。左上角是我们的编码代理,一个 MCP 服务器基本上包装了我们的云沙箱环境,所有发现的结果都会发送回给我们。
我们将它们存储在 SQLite 数据库中,因为正如你们中的一些人可能看到的,代理很容易写入 Markdown 文件,但这在一千个测试时并不具备可扩展性。这使我们能够利用并发功能,或者让多个子代理在本地运行并执行测试,然后将结果存储在本地。一千个测试听起来很容易,但实际上屏幕上的每一个点都代表了一个客户实际运行的工作流。
我们做了诸如测试沙箱生命周期之类的事情,当它承受压力时可靠性如何?还有文件系统 IO,当你从沙箱上传和下载文件时会发生什么?我们测试了性能。我们还测试了一些软件开发生命周期,例如编写 Python 包、Java 包等。为了让你对其中一个点代表什么有个概念,它可能是一个端到端的机器学习训练程序;可能是生成 PDF 报告;也可能只是简单地打开一个网页。
我们很快意识到,当时托管两个主要应用程序的平台——一个是代码沙箱,另一个是云浏览器——对于它们所-hosted 的沙箱来说,有着不同的重要测试。例如,在浏览器中,我们要求代理创建一堆标签页并尝试抓取它们并进行总结,也许截取一些屏幕截图、下载它们,或者填写表单、自动化登录工作流。但重点在于这些沙箱托管的应用程序通常会经历不同的工作流程,从而对沙箱提出不同的要求。
我们运行了这些测试,我想谈谈三个故障,我认为它们展示了一些我们从沙箱托管应用程序中看到的模式。一个简单的是我们上传了一张图片,下载它时我们希望看到与上传相同的内容,但结果并非如此。我们深入调查后发现 MCP 层的编码层不正确。第二个也很有趣,是一个“无字节”(no bite)的情况,它只是让测试失效。“无字节”可以是零,也可以是某些编码语言中的标记,表示字符串已完成。
另一个特别涉及沙箱层的问题是我们在沙箱的特定目录中写入文件,但当我们尝试取回它时却不可用。现在我们开始将模式和故障分为两层:接口层和沙箱层。我认为区分这一点很重要,因为当我们开始在沙箱中托管应用程序时,它们会稍微偏离典型的 API 服务模式。在典型模式中,你有一个长期运行的服务暴露一个 API,发送请求并获得合理格式的输出,你知道后端服务在做什么。
但在当今世界,我们不再拥有那么多长期运行的应用程序,而是有专门的代理,我们通过网关暴露对它们的访问权限。它们对其计算环境的需求将大不相同。我们知道这一点,这也是我想我们许多人都能共鸣的经验:你在本地开发某样东西时,开始看到你的代理(无论是 Cursor、Claude Code 还是其他什么)做出奇怪的事情。它可能会下载你可能不期望的包,或者出于某种原因将 CSV 文件转换为 JSON 再到 PDF。
你希望代理执行的所有这些工作流程都将对沙箱环境提出不同的要求。
你的环境,例如沙箱拥有多少内存或 CPU、进程可用的权限以及文件系统。我认为在今天我们看到的许多演讲中,沙箱可以拥有多种不同的架构。这里更广泛的观点是,我认为所有这些约束对代理解决问题的能力有着巨大的影响。
为了直观地展示这一点,以下是我们在比较两个托管在沙箱中的不同应用程序时看到的一些故障。顶部是代码沙箱,底部是云浏览器。右下角用红色突出显示的失败模式表示沙箱实际崩溃的次数。在这种情况下,因为
云浏览器我们知道打开标签页非常消耗内存。因此,许多测试仅仅由于内存限制而失败。这在代码解释环境中并不是我们看到的故障类型。当我们将它们以不同的方式映射时,我们发现失败模式聚集在沙箱原语周围。我们知道文件系统周围的某些组件倾向于涉及
文件系统的权限、挂载的文件系统、读取、写入和执行文件的权限,以及文件系统是持久的还是临时的。测试非常严苛。例如,在右下角我们有浏览器测试仅仅通过耗尽会话和沙箱的内存来使其失效,并将其标记为完全失败。我认为
这里更广泛的观点是,当我们将这些应用程序托管在沙箱中并期望我们的客户能够在其中构建相当任意的工作负载时,我们必须非常小心,因为沙箱约束对代理完成那些问题的能力有着巨大的影响。现在如果我们仔细看看这张幻灯片,第二列内容相当丰富,我们拥有
构成沙箱容器可能外观的许多原语。我们可以深入到底层内核能力,例如内核拦截器、这些称为扩展 BPF 的程序(BPF program),它们允许你运行内核模块并在 Python 层拦截程序。这些可能控制你的代理实际上如何发起一些出站调用,也许向
你内部的公司服务发出内部 API 调用。
如果我们将其绘制成图表,这是沙箱中的组件如何影响你的工作负载执行其任务能力的一个非常高级别的概述。例如,我认为在我们的演讲早些时候,我们谈到了安全计算(secure compute),它控制你的应用程序可能想要运行的系统控制程序。例如,假设我有一个机器学习包
需要生成一个进程。我的进程或容器甚至有能力启动新进程吗?也许我有一个代码解释任务,需要将一个 Python 包下载到非常特定的模块中,以便 Python 内核能够拾取它,或者 Rust 二进制文件是否在正确的位置,以便代码代理能够运行或执行一个程序。所有
这些非常小的事情往往会累积起来影响你的代理执行业务问题的能力。现在退后一步,我认为这很有趣,那就是使用 LLM 基本上生成单元测试的想法。我想我们都做过这件事。我不知道现在是否还有人手工编写单元测试。同样,如果我们向上移动到集成测试层,我们可以
预期代理在理解问题空间并为它们编写测试方面表现良好。但是随着我们托管越来越多仅仅是代理的应用程序在沙箱中,我们开始看到模型的裂缝,这些非常底层的原语和控制可能会阻碍你的代理实现其目标状态的能力。我们希望在这里传达的是,
通过模糊测试(fuzz testing)你的代理沙箱来实际揭示这些对我们来说相当无害的失败模式是一种非常有力的方法,要求它完成可能一千个工作流并查看你得到的结果。为了使其更具象化,我们在座的许多开发人员非常习惯于在本地运行代码代理。你
可能有你的 CodeEx 或云环境在本地运行。随着我们扩展并创建更多工作区,你很快会对你的笔记本电脑施加限制,现在你知道你的团队希望将这些代码代理放入远程沙箱中,以便你可以扩展你处理的 GitHub PR 数量等。但正如你可能已经看到的,你在本地工作站中拥有的工具、你的 MCP
工具和在本地运行的应用程序可能与远程沙箱中的内容不匹配。这里稍微提一下 Agent Core,这实际上是我们非常关注的问题之一,因为我们认识到客户希望扩展他们的代码代理以及他们实际运行这些软件开发生命周期的方式。因此我们最近发布的一个功能是
授予客户 SSH 进入他们的沙箱以查看正在发生什么的权限。当然,现在通过 SSH 连接到你沙箱的不再真的是人类,或者是与你一起开发的代码代理。但想法是桥接到沙箱并四处探查以查看导致你的代码代理或应用程序运行不顺畅的问题是一个
相当明确的业务问题,也是我们试图为客户解决的问题。如果你稍微看看学术界的一个有趣例子我认为我们大多数人可能都关心的是每当前沿模型发布时,我们要看的第一件事就是 SWE-bench 基准报告,即这个模型在这个三个基准测试中获得了 XYZ 百分比, versus
另一个。最近加州大学伯克利分校的一些研究人员进行了一项研究,发现给定正确的环境控制和利用代理,他们实际上击败了 SWE-bench 基准测试,达到高达 100%。而在相反方面还有另一项研究研究人员试图向拥有损坏工具的代理提供广泛的一组业务问题。当然
该代理的有效性大幅下降。所以我认为这是我今天想要主要强调的,即我们今天构建的这些应用程序越来越具有代理性质,它们不仅仅局限于你为客户构建的 REST API 服务,而是
一个在沙箱内运行的任意代理。要找到所有导致问题的尖锐边缘确实非常具有挑战性,其中
沙箱原语会导致代理完成问题的效率降低。因此,我今天给大家提出的挑战是:如果你打算在沙箱中托管你的代理程序,当然要在本地进行测试,但也要通过一套广泛的领域测试在远程进行模糊测试。好的,谢谢。(掌声)
[音乐]