谢谢你的演讲。出于好奇,我想了解一下会议设计在第一版和第二版迭代中有什么变化?>> 好问题。Gabe,你想回答一下在第一次和第二次迭代之间会议存储方面发生了什么变化吗?>> 嗯,当然。主要改变是我们希望抽象出尽可能多的事物,并将它们隔离到不同的组件中,以便我们可以扩展存储机制来保存我们想要存储的未来事件,而不必将它们与会议工作的机械结构紧密耦合。基本上,我们将构建和虚拟化接口这一原则应用到了底层,不仅跨越服务边界,也在事件层面上。>> 好的,谢谢。嗯,听起来可能不是每个人都能跟上进度,但希望我们能找到一种方式来分享这些幻灯片,你们可以在家尝试一下。或者如果你们有手机,也许可以连接到热点看看能否跟上进度。嗯,好吧,让我们再试一次。我们要说,“给我构建一个代理,每当给出一个主题时,就告诉我笑话。”然后你只需按回车键。你可以看到 Claude 正在生成系统提示词,它想出了一个名字、描述,并选择了一个模型。你可以像这样更改这个模型(如果你想的话),并给予代理访问代理工具集的权限。然后你会点击“创建代理”。这基本上会调用 v1 代理端点来创建代理。好的,那个已经创建了。接下来,我们将配置环境,也就是沙箱的模板。我们只是创建一个新的,然后我们会给它无限制的访问权限(针对这次演示)。但在构建生产级代理时,你当然希望收紧访问控制,限制它可以触及的域名或特定的 MCP 服务器。所以我们将使用无限制的权限。然后在这里你可以看到,你可以选择想要安装的包等。接下来我们只需启动会话。好吧。现在我们要测试运行我们的会话。嗯,对,“告诉我关于猫的笑话。”你会看到模型开始思考并想出了一个关于猫的笑话。是的,这就是构建你的代理如此简单的方式。现在这个代理已经在云端运行起来了。你只需要启动与代理的会话,发送事件,获取返回的事件。其他一切由我们管理。所以我们管理所有的基础设施、托管、框架(harness)、沙箱管理、扩展以及你的事件日志存储。然后你可以专注于围绕此构建产品。嗯,谢谢。现在我将把时间交给 Gabe 进行工作坊中更动手的部分,希望我们的 Wi-Fi 运气能好一些。谢谢。(掌声)
你能听到我吗?太好了。我看到后面挤了一群人,这里和那里还有空间,如果你想进来的话,这样我们可以容纳所有人。嗯,在开始之前,这是我们要使用的一个仓库(repo)。如果你想拍一下二维码的照,克隆那个仓库。嗯,进入 research desk 目录,然后运行 npm install 或 bunai(注:此处原文为 bonai/bun a i,结合上下文应为包管理器命令,保留发音或意译为 bun install)。嗯,我会让你们去做这个,然后我会带你们一起看看我们今天将要构建的内容。嗯,我还看到有些手机亮着屏幕。我知道 Wi-Fi 有问题。希望你们能访问到那个仓库。嗯,好的哦。哦,我看到你了。好吧。酷。那么,我们今天将要构建什么呢?我将向你展示如何使用云托管代理(Cloud Managed Agents)来构建各种不同类型的应用程序。我们将从构建一个自定义的类似聊天的界面开始,这样你就可以与代理交谈了。我们可以说“你好”。嗯,然后我们将把这个代理增强到一个多智能体生态系统中,以便它可以委派任务给子代理。我们会赋予它技能,特别是能够调用 SEC 网站并获取单个股票代码的 SEC 备案文件(filings),以及分析特定表格的技能。嗯,然后我们将能够使用这些新增强后的代理来运行更异步的、可能需要长时间运行的智能体任务。嗯,接着我们将通过启用某种地图-归约(map-reduce)接口将所有内容整合在一起,我们可以与一个代理交谈,该代理然后可以委派给许多其他智能体,并执行类似地图-归约的操作。向你展示如何在 CMA(云托管代理)之上构建自定义框架,以编排你自己的工作、使用自定义工具并管理多会话交互。嗯,最后我将展示我们的部署 API,它允许你设置定期工作以安排时间表,这样你就可以按照给定的频率运行会话,进行那种会自行更新的长期分析。听起来不错吗?安静(注:原文 quiet 可能是现场环境音或口误,结合语境忽略或译为确认声)。好的,太好了。嗯,好吧,让我们切换到编码界面。我将使用 Cloud Code 进行此操作。你可以随意使用你喜欢的任何代码智能体。嗯,我认为没有人是手动编写代码的,所以我也不会那样做。我们的仓库中加载了一个技能(skill),它将逐步带你完成工作坊。嗯,所以如果你想在我结束后重新运行工作坊,以后当你有更好的 Wi-Fi 和互联网接入时,你可以在家这样做。嗯,所以你要做的第一件事是,我假设你已经签出了仓库。你进入了 research desk 仓库并运行了 bun(注:原文 buni 应为笔误,结合前文 npm install/bunai 及后文 bun run dev,确认为 bun)。我们将使用 bun run dev 启动我们的服务器。我会把它放大一点。我假设没人能看到。好吧,这样更好了吗?>> 是的。然后如果 Gabe 在演讲时有问题,请随时举手,我可以拿着麦克风跑过去帮你。>> 我们有助手(helpers)。所以如果你遇到问题,请举手,人们会过来帮助你。嗯,酷。既然你已经做到了这一步,你基本上可以加载这个网站。你要做的第一件事是进入设置页面(setup page)。大家都跟我到这里了吗?>> 是的。好的。嗯,现在我们要……对。嗯,好吧。一旦他拍完照片,我们将启动我们的工作坊技能(workshop skill)。所以在 Cloud Code 中,你可以输入 workshop start。它将开始为你运行工作坊流程。我们将分六个阶段进行(six acts)。嗯,抱歉中间没有休息环节。希望这没问题吧?但我们会进行的。Claude 会……当然我们要进入自动模式(auto mode)。Claude 将跟踪每个阶段,以便你可以继续操作。你可以一直输入 workshop next,这样它就会不断推进整个过程。嗯,我
我会让 Claude 替我完成,但会手把手教我并解释它在做什么。首先它会确保我们的前置条件已设置好。接着它会将 m.example 文件复制到 amp.local。哦不,停一下,还没到那一步。好吧,它有点太急切了。它会复制那个文件,其中包含一些需要填写的值。你需要粘贴你的 API 密钥。
你还需要填入 SEC(美国证券交易委员会)在调用其 API 时识别你的身份信息,因此必须输入你的名字和邮箱。这只是为了让他们知道是谁在调用接口。基本上做完这些后,我们就进入下一步。大家跟上进度了吗?你们已经在 .local 文件中填入了 API 密钥和 Edgar 标识符。
举手示意一下 >> 快速举下手看看,或者有多少能跟上的人可能有 Wi-Fi?>> 好吧,至少有一位。[笑声] MVP,抱歉。哎呀,哦,是为了那个仓库的。这个。>> Rohan,你想接过麦克风吗?>> 是的,谢谢。
那个带有凭据的幻灯片就是它了。设置部分就是这样。>> 这个。 >> 谢谢。 >> 好的,没问题。鉴于大家可能没有 Wi-Fi,请随时打断我们并提问,这样我们可以让互动更多一些,帮助大家理解概念,以便在工作坊结束后能利用自己的时间进行构建。
好的。嗯,我有…… >> 是的,这是应用启动时的样子,当你克隆并 cd 进入 research desk 运行 bun run rundev 时。你会得到这样一个网站。 >> 我可以问个问题吗?>> 当然,我没看到你…… >> 哦,你在那儿。[笑声]
我想知道的是,当你说 Claude 处理和管理工作代理时,这运行在哪里?是在 AWS 上吗?>> 是的,好问题。嗯,我们将在我们自己的基础设施中运行它。今天我们要演示的 offering 是在我们的平台上运行的,但如果你想在 AWS 上使用自己的 AWS 积分运行,我们也提供在 AWS 上的云平台。
我们还提供自托管沙箱(self-hosted sandboxes),也许我们可以在演示后讨论这个。如果你想通过不同的提供商如 Burcell、Modal 或 Daytona 等引入自己的沙箱,你可以这样做。即使你想在 Google Cloud 和 AWS 环境中运行你的沙箱也可以。
嗯,好的,我将继续演示。下一步你要做的是点击这个按钮来创建你的代理。它将为我们创建两样东西:Priyanka 提到的环境,即沙箱外观的模板。对于这个演示,我们将授予它访问几个网站的权限,主要是 SEC。
我们会添加一些 Python 包,以便它能使用预定义的 Python 包访问 SEC。它还将创建一个代理,这是一个非常基础的代理。目前它没有任何工具,只有一个提示词(prompt)。好吧,它有基础工具,但没有技能,没有子代理协调等。
我要告诉 Claude 继续实现我们可以在应用程序中与该代理对话的接口。正如 Bianca 提到的,与会话通信的主要方式是通过事件流(event stream)。因此你监听该流以获取代理推送回来的所有事件,并可以使用端点将事件推回。
实际上,这些类聊天应用程序中通信的所有内容都发生在这个流上。所以我们可以看到 Claude 正在实现这一部分,以便当我在聊天框中按下回车键时,它会发送一个包含我发送给该会话内容的用户消息事件。
然后它会将 SSE 流从后端路由回我的浏览器。因此它会监听进入我们 API 的流连接中的事件,然后将它们重新转发回前端,以便我可以以美观的方式渲染它们。一旦 Claude 完成这些工作,我们应该能够转到这个 desk 选项卡并向我们的代理打招呼。
如果一切顺利的话效果会很好。我们可以看到现在我们在与代理对话了。如果你想构建一个类聊天应用程序,到这里就可以停止了。这很好,但我们想做更多事情。Claude Managed Agents 的整个意义在于你可以执行长时间运行的异步任务,不仅仅是几分钟,而是几小时、几天甚至几个月。
让我们看看接下来需要做什么。下一步我们要……哦,Claude 今天非常急切。好吧,下一步是我们想增强我们的代理能力,对吧?我们要赋予代理一项技能以便它能调用 SEC。
我们还要使用多代理协调(multi-agent coordination),这样我们的会话可以将工作委派给更专业且能执行某些任务的子代理。我们基本上要提升智能层级。那么让我们通过说“workshop next”来做到这一点。
现在 Claude 将要实施配置方案以升级我们的代理,使其使用更多子代理或任何子代理。我们将赋予它一项技能,让它能与 SEC 对话。我们描述了如何使用 Python 包,描述了必须使用 Edgar 标识符进行调用等所有细节。
我们将为工作坊后期提供一个自定义工具(custom tool)。这个自定义工具将使我们能够告诉我们的首席研究代理启动多个我们将协调的会话,用于某种定制测试框架。这就是 Claude 在这里做的事情:更新其进度,创建这个名为 dispatch analysis 的自定义工具。
我们稍后会回到这一点。我们为它提供了一个模式(schema)。它将更新主代理的描述以创建该代理的新版本。这个新版本将包含……哦,PagerDuty 集成。
这个新版本将有几个不同的子代理供其委派工作,以及对自己的引用(reference)。如果主代理想要启动一个具有相同提示词的自身副本,它可以这样做。这很重要,因为有时你并不确切知道会话想要执行何种任务,但你有一个大致想法,即希望有子代理启动并工作。
因此你可以定义一个指向你自己的自引用(self reference)。
那个时钟随后可以启动一个子代理。嗯,这个问题在过去曾出现过。它并不会将该会话的转录副本复制到子代理中,而只是将工具描述、模式以及提示词复制过去。嗯,很好。那么现在如果我们进入这里,我们应该能看到有一个新的代理出现了。哦,我想我需要配置它们。所以在我们的设置中应该有一个按钮叫作“配备人员”。当我这样做时,它实际上会运行……哦。呃,好的。我之前已经运行过这个了。让我删除这些技能,以便为您重新创建它们。嗯,我刚才试图演示那个“魔术烹饪秀”的效果,但这没关系。
好的。所以我们将删除该技能,并请求 Cloud 重新配置它。它将创建所有那些资源,然后我们就能在这里看到所有的子代理、我们要创建的技能和记忆存储。对于这些会话,我们还支持长期运行的共享记忆存储。我们将使用它,以便不同的会话可以了解不同的金融工具,并相互分享这些知识。在本次研讨会的最后,我将向您展示如何利用这种长期记忆来在多次会话、天数、数月甚至数年的时间里持续改进您的代理。
嗯,很好。所以我们应该在这里看到该代理现在拥有我们描述的技能。它还有带有各自提示词、工具和权限的子代理。它有提示词和模型。我想我们准备好使用这个新的专用子代理来执行我们的第一个异步长期任务了。所以让我们告诉 Cloud 继续下一步。我们要做的下一件事是,以一种非聊天式应用、而是更异步的方式告诉 Claude:“嘿,研究这个金融工具,并按照我定义且关心的格式给我一份报告。”我们将使用一种叫做“结果”的东西。
结果是我们要实现自我监督的方式。在结果中,你告诉 Claude:“这是你的任务。这是评估你任务的评分标准。”它将去执行这项工作,然后当它认为完成后,它会请求一个子代理来查看评分标准和 Claude 所做的工作,评估其是否正确完成。如果完成了,那就太好了;如果没有完成,它将重试。嗯,所以这里 Claude 为我们实现的基本上是这个用户定义的结果事件。因此,无论何时我们在 UI(我稍后展示)中为特定股票代码启动会话时,它都会发送带有特定评分标准、最大迭代次数和任务描述的用户定义结果。
然后 Cloud 就会为我们运行该任务。嗯,那么在 UI 中看起来是什么样呢?如果你看这个记分卡,我可以告诉 Claude:“嘿,我想分析英伟达。”哦,请。好的,太好了。所以它将启动一个会话来分析英伟达。这需要一些时间。我将进行那个“烹饪秀”演示,并展示之前会话的情况。大约需要 10 分钟左右。嗯,但这是我昨天运行的一个示例。首先我们要告诉 Claude的是这里有一个结果:我要你分析英伟达最新的 SEC 季度文件。你将使用 Edgar ID(身份标识)。这些就是你的 Edgar ID 所在的位置。
你有记忆功能,所以检查一下你之前是否已经做过分析,并确保使用那些已有的信息,而不是重新提交和调查你已经知道的事情。我要你找到我最关心的最新表格格式并对其进行分析。然后我需要两个交付物:一,我想让你在我的记忆中为该公司写一条笔记;二,我要你以定义良好的结构化输出形式写一篇记分卡,并将其保存在特定的文件位置。嗯,然后 Claude 就去工作了,开始调用工具。它在记忆存储中没有找到任何笔记。
它查看了几个不同的地方,然后决定:“好的,我知道该怎么做。”我将利用我的子代理来完成大部分工作。我要启动一个金融专家分析代理(或提取器),以及一个风险评估分析师。你可以在这里的控制台中看到所有这些内容,以实现完全的可观测性。这里的每一行代表一个线程,而每个线程代表子代理所做的工作。于是每个子代理都去工作了,当它们完成后,会通知主代理:“嘿,这是你要求我做的。”然后主代理醒来,从子代理那里获取信息,整理好所有需要做的事情并创建交付物。
它创建了 JSON 文件(即我们指定的那个),并确保更新了记忆,然后自我监督开始了。所以它启动了一个子代理来验证我们定义的结果是否得到满足。它查看了评分标准,分析了会话中完成的所有工作以及创建的工件(artifacts)。最终决定这满足了要求:记分卡已交付,数字定义明确,记忆更新正确,一切看起来都很好。嗯,我认为这仍在运行中,但一旦完成,你会在这里看到一个表格显示每个股票代码的情况。
因为我们可以从会话中提取报告记分卡并下载它。你将其放入数据库中,对于这个演示我们把它放在本地。嗯,但我想你已经明白我的意思了。好的,这很棒,但是如果你想同时处理一百或十个股票代码怎么办?如果我能与一个代理聊天来构建一个自定义的编排框架,让它为每个股票代码委派工作到不同的会话中,然后在全部完成后汇总结果并给我一堆分数,那该多好。嗯,所以这就是我们接下来要做的。
我们将利用那个自定义工具来在我们的服务器上构建我们的自定义编排框架。在那里,当我们与主代理交谈时,在某个时刻那个主代理将决定:“嘿,我想启动 10 个不同的会话来工作。”我们会得到……哦,我跳过了一个步骤,抱歉。我们将首先更新技能。嗯,我想向你展示这些技能是实时工件(live artifacts),你可以随时更新它们以改进技能。在这种情况下,我们正在添加查看新表格格式的能力。然后当你这样做时,任何引用该技能的将会话都会获得这个新信息。
这是你可以持续更新的东西。你可以查看之前的会话以了解它们的性能表现。我们将在稍后看到这一点。
演示的结尾部分涉及我们称之为“梦境”的过程。好的,接下来我要进入编排环节。既然技能已经发布完毕,我想我们这里应该可以看看有没有什么问题。我知道信息量很大,Travis 那边有个问题。有人问我获取积分需要多长时间,应该只需要五分钟。虽然表单上写着一到两天,但你通常五分钟内就能看到结果。
有人好奇研究代理从 SEC 获取数据访问权限的问题,这是否需要某种凭证?你们是否会演示凭证注入或代理的工作方式?对于 SEC 来说,只需要你的电子邮件和姓名。在这个演示中,我们直接将信息注入提示词中。但在实际生产应用中,我们会使用“保险库”(Vaults)。
保险库的工作原理是定义一个你想注入到环境变量中的秘密。我们不直接放入真实密钥,而是使用占位符。当 Claude 工作并需要使用该环境变量时,它注入的是占位符值。我们在出口处将其替换为真实值,且仅在你指定的允许主机域内进行此操作。
例如,如果你规定某个秘密只能用于 SEC 网站,而 Claude 试图在 Anthropic.com 使用它,我们不会进行替换;但当它调用 sec.gov 时,我们会执行替换。这本质上是一个 API,你可以在控制台中创建保险库并获取 ID,然后在会话中包含该 ID 以进行认证。
你可以使用 CLI(例如 Google Workspace CLI)安装在沙箱中,并提供 API 密钥作为环境凭证。我们将遵循 Gabe 提到的相同方法。这也适用于 OAuth 凭据,它们同样有效。Gabe,你是否想在控制台上快速展示一下保险库的创建过程?
是的,你可以在这里创建一个保险库,然后在其中捆绑凭据。你可以有 MCP 或 OAuth(如 Notion)等预定义项。每当引用会话时,注入该保险库 ID 会将所有凭据捆绑到会话中。当它尝试使用你指定的任何域时,它会用真实凭据替换占位符。
有个快速问题:Cloud Agents SDK 中的哪些功能属于它?你指的是 Agent SDK,这显然是建立在之上的。我想知道哪些能力在 SDK 层中,哪些在外面?Agent SDK 被打包为无头云代码版本。我们构建了一个通用版本,从 Agent SDK 中汲取了灵感和教训,但重新构建了框架,使其更通用而不只是针对编码。
所以它有点像分叉?是的,基本上是一个独立的框架。Agent SDK 本质上是一种云代码形式,你可以将其作为二进制文件在任何地方运行。这是一个完全托管的解决方案,在我们的云中运行,我们拥有自己的框架,深受云代码框架启发,并经常就整体增强进行交流。
我看到后面还有举手的人。这里有个问题:当你在多个代理之间进行编排时,是否有一些护栏防止代理陷入循环并消耗大量令牌?部分逻辑由你自行编排和决定。如果你构建自定义框架,可以使用其他提供商实现多系统方案。
我们正在探索更严格的预算控制概念,例如限制每会话的金额或令牌量,但这目前尚未提供。还有几个问题。之前你在控制台上展示了管理器和子代理的转录记录,你可以查看它们的执行情况。如果发现错误或走错路径,或者想更改历史,是否有办法纠正或回溯到那个时间点重新开始并添加指导?
你可以引导它。例如发送一个新的用户消息事件来引导代理,它会排队处理。我们可以一次性发送多条消息而不影响性能。目前我们没有像“倒带”和“前滚”这样的功能,但如果大家感兴趣,我们会考虑加入。
是的,会话分叉正是你所要求的。我们已经有几位客户提出过这个需求,这在我们的路线图之中,希望将来能提供。谢谢。我看到这里还有举手的人。好的,Rohan 请讲。
假设这一切都在云中运行,你们是否有路线图让代理之间共享集体知识?比如在一个特定应用中有一万名用户。请大声一点,有点听不清。我的意思是假设所有应用都在云中运行并分发给成千上万的用户进行金融研究,你们有会话日志。是否有集体记忆功能或相关路线图?
我们今天就有这个功能,实际上在这个演示中已经使用了。
我们使用一个记忆存储,允许您在不同会话之间共享知识。在这里您可以看到,代理们各自填充关于它们迄今为止所做工作的具体信息。稍后我将展示如何利用“梦境”功能整合这些知识,随着不同代理遇到各种边缘情况并相互学习,您可以持续改进记忆存储。
针对之前提到的将数据存储在Anthropic基础设施中的问题,如果您希望进行区分,例如在AWS Bedrock上运行某些任务,并拥有自己的数据集群用于沙箱隔离,那么关于自托管的问题呢?这部分是否存在厂商锁定?它的灵活性如何?
这一切都是基于API的,因此您可以提取记忆并将其放入不同的系统中。虽然目前会话中不直接支持其他内存提供商的即插即用,但您可以构建一个MCP或自定义工具来实现这一点。这也是我设想的操作方式。
此外,关于最初提到的用户级和组织级记忆问题,我们确实允许附加多个记忆存储。您可以设想拥有一个用户级的记忆存储和一个组织级的记忆存储,然后将两者都带入每个会话中。这样您既可以收集用户级也可以收集组织级的记忆。正如Gabe所说,这些数据并没有被锁定,如果您愿意,可以将数据带到任何地方,因为所有操作都是通过API调用完成的。
在演示代理工作流时我注意到评分器位于主代理层面,那么这些子代理任务是如何进行评分的呢?又是如何管理跨任务的记忆呢?这是一个很好的问题。我们构建的子代理旨在通过协作来增强上下文并利用会话的能力,结果定义发生在整体的会话层面。您定义了想要完成的目标,主代理随后使用子代理来完成这项工作并协调它们之间的合作,最终报告完成。目前并不支持定义子结果的目标。
接着刚才关于“梦境”功能的问题,如果子代理执行了某些操作,我们如何从中学习呢?目前,“梦境”功能仅限于记忆存储。稍后我会展示这一点。“梦境”的工作原理是分析跨多个会话的转录文本和创建的记忆,以便更新其记忆库,让未来的代理知道该提取什么。我们可以想象未来将其扩展到技能和提示词以及代理定义上,以实现持续学习功能,但目前仅针对记忆存储。
假设您的公司数据存储在传统数据库或RAG系统中,您希望通过自定义CLI或MCP将其暴露给这类代理。在您的环境中部署的安全路径是什么?
这是一个很好的问题,有两种方法。如果您可以通过API或MCP访问这些数据,您只需创建一个MCP并赋予其身份验证凭据,它就可以直接调用您的MCP。如果您不想将MCP暴露在互联网上,我们有一个名为“MCP隧道”的功能,允许您在网络和我们之间建立隧道,从而避免暴露在互联网上。如果这门槛太高,我们支持自托管沙箱,您可以引入与您的网络对等连接并访问您应用程序和服务的沙箱。代理将调用由您管理和托管的沙箱,从而以这种方式访问您的资源。
关于环境依赖项我有一个问题:我看到可以加载依赖项,这是在运行时还是创建时进行的?是在创建时。然后我们会缓存它并在沙箱的重新实例化过程中重复使用该环境。
那么您可以指定内部依赖项吗,还是必须选择npm包?目前它们都必须通过npm、cargo或pip等可访问。但如果您愿意,可以直接将文件或GitHub仓库上传到会话中以便安装它们。
还有一个关于部署的问题,我看到有一个选项卡。是的,我会讲到那部分。我将继续进行演示,然后我们会回答更多问题。