Transcript
00:00:00[无声]
00:00:30。
00:00:53>> 嗨,欢迎大家来到新一期的 Vercel 社区分享会。
00:00:57我是今天的主持人 Jacob Paris。
00:01:00我们举办这些活动,是为了展示来自社区、
00:01:03客户以及所有在 Vercel 上构建酷炫项目的开发者们的精彩成果。
00:01:08我们正在 LinkedIn 上进行同步直播,
00:01:10但如果你想参与聊天互动,请访问 [community.com/live](https://community.com/live),
00:01:15你就能在页面顶部看到本次分享会。
00:01:18在最后,我们会留出一些时间进行问答,
00:01:21所以请随时在直播聊天室中提出你的问题。
00:01:25现在我想介绍一下我们的嘉宾。
00:01:27我们邀请到了来自 Saltbox Management 的 Shane Smith。
00:01:30>> 嗨。
00:01:32>> 嘿,Shane,今天过得怎么样?
00:01:35>> 挺好的,你呢?
00:01:37>> 我也挺不错的。
00:01:38是的,那么今天你给我们准备了演示吗?
00:01:42>> 是的,我准备了一些内容要过一下,
00:01:46先介绍一点背景,最后再进行现场演示。
00:01:48>> 太棒了,如果你准备好开始的话,我可以帮你分享屏幕。
00:01:53>> 没问题,正合适。
00:01:57好的,在屏幕加载的过程中,我先简单介绍一下背景。
00:02:04正如 Jacob 所说,我叫 Shane Smith,是 Saltbox Management 的 CTO。
00:02:09Saltbox 是一家服务型公司。
00:02:12实际上,我们大部分时间都在为客户
00:02:16落地和实施 Salesforce 技术。
00:02:18而在过去几年里,我们一直在为自己打造一款产品。
00:02:24随着开发的深入,我们已经到了开始向客户
00:02:28以及更大范围的市场去推广它的阶段。
00:02:31所以今天,我将分享我们是如何做到这一点的,特别是如何利用 Vercel
00:02:37以及 Vercel 为我们提供的一些不同的技术。
00:02:41正如大家在屏幕上看到的,
00:02:42我们也会探讨 AI Gateway。
00:02:44现在让我们来聊聊我们想解决的痛点,
00:02:49我们有一批正在使用 Salesforce 的客户。
00:02:54特别是在这个 Agent(智能体)时代,这些用户希望
00:02:58能用更自然的语言与 Salesforce 进行交互。
00:03:02因此,在第一个使用场景中,我们要解决的痛点
00:03:06是针对业务用户的。
00:03:07他们希望能够用通俗易懂的日常语言,与他们的 Salesforce 产品生态进行对话,
00:03:10从而更快地解答他们遇到的问题。
00:03:16而在第二个场景中,我们是在为建设者们解决问题,也就是那些
00:03:20在 Salesforce 内部实际进行配置和定制开发的人,
00:03:23这在很大程度上也就是我们自己。
00:03:25这是我们开启这段旅程的起点——我们希望
00:03:28通过 Agent 让 Salesforce 的开发工作变得更轻松。
00:03:31以上就是我们试图为自己
00:03:34和我们的用户解决的两个核心痛点。
00:03:35而这一切的背景在于,做这件事其实相当有挑战性。
00:03:41这也是为什么大家会雇佣像我们这样的专业服务公司的原因。
00:03:45因为理解 Salesforce 的上下文、理解客户公司
00:03:49以及他们具体项目的背景,并尝试将其转化为
00:03:54符合最佳实践、可投入生产的高可靠、可扩展的代码,真的非常困难。
00:03:58所以你不能随便找个大语言模型
00:04:01提一个关于 Salesforce 的问题,这可能也能给你一些解答,
00:04:05但绝不会是直接可用于生产环境的代码。
00:04:07这就是我们想要达到的目标。
00:04:12在朝着这个方向前进的过程中,我们只有一个相对较小的产品团队,
00:04:16却要打造这样一个野心勃勃的产品。
00:04:19因此,我们希望把精力集中在产品本身,而不是底层的架构上。
00:04:24我们希望底层架构能“开箱即用”,并提供我们所需的各种能力。
00:04:28这就是我们的挑战,也是我们押下的赌注:我们相信
00:04:33我们可以在 Vercel 的基础设施上构建起这个可扩展的平台,并以此赋能我们实现目标。
00:04:40接下来我将谈谈我们具体是如何做到的。
00:04:44我们的高层架构基本上可以分为三个层级。
00:04:48在最顶层,我们有一个 Next.js 应用程序,它作为
00:04:53面向用户的 UI 展现层。
00:04:56它具备了当今时代
00:05:02一个 AI Agent 所应有的全部常见流式 UI 交互能力。
00:05:04然后是第二层,也就是我们的边缘(Edge)和服务器端能力。
00:05:09我们使用 AI SDK(特别是最新的版本 6)来控制 Agent,
00:05:16并驱动 Agent 运行环(Agentic Loop)以及其中内置的所有工具链。
00:05:21如果你还不熟悉这个 SDK 并且正准备涉足 Agent 领域,
00:05:25我强烈推荐你去试用一下。
00:05:28它让你能够接入并调用市面上的任何大语言模型。
00:05:34它以一种模型无关的方式,提供了
00:05:37构建 Agent 运行环所需的框架和脚手架,
00:05:40并在整个过程中为 Agent 赋予非常强大的工具调用能力。
00:05:43而第三层则是真正的 AI 层,也就是接入我们想要使用的任何模型。
00:05:51这也是我们最初在走这条路时需要做出的抉择,
00:05:56我们想要搞清楚究竟什么才是最适合特定场景的模型。
00:06:00而我们得出的结论是,并没有一个单一的模型
00:06:04能完美适用于所有的场景。
00:06:06因此,我们希望以一种模型无关的方式来构建它,以便我们可以随时插拔
00:06:10并在新模型发布时,针对不同的场景即插即用最合适的模型。
00:06:14这样无需对底层的脚手架做出巨大的改动就能直接接入新模型。
00:06:20为此我们选择了 AI Gateway,
00:06:23稍后我会对此展开更详细的介绍。
00:06:25接着,正如大家在底部看到的,我们还有一些后台服务
00:06:30来支撑整个基础设施的运转。
00:06:35现在让我们更深入地了解一下 AI Gateway。
00:06:38你可以在左侧看到一段伪代码脚本,展示了这看起来大概是什么样的,
00:06:43但基本上你只需要一行代码说:
00:06:46“我要接入这个网关。”
00:06:49一旦你完成了这一步,你就可以通过这个网关
00:06:51随心所欲地使用任何你想要的模型了。
00:06:55在很多情况下,我们会使用 Claude Opus,但在另外一些情况下,我们也会在不同的场景中使用 Sonnet、GPT 或是 Groq。
00:07:00[无声]
00:07:04这就是 AI Gateway 的强大之处之一:你可以使用任何你想要的模型,不会被锁定,从而获得极大的灵活性。
00:07:08你就可以使用任何你想用的模型,不会被锁定,
00:07:10从而能够拥有这种灵活性。
00:07:12而这让我们可以实现一些非常直观的、
00:07:18基于问题复杂度和类型的路由机制。
00:07:22因此我们在这里加入了一个分类器,以便判断
00:07:27用户提出的问题有多复杂?
00:07:29他们只是在对一句“你好”寻求简单的回复,
00:07:32还是在提出更复杂的要求,比如试图为用户
00:07:37构建一个完整的流程?
00:07:38根据这些,我们可能会将其路由到不同的模型。
00:07:40这使我们能够实现快速响应,
00:07:44根据我们提供的模型来匹配相应的复杂度,
00:07:49并给用户提供恰当的回复。
00:07:50在如今这个时代,关于 Agent 的体验,
00:07:59现在大多数用户通常会有两种不同的期待。
00:08:04一种是向用户进行流式实时响应,
00:08:07这样你就能实时看到正在发生的事情。
00:08:09但同时,如果遇到了一个非常复杂的请求,
00:08:14可能需要几分钟、甚至几十分钟或几小时,那又该怎么办?
00:08:20所以,从产品的角度来看,我们是从流式传输这一侧开始的。
00:08:23这正是 AI SDK 的闪光点,它最初是在流式传输端发力的。
00:08:28在左侧,你可以看到一个示例问卷:
00:08:31“根据会议生成用户故事”。
00:08:33这是我们在构建这个工具时的首批用例之一,
00:08:37即获取所有上下文并为开发人员提供用户故事。
00:08:41但当我们开始接触更复杂的业务需求时,比如在 Salesforce 中
00:08:45搭建起一个完整的 B2B 店面,或者设计一个带有自定义页面的 Experience Cloud 站点,
00:08:51这些任务花费的时间,可比流式传输到浏览器所需的几分钟要长得多。
00:08:56因此,随着我们在 Vercel 平台上的技术走向成熟,
00:08:59我们开始让用户在 UI 中拥有单一的体验,
00:09:05但同时能够根据复杂度,
00:09:09既进行流式传输,又启动后台进程。
00:09:11而这些在 Vercel 基础设施内部都是支持的,
00:09:14这不仅依赖于平台本身,也使用了一些
00:09:19关于沙箱以及其他我稍后会谈到的功能。
00:09:24所以从工具的角度来看,我认为使用 AI SDK
00:09:28这类工具的超能力之一,在于你拥有了一个可以随时接入的框架。
00:09:34我们一开始只有几个工具,然后随着时间的推移,
00:09:39在这些类别中构建了越来越多的工具,这让我们真正拥有了
00:09:44与用户以及 Salesforce 环境进行交互的抓手。
00:09:48如你所见,我们拥有文档生成、搜索、
00:09:52故事生成、集成,以及最核心的这个 Salesforce 功能,
00:09:57它允许我们去理解环境、验证环境、查询环境,
00:10:01并在这些环境中进行部署。
00:10:05这真正赋予了这个 Agent 生命,而不仅仅是直接对接一个 LLM。
00:10:10那么,让 Agent “拥有双手”
00:10:16具体又是如何运作的呢?
00:10:18其实,在 Vercel 生态系统中,
00:10:22他们最近一直在推出的一项较新的功能就是这个沙箱。
00:10:27如果你熟悉 Salesforce,
00:10:30并思考过如何与 Salesforce 交互,那么在很多时候,开发人员
00:10:34以及技术团队,都会使用 Salesforce 的 CLI。
00:10:39这使他们能够在终端级别与 Salesforce 交互,
00:10:43启动沙箱、启动 B2B 商业店面以及进行部署。
00:10:49这使得与 Salesforce 的交互变得非常容易。
00:10:51但这在转瞬即逝的浏览器中是很难实现的,对吧?
00:10:55你登录了任何站点,每次都必须重新登录,
00:10:59这让与 Salesforce 的交互变得非常困难。
00:11:01因此,我们开始利用 Vercel 沙箱的这项功能,
00:11:06我们允许用户对他们的环境进行身份验证。
00:11:10启动一个沙箱,使我们能够实际与文件系统进行交互,
00:11:16并允许我们把正在编写的代码,或者想要处理的文件,
00:11:20实际部署到该沙箱中,然后使用 Salesforce CLI
00:11:26在这个沙箱中将这些文件推送到 Salesforce 里。
00:11:30这可能是一个特定于 Salesforce 生态系统的用例,
00:11:35因为他们有 Scratch Org(暂存组织)和沙箱的概念,
00:11:40但我认为,随着我们越来越多地深入到 Agent 生态系统的编码端,
00:11:43沙箱这一概念是绝对至关重要的,
00:11:49因为它需要,或者说它为我们提供了
00:11:55传统上构建 Agent 和 LLM 所依赖的文件结构。
00:11:58所以我认为,在涉及你能实际做些什么的时候,
00:12:01它赋予了你很大的灵活性。
00:12:06最后,总结一下我们一直在构建的几大支柱,
00:12:10v0 对我们的团队来说一直是一项巨大的助力,对吧?
00:12:17我们实际上在两个不同的层面上使用它。
00:12:18我们从产品的角度使用它,来构建我们的产品 Saltbox One。
00:12:23我们还在服务侧使用它,用来构建 Salesforce。
00:12:27所以,我们实际做的是将这两者结合起来。
00:12:31当你在 S1 中,并且拥有你正在尝试做的事情的上下文,
00:12:35拥有所有的 Salesforce 信息,拥有实际去收集
00:12:41所有关于你 Salesforce 组织信息的能力时,我们与 v0 进行了紧密的集成,
00:12:45你可以把这些信息作为上下文传递给 v0。
00:12:51这让 v0 能够切实地帮助你生成代码。
00:12:54所以它不仅仅适用于 React,在给定正确的上下文和
00:12:58相关信息的情况下,它也可以做像 Apex、LWC 和 Flow 这样的事情。
00:13:01我们将它们紧密结合在一起,
00:13:05并创造出了一种非常棒的无缝集成体验。
00:13:09如果我们需要停顿一下并思考,我们会给其他团队什么建议?
00:13:14以下是我的四点心得。
00:13:17第一是使用网关,别再为使用哪些模型争论了,
00:13:21开始在合适的场合、为合适的工具选择合适的模型。
00:13:25这会带给你极大的灵活性和能力。
00:13:28第二是流式传输只是个开始。
00:13:31这是很多应用开始的地方,那些在 Agent 世界中
00:13:35更偏向初创阶段的应用。
00:13:38但实际上,你同样需要这种持久的后台运行能力。
00:13:42这就是你前进方向的上限所在。
00:13:45第三就是我刚才谈到的沙箱。
00:13:48让它落地,赋予你的 Agent 命令行界面(CLI)访问权限,
00:13:52这真的能给你带来很多超能力。
00:13:55最后一个是:找到合适的平台。
00:13:57所以对我们来说,那就是在 Vercel 上进行构建,
00:14:01这让我们无需专注于基础设施。
00:14:04而是让我们可以专注于我们试图在 Saltbox One
00:14:07大规模推出的功能和能力。
00:14:12那么,接下来我将直接进入演示部分,
00:14:19体验一下对话式的 Salesforce 使用流程。
00:14:24稍微聊一下用户故事的生成,
00:14:26并看看智能体运行时的实际效果。
00:14:29所以,在我切换屏幕时,请稍等片刻。
00:14:34好的,太棒了。
00:14:38现在进入 Saltbox One,这是我们的一个演示组织。
00:14:44你可以看到,左侧呈现的是
00:14:48我们所谓的“项目”,这些项目为我们提供了不同的上下文。
00:14:51而在中间,则是我们全新的对话面板。
00:14:56所以我们可以把焦点放在这里。
00:14:58向下滚动时,我们可以看到所有不同的项目。
00:15:01这使我们能够将正确的上下文加载到对话中。
00:15:05我们在底部整齐排列着工具,
00:15:08这也是我们所有集成传入的地方。
00:15:12然后在更下方,我们实际上有能力添加上下文。
00:15:16我们可以在这里直接拖入会议记录、用户故事、工件、
00:15:20Salesforce 组织,或者是该 Salesforce 组织中的特定内容。
00:15:23这让我们可以进行非常丰富的对话。
00:15:27所以,我打算先从一个比较复杂的例子开始。
00:15:33然后在其运行期间,我们会切换到一些
00:15:37我提前运行好的内容,以便我们可以进行讲解。
00:15:40在这个例子中,我们想在 Salesforce 中创建一个屏幕流,
00:15:45允许我们输入案例评论,并希望它能提供一个确认屏幕。
00:15:51虽然这不是一个超级复杂的需求,但确实需要你了解工作流,
00:15:56知道如何配置,知道如何实现,
00:15:58并且知道如何去调试它。
00:16:00所以,在去讨论其他对话的同时,我们要让智能体开始处理这个任务。
00:16:03在跳转之前,你可以看到它正在检索一些上下文文件。
00:16:06这就是 Saltbox One 的一些独门秘诀,因为我们拥有
00:16:09大量关于 Salesforce 的信息、操作方法,
00:16:13以及使其真正正确运行的剧本。
00:16:16你甚至能看到它非常快速地反馈说:
00:16:19“嗨,好消息,我检查了您的实例。”
00:16:23“目前在案例评论上没有任何自动化,因此我们可以继续。”
00:16:25接着它会问我几个跟进的问题。
00:16:29我会说:“是的,你可以使用默认组织。”
00:16:32然后让它继续,它就会开始制定一个计划。
00:16:37不过在它处理的时候,我其实想跳转到
00:16:41另一个不同的对话里。
00:16:44这其实是我们的项目中最常被客户使用的
00:16:47功能之一,那就是引入会议记录的能力。
00:16:52在这个例子中,我有一个名为 Halston 的演示品牌。
00:16:56我录制了一次会议,期间我们讨论了一些关于
00:17:00构建 Salesforce 能力的新需求。
00:17:03我正向它询问一些关于我们组织的情况,我希望它基于现有的内容,
00:17:07并基于 Salesforce 开箱即用的
00:17:11功能来做分析。
00:17:16表面上看这是一个挺直接的需求,
00:17:18但如果你仔细想想,它其实相当复杂,因为它要求
00:17:21了解你环境的细节,并且你必须知道什么是开箱即用的,
00:17:26什么又是定制的,才能做出正确的决定。
00:17:30因此,在这个例子中,我们提出了这个问题,你可以看到它反馈道:
00:17:33“以下是该讨论中整理出的会议需求。”
00:17:37“这是您目前拥有的内容。”
00:17:41“这是您的数据模型”,并提供了一个漂亮的 Mermaid 图表供我们查看并
00:17:43确认这就是当前的现状。
00:17:46然后,它实际上开始给出建议。
00:17:48比如“S1 会如何处理”,会将其拆分为这些阶段。
00:17:52它会从第一阶段的数据模型开始,存储可见性订阅,
00:17:57然后给你一些建议和一些关键问题。
00:18:02而且我能够与它进行来回沟通。
00:18:06所以,我给出了诸如“这些问题的答案在这里”的回复。
00:18:07最终,它为我提供了一份非常漂亮的文档,将
00:18:12需求拆分到了这些阶段中,细节非常丰富。
00:18:16我可以把这个直接转化为代码。
00:18:19也可以把它转化为用户故事或任何其他需求。
00:18:22所以,这正是 Saltbox One 的超级大招之一,因为我们是
00:18:27从服务提供商的角度来构建这个系统的。
00:18:31因此我们知道如何实施 Salesforce。
00:18:33我们知道最佳实践。
00:18:35我们知道如何去推进。
00:18:37而所有这些都已经融入到了我们赋予
00:18:38Saltbox One 的智能体上下文中。
00:18:43现在,当我们跳回到最初的对话时,
00:18:44我们可以看到,我们对默认组织说了“是”。
00:18:49它已经梳理了刚才提到的所有上下文,
00:18:52找出了最合适的方法。
00:18:55我们可以看到它已经创建了一张精美的小卡片供我们审查。
00:18:57现在,这张卡片就是我们控制智能体行为的方式。
00:19:02也就是,你想让智能体去制定这个计划,
00:19:07但不希望它自己去运行。
00:19:11我们仍然需要把“人”保留在反馈环路中。
00:19:13因此,我们制作了这个组件,你可以清楚地看到
00:19:15它将要部署什么,以及如何进行部署。
00:19:19而你所需要做的,就是直接点击“批准并执行”。
00:19:22当然,因为我是在做演示,所以它可能无法正常部署。
00:19:25但实际上你可以直接进行部署。
00:19:29在与智能体进行来回沟通并
00:19:33解决问题之后,你可以点击“重试”。
00:19:37如果它已经部署了,如果你不喜欢这个版本,
00:19:38你实际上还可以回滚到之前的版本。
00:19:43在进行最后一个实时演示之前,
00:19:44我还要在屏幕上展示最后一个用例,
00:19:50就是快速审查你组织的架构。
00:19:55这是我们经常被问到的一个非常普遍的问题,即:
00:20:00“帮我们理解一下架构,或者帮我们理解一下其中的技术债。”
00:20:03“我们该如何准备在 Salesforce 环境中
00:20:04走上这种智能体的道路?”
00:20:09这些看似都是很简单的问题,但实际上也是非常有深度的问题。
00:20:10所以,你可以提出这样的问题,
00:20:15让它梳理你的许可环境、关键发现,
00:20:18并绘制出跨机会的对象模型。
00:20:22而且,我们在回复中始终会做的一件事,
00:20:27就是开始标记出你可能需要审查的内容。
00:20:30在这个例子中,我们有类似
00:20:34跨所有对象的未记录字段等文档。
00:20:38看起来我们有很多自定义字段,也有关于如何处理的建议,
00:20:40以及我们实际可以深入的下一步行动。
00:20:45既然如此,我可以继续说:“我想执行那个操作。”
00:20:48它就会开始把焦点具体缩小在
00:20:53B2B 商业流程上,以及所有事物之间是如何开始交互的。
00:20:57它会对这些环境进行查询,
00:21:02看看周围的所有生态系统,
00:21:05然后整理出一种综合的响应,
00:21:07你可以继续进行对话。
00:21:10现在,在这个智能体运行的时候,
00:21:12我会展示最后一个例子,再来一个用例。
00:21:16如果跳回到一个新的对话,我可以直接
00:21:21拖入一个 Confluence 页面,它其实是
00:21:27我们之前某次对话的产出。
00:21:32这上面有关于该解决方案具体细节的完整长文。
00:21:35我可以快速地下达指令,比如“我想为
00:21:39这份文档中的第一阶段创建用户故事”。
00:21:43再次强调,这里的特别之处在于,它不仅整合了
00:21:46这份文档的上下文,还整合了你的项目、你的 Salesforce 环境、
00:21:50我们的最佳实践、Salesforce 生态系统,
00:21:55并决定将这个第一阶段拆分为
00:21:59易于管理的用户故事的最佳方式是什么,写下初始声明,
00:22:03例如“作为用户,我希望能够...”,
00:22:08并列出几点具体的验收标准。
00:22:14这为你编写这些用户故事提供了一个非常好的起点。
00:22:18一旦这些用户故事生成,你就可以进入
00:22:22更深层次的细节,如果需要,可以
00:22:24与智能体进行往复沟通来进一步完善。
00:22:28现在那个任务正在运行,
00:22:32我跳回到之前刚刚完成审计的对话中。
00:22:36我们进行了一些查询,整理出了 B2B 审计流程。
00:22:40你可以看到,我们整理出了一个相当不错的评估,
00:22:45以及关于技术债是什么、
00:22:48或者我们应该优先处理什么的建议。
00:22:51所以,你可以开始看到所有这些是如何串联在一起的。
00:22:55当我跳回到我的示例时,
00:23:00似乎我的屏幕冻结了,请稍等一下。
00:23:11来了。
00:23:14在最后一个例子中,我们整理出了这些用户故事。
00:23:18你可以看到这些用户故事显示在左侧,
00:23:22而详细信息显示在右侧。
00:23:24这使我们能够将其集成到 Asana 或 Jira 中,
00:23:27并支持整个开发生命周期的流畅运作。
00:23:32以上就是 Saltbox One、我们如何使用 Vercel 生态系统、
00:23:39如何使用沙箱功能、网关功能
00:23:44以及 v0 来构建这样一个应用,
00:23:49并真正专注于为客户提供特性和功能的简要概述。
00:23:53而不需要过多关注背后的基础设施。
00:23:56那么,Jacob,有什么问题需要我们探讨吗?
00:24:02>> 是的,是的,感谢你带来这么酷的演示。
00:24:06我这里有几个问题。
00:24:08首先,我很好奇智能体的权限是如何运作的。
00:24:12S1 是有自己的权限(比如当你设置应用时,
00:24:16它会获得对 Salesforce、Confluence 等的一定访问权限)?
00:24:20还是基于提问的人的权限?
00:24:23因为一旦你接入了所有这些企业级
00:24:26SSO 集成,这确实是一件挺棘手的事情。
00:24:29所以我很好奇你们在这个问题上做出了什么决定。
00:24:32>> 是的,在思考同一个问题时,我们实际上来回讨论了很久,
00:24:36最终我们决定采用基于用户的权限。
00:24:40所以当用户进来时,他们有能力以自己的用户身份进行认证。
00:24:45因此,他们在 Salesforce 或任何其他应用中执行的任何操作
00:24:50都代表他们特定的用户,使用他们的 OAuth
00:24:53或 API 密钥,这取决于我们所支持的平台。
00:24:57这让我们能够控制“是您的用户执行了该操作”。
00:25:03但在某些平台上,比如 Salesforce,
00:25:06我们实际上还有另外一层保护,
00:25:09那就是每次连接 Salesforce 实例时,
00:25:12它最初都是只读连接。
00:25:15然后,你可以将其切换为写入权限。
00:25:19一旦切换,对于在 Salesforce 环境中
00:25:23进行的任何更改,您都将始终看到那个批准屏幕。
00:25:26>> 好的,所以在 Salesforce 端,为了可审计性,
00:25:31用户执行的任何操作都需要他们点击。
00:25:37也就是说,当你有一个写入操作时,它会弹出批准提示。
00:25:39用户必须明确点击“接受并继续”才能让智能体执行。
00:25:44>> 没错。
00:25:44>> 在 Salesforce 上,这会显示为是由该用户完成的。
00:25:49>> 没错。
00:25:50>> 好的,太完美了,太完美了。
00:25:51我还很好奇,智能体本身是如何使用沙箱的?
00:25:57比如,你们是否有某些工具调用,
00:26:02在内部隐式地调用沙箱作为其实现的细节?
00:26:06还是说智能体拥有沙箱工具,并且它知道
00:26:11有些事情必须在沙箱中完成,那也是它运行 CLI 或 API 的地方等等。
00:26:16我很想知道你们是如何设置的。
00:26:19>> 是的,我们实际上有两个主要工具使用了官方的
00:26:25Vercel 沙箱,稍后我也会谈到一个独立的沙箱。
00:26:28第一个官方工具是,当你启动 scratch 组织时,
00:26:33我们总是会启动一个 Vercel 沙箱,并使用 SF CLI 来创建该 scratch 组织。
00:26:37第二个用例是,当你与 Salesforce 进行交互,
00:26:43以便在环境中进行验证或部署新内容时。
00:26:48这总是通过带有 Salesforce CLI 的 Vercel 沙箱来完成。
00:26:51在我们看来,这是最简单的方法来做部署
00:26:54和进行其他活动,也就是使用 CLI,而 Vercel 沙箱让我们可以非常轻松地
00:26:58安装它并继续使用现有的沙箱。
00:27:04所以我们有这两个使用官方 Vercel 沙箱的工具,然后我们实际上
00:27:08还有一个更小的内存中沙箱,每次对话都有,
00:27:14随着他们在智能体上的每一次轮次,我们用它来把所有文件整合在一起,
00:27:20并让智能体能够去理解那个内存沙箱中有什么。
00:27:25所以算是两种不同的版本。
00:27:26>> 好的,你们有对沙箱进行任何形式的
00:27:32网络限制,以限制它可以访问的内容吗?
00:27:36那上面的安全配置文件看起来是什么样的?
00:27:40>> 在 Vercel 沙箱那一边吗?
00:27:42>> 是的,是的。
00:27:43>> 是的,Vercel 沙箱,我是说,它们启动时非常干净。
00:27:47所以我们会加载我们需要的文件,并允许它只访问这些内容。
00:27:52所以它绝不像我们的代码库,它就像是 S1 会去
00:27:56实际提取任何它已经整理好的、基本上是计划好的内容。
00:28:02就拿我展示的流(flow)为例,它会提取这些文件。
00:28:05它会创建 Salesforce 在进行部署时
00:28:10所预期的目录,并将这些文件放入该目录中。
00:28:13然后它会从那里开始部署。
00:28:14所以实际上,它拥有的东西非常有限,只有我们在合适的时间给它的东西。
00:28:20>> 我们的 YouTube 上收到一个问题,定价模式是怎么设置的?
00:28:25你们如何处理定价?
00:28:28是基于使用量、基于席位,还是像 Soapbox 那样?
00:28:32>> 是的,这是一个很好的问题。
00:28:33我们目前仍在敲定这个方案,因为我们正在向客户
00:28:38推广这个产品,并试图找出正确的方法。
00:28:41我们目前是采用基于用户或基于用户席位的定价
00:28:48并在该层级内对你可以进行的对话数量、
00:28:53多少数据、以及多少次交互进行限制。
00:28:55这就是我们目前的起点。
00:28:59但正如大家在这个生态系统中所经历的那样,
00:29:02在涉及基于 Token 的工具时,事情变化得非常频繁且迅速。
00:29:07所以这就是我们的起点,也就是基于用户席位的门槛。
00:29:11>> 是的,是的,我认为很难找到一个完美的模式,既能随着
00:29:16你的使用量和客户一起扩展,又能兼顾你自己的成本支出。
00:29:20所以确实有些难度。
00:29:23让我们看看,这里还有另一个问题。
00:29:24你们如何决定将哪些问题路由到各个模型?
00:29:29所以有些特定的任务你们会路由到 Opus。
00:29:31也有些特定的任务你们会路由到 Sonnet。
00:29:33你们如何决定这些路由?
00:29:35你们是使用像评估(eval)系统这样的数据来支持,还是通过手动测试
00:29:41并发现,嘿,Sonnet 已经足够应付这些类型了?
00:29:45你们的方法是什么?
00:29:46>> 是的,这个问题的答案一直在演变。
00:29:52我们目前的情况是,在初始问题上有一个确定性的分类器
00:29:57它能帮助我们根据用户的提问,来理解这个问题有多复杂。
00:30:03他们会说像 "计划" 这样的词吗?
00:30:04他们会说像 "调查" 这样的词吗?
00:30:07所以使用这种方法,因为它们快速而且免费,对吧?
00:30:12你能够非常快速地捕捉到这些。
00:30:15所以我们是从基于正则表达式或确定性的方法开始的。
00:30:20如果我们没有在那里找到匹配项,那么我们就会转向大模型分类器,我们会说,
00:30:27好的,根据这里面的内容,如果字数超过了某个阈值等等,
00:30:32我们就把它传给大模型来实际分类它有多复杂。
00:30:38那个模型非常快,大约需要 300 毫秒来进行这种分类。
00:30:42然后它会帮助我们把它路由到正确的模型,无论是 Opus、Sonnet 还是其他的。
00:30:47然后我们也有一个后备方案。
00:30:49如果事情变得太复杂,而用户,你知道的,再次提出了相同的问题,
00:30:54或者我们还有其他规则,那么它就会退回到我们最强大的模型
00:30:59并设定一个分钟级的阈值,以便用户在提问时能得到正确的回复。
00:31:06>> 好的。那你们目前在路由模型中,是用 Haiku 来做那个分类器吗?
00:31:11>> 是的,对于最开始的那个,是的。
00:31:13>> 酷,酷。
00:31:15好的。那么,你也是 v0 大使计划的成员。
00:31:20这给你带来了什么帮助?你会推荐它吗?
00:31:23在构建这个产品的过程中,到目前为止你有没有从这个计划中获得价值?
00:31:28>> 是的,绝对有。
00:31:30如果有任何听众有兴趣更贴近社区,我高度推荐它。
00:31:36我已经为不同地区的人们举办了几次活动了。
00:31:41我大约在几个月前,或者可能是一个月前去墨西哥做了一次现场活动,
00:31:48在现场和那里的一大群人一起体验了 v0。
00:31:51就我个人而言,我从 v0 大使计划中获益良多,
00:31:56因为我可以直接接触到产品团队的成员,
00:31:59同时也能接触到其他在这一领域和我一样专注的人。
00:32:03所以像这样互相碰撞想法,真的非常有价值。
00:32:08>> 酷。既然你可以直接接触到产品人员,
00:32:13我相信你发了很多反馈过去。
00:32:16有什么反馈是你想在这里公开向他们提问的吗,
00:32:22好让他们当场感受一下压力?
00:32:25>> 我还是客气一点吧。我认为最大的一个问题,我们之前也讨论过,
00:32:30就是给 v0 引入更多的功能,
00:32:34特别是那些开发者在本地 IDE 环境中已经习惯的功能。
00:32:41在过去的几个月里,我们已经在 v0 内部获得了沙箱功能,
00:32:45并且有能力去启动它并拥有一个真实的运行环境,
00:32:49这是迈向正确方向的巨大一步。
00:32:51我认为随着我们继续沿着这条路走下去,它会继续变得更好。
00:32:55所以,我的建议就是继续沿着这条路走下去。
00:33:00>> 棒极了。是的,这是一个长期持续的过程。
00:33:02它以前是一个非常、非常简陋的浏览器集成开发环境(IDE),
00:33:06而现在它已经像是一个完整的 VS Code 和 Monaco 的集成了。
00:33:10它每个月都在变得越来越好。
00:33:14>> 没错。
00:33:15>> 好的。我想我们这里的问题就这些了。
00:33:18所以,我想非常感谢你过来做这么精彩的演示。
00:33:24如果人们想要跟进或了解更多关于 stopbox 的信息,可以在哪里找到你?
00:33:32>> 我在 LinkedIn 上最活跃。
00:33:34所以,如果你想和我建立联系,可以在那里发条消息。
00:33:37告诉我你看了这次分享。
00:33:39我就会知道你是谁,也很高兴能与你联系并回答任何问题。
00:33:44>> 棒极了。是的,我们会在聊天栏里留下你的 LinkedIn 链接。
00:33:48所以,总之,非常感谢你的到来。
00:33:52>> 好的,非常感谢。
00:33:55>> 好的。也谢谢其他所有人的参与。
00:33:59我们很快就会在... 举办另一场社区活动。
00:34:05让我查看一下日历。
00:34:10我本来应该提前看好这个的。
00:34:15噢,它将在周四举行,但实际上还没有添加到我们的日历中。
00:34:20所以,是的,过两天再来看看吧。
00:34:22我们还有另一场活动要举行。
00:34:24在那之前,我们在社区里再见。
00:34:27祝大家今天过得愉快。