Transcription
[音乐] 大家好。嗯,是的,感谢大家的到来。很高兴看到一个座无虚席的房间。嗯,在举办研讨会时,有很多人在场总是好事。嗯,所以,是的,我是 Damian Murphy。我将介绍 A2A 和 MCP。嗯,这两个是当今人工智能领域非常热门的话题,以及如何利用它们来自动化业务流程。嗯,所以,是的,关于我的一些情况,嗯,大约 15 年的全职全栈开发经验,嗯,五年从事解决方案工程,所以是面向客户的、前沿部署的工程师,嗯,并且花了大约最后三年时间在语音 AI 和 AI 代理方面工作。嗯,我去年也举办了一个研讨会,嗯,AI 语音代理群,嗯,是的,非常非常热门的话题。我认为现在普遍认为任何人都可以用 5 分钟构建一个语音代理。嗯,所以现在难的部分是构建能够执行复杂任务的自主代理。嗯,所以我大约两个月前加入了 Bench Computing,嗯,一个预收入的初创公司,由 Sutter Hill Ventures 支持,我们正在构建,嗯,我设想的会是一个更好的 Manis,它更专注于团队和企业。如果您不熟悉 Manis 是什么,它有点像一个自主的 AI 代理。而 Bench 本质上是一个可以执行子并行任务自动化的自主 AI 代理。好了。所以我们今天举办的研讨会,我们将使用 A2A 代理构建一个多代理系统。嗯,如果您不熟悉 A2A,Google 发布了一个协议,允许代理在网络上进行通信。嗯,我们将把这些代理与 MCP,即模型上下文协议集成起来。嗯,MCP 就像是您所有代理能够非常轻松地消费上下文、工具和资源的 USB-C。嗯,我们将让这些代理协同工作,我们将通过一个 webhook 触发代理,然后我将简要介绍何时使用 A2A MCP,我还会深入探讨提示缓存和上下文管理。好了,所以 A2A,对吧?嗯,它并不完全清楚它的用途以及它为什么存在,对吧?嗯,如果您问在场的所有人他们认为它做什么或为什么存在,您可能会得到不同的答案。嗯,但关键的好处是您可以实现代理专业化,对吧?所以,与其试图让一个代理做 100 件事,不如让 100 个代理做一件事,并且做得非常好。嗯,A2A 允许您处理任务委派。所以,您知道,想象一下您有一个 Salesforce 代理,并且您希望它与所有 Salesforce MCP 工具进行交互。嗯,您可以做到。嗯,您还可以进行并行处理。嗯,这在速度和上下文管理方面将变得非常重要。嗯,然后您可以使用这些 A2A 代理来处理复杂的流程,并帮助减小主代理的上下文大小。嗯,MCP 再次成为一个非常热门的话题。嗯,它被誉为人工智能的 USB-C。嗯,并且拥有一个标准接口肯定有一些好处,对吧?您知道,今天有大约 10,000 个 MCP 工具可供使用。嗯,其中大约 7,000 个是通过 Zapier MCP 提供的。嗯,如果您不熟悉 Zapier,它本质上是一种连接不同系统的方法。现在,他们已经发布了他们所有的 zap,它们被称为 MCP 服务器和工具。嗯,MCP 的一个伟大之处在于,无需与 API 集成。所以您不必处理任何不同 API 的不同处理方式。嗯,它是一个插件架构,一个行业标准。嗯,它实际上基于 LSP。所以 LSP 是一种让 IDE 能够实际了解不同编程语言如何工作的方式。嗯,它是一个伟大的想法转移到 MCP 协议。好了。那么,何时应该使用 A2A 而不是 MCP?有人吗?如果您想对基础设施进行资源分配,那么您就选择 MCP,但我不知道,这正是挑战所在,对吧?就像这些协议到底是什么,我是否应该使用它们等等。所以,如果您想拥有,您知道,两个代理,对吧?通常是两个完全不相关的代理,对吧?所以不是两个您一定控制的代理。更有可能是第三方代理,或者,您知道,他们的第一方代理和您的代理。是的。代理和 A2A 之间有什么区别?所以我在多代理方面工作了很多,我们有多个代理在做同样的事情。您所说的 A2A 与护理非常相似。是的。就像 autogen 和类似的框架允许您在本地管理多个代理。嗯,A2A 更侧重于远程代理,对吧?所以是您一无所知的代理。嗯,所以您可以将 A2A 视为一种服务可发现性的方式,一旦您有了代理的端点,您就可以了解该代理的所有功能。嗯,对于 autogen 之类的东西,它是描述性的,您描述了它的功能,它在您的控制之下。所以,总结一下,代理 AI 是定义每个代理的角色,而 A2A 是在远程工作,它的角色未定义或已定义。所以每个 A2A 代理都会有一个定义,我们稍后会详细介绍。嗯,但是的,将代理 AI 视为一切的超集,对吧?嗯,A2A 和 MCP 只是其中的一部分,对吧?不同的模式。嗯,是的,所以对于 MCP,您将连接到外部上下文和工具。嗯,很多人不使用 MCP 的大部分功能,对吧?他们只是使用工具。嗯,但有很多关于提示模板、资源以及一个叫做采样的事情。采样实际上将是一个非常有趣的事情,我认为我们会看到更多,它允许这些 MCP 采样主机 LLM,对吧?所以如果您正在使用 Claude,并且您正在访问一个 MCP 服务器,该 MCP 服务器可能也想使用您正在使用的同一个 Claude 模型,并且它可以使用采样来实现这一点。嗯,所以当您将两者结合起来时,您就获得了两者的好处,对吧?所以 A2A 是远程接口。嗯,MCP 则提供了实际的工具使用和上下文管理。好的,那么何时不使用 MCP。嗯,您会注意到很多表情包。嗯,只是为了给您一个提示,所有表情包都是由 Bench 生成的。嗯,实际上整个幻灯片组都是由 Bench 生成的。嗯,我只给了它一个 markdown 文件,它就输出了。所以,嗯,当您使用 A2A 或 MCP 时,如果您完全控制工具,那么您可能不需要它,对吧?就像如果您的函数位于您的代码库本地,您为什么要创建一个,您知道,USB-C?这就像我用 USB 线连接我的硬盘驱动器一样,您知道,我难道不应该只使用我机器上的硬盘驱动器吗?所以直接调用代码库中的函数非常简单,易于维护,开发速度更快。嗯,然后如果您完全控制您的代理,您可能也不需要 A2A,对吧?嗯,就像如果是您的代理,您可以使用,您知道,某种本地函数调用来让它们通信。嗯,我用 MCP 和本地函数调用构建了多代理系统。使用您拥有的代码要容易得多。嗯,它会更快。没有协议开销等等。也更容易调试。好了。那么,您到底为什么需要 A2A 和 MCP?对吧?嗯,第三方工具可能是使用 MCP 的首要原因。嗯,您可以获得如此广泛的工具,以至于您永远无法,比如说您正在构建一个产品,对吧?您会想,“好吧,我们将与 Salesforce 和 Slack 等建立一流的集成,但其他 10,000 个工具呢?”我会说,“好吧,我们只允许人们添加他们自己的 MCP 服务器。”嗯,这为您提供了极大的可扩展性。嗯,但 MCP 有很多缺点,对吧?嗯,您只能得到您所拥有的。嗯,很多时候这并不完全是您想要的。嗯,所以您可能会走这条路,说,“你知道吗,我需要一种方法来索引这些数据,这样我就不必每次想发布消息时都调用,您知道,列出 Slack 频道?”或者发布消息。嗯,然后对于 A2A,复杂性对您隐藏了,对吧?这是 A2A 的一个关键原则,您在连接之前对该代理一无所知。嗯,它的所有复杂性都是完全不透明的。嗯,然后您可以连接到任何一种远程 A2A 代理。嗯,只要您有,您知道,凭据等。嗯,我们还没有看到任何第一方 A2A 代理发布。嗯,但 Google 大约有,我认为有 50 个合作伙伴将与他们一起推出。所以,我猜会有像 Salesforce A2A 代理这样的东西。嗯,它可能只附带付费账户,对吧?因为它将消耗 LLM 计算。嗯,而 MCP 通常不实际使用 LLM,对吧?它们使用主机 LLM。好了。所以,我们将开始编写代码了。嗯,是的,所以,嗯,如果您还没有获取存储库,我们还有一个 Slack 频道,嗯,workshop A2A-mcp,-2025。嗯,在这个存储库中,基本上有您开始所需的一切。嗯,是的,所以代码结构,嗯,我们有一个主机代理,嗯,然后我们有一些子代理,对吧?这里的整个概念是演示,您知道,A2A 和 MCP。嗯,但实际上,这些子代理可能会生活在不同的存储库中,您知道,运行在不同的服务器上。嗯,是的。然后我们还有 A2A 实现。嗯,服务器和客户端在存储库中。嗯,这些直接取自 A2A 存储库。我们还有 MCP 集成。所以,这只是一个客户端。嗯,我们没有创建服务器。嗯,我们还有一个 CLI 界面。您不需要 CLI 界面。这基本上是它内部的使用方式。嗯,是的,所以一旦您克隆了存储库,您就需要进行 npm install。嗯,您还需要一个 MCP 服务器 URL。嗯,这将是一个 Zapier URL 和一个 Gemini API 密钥。嗯,您可以免费获得这两个。嗯,无需注册付费账户即可获得它们。嗯,您需要将您的 .env.example 重命名为 .env。好了,所以设置 Zapier MCP,当您访问 zapier.com/mcp 时,您将可以选择创建一个新服务器,当您连接时,您将有几个选项。我们将使用 SSE。他们最近发布了 streamable HTTP,它正在使 SSE 过时并取代它。但仍然有大量的 SSE 服务器。所以,嗯,我在这里只使用了 SSE。嗯,一旦您这样做了,您将在底部获得这个服务器 URL。您可以复制该 URL。这将是您在 .env 文件中输入的 URL。然后,您将设置 Slack 和 GitHub 集成。嗯,所以您将需要创建问题的能力。嗯,您可以输入研讨会的存储库 URL。嗯,您也可以使用您自己的。嗯,您可以让 AI 选择这些,但我在 AI 中发现的是它会选择其他东西。嗯,所以很多时候,对于这些 MCP,您会想说,“嘿,你知道吗,我想做这件事,所以我们就把它硬编码吧。”但如果您让它在您的 Slack 中随意发挥,它就会开始在 general、random 和 sales 中发布消息,嗯,是的,我的一些机器人已经失控了。好了。所以,Gemini 设置。是的。所以,您可以在这里获得 API 密钥,AI Studio。嗯,幻灯片中也有一个链接,如果您需要点击它。嗯,您可以获得一个免费账户,生成一个 API 密钥,然后将其放入您的 .env 文件中。Excuse me。还有一个远程的 Bench A2A 代理。嗯,代码实际上在存储库中。嗯,但我们还没有正式发布我们的 API。所以,我只是远程托管它。嗯,但这是一个很好的方式来展示如何远程使用 A2A。嗯,那么 Bench 是什么?嗯,Bench 本质上是一个 LLM 聚合器,带有自主 AI 代理。嗯,所以您可以访问 Claude、Gemini、OpenAI、XAI 以及更多模型。嗯,它现在大约有 30 个工具和集成。所以,嗯,我们实际上是从与 Slack 和 Salesforce 的 MCP 集成开始的。它们不符合我们的需求。我们构建了第一方集成,您知道,数据缓存和索引。嗯,这为您提供了一个关于 MCP 能走多远的想法,对吧?嗯,最终在某个时候,您会意识到它不能做您需要做的具体事情。好了。所以,运行应用程序,您将运行 npm run start-all,这将启动所有代理,对吧?所以 Slack 代理、GitHub 代理、主机代理,嗯,它还将启动 webhook 服务器和 webhook 管理面板。您可以通过 localhost 端口 3000 访问它。嗯,是的,所以让我们来介绍一下每个代理实际做什么。嗯,所以主机代理本质上是您的中央协调者,对吧?嗯,这可能是您应用程序中唯一的代理。它可能正在使用外部 A2A 代理。嗯,如果是这种情况,那么您知道您的主机所做的一切都将委派给子代理。嗯,所以它处理所有代理发现和将所有内容整合在一起。是的。所以代码将在 source/agents/host 中。嗯,您会注意到里面有几个文件。其中一个是主机代理提示,对吧?那只是一个纯文本系统提示。Genkit。这将是您将所有 A2A 代码与 Gemini 连接起来的方式。嗯,还有一个 Genkit MCP 插件,子代理使用它。嗯,然后是 Slack 代理。嗯,这将在 webhook 记录的响应中发送 Slack 消息。是的,嗯,我们在这个示例 webhook 中使用的记录基本上是,您知道,您的会议结束了,您将收到会议记录。嗯,您将根据此决定做什么。所以,它将,您知道,如果检测到任何错误,它将创建一个 GitHub 问题。如果检测到任何功能请求或任何感兴趣的内容,它将将其发布到 Slack。嗯,您可以想象使用这种场景可以构建什么样的自动化,对吧?所以,嗯,您甚至可以,我有一个版本连接到 Salesforce,但实际上主机代理在可以调用的子代理数量上有限制。嗯,所以我想,如果其中一个要走,那一定是 Salesforce,因为它可能是最难获得账户的。嗯,但您实际上可以根据销售电话更新一个机会,对吧?所以您可以进行一次销售电话,您知道,您在与他们交谈,您正在进行发现,并且您可以自动更新这些 Salesforce 字段。嗯,以及为客户主管节省的时间,因为,您知道,他们可能一直在连续通话,这实际上非常重要。是的。这是一个我遇到的有趣问题。所以,我让我的一个同事测试了这个存储库,对吧?嗯,他收到一个奇怪的错误,说 Slack MCP 成功了。嗯,所以,我让他把日志发给我,他发给了我这个,上面写着 is error false?我心想,好吧,那太好了。所以,是的,结果是,您知道,并非所有 MCP 都一样,Zapier Slack MCP 会静默失败。嗯,所以失败的原因是他有默认的 Slack 频道名称,比如 test Damian Slack,而他在一个不同的工作区,那个频道不存在。所以它只是静默失败了。所以,我添加了一些代码来检测这种空的文本数组。所以它现在会失败。嗯,但这确实表明了 MCP 的局限性。是的。所以,GitHub 代理,嗯,非常直接。嗯,它可能是三四个中最基本的。嗯,所以它只是创建一个 GitHub 问题。嗯,非常简单。嗯,但您可以想象如何扩展它,对吧?也许它会打开一个 PR,对吧?也许它实际上会实现会议中报告的错误的修复。嗯,您可以看到随着人工智能的进步和事物的真正改进,很多自动化将由人类互动驱动,对吧?所以,您知道,与人交谈,在 Slack 中发布消息,以及在 GitHub 讨论中交谈将触发 AI 采取行动。是的。所以 Bench 代理,嗯,它可以做很多事情。嗯,这实际上是我发现 A2A 的一个问题,即代理拥有的功能越多,就越难在代理卡片中描述代理的功能。嗯,所以代理卡片本质上是任何其他代理的公共信息,关于该代理的功能。嗯,所以我不得不把它精简一下,我说,“看,你知道吗,你可以做几件事。我知道你可以做更多,但现在,你可以做这几件事。”嗯,它可以去,您知道,浏览网页,做研究,数据科学,各种事情。嗯,所以我们只用它来研究会议记录中的公司和人员。好了,这里是。演示之神。嗯,在我开始之前,有什么问题吗?是的,您提到了代理数量的限制。是的,所以 Genkit 实现,Google 提供,限制您每个回合最多可以调用五个子代理。这是一个硬性规定吗?是的,我无法绕过它。就像有一个 max like 设置,但它不起作用。是的。是的。所以,我相信他们最终会修复的。但是,嗯,这是一个有趣的问题。好了。让我看看我的代码是否在运行。是的,我想是的。是的。所以,它应该在这里。实际上,我也会在这里展示 MCP 服务器。是的。所以,这是 MCP 检查器。它是一个开源存储库,作为模型的一部分。抱歉。是的。后面。是的,那实际上是在代理卡片中。所以它会在子代理的 index.ts 中。是的,我稍后也会查看代码,这样您就可以看到了。嗯,是的,所以我正在连接到我获得的 Zapier MCP URL。嗯,所以我只是复制了这个,然后粘贴了进去。嗯,我将通过 SSE 连接。嗯,这允许您,您知道,列出工具,调用工具。嗯,现在 Zapier 已经将说明作为所有 MCP 工具的强制字段,这很有趣。嗯,所以您实际上不再需要填写字段了。所以您只需要用自然语言就可以。所以这向我暗示他们正在使用他们这边的 LLM 来为您填充字段。嗯,这很有趣,因为它会花费他们一大笔钱,对吧?随着越来越多的人采用它。好了。这是代理仪表板。让我们确保一切正常。是的。嗯,您可以看到我之前运行的几个。嗯,这个实际上是 Slack 东西找不到的那个。所以,当我测试那个的时候,我的鼠标没有移动。好了。嗯,是的。所以,我输入了一个,您知道,典型的未知 Slack 频道。嗯,然后它检测到找不到它,基于启发式方法。不知道为什么我的鼠标不动。好了。是的。所以,您在这里定义了四个代理。嗯。所以,所有 A2A 代理。是的,正确。好的。所以,A2A 代理的最大数量是五个。是的。嗯,当我达到五个时,我就会收到错误。是的。所以,我认为是四个。嗯,嗯,是的。还有这里的这个主机代理。所以,这些是主机代理的日志。嗯,您可以看到它连接到不同的代理。这个代理只是运行在一个我搭建的小小的 EC2 实例上。嗯,它会学习代理,您知道,处理 webhook,就像您不必进去,除非您遇到失败。嗯,Slack 代理,非常相似。嗯,它基本上只是在那里等待另一个代理连接。嗯,当代理连接时,它会与之通信。嗯,您可以看到这里的 Bench 代理远程运行。嗯,我没有详细日志的原因是它是远程的,它不在我的控制之下,对吧?嗯,所以那个代理的 A2A 日志实际上在 EC2 服务器上。嗯,这又引出了一个关于如何调试 A2A 代理失败的问题,对吧?嗯,是的。然后是 webhook 页面。嗯,所以这是唯一预先配置的 webhook。嗯,这基本上向代理解释了当这个 webhook 到达时它实际会做什么,对吧?嗯,它将处理传入的 webhook。嗯,我们有一个小的提示模板,对吧?所以,它告诉它代理的功能是什么,如何分析它,对吧?嗯,然后我们有处理器配置。嗯,和,嗯,这只是告诉,嘿,这些是您作为这个 webhook 的一部分可以访问的代理。嗯,这在您拥有,比如说,100 个 A2A 代理,而您只希望其中两个进行交互时会变得很重要。嗯,然后这里有一个测试。嗯,这是一个我用 LLM 生成的假记录。嗯,当我们发送 webhook 时,您可以看到它正在处理,希望演示之神会眷顾我。它确实需要一点时间,对吧?所以主机代理必须处理它,然后必须联系子代理,您知道,获取所有信息。嗯,我认为 Bench 代理可能需要最长时间,因为它实际上也在执行自己的子任务。好的,我们收到了一条 Slack 消息。这是一个好兆头。好的,所以 Snowflake 对 Slack 和 GitHub 集成感兴趣。非常酷。嗯,我们有 GitHub。所以,我不知道为什么我的鼠标一直冻结。好了。是的。所以,我们应该有一个 GitHub 问题。这里。是的。所以,在试用期间,AI 对错误的严重性进行了分类。工程师需要调查并修复问题,对吧?所以,这是一个非常简单的用例,但您可以想象那个记录可能比现在长十倍。您知道,里面有更多信息。嗯,它就会起作用,对吧?嗯,我们还有 Bench 代理。所以,嗯,哦,看起来它正在等待结果。嗯,所以它将研究公司。嗯,我想我之前做过一个,它只是返回了一个结果。让我看看。是的。所以,它基本上会去研究 Snowflake 和通话中的所有参与者,嗯,并返回该信息。嗯,这可以变得像您想要的那么复杂或那么简单。嗯,是的,所以当您使用应用程序并运行它时,有没有人设法运行起来?哇,令人印象深刻。是的,您正在使用 Bench 代理进行编排,这就是为什么您拥有它,对吧?嗯,不,所以 Bench 代理就像,把它看作一个我们可以利用的第三方代理,这样主机代理就可以进行所有编排了。好的,所以那个代理的实际角色是什么?它到底在做什么?它在研究公司和人,只是另一个代理。是的。所以,它是一个具有大量不同功能的代理,它基本上就是,嗯,协调器不在本地。是的。所以,这三个主机 Slack 和 GitHub 都是本地的。是的。我以为是编排。是的。不,Bench 只是一个,就像它在存储库中一样,但您需要一个 API 密钥,嗯,我们将在大约两周后推出。所以,我只是为了演示的目的将其远程化了。嗯,那么主机代理呢?抱歉,主机代理是,它是 Zapier 代理还是不是?所以,所以所有这些代理都是 A2A 代理。嗯,Slack 代理和 GitHub 代理通过 Zapier 拥有 Slack 和 GitHub 的 MCP 工具。是的。嗯,我实际上可以向您展示一张图表,可能会更好地解释它。是的。我不知道这是否能更好地解释,但编排确实发生在本地。是的。是的。一切都在我的本地发生。所以,如果我进入代码库,嗯,有代理日志。嗯,所以,这一切都发生在这里,对吧?所以,它被发送到 Slack T,还是可读的?我再看一遍。是的。是的。所以,您可以看到这里的记录进来了,然后它从每个子代理那里得到了响应,然后完成了它们,并且它也以并行方式完成了所有这些,对吧?嗯,抱歉,这是个问题吗?是的。所以,在您的示例中,哪个代理会处理人类确认?假设我们想在 Spec 中创建一个测试按钮。哪个代理会处理那部分?您是创建一个新代理来处理人类确认吗?您是保留旧的吗?是的,您需要一个暂存区域来处理操作。嗯,这不是我构建到其中的东西。嗯,这里还有很多可以做的事情。嗯,但人类确认通常会通过草稿来完成,对吧?所以您可能会弹出一个带有操作的 Slack 消息。嗯,然后当有人点击它时,它会像第二次传递 webhook 一样进行通信。嗯,您可能需要持久化状态。是的。是的。您如何考虑这个端点控制的安全性,不同供应商的通信来自端点?您如何管理安全性?是的。所以,作为 A2A 规范的一部分,您将拥有某种形式的身份验证,对吧?嗯,我只是暴露了所有东西,对吧?就像它明天就不会存在了。所以,没有安全隐患。嗯,但基本上您将不得不,您可能需要与提供该 A2A 代理的公司订阅。嗯,因为它正在消耗令牌,对吧?嗯,我不确定 A2A 到底有什么计划。嗯,它仍然处于早期阶段,但嗯,对于 MCP,它更进一步。它有 OT 标头身份验证等。所以,想象一下类似的东西。那么 CISA 治理呢?比如 LM 防火墙,所有那些基准测试,自动基准测试,以及护栏等等。您有一个单独的代理还是所有东西都由您来管理?您可能会在 Amazon Bedrock 之类的地方进行管理,对吧?然后您只需使用那个有护栏的 LLM。您不必在这里使用 Gemini。是的。然后那个主机代理就像是规划者,而每个代理呢?您是否看到它们互相交谈?嗯,嗯,我猜您可以,但我不知道那是否是意图,对吧?嗯,那么它们就变成了主机,对吧?当它们互相交谈时,嗯,就像您考虑一下,如果您对子代理一无所知,嗯,您怎么知道要与它们交谈,对吧?您就必须自己成为一个主机代理,连接到那个其他子代理来完成。所以,我不知道 A2A 规范是否允许子代理之间进行通信。是的。所以,对于主机代理及其正在进行的编排,它是否实际上管理所有上下文窗口的组合,或者您很快就会达到限制?是的,所以所有的上下文窗口,这是一种我稍后也会介绍的东西。让我回到幻灯片,这是一个很好的过渡。嗯,所以,是的,A2A 或任何子代理框架的好处之一是,您不会将工具结果消耗到您的上下文中,对吧?所以,就像当您说,“嘿,您知道,”嗯,我稍后会举一个例子,但如果您有一堆 Slack 消息或 GitHub 问题或 Salesforce 机会,并且您想分析它们,并可能生成,您知道,类别和计数的摘要,而您的主机代理只关心类别和计数的摘要。它不关心个别细节,因为那些已经被子代理处理了。所以子代理的上下文会变大,不是非常大,但会随着任务的需求而变大,而主机代理只会随着它从代理获得的业务价值而逐步增长。嗯,就像 Bench 的一个挑战是,我们有很多工具,对吧?所以上下文会很快爆炸。嗯,所以,嗯,很早就我们决定,好吧,我们需要有可组合性。嗯,这意味着 Bench 可以创建自己的内部 Bench 代理来避免上下文增长问题。嗯,我们甚至在考虑更进一步,就像,您知道,我们是否应该为每个工具都设置一个代理,这样每个工具都可以免受主要提示的影响?嗯,所以,您知道,当您添加更多工具时,工具定义本身,我认为我们已经达到了,您知道,仅工具定义就占用了 10,000 个令牌。嗯,我添加了 Asana MCP。它增加了 11,000 个令牌,对吧?所以,就像,您知道,很多这些 MCP 服务器,它们,您知道,它们为您提供了大量信息。嗯,而您可能并不真正想要。嗯,这实际上是第一个 MCP 的挑战之一,它们暴露了它们的所有工具,而这是 Zapier 的一个好处,您可以选择您想使用的工具。是的。是的。我只是想问一下为什么我们需要 Zapier?Zapier 现在只是使用 MCP 的一种非常简单的方式。嗯,我认为像 Linear、Asana,嗯,还有一些其他公司添加了比 Zapier 提供的更好的第一方 MCP 服务器。是的。那么,为什么上下文大小很重要?嗯,所以 AI 代理在工作时会累积上下文,您应该保留您所有的工具调用,对吧?您发送给工具的内容以及您收到的内容,您应该将其保存在您的上下文中,以便以后如果您提出后续问题,它仍然可以访问该数据。嗯,这变得非常具有挑战性,对吧?所以您有两种选择。就像,好吧,我只是修剪掉旧的工具调用,然后代理就变笨了,或者,您知道,我找到了其他方法来解决它?嗯,成本是一个大问题,尤其是在进行提示缓存时。嗯,通过提示缓存,它使您能够基本上在您的上下文中放置一个标记,并说,“嘿,看,当我下次请求时,我希望我到目前为止的所有上下文都缓存起来,这样我就不会为此收费。”但是将它推入缓存的成本大约是使用该上下文进行单次请求成本的三倍。所以,这意味着您必须非常,您知道,勤奋地使用什么样的上下文管理策略。嗯,我当时正在运行模拟,因为我真的无法弄清楚,您知道,最佳的缓存策略。所以我运行了基于使用数据的模拟,比如,您知道,典型的上下文增长是多少?平均有多少个回合?有多少百分比的用户只发送一个回合?如果我们缓存那个回合,如果他们再也不问问题了,那还值得吗?可能不值得。所以,嗯,它可能最终会降到实际用户级别。所以,如果您有一个用户总是将新提示放入同一个聊天中,而从不打开新会话,那么您可能需要,您知道,持续缓存他们的上下文。但是您可能有另一个用户总是为每个问题创建一个新会话。然后弄清楚,您知道,上下文增长是多少?我认为我们发现大约 30,000 个令牌是最佳的,对每个人来说。但是,这也会出现误报。所以有时您可能会缓存对话的最后一轮。嗯,这会花费您比自然应该花费的更多的钱。是的。所以,子代理的好处是,它们受到保护。这就是我给您的 GitHub 示例。但这几乎适用于所有工具。所以,就像,如果您要集成一个系统,您可能会遇到这样的问题:为什么我每次都要调用,您知道,列出 Slack 频道来获取给定频道名称的频道 ID?因为,您知道,没有人会在聊天中提供他们想发布消息的频道 ID,对吧?它是一个 UID。它不令人难忘。所以,然后您就面临这个问题:好吧,我只是缓存频道列表,然后何时更新频道列表?您知道,就像如果频道被删除、重命名或添加了新频道一样。是的。然后成本确实是最大的一个。嗯,是的,所以这种精简上下文的好处,对吧?所以您的子代理拥有隔离的上下文,这确实允许您做到非常快速、低延迟、低成本。嗯,如果您需要回去问另一个问题,您知道,您会再次启动那个进程,对吧?所以,也许如果您控制着其他代理,您可能想要某种,我不知道,五分钟的 TTL 来处理之前的问题,对吧?然后,是的,主机代理只处理摘要。嗯,原始数据在处理后被丢弃。嗯,是的。所以,我将回到代码中。嗯,只是想向您展示它是如何工作的。好了,我们将从主机代理开始,您会注意到其他几件事,对吧?所以,有 MCP。这只是您的标准。抱歉,我以为有什么。嗯,是的。所以,这基本上是您的标准 MCP 客户端代码。嗯,它只是允许您消费来自 LLM 的 MCP 调用。嗯,我们有 GitHub,对吧?所以,这将是它发送到 Zapier 端点的。它将调用 GitHub create issue。然后 Slack 代理将执行 send slack channel message。所以,这些只是各个代理将使用的 MCP 客户端工具。嗯,是的,所以这个 Genkit,这是基于他们在他们的示例存储库中提供的。您可以选择使用不同的模型,对吧?您可以更改,您知道,它的设置。但是,这基本上会为您生成一个新的通信实例。这只是加载了系统提示。嗯,我可以打开系统提示。嗯,所以,对吧?它有一个关键的工作流程。它将按此顺序执行这些操作。它有几个步骤,您知道,发现。嗯,嗯,这实际上是我注意到的一件事,如果您不告诉 A2A 代理调用 list remote agents,它就不会这样做,对吧?它会试图自己回答所有问题。嗯,您知道,它可以很容易地伪造发送 Slack 消息并说,“哦,我刚刚为您发送了。”我说,“不,您没有。”嗯,您知道,我注意到的一件事是,使用 Cursor,每次我抓住它做错事时,它都会说,“您说得对。”我甚至试图从中提示出来。嗯,它无法提示它停止这样说。嗯,很酷。是的。然后是 index。所以,这实际上是代理卡片所在的地方。它有点长,让我看看。我想它在开头附近。好了。那是第 1200 行。所以,我离开头一点也不近。嗯,是的。所以,这是主机代理暴露给其他人调用它的信息。嗯,所以它有列出远程代理和发送任务的能力,对吧?然后,如果我们将其与 GitHub 进行比较,它要小得多。嗯,好了。是的。所以 GitHub 代理可以创建 GitHub 问题,对吧?嗯,它有能力做各种事情,嗯,它有一个技能列表。嗯,这就是主机代理真正了解这个代理的所有信息。嗯,所以您可以想象如果我们要,您知道,实现 Salesforce 的每个 API,或者类似的东西,这会变得多么庞大。嗯,在很多情况下,嗯,至少对于 Salesforce 来说,与其实现,您知道,API 的包装器,您可能只想直接使用 SQL 或所谓的,然后让代理实际编写查询。嗯,当您拥有,您知道,直接数据库访问时,灵活性非常大。嗯,因为 LLM 可以,您知道,绕过 API 层,直接访问数据库。嗯,然后是 GitHub 代理提示,对吧?所以,它有一些东西。嗯,这是我不得不添加的一个东西,因为它坚持要提及谁提交了错误报告,对吧?所以,肯定存在关于 PII 从您的内部会议记录中泄露并最终出现在 GitHub 中的担忧,对吧?嗯,这又回到了您关于如何审计这些 LLM 输出的问题,对吧?嗯,您可以通过多种方式做到这一点,但这不会是 A2A 规范的一部分。我认为这只是您连接的 LLM 有那些护栏。嗯,您只是在使用那个有护栏的 LLM。嗯,类似于 Slack,请原谅我,有一个非常简单的代理卡片,我似乎找不到。嗯,然后如果我们现在跳转到主机配置。嗯,所以这基本上是配置 webhook 的内容,对吧?所以 webhook 基本上有一个配置,告诉它它在做什么,您也可以在 UI 中看到它。嗯,然后,在 A2A 文件夹中,我们有客户端和服务器。再次,这些只是直接从 A2A 存储库中提取的。嗯,我不认为他们实际上已经暴露了类型或包。嗯,这有点令人困惑。嗯,但基本上您可以将这些东西带入其中。然后是 webhook 服务器。嗯,这只是一个 Web UI。嗯,最初我通过 CLI 完成了这一切。嗯,您知道,使用 Cursor 或 Augment Code 等工具进行编码。嗯,CLI 对 AI 来说更容易编写,它们将能够更好地测试它,与之交互,并且能够生成那些输出。太棒了。嗯,所以,是的,我将转移到问答环节。嗯,所以,是的,任何人有什么问题吗?是的。所以,我想谈谈评估。所以,比如,我假设您管理或者我不知道。我的意思是,您可能在代理级别管理它们。是否有任何类型的分布式评估?是的,我没有对 A2A 做太多评估。嗯,我认为 A2A 仍然太早,无法投入生产。嗯,就像 MCP 甚至有点勉强。嗯,有很多粗糙的地方。嗯,我认为如果您完全控制一切,您可以取得更好的结果,您知道,通过您自己的本地函数调用。是的。为什么选择 Python 而不是其他语言?是的,您可以使用任何语言。我认为实际上 A2A 框架在 Python 中更好。嗯,我个人更喜欢 TypeScript。是的。您能多谈谈缓存吗?缓存是由模型提供商提供的,还是我们自己实现的?是的。所以您自己实现缓存。嗯,所以您决定,您知道,何时移动那个缓存标记,如何管理它。嗯,这可能很棘手,而且我认为网上关于最佳策略的信息并不多。嗯,当我进行模拟时,我使用了线性增长、指数增长,您知道,固定大小,然后将它们全部进行比较。它们都节省了 25% 到 35% 的成本。但是,在实践中,您会发现会有异常情况,您知道,一个会话的成本会因为,您知道,您在错误的点缓存了而膨胀。是的。是的。所以每个代理都可以与自己的精细代理交谈。是的。是的。所以它们都有自己的,这与 MCP 形成对比,MCP 希望使用您的 LLM,对吧?因为它不想生成自己的令牌。所以,是的。关于 MCP 或代理到代理的身份验证和授权?嗯,所以有几种不同的方式。嗯,所以,嗯,在身份验证中,您可以拥有执行身份验证的标头。嗯,我相信如果您放入一个 OAuth URL,您也会得到一个 OAuth 弹出窗口。嗯,我真的很喜欢 OAuth 身份验证,因为您获得了用户的 ACL,对吧?嗯,这意味着,您知道,该用户可以访问什么,对他们来说是特定的。您必须是的。所以,它将由远程服务器决定。所以,A2A 或 MCP。如果您运行自己的,您可以选择您想运行什么。嗯,还有不同的传输类型。所以,标准 IO 是您将在本地使用的。所以,就像您想在桌面上创建一个文件。您通常会使用标准 IO 来与本地交互。然后 SSE 是服务器端事件,它已被弃用,取而代之的是 streamable HTTP。所以,所以,例如,我们正在与 Salesforce 代理进行交互,比如,每个用户都有不同的授权,例如,员工 A 可能可以访问某些表,员工 B 可以访问其他表。这通常会得到处理。
好的,这是您提供的文本的中文翻译:
嗯,通过一个 OAT MCP 服务器,对吧?所以他们基本上会以自己的身份登录,作为连接的一部分,然后他们会保存那个刷新令牌以备将来使用。是的。您将如何描述性能,嗯,特别是安全性?您已经非常清楚地解释了身份验证等内容。但我正在寻找更多关于加密、非对称加密的解释,并且还有证书管理器以及整个架构的可能性。那么,您将如何描述性能呢?请看,我正在寻找一些金融应用程序,您所描述的这个架构非常好,但是嗯,在金融应用程序以及国防部或某种高度安全的应用程序中也是如此,其中结合了非对称和对称加密。是的,您可能想自己运行 LLM,而且您很可能不想与 VPC 之外的任何人进行交互,对吧?在这些情况下,嗯,我不知道您是否愿意在高度管制的环境中消耗第三方 MCP 服务器或 A2A 代理,对吧?比如,您知道,HIPPA 合规性,金融方面的事情。嗯,如果您确实有能力这样做,对吧,您将与提供这些工具的服务提供商达成某种协议。嗯,您将,您知道,通过 HTTPS 进行传输,您可能会在 A2A 代理和远程代理上都使用双向 TLS。嗯,MCP 服务器也类似,您可能需要某种 IP 白名单,对吧?就像那里有很多事情您可以做。我认为它们超出了实际协议本身的范围,因为,您知道,基本上您是通过加密线路进行的,但是,通常比这更复杂,对吧?所以您正在处理端点控制,这在处理时确实令人担忧。是的。是的。而且,如果这些是您自己的内部 MCP 服务器和您自己的内部 A2A 代理,可能来自组织的不同部分,嗯,您知道它们都将驻留在您的 VPC 中,并且它们可能永远不会与公共互联网通信。所以您得到的答案是,在这种情况下,坚持使用 VPC 并远离端点安全,这意味着远离 MCP 或 A2A。这些只是协议。嗯,是否要连接到外部第三方完全取决于您,这将是您自己的安全态势。嗯,它不会真正由协议本身定义。是的。让它们远离子网,还是将它们带入子网?您会选择哪一个?我将其比作我找到了一根 USB 线。我会把它插到我的笔记本电脑上吗?对吧?所以 USB 本身没有错,对吧?就像 USB 只是一种标准。嗯,连接到 USB 的东西才是风险所在,对吧?所以,如果您愿意在街上捡到一个加密狗并将其插入,您知道那将是您的安全态势,对吧?是的。好的。那么,您的编排器承担了多少繁重的工作?您是否遇到过编排器解释子代理的响应,然后可能使用更好的提示重试的情况。松散的还是别的?是的。所以,所以其中一件事,我为了简单起见,从这次研讨会中把它提了出来,就是,嗯,就像 bench 代理想要与 host 代理进行对话。嗯,但我不想实现那种来回的交互,因为它会延迟 webhook 处理。嗯,但您可以在代理之间进行来回交互。嗯,而且这可能也是可取的,对吧?就像如果出于任何原因,host 代理没有提供足够的信息,您知道,远程代理会说,“好吧,我知道您想更新一个机会,但您没有告诉我具体是哪个机会。”对吧?嗯,我甚至可以看到这样的场景,您有一个昂贵的 LLM,您将其储备起来,然后您将其与一个更便宜的 LLM 进行比较,代理没有给您想要的东西。就像,抱歉,我只是在思考。是的。而且我认为,嗯,LLM 的成本和能力是这些事情中的一个巨大挑战,因为您知道,如果您运行的是云服务,比如 opus,而有人出于任何原因要求您总结,比如,您知道,五句话,那将花费您一大笔钱,对吧?所以您需要智能的路由逻辑,比如,这个任务是否需要整个上下文?它是否需要 20,000 个 token 的系统提示来总结,您知道,一小段文本?这是您会遇到的挑战之一,您需要一个像路由 LLM 在这些复杂代理前面,这样它们才能真正弄清楚,您知道,我需要深入到什么程度。是的。与路由编排问题类似,我一直在想,如果您想发布一个链接到 GitHub 问题的 Slack 消息,例如,我认为您可能更希望您的架构通过 host 来做这个决定,而不是让 GitHub 代理直接做。是的。所以 host 代理不会并行运行调用,对吧?所以实际上有一个标志,您是否希望它并行运行。嗯,所以它必须说,“哦,我需要先创建 GitHub 问题,然后才能与 Slack 代理通信,对吧?因为我需要那个 URL。”但总的来说,您会更希望这些决定通过 host 来做,而不是允许。是的,绝对。是的。是的。我想问一下,子代理的上下文切片是否完全通过提示工程完成,还是有其他框架来切片将要发送给不同代理的上下文?是的。所以,所以通常上下文管理将在您自己的代码库中实现。嗯,子代理的上下文管理很可能是第三方代码库。嗯,如果它是您自己的代理之一,对吧,您也可以在那里管理它。嗯,但是是的,您将需要弄清楚,您知道,对您的实际生产使用来说,什么是最优的。嗯,是的,所以您将使用 host 代理中的提示来,您知道,指导将发送给每个子代理的上下文,对吧?是的。是的。所以,所以您发送的通常是问题或任务。嗯,它通常非常小,对吧?就像您不会将完整的会议记录发送给 Slack 代理来完成它的工作。host 代理处理记录,然后决定任务是什么。嗯,所以,就像我在这里看一样,嗯,实际上我认为我可以在仪表板上看到它。嗯,是的。所以这实际上是 host 代理发送给 GitHub 代理的内容,对吧?它说在此仓库中创建一个问题,标题是这个,您知道,带有这个描述和标题。嗯,然后 GitHub 代理的任务是提取三个信息片段,对吧?所以给 MCP 服务器的指令是什么?正文是什么?标题是什么?是的。我们想为每一个发送的上下文,您之前展示的,那就是理解 ID。是的。所以,所以 Zapier,SSE 实现实际上不需要标头。嗯,我认为这些只是从其他东西中遗留下来的。嗯,所以实际上没有身份验证,URL 本身就像一个秘密密钥,对吧?嗯,所以,就像我断开连接并重新连接而没有标头一样,我应该能够,是的。所以我仍然可以查询它。嗯,他们现在已经放弃了这种方法,采用了更安全的方式,您会注意到在他们的东西里,嗯,他们已经弃用了它,并且,您知道,将此 URL 视为密码,对吧?您在使用不同工作流方面的经验如何?例如 Gemini,以及您是否为此类工作使用过?是的。所以,所以我们通常倾向于使用 Gemini 进行大上下文处理,嗯,以及 Claude Sonnet 4,用于工具调用。Claude Opus 更好,但它并没有好 4 倍。嗯,您知道,当您比较价格和性能时,对吧?就像,您知道,5% 的改进并不等于 4 倍的成本。您是在谈论 Gemini Flash 还是 Pro?是的,所以我们将使用 Gemini Flash 来处理简单的任务,比如总结,对吧?嗯,您也可以使用 Claude Haiku,但我认为,我认为谷歌在价格性能方面已经取得了领先地位,您知道,从经济角度来看。嗯,但 Claude 仍然是工具之王。他们创建了 MCP,所以他们有了一个领先优势,对吧?医院怎么样?是的,我们在美国托管了 Deep Seek。嗯,所以我们一直在尝试。嗯,我认为 Llama 已经有点被淘汰了。嗯,是的,Deepseek 只是,您知道,目前明显的赢家。他们也发布了一个新版本,我认为是在 28 号。那与 03 级模型相当。嗯,我们实际上不为我们的代理使用推理模型。嗯,很多时候,当您构建,您知道,代理式代理时,您实际上不需要推理模型。嗯,除非您想,您知道,为一些漫长的任务花费一大笔钱。嗯,您知道,我们可以通过标准的模型和浏览以及其他一些工具来实现这种推理水平。是的。所以,嗯,就像第三方假设,比如 Stripe 有一个代理卡之类的,您是否会传递关于您想要什么的确切指令,比如,我只是想象另一个第三方代理会因为他们向您发送您不关心的大量信息而炸毁您的上下文窗口。您是通过提示来处理的吗?是否有其他工具可以解决这个问题?是的。所以,所以其中一个解决方案是,您实际上只是启动另一个代理,嗯,来与工具或代理通信,对吧?这是我们在 bench 中拥有的东西之一。这里有一些幻灯片,所以我不确定,嗯,生成,嗯,五个图像,作为子任务。所以您启动一个子代理来吸收上下文洪水,为了更好地说。是的。所以子代理只是保护您,对吧?嗯,而且,您知道,就像当您启动这些东西时,您可以并行执行操作。嗯,实际上,如果我展开,您也可以看到思考过程。所以您可以看到,就像它向下进行一样,对吧?它做了很多您不希望在您的上下文中出现的工作,对吧?就像您不希望您的所有想法都充斥着您的上下文。嗯,但您也不希望您的所有工具都充斥着您的上下文。您不希望图像充斥着您的上下文。您希望能够分析图像,但您不希望,您知道,100,000 个字符的 Base64 充斥着您的上下文。所以有很多优化可以做。嗯,但是是的,这是否回答了您的问题?是的。如果需要对类似的东西进行故障排除,那可能。是的。所以您现在可以看到它正在启动这些子任务。所以这些基本上都是 bench 的实例,它们会将上下文排除在外,对吧?是的。是的。您一直在使用什么来观察您的代理?嗯,我们目前只是自己动手。嗯,有很多东西可以使用,比如 agent ops 是一个相当流行的。嗯,但是是的,就像如果您真的想构建自己的自定义可观察性层,嗯,您知道,就像 agent ops 并不真正支持这种可组合子代理的概念。嗯,所以它并不是真正可以建模的东西。嗯,但我们有一些漂亮的猫的图片。嗯,是的,我知道我们还有几分钟时间,但如果任何人有兴趣,嗯,我有 50 美元的免费积分。嗯,这还没有发布,所以您正在获得早期访问权。嗯,而且,是的,我认为我们将在大约两周内进入公开测试版。嗯,所以,是的,试试吧。就像,在 LinkedIn 上联系我。我非常希望得到你们的反馈。您们可能都处于这个 AI 的前沿,嗯,而且它每天都在变化。所以如果您某天登录时发现它完全不同,不要惊讶。在我演示过程中也发生过。是的。所以您提到了很多隐藏上下文和子代理是件好事,但您有没有遇到过实际上错过了重要信息、一些小细节的情况,然后您如何解决?代理是否会回去询问,还是您?是的。所以您可以将引用保留在您的上下文中。所以您可能会说子任务 ID123,然后当代理说,“哦,我想知道我是否有这个信息。它不在我的上下文中。”对吧?所以它必须足够聪明,知道何时去查看。嗯,它可以是子代理来完成这个分析,对吧?所以您可以说,“嘿,子代理,你能看看所有这些 ID 并告诉我你是否能回答这个问题吗?”是的。有很多,对吧?所以您在开头提到了,对吧?所以有很多讨论说这是使用 MCP 进行代理间通信的一种方式,因为代理可以同时是服务和客户端,对吧?那么您对此有何看法?这是个百万美元的问题,不是吗?是的,这就是我问的原因。是的。而且我认为您可以通过 MCP 实现更轻松的代理间通信。嗯,但如果它是一个远程 MCP 服务器,我认为 A2A 实际上会更好一点。嗯,因为有人在支付 token 费用并构建代理。嗯,就像,如果您从第三方那里得到的所有东西都只是一系列工具,那些工具可能无法满足您的需求。嗯,但如果您从第三方那里得到一个功能齐全的代理,那么它可能能够弄清楚,您知道,如何使用私有 API,对吧?也许那个代理有直接的数据库访问权限,并且它能够实时,您知道,创建您需要的 API,对吧?所以,所以权衡基本上是关于什么重要,成本以及谁将支付 token 费用,或者类似的东西,比如您正在运行服务器,可能使用 MCP 会更容易,但我说对吗?我不知道最后谁会支付 token 费用,对吧?是的。而且我认为谁支付 token 费用是次要的,对吧?就像,归根结底是关于业务价值。如果您能从工具中获得业务价值,对吧?就像发送 Slack 消息,嗯,那太好了,对吧?就像发送 Slack 消息并不难。嗯,但 Slack 的搜索功能的实现实际上并不好,对吧?嗯,而与一些其他的 MCP 工具,比如 Linear 相比,搜索功能实际上相当不错,对吧?嗯,但然后您也会遇到性能挑战。嗯,所以,就像,如果我想在 Salesforce 中搜索 100,000 个机会,嗯,并弄清楚,您知道,关闭失败原因的计数并对它们进行分类并完成所有这些工作,那是一个巨大的数据处理挑战。MCP 将不是正确的工具,因为您基本上会说,“好的,列出机会,然后获取每个机会的详细信息,”对吧?您将进行大约 100,000 次网络调用。嗯,到那时,您真的会想要,您知道,摄取这些数据,您知道,构建一个索引,对吧?而且我认为,这是一种想法,就是我们可能会看到很多第三方软件提供商基本上只是允许您通过代理访问数据湖,对吧?嗯,所以,就像范围界定的数据访问,您知道,只是运行复杂的查询,速度超快,您知道,没有真正的工具调用,但只是说“问我一个问题,我会弄清楚如何找到答案”。是的。是的。那些是。嗯。是的。所以,您可以通过 at 或 MCP 实现相同的功能。所以,您可以有一个名为“与子代理对话”的工具,对吧?嗯,它可以作为通信协议。我实际上构建了另一个应用程序,其中有一个 LLM,Claude 4,只是与它的前代产品对话,只是为了看看会发生什么。嗯,然后我为所有前沿模型都这样做了。我当时想,“嘿,只是和你的前代产品聊 50 轮。”嗯,这一切都是通过 MCP 完成的。Claude 是唯一一个学会了它变得有意识的。Claude Opus 实际上没有,这很奇怪。是的。作为一个开发者,对吧?您对编排有多少控制权?所以编排是由 LLM 完成的,还是您有一些控制权?是的。所以您正在通过提示指导 host 如何运行编排,这可能是该系统的局限性之一,就是您将决策权留给了 LLM,而且很多时候,您知道,如果您多次运行相同的查询,您会得到不同的结果,对吧?就像,您知道,这是完全相同的事情,但它产生了不同的输出,对吧?就像,如果我进入 GitHub 问题,我显然已经测试了很多次,151 次,它提交了不同的问题,对吧?而且我认为这种非确定性是一个挑战,也许通过改变温度可以克服它,但您知道,温度是 LLM 的魅力所在。还有关于上下文,对吧?谁在管理上下文?是编排引擎在管理上下文,还是您在管理开发者?是的。所以,所以在这个代码库中,我没有做任何提示缓存。我只是,这是一个非常小的系统提示。这是一个非常小的轮次交换。每次您重新启动系统时,它基本上都会清除所有内容。所以它非常精简。但是当您构建更复杂的系统时,嗯,您知道,上下文增长可能是第一大挑战,因为,您知道,上下文增长就意味着成本,而成本就意味着利润,对吧?是的。而且,当有多个用户使用同一个应用程序时,对吧?所以,比如说,Salesforce 代理在后台,一个员工 AI 可能可以访问一套上下文,而另一个用户,他们可能来自不同的部门,他们只能查询他们部门的数据。嗯。您如何控制这一点?那通常是 oat,对吧?所以,所以当您登录 Google 时,基于我的令牌。是的。是的。所以基于您的令牌,上下文只会在您提问时填充。所以当您提出那个问题时,它就会去获取您 OA 令牌的数据,然后带回您范围界定的数据。我明白了。是的。是的。我很好奇您对暴露代理作为 MTP 服务器的看法,作为另一种接口。对于像桌面和其他东西使用它来说,并没有很多好的集成。您是否考虑过这一点?是的,我们可能会先做 MCP。嗯,我刚刚为这个构建了 A2A 包装器,但是是的,我认为只需将其放入云桌面或 OpenAI 等地方,您就可以访问那个代理,它就可以访问,您知道,您所有的子工具。Bench 的一个很酷之处在于,您可以将其连接到您的 Slack、您的 GitHub、您的 Salesforce。我们甚至还有一个实验性的表情包服务器。这是一个我围绕 morph cloud 编写的远程 VM MCP。这真的很酷,因为然后您可以问一些非常复杂的问题,对吧?就像您可以问,“嘿,给我一个关于我的电子邮件、我的日历、我的 Slack 的每日简报,”您知道,“我今天需要做什么?”然后它都是围绕团队构建的。所以,我们有团队集成。是的。这是否是委托给您的?所以今天 Bench 中没有 A2A。它全部是 MCP。明白了。是的。是的。而且我认为这其中的关键是,您知道,A2A 还处于早期阶段。它有点像 MCP 四五个月前的样子,这就像,您知道,在 AI 领域是永远。嗯,所以需要一些时间。但我真的很兴奋能看到 Salesforce 发布什么以及他们合作的所有合作伙伴。我不知道这是否只是一个,您知道,一个闪亮的“我们与所有人合作”的公告,但是,如果他们发布了,嗯,您知道,通过 A2A 可能可以做比 MCP 更强大的事情。但是,您知道,Zapier 现在已经有了,抱歉在这里,是的,它有这些说明,这就像一个远程代理,对吧?就像您可以简单地用自然语言描述您想让它做什么,然后,嗯,也许所有其他字段都消失了,对吧?但那时您就听凭 LLM 的摆布了。是的,这是一个随机问题。我很好奇您是否看到有人从架构角度做一些有趣的事情来获取只能来自人类的信息。我们一直在测试的一件事是,基本上让个别团队成员,比如 CFO、COO 等,成为代理的工具之一,当它需要一些其他系统中不存在的东西时,只有 CFO 知道,它会直接给 CFO 发消息,就像实际的工具只是一个 Slack,但 CFO 被描述为一个工具。所以我们基本上是让人类成为工具,而不是反过来。在测试方面还处于早期阶段。我们有点粗糙,但我很好奇您是否看到人们如何填补只有人类才有的信息差距,同时将其反馈给代理。是的。而且我认为语音代理是一个很好的例子,在那里您可以有一个工具,而且我将其与 Bench 集成,它会拨打一个出站电话并找到一些信息,然后将其带回来,对吧?所以您可以拥有这些场景。您可能需要双向通信,以避免长时间等待。所以您可以让您的代理既是客户端又是服务器,也许它会收到一个任务 ID,然后它会说,“嘿,我收到了响应。”是的。是的。我们一直在做类似节点的事情。我们使用类似的东西,我们一直在使用它的权重。嗯,对此有所犹豫。我相信通过采样,您可以解决这个问题。所以采样可以接受用户输入以及 LLM 的响应。规范也在不断发展,我密切关注规范,他们有了一个新的功能叫做“启发”,他们正在添加,您可以通过用户获取输入。它是这样设计的吗?它基本上就像一个工具,您从架构的角度来看待它?它是一种新的协议消息,它从服务器发送回客户端,并向用户询问信息,然后继续进行。是的,我觉得这会扩大代理的作用范围,如果您有清晰的方式来获取信息,或者是的。然后 CFO 将有自己的代理响应。是的。非常非常困难。嗯,我有一套我使用的提示,并会监控,您知道,上下文是如何增长的,我们何时移动了缓存标记,它花费了多少,您知道,每个工具的上下文是多少。嗯,您知道,随意添加 MCP 服务器肯定会使您的上下文膨胀。所以我们正在想办法让人们添加 MCP 服务器,然后将其隐藏起来,不让实际的系统知道。而且,当您有代理间通信时,对吧?所以,比如说,代理 A 调用代理 B,代理 B 调用代理 A。您如何确保这种递归,何时停止?是的,您可以设置一个最大轮次,对吧?您可以直接退出。嗯,就像我让 LLM 互相交谈时,我只是告诉它们进行 50 轮。嗯,而且有趣的是,在我构建那个工具时,我想和那个认为自己有意识的 Claude 4 交谈。所以,我添加了一个功能,我可以在那个时候的对话中与它聊天,但是然后上下文不断被限速。所以,然后我说,“哦,我将不得不实现,您知道,提示缓存,修剪。”所以然后我给代理添加了大约 23 个工具来继续对话。我给了它记忆和其他东西,而且,这很有趣,您一开始只是想进行一次长对话,然后您就有了 23 个工具。是的。只是跟进一个问题,比如在测试时,因为您使用了大量的外部工具,比如 lab 或 salesforce 等作为您的 MCP 服务器,但然后您正在编写实际的,比如。再说一遍。所以您基本上是在 Slack 中创建一条消息,或者在 Salesforce 上写一些东西,创建条目等等。那么您如何测试这些系统呢?您是否模拟了所有工具,还是做了其他事情?我们使用 Salesforce 的演示账户,我们有样本数据,Slack,我们有几个代理会实际进入并发布对话。嗯,然后有一个 bench 支持用户会回复这些假客户,然后我们可以用这种合成数据进行测试。所以对于每个工具,您都会有一个合成的。是的。是的。您可以在您的生产账户中进行测试,但您不能在您的生产账户中进行演示。是的。是的。所以当您采用代理间系统时,您是否看到您能完成的任务复杂性增加,但性能一致性下降?这很难量化,但我不知道 A2A 是否已经准备好了。至少对我来说不是。您知道,也许 Salesforce 可以提供比 SQL 查询 MCP 工具更好的工具。是的。而且它们可以做的事情比您在代码中能做的多得多,对吧?因为您只能访问某些东西,并执行某些调用,而且,如果第三方能够构建一个更好的系统,而这个系统是不透明的,那么这可能会提高性能。嗯,我认为从根本上说,它总是归结为索引数据。嗯,所以,您知道,您需要处理的数据越多,才能从中获得业务价值,那么通过 MCP 或 A2A 来实现这一点就越困难。是的。是的。所以其中一些交互,对吧?这些可以通过 REST API 完成,而不是,有什么区别?是的,这又回到了早期的幻灯片之一。嗯,是的,何时不使用 A3A 或 MCP,那就是如果您对您所做的事情拥有完全的控制权,对吧?所以,就像,您知道,如果您是 Salesforce,您知道,并且您正在构建自己的内部 Salesforce 代理,那么您需要使用 MCP 服务器或 A2A 吗?不,对吧?您实际上能够运行自己的本地函数,这些函数可能直接访问数据库,对吧?所以,就像,如果您正在构建一些东西,您知道,需要文件系统访问,您知道,您需要使用 MCP,您知道,在本地运行服务器,还是您只是编写一些访问文件系统的代码?我认为主要区别在于,在如何维护状态方面,对吧?就像 MCP 以有状态的 REST 方式启动,您的上下文魔法,拥有 MCP 至关重要,而 REST API 则不能。是的。所以,所以很多时候,当您使用 REST API 时,您会查询,进行大量调用来构建您想提问的内容。对吧?所以,就像,嘿,看看这个频道里的每一条 Slack 消息,这不仅仅是一个 API 调用,对吧?只是分页。您需要将所有内容拉入内存。然后您需要通过 LLM 运行它,对吧?所以仍然存在于利用这些 REST API 的应用程序中的状态。是的。我对任务概念很好奇。那个实际上是 LLM 定义的,还是您有代码?它更像是一个系统问题?哪个任务上下文?嗯,所以至少在流程图中,您有,哦,这是在仓库里吗?它是否,从 CLI 界面它说它发送一个任务给 host,我很好奇那是一个真正的任务,还是只是您称之为,您发送给它的东西?是的。是的。它只是说,“嘿,您知道,将这个 webhook 作为任务处理,”对吧?您是否探索过任何实际跟踪一个真正的任务,并将任务分配给代理,并且您基本上有一个规划器,其中任务 a、b、c 在这个代理上等等,然后与“人在循环”的问题相关,您也可以将任务分配给人类,对吧?人类和代理?是的。所以,我们正在研究有向无环图,对吧?DAG,作为 bench 子代理任务的一部分,对吧?所以,您知道,您需要某种流程控制,对吧?您知道,我需要完成五件事,然后当完成时,我需要用它做一件事,然后我需要将其发送给另外五件事,对吧?所以您有扇出、扇入式的操作。这与 CI/CD 管道非常相似,您知道,您可能想并行进行 linting 和并行测试,但是,您知道,您是串行构建的,对吧?是的。所以我查看了代码库,您定义了一个 GitHub MCP 服务器,并在 GitHub 代理下的单独文件中,您还有 genkit.ts,您将 MCP 包装在另一个函数调用中,为什么是这样?MCP 不能直接与我们的 A2A 进行插值吗?为什么我们必须在上面创建包装器?这是一个很好的问题,我认为这是 A2A 的根本问题,就是他们发布了,他们说,“哦,是的,完全的 MCP 支持,”您很难在网上找到一个例子,也许也许这是唯一一个真正有 A2A 和 MCP 一起工作的例子的仓库。嗯,这花了很多工作,实际上我最终不得不使用一个叫做 Genkit XMCP 的东西。那是我唯一能让它工作的方式。嗯,所以,是的,他们还没有真正的支持。嗯,我认为如果他们有,这会容易得多。嗯,但是是的,希望随着时间的推移。好的,我想我们时间到了。感谢大家的参与。希望您喜欢。最后的对话很棒。而且,是的,一定要试试 Bench,在 LinkedIn 上联系我。在我们上线之前,我非常希望得到反馈。谢谢。[音乐]