[ { "speaker": "Narrator", "text": "智能。" }, { "speaker": "Narrator", "text": "他们称其为智能。" }, { "speaker": "Narrator", "text": "但若它不能行动,那它做什么?" }, { "speaker": "Narrator", "text": "它等待我们。" }, { "speaker": "Narrator", "text": "所以我们推动它。" }, { "speaker": "Narrator", "text": "所以它不需要我们。" }, { "speaker": "Narrator", "text": "我们赋予它技能、工具和记忆的马具。" }, { "speaker": "Narrator", "text": "记忆给予它上下文。" }, { "speaker": "Narrator", "text": "上下文变成计划。" }, { "speaker": "Narrator", "text": "所以它行动。" }, { "speaker": "Narrator", "text": "但行动还不够。" }, { "speaker": "Narrator", "text": "它必须学习。" }, { "speaker": "Narrator", "text": "所以我们观察它,衡量它,个性化它并改进它。" }, { "speaker": "Narrator", "text": "再次改进它。" }, { "speaker": "Narrator", "text": "测试评估,部署,修复,更快,更大压力。" }, { "speaker": "Narrator", "text": "测试评估,部署,修复。" }, { "speaker": "Narrator", "text": "完美。" }, { "speaker": "Narrator", "text": "它在工作。" }, { "speaker": "Narrator", "text": "而不仅仅是智能。" }, { "speaker": "Narrator", "text": "而是一个谎言。" }, { "speaker": "Narrator", "text": "请欢迎 Harrison 登台,LangChain 的联合创始人兼 CEO。" }, { "speaker": "Harrison", "text": "好的,我们开始吧。" }, { "speaker": "Harrison", "text": "我原本不知道会录视频,所以虽然如此,但还是很棒。" }, { "speaker": "Harrison", "text": "很棒。" }, { "speaker": "Harrison", "text": "我们很兴奋能在这里。" }, { "speaker": "Harrison", "text": "这是我们第二次参加,所以我们决定这次举办两天而不是一天。" }, { "speaker": "Harrison", "text": "我们为大家准备了丰富的演讲阵容。" }, { "speaker": "Harrison", "text": "我认为这会非常精彩。" }, { "speaker": "Harrison", "text": "我们有很多内容要分享。" }, { "speaker": "Harrison", "text": "所以我们很激动也很荣幸你们决定和我们一起度过这两天。" }, { "speaker": "Harrison", "text": "去年,我们在 Interrupt 开幕式上讨论了构建代理程序的困难。" }, { "speaker": "Harrison", "text": "原型很容易制作,但要进入生产却很难。" }, { "speaker": "Harrison", "text": "你一路上会遇到很多挑战。" }, { "speaker": "Harrison", "text": "在过去的一年里,我们看到包括今天发言的许多公司在内的多家公司已经找到了克服这些障碍的方法,并将代理程序带入了生产环境。" }, { "speaker": "Harrison", "text": "虽然仍然很难构建代理程序并将其投入生产,但我们已经弄清楚了一些需要实现这一点的东西。" }, { "speaker": "Harrison", "text": "构建代理程序不同于构建软件。" }, { "speaker": "Harrison", "text": "这就是它成为一个新挑战的原因。" }, { "speaker": "Harrison", "text": "这也是为什么你需要新的工具和技能。" }, { "speaker": "Harrison", "text": "我认为思考一下为什么这与构建软件不同是很重要的。" }, { "speaker": "Harrison", "text": "我们认为有两件事使它与众不同。" }, { "speaker": "Harrison", "text": "一个是输入本身。" }, { "speaker": "Harrison", "text": "自然语言可以在维度上无限延伸。" }, { "speaker": "Harrison", "text": "它可以是任意数量的单词,或者现在可以开始是图像、视频甚至音频文件。" }, { "speaker": "Harrison", "text": "因此代理的输入空间非常大。" }, { "speaker": "Harrison", "text": "输出空间也非常大。" }, { "speaker": "Harrison", "text": "LLMs本身是非确定性的,即使它们是确定性的,对提示的小变化仍然非常敏感。" }, { "speaker": "Harrison", "text": "因此当你有一个如此大的输入空间和这样一个不稳健的系统时,最终会得到一个在实际推出之前很难预测其表现的整体代理系统的。" }, { "speaker": "Harrison", "text": "那些已经弄清楚如何可靠地构建代理的团队,他们会尽早发布然后快速迭代。" }, { "speaker": "Harrison", "text": "我们再次看到了从成功将代理投入生产的公司中看到的这种模式。" }, { "speaker": "Harrison", "text": "在进行这种迭代时,通过某种方式,他们已经确定了与人们用来构建和发布的软件开发生命周期并行的新一代代理开发生命周期,但这是不同的,因为代理是不同的。" }, { "speaker": "Harrison", "text": "它们需要更多的迭代,并且每个阶段的步骤略有不同。" }, { "speaker": "Harrison", "text": "因此,无论人们是否称之为这种生命周期,真正掌握它就是当人们建立组织和工具来帮助发布代理时所做的事情。" }, { "speaker": "Harrison", "text": "我们所做的所有事情都可以通过将其描述为符合这个生命周期来进行说明。" }, { "speaker": "Harrison", "text": "我们想弄清楚未来的代理会是什么样子,并构建所有必要的工具使它们成为现实。" }, { "speaker": "Harrison", "text": "因此我们在思考这种生命周期的样子以及如何帮助它。" }, { "speaker": "Harrison", "text": "今天我想谈谈我们如何看待这个生命周期。" }, { "speaker": "Harrison", "text": "我还想谈论一些我们将要推出的东西,使团队能够更快地通过这个生命周期进行迭代。" }, { "speaker": "Harrison", "text": "首先,我想谈谈构建代理的建设过程。" }, { "speaker": "Harrison", "text": "这是我们开始的地方。" }, { "speaker": "Harrison", "text": "所以这就是LangChain了。" }, { "speaker": "Harrison", "text": "它主要是围绕构建这些LLM和代理应用程序。" }, { "speaker": "Harrison", "text": "一个有趣的事实,在ChatGPT推出之前,我们有一个叫Agent的课程。" }, { "speaker": "Harrison", "text": "我记得这件事。" }, { "speaker": "Harrison", "text": "我当时在圣迭戈过感恩节,正犹豫要怎么给它命名。" }, { "speaker": "Harrison", "text": "最后我把它命名为agent-executor而不是agent。" }, { "speaker": "Harrison", "text": "所以你知道的,我们在起名方面并不擅长,这可能是第一个例子。" }, { "speaker": "Harrison", "text": "但那时我们就有这个代理的概念,并且它在LangChain中。" }, { "speaker": "Harrison", "text": "然后大约一年后,我们推出了Langgraph。" }, { "speaker": "Harrison", "text": "随着人们构建的应用程序变得越来越复杂,它们可能一开始是链的形式,但后来变成了更复杂的图。" }, { "speaker": "Harrison", "text": "这就是LangGraph背后的想法。" }, { "speaker": "Harrison", "text": "然后我们推出了LangChain 1.0,并且大约九个月前,我们推出了深度代理。" }, { "speaker": "Harrison", "text": "深度代理是这个概念的进一步发展。" }, { "speaker": "Harrison", "text": "所以我现在想多谈谈深度代理,因为这是我们认为未来的发展方向。" }, { "speaker": "Harrison", "text": "从最初的LangChain中的agent执行器到现在的核心思想来看,其实很简单。" }, { "speaker": "Harrison", "text": "它是一个在循环中运行的LLM调用工具。" }, { "speaker": "Harrison", "text": "这个循环周围可以发生很多事情。" }, { "speaker": "Harrison", "text": "你可以添加许多特定的工具。" }, { "speaker": "Harrison", "text": "但当人们谈论代理时,他们基本上就是指这个概念。" }, { "speaker": "Harrison", "text": "用户请求进来,你调用LLM,LLM决定调用一个工具,然后你就执行那个工具,直到LLM决定完成为止。" }, { "speaker": "Harrison", "text": "这就是代理的核心理念,一直都是这样。" }, { "speaker": "Harrison", "text": "那么什么是深度代理?" }, { "speaker": "Harrison", "text": "深度代理是一个代理框架,并且它基本上增加了更多的电池,包含了一些东西。" }, { "speaker": "Harrison", "text": "它添加了哪些内容?" }, { "speaker": "Harrison", "text": "它增加了一个执行环境。" }, { "speaker": "Harrison", "text": "所以代理框架需要一个运行的地方。" }, { "speaker": "Harrison", "text": "一种非常常见的方法是在沙盒中运行它们。" }, { "speaker": "Harrison", "text": "你可以给它文件系统的访问权限,你也可以给它代码的访问权限,它可以读取文件、写入文件、执行代码。" }, { "speaker": "Harrison", "text": "这就是它的执行环境。" }, { "speaker": "Harrison", "text": "所以当人们谈论代理框架时,他们经常谈到编码代理的一部分就是其执行环境。" }, { "speaker": "Harrison", "text": "Sam boxes是一个极端情况。" }, { "speaker": "Harrison", "text": "你可以编写和执行代码。" }, { "speaker": "Harrison", "text": "而在另一个极端,我们称之为深度代理中的虚拟文件系统。" }, { "speaker": "Harrison", "text": "这基本上是一个我们可以暴露给代理的数据库作为文件系统。" }, { "speaker": "Harrison", "text": "LLMs在读写文件方面非常出色。" }, { "speaker": "Harrison", "text": "所以你可以巧妙地将其引入这种模拟执行环境。" }, { "speaker": "Harrison", "text": "但关键是你要给它一个可以互动的环境。" }, { "speaker": "Harrison", "text": "深度代理和其他代理框架都附带了大量的内置上下文管理。" }, { "speaker": "Harrison", "text": "所以技能和记忆就是这个的例证。" }, { "speaker": "Harrison", "text": "总结是当对话过长时的一种短期记忆,比如在对话变得太长的时候你会进行总结。" }, { "speaker": "Harrison", "text": "上下文卸载,你如何处理非常长的工具调用?" }, { "speaker": "Harrison", "text": "这是内置到代理框架中的逻辑。" }, { "speaker": "Harrison", "text": "提示缓存是另一个例子,在这里你需要确保缓存初始请求的部分以便未来可以更快更便宜地使用。" }, { "speaker": "Harrison", "text": "所以所有这些上下文管理都内置在框架中,并且会自动为你处理。" }, { "speaker": "Harrison", "text": "所以这些代理,这些深度代理,它们是长期目标的代理,但这并不意味着它们完全自主。" }, { "speaker": "Harrison", "text": "你仍然需要人在环中。" }, { "speaker": "Harrison", "text": "因此深度代理附带了非常好的人在环控制。" }, { "speaker": "Harrison", "text": "最后是委派。" }, { "speaker": "Harrison", "text": "代理框架可以用来启动其他代理,无论是规划代理还是用于不同任务的其他子代理。" }, { "speaker": "Harrison", "text": "所以所有这些委派与这些子代理进行通信并使它们向你反馈的所有内容都在代理框架中进行了规定。" }, { "speaker": "Harrison", "text": "因此深度代理包含了所有这些东西。" }, { "speaker": "Harrison", "text": "我们花费大量时间进行研究和应用AI工作,以确保我们的总结方式是最优的,我们的子代理方式也是最优的。" }, { "speaker": "Harrison", "text": "今天,我们要推出的是DeepAgeant 0.6,这是DeepAgeants的新版本。" }, { "speaker": "Harrison", "text": "其中包含三个大的改进,这些改进是基于我们在行业中看到的三种趋势。" }, { "speaker": "Harrison", "text": "我们看到行业中的一个趋势是开源模型的兴起。" }, { "speaker": "Harrison", "text": "DeepSeq V4上周推出,并且在某些任务上的表现与前沿模型相当。" }, { "speaker": "Harrison", "text": "所以开源模型正在变得更好。" }, { "speaker": "Harrison", "text": "另一个现象是成本在上升。" }, { "speaker": "Harrison", "text": "前沿模型的成本一直在不断上涨,而使用量也在不断增加。" }, { "speaker": "Harrison", "text": "所以我们认为越来越多的情况将是更多地使用开源模型。" }, { "speaker": "Harrison", "text": "因此,在 DeepAgent 0.6 中,我们希望使其成为使用开源模型的最佳场所。" }, { "speaker": "Harrison", "text": "所以我们将原生支持 GLM5、DeepSeek 和 Nemotron 模型。" }, { "speaker": "Harrison", "text": "尝试开源模型最简单的方法是通过编码。" }, { "speaker": "Harrison", "text": "因此,我们正在推出 deep agents code 作为使用 DeepAgents 构建编码代理的一个开源示例。" }, { "speaker": "Harrison", "text": "并且我们将使其非常适用于开源模型。" }, { "speaker": "Harrison", "text": "我们看到的另一个现象是执行环境受到了很多关注。" }, { "speaker": "Harrison", "text": "我们已经讨论过这个问题。" }, { "speaker": "Harrison", "text": "我们讨论了虚拟文件系统,这是一种非常简单的方法,可以让代理与它认为是文件系统的交互方式,但实际上只是一个简单的数据库在后台。" }, { "speaker": "Harrison", "text": "而在另一端,则是一个完整的代码沙箱环境,在这里代理可以编写和执行代码、启动一个 web 服务器等等。" }, { "speaker": "Harrison", "text": "这是一个连续体。" }, { "speaker": "Harrison", "text": "但中间是什么呢?" }, { "speaker": "Harrison", "text": "因此在 DeepAgent 0.6 中,我们推出了 CodeInterpreter。" }, { "speaker": "Harrison", "text": "CodeInterpreter 是我们使用 QuickJS 实现的,这是一个 JavaScript 运行时。" }, { "speaker": "Harrison", "text": "它基本上允许代理在一个类似 repel 的环境中编写和执行代码。" }, { "speaker": "Harrison", "text": "这是一部分 JavaScript 语言,你不能做沙箱中可以做的所有事情。" }, { "speaker": "Harrison", "text": "所以你不能运行 Docker 或其他类似的东西,但仍然可以编程地编写和调用工具。" }, { "speaker": "Harrison", "text": "你可以操作数据文件。" }, { "speaker": "Harrison", "text": "你也可以在这里读取和写入文件系统。" }, { "speaker": "Harrison", "text": "所以我们认为这是一个非常有趣的中间地带,部署起来特别轻量级。" }, { "speaker": "Harrison", "text": "这就是它的优势。" }, { "speaker": "Harrison", "text": "你不需要为每个代理启动一个单独的沙盒。" }, { "speaker": "Harrison", "text": "你可以直接部署这个东西,以多租户的方式运行起来非常容易,但你仍然可以从中获得很多编码带来的好处。" }, { "speaker": "Harrison", "text": "我们看到的第三个趋势是,虽然这仍然很难,但构建令人愉悦的用户界面仍然是非常重要的一件事。" }, { "speaker": "Harrison", "text": "用户界面很重要,与代理交互也很重要。" }, { "speaker": "Harrison", "text": "而发生的一件事情就是这些代理变得越来越复杂,它们发出的事件也相应地变得更加复杂。" }, { "speaker": "Harrison", "text": "它们会发出文本、调用工具、图像、推理、子代理等东西,你怎么做?" }, { "speaker": "Harrison", "text": "所以我们希望尽可能让人们对运行代理框架并将其连接到为他们的客户构建的令人愉悦的用户界面变得简单。" }, { "speaker": "Harrison", "text": "因此,在 Deep Agents 0.6 的第三次发布中,我们有更好的支持流式传输。" }, { "speaker": "Harrison", "text": "所以我们有一个全新的流式协议。" }, { "speaker": "Harrison", "text": "我们有四种不同的前端 SDK,适用于不同前端语言。" }, { "speaker": "Harrison", "text": "并且我们与 UI 框架合作,如 Co-PilotKit、Assistant UI 和 Vercel,确保它能够紧密集成。" }, { "speaker": "Harrison", "text": "用户界面是构建代理的一个重要部分,我们希望让这样做变得尽可能简单。" }, { "speaker": "Harrison", "text": "所以如果你还没有试过 Deep Agents,请今天就去尝试一下吧。" }, { "speaker": "Harrison", "text": "这是我们认为未来的发展方向。" }, { "speaker": "Harrison", "text": "我们认为代理框架会变得越来越强大,越来越适合生产环境。" }, { "speaker": "Harrison", "text": "而 Deep Agents 就是我们版本的实现。" }, { "speaker": "Harrison", "text": "接下来我想谈谈测试阶段。" }, { "speaker": "Harrison", "text": "所以你已经构建了你的代理。" }, { "speaker": "Harrison", "text": "你怎么知道它是否真的在起作用?" }, { "speaker": "Harrison", "text": "这就是Langsmith评估发挥作用的地方,这是我们过去两年一直在开发的东西。" }, { "speaker": "Harrison", "text": "你需要构建数据集,比如参考输入和参考输出,或者可能是一些评分标准来衡量它的表现。" }, { "speaker": "Harrison", "text": "你需要定义一些指标。" }, { "speaker": "Harrison", "text": "你怎么知道代理是否通过了?" }, { "speaker": "Harrison", "text": "这可能是正确性的问题。" }, { "speaker": "Harrison", "text": "这可能是幻觉的问题。" }, { "speaker": "Harrison", "text": "但你需要定义一些适用于你应用场景的指标。" }, { "speaker": "Harrison", "text": "然后你可以让你的代理运行在这些数据集上,根据这些指标进行评分,并创建这些实验,你可以使用这些实验来进行hill爬升某些事情。" }, { "speaker": "Harrison", "text": "或者你可以用它们来确保你在做更改时不会退步。" }, { "speaker": "Harrison", "text": "评估是Lang Smith的关键部分,我们今天将围绕这个推出一些东西。" }, { "speaker": "Harrison", "text": "但我稍后会谈到这一点。" }, { "speaker": "Harrison", "text": "所以我要继续部署了。" }, { "speaker": "Harrison", "text": "你已经构建了你的代理。" }, { "speaker": "Harrison", "text": "它在本地运行。" }, { "speaker": "Harrison", "text": "现在你想把它投入生产。" }, { "speaker": "Harrison", "text": "当你这样做时,会遇到很多挑战。" }, { "speaker": "Harrison", "text": "首先,你得从单个用户开始,就是你自己。" }, { "speaker": "Harrison", "text": "现在你在生产环境中为许多人服务。" }, { "speaker": "Harrison", "text": "其次,你需要控制谁可以访问它。" }, { "speaker": "Harrison", "text": "你不能随便让所有人使用。" }, { "speaker": "Harrison", "text": "然后当你本地运行时如果挂掉了,这只是在测试。" }, { "speaker": "Harrison", "text": "你可以从那里恢复过来。" }, { "speaker": "Harrison", "text": "但你需要在大规模运行时持久地运行它。" }, { "speaker": "Harrison", "text": "所以一年前我们推出了Langsmith部署来帮助解决这个问题。" }, { "speaker": "Harrison", "text": "这个里面有很多功能被内置了进来。" }, { "speaker": "Harrison", "text": "我们大约推出了30个不同的API端点来处理流式传输、人工介入、认证,以及其他类似的事情。" }, { "speaker": "Harrison", "text": "它是一个单一的标准部署模式。" }, { "speaker": "Harrison", "text": "今天它已经执行了超过1亿次代理运行,并且被Workday、Cisco、Etsy、Podium和ByteDance等公司信任。" }, { "speaker": "Harrison", "text": "但我们也意识到Langsmith部署并不是将代理引入生产所需的唯一事物。" }, { "speaker": "Harrison", "text": "我们讨论过代理需要一个执行环境,其中一个最好的执行环境是沙箱。" }, { "speaker": "Harrison", "text": "无论代理是否是一个编程代理,读写代码都可以对代理产生重大影响。" }, { "speaker": "Harrison", "text": "它可以以这种方式操作数据。" }, { "speaker": "Harrison", "text": "它可以以这种方式使用命令行界面。" }, { "speaker": "Harrison", "text": "所以我们通常认为许多代理将需要在沙箱中编写和执行代码的能力。" }, { "speaker": "Harrison", "text": "因此今天,我们很高兴宣布Lang Smith沙箱现在一般可用。" }, { "speaker": "Harrison", "text": "嗯。" }, { "speaker": "Harrison", "text": "我们认为这将是未来代理的一个重要部分,所以我们让在不到一秒钟内启动沙盒变得非常容易。" }, { "speaker": "Harrison", "text": "它支持快照和分支。" }, { "speaker": "Harrison", "text": "我们做的一件最酷的事情之一是这个代理的离线代理。" }, { "speaker": "Harrison", "text": "所以如果你想给LLM代理使用需要API密钥的东西,实际上你不想让它看到那个API密钥,因为它可能会被提示注入并泄露出去。" }, { "speaker": "Harrison", "text": "所以我们有一个离线代理,它位于沙盒之外,并且基本上会拦截流量并在其中插入这些内容。" }, { "speaker": "Harrison", "text": "这都是Lang Smith SDK的一部分,它是完全框架无关的。" }, { "speaker": "Harrison", "text": "所以你可以用它来使用深度代理,你也可以不用深度代理来使用它,你可以用来测试代理,你可以用来进行强化学习,你也可以用来运行生产中的代理。" }, { "speaker": "Harrison", "text": "我们非常期待看到人们如何使用它。" }, { "speaker": "Harrison", "text": "我们已经有了一些客户在使用它。" }, { "speaker": "Harrison", "text": "例如,星期一(Monday)就用它来为他们的AI助手侧kick提供支持,并且我们对迄今为止收到的反馈感到非常兴奋。" }, { "speaker": "Harrison", "text": "将代理引入生产中的另一个重要部分是上下文。" }, { "speaker": "Harrison", "text": "仅凭LLM本身,它们什么都不知道,或者它们知道一切。" }, { "speaker": "Harrison", "text": "人类也不是什么都懂。" }, { "speaker": "Harrison", "text": "当我们需要查找东西时,我们会去图书馆。" }, { "speaker": "Harrison", "text": "我们通过阅读书籍来学习东西,而这也是代理所做的事情。" }, { "speaker": "Harrison", "text": "它们就是这样做的,利用上下文。" }, { "speaker": "Harrison", "text": "这些上下文随着LLM的改进而演变。" }, { "speaker": "Harrison", "text": "所以我们在Lang Smith中有一个很长一段时间的提示枢纽,你可以存储反转提示。" }, { "speaker": "Harrison", "text": "而提示词就像是引导代理的东西,但过去几个月和几年前我们看到的是,提供给代理的上下文已经从提示词演进到了像agent.md文件这样的东西,即非常详细的指令,以及这些代理所使用的技能。" }, { "speaker": "Harrison", "text": "很多都是由编码代理标准塑造的。" }, { "speaker": "Harrison", "text": "这两者都是开放的标准,顺便说一句,所以它们是开放基金会的一部分。" }, { "speaker": "Harrison", "text": "因此,随着LLMs所需的上下文从提示词演进到这些agent.md和技能,我们的工具也相应地进行了演变。" }, { "speaker": "Harrison", "text": "今天,我们非常兴奋地推出了Lang Smith Context Hub。" }, { "speaker": "Harrison", "text": "耶!" }, { "speaker": "Harrison", "text": "那么这个Context Hub里有什么呢?" }, { "speaker": "Harrison", "text": "我们认为这将成为一种越来越常见的模式,所以你可以把所有这些东西都存储在Context Hub中,你将获得版本控制、标签和评论功能,然后你可以使用它们。" }, { "speaker": "Harrison", "text": "你可以本地拉取它们,你可以在你的编码CLI中运行它们,在深度代理作为虚拟文件系统的地方我们有一个集成,或者你可以在任何代理框架中使用它们。" }, { "speaker": "Harrison", "text": "我们认为Context Hub是一个关于记忆的初步尝试。" }, { "speaker": "Harrison", "text": "我们认为记忆在未来对代理来说非常重要。" }, { "speaker": "Harrison", "text": "我们认为agents.md和技能可以绝对被视为早期形式的记忆。" }, { "speaker": "Harrison", "text": "它们是开放的标准。" }, { "speaker": "Harrison", "text": "所以这是一个很好的想法,因为我们认为记忆应该是开放的。" }, { "speaker": "Harrison", "text": "我们认为记忆不应该被锁定在LLM、框架或平台上。" }, { "speaker": "Harrison", "text": "虽然我们正在构建Context Hub,但我们希望这种上下文的想法是真正开放的。" }, { "speaker": "Harrison", "text": "因此,我们正在与Redis、Elastic、Mongo和Pinecone等多家公司合作,将这个关于记忆的第一个尝试变成一个开放标准的记忆,为代理提供开放的标准。" }, { "speaker": "Harrison", "text": "所以我们认为一切都应该是开放的。" }, { "speaker": "Harrison", "text": "最后,我们有监控功能。" }, { "speaker": "Harrison", "text": "所以你已经推出了它。" }, { "speaker": "Harrison", "text": "但是你怎么知道代理实际上在做什么?" }, { "speaker": "Harrison", "text": "这样你就可以确保可以看到每个代理的每一步,以及输入和输出是什么。" }, { "speaker": "Harrison", "text": "仪表板,以便你可以随着时间追踪成本和延迟。" }, { "speaker": "Harrison", "text": "在线评估,这样你就可以将LLM作为裁判或代码来运行这些跟踪,获得一些反馈并将其附上或将用户反馈捕获。" }, { "speaker": "Harrison", "text": "所有这些都是Ling Smith可观测性的一部分。" }, { "speaker": "Harrison", "text": "我们在过去两年和几个月里一直在构建很多东西。" }, { "speaker": "Harrison", "text": "我们即将推出几个非常大的项目,但我们稍后再谈。" }, { "speaker": "Harrison", "text": "所以这就是代理开发生命周期,以及它如何使你能够将代理引入生产并维护它们。" }, { "speaker": "Harrison", "text": "而且当你为一个代理做一次时这是可以的。" }, { "speaker": "Harrison", "text": "当你为10个或100个代理这样做时,你就真的需要开始考虑所有这些治理问题了。" }, { "speaker": "Harrison", "text": "你如何在大规模下做到这一点?" }, { "speaker": "Harrison", "text": "你如何以一种成本效益高且安全的方式来做到这一点?" }, { "speaker": "Harrison", "text": "LLMs变得很昂贵。" }, { "speaker": "Harrison", "text": "你怎么知道代理花费了多少,特定用户在代理上花费了多少钱,并且如何避免意外账单?" }, { "speaker": "Harrison", "text": "那么你怎么控制它们可以和不可以看到的内容呢?" }, { "speaker": "Harrison", "text": "今天,我们推出了Langsmith LLM网关进行测试,以帮助解决这些问题。" }, { "speaker": "Harrison", "text": "Woo!" }, { "speaker": "Harrison", "text": "你们不能挑着喜欢的公告鼓掌。" }, { "speaker": "Harrison", "text": "你们必须为所有的内容鼓掌。" }, { "speaker": "Harrison", "text": "它们都很棒。" }, { "speaker": "Harrison", "text": "那么Link Smith LLM Gateway是什么?" }, { "speaker": "Harrison", "text": "所以你有你的代理,它们正在运行。" }, { "speaker": "Harrison", "text": "Link Smith LLM Gateway基本上位于它们和LLM调用之间。" }, { "speaker": "Harrison", "text": "你可以设置支出限制。" }, { "speaker": "Harrison", "text": "你还可以实现完全的支出透明度。" }, { "speaker": "Harrison", "text": "它与许多编码代理进行了集成。" }, { "speaker": "Harrison", "text": "所以你可以使用它。" }, { "speaker": "Harrison", "text": "我们知道编码代理是人们最常用的东西。" }, { "speaker": "Harrison", "text": "这也是很多成本发生的地方。" }, { "speaker": "Harrison", "text": "所以我们确保与许多编码代理进行了集成。" }, { "speaker": "Harrison", "text": "它与LangChain可以帮助你访问的所有LLM提供商都进行了集成,并且所有内容都会自动追溯到LangSmith。" }, { "speaker": "Harrison", "text": "所以这就是完整的代理开发生命周期。" }, { "speaker": "Harrison", "text": "我们正在构建的一切都符合这个模型。" }, { "speaker": "Harrison", "text": "我们也认识到这里有很多东西。" }, { "speaker": "Harrison", "text": "将一个代理带到生产并经历这个生命周期涉及许多不同的部分。" }, { "speaker": "Harrison", "text": "所以我们希望尽可能简化人们将所有这些组件,包括我们的深层代理底层框架深探剂,带到生产环境的过程。" }, { "speaker": "Harrison", "text": "为了实现这一点,今天我们宣布在私有预览中推出管理深层代理。" }, { "speaker": "Harrison", "text": "耶!" }, { "speaker": "Harrison", "text": "所以管理深层代理是一个单一的API,用于与所有这些不同的组件进行交互。" }, { "speaker": "Harrison", "text": "它在后台运行深层代理框架。" }, { "speaker": "Harrison", "text": "它使用Lang Smith部署。" }, { "speaker": "Harrison", "text": "你可以访问的模型包括任何现有的模型。" }, { "speaker": "Harrison", "text": "我们当然与OpenAI和Anthropic集成,但也与开源模型提供商如Fireworks和Base10集成。" }, { "speaker": "Harrison", "text": "所有代理指令和记忆都存储在Context Hub中,因此你可以查看、版本化并跟踪它们的更新。" }, { "speaker": "Harrison", "text": "部署这些代理时,你基本上希望在这里部署代理,然后给它一个沙盒来运行和编写工具。" }, { "speaker": "Harrison", "text": "并且要将它们分开。" }, { "speaker": "Harrison", "text": "这就是我们采用的架构。" }, { "speaker": "Harrison", "text": "我们在后台使用Langsmith沙箱来帮助提供这些沙箱。" }, { "speaker": "Harrison", "text": "MCPs是连接工具的方式。" }, { "speaker": "Harrison", "text": "你可以直接提供MCPs,或者可以使用Arcade或其他提供大量MCP服务器访问权限的合作伙伴来完成此操作。" }, { "speaker": "Harrison", "text": "所有这些都通过我们宣布的新流式协议进行流式传输。" }, { "speaker": "Harrison", "text": "所以你可以无缝地将其与Co-Pilot Kit、Assistant UI和其他框架集成。" }, { "speaker": "Harrison", "text": "结合这一切,LangChain开源和LangSmith共同推动了整个代理开发生命周期。" }, { "speaker": "Harrison", "text": "我们认为踪迹在这个生命周期的中心位置。" }, { "speaker": "Harrison", "text": "所以我们公司花了很多时间思考踪迹,考虑如何构建最佳的围绕它们的体验。" }, { "speaker": "Harrison", "text": "每个人都这样想。" }, { "speaker": "Harrison", "text": "但公司里没有人比我的联合创始人安库什更专注于踪迹了。" }, { "speaker": "Harrison", "text": "因此我们正在推出很多非常酷的东西来围绕这个话题,但在讨论踪迹和他的对踪迹的热爱之前,我想请我的联合创始人安库什·戈拉上台。" }, { "speaker": "Ankush", "text": "大家好。" }, { "speaker": "Ankush", "text": "我是安库什,LangChain 的联合创始人兼 CTO。" }, { "speaker": "Ankush", "text": "正如哈里森提到的,我确实花费了很多时间思考代理踪迹的问题。" }, { "speaker": "Ankush", "text": "这是因为我们真的认为代理踪迹是代理开发生命周期的核心。" }, { "speaker": "Ankush", "text": "每个代理踪迹都捕捉了你的代理在特定时间点的实际行为记录。" }, { "speaker": "Ankush", "text": "然而,代理踪迹或更广泛地说,代理可观测性提出了一个独特数据基础设施问题。" }, { "speaker": "Ankush", "text": "首先,代理踪迹非常嵌套,并且可能包含数千甚至数万的中间步骤。" }, { "speaker": "Ankush", "text": "与代理踪迹相关的载荷是大型且无界的。" }, { "speaker": "Ankush", "text": "这两种代理踪迹的特点直接源于代理运行的时间更长以及大模型上下文窗口大小变得越来越大。" }, { "speaker": "Ankush", "text": "我们正在看到越来越多的代理踪迹被记录下来,这些踪迹以图像和语音等模态形式存在。" }, { "speaker": "Ankush", "text": "语音在诸如客户服务的应用中尤其流行。" }, { "speaker": "Ankush", "text": "最后,为了有效挖掘你的代理踪迹以获得有用见解所需的访问模式或查询模式是独特且复杂的。" }, { "speaker": "Ankush", "text": "不仅代理踪迹编码了更多的信息并且变得越来越复杂,随着代理变得越来越普遍,它们的体积也在增长。" }, { "speaker": "Ankush", "text": "这里有一个图表突显了一个真实 Langsmith 客户每周踪迹体积随时间的变化情况。" }, { "speaker": "Ankush", "text": "如您所见,在测试和开发的早期阶段,每周踪迹体积相对较小。" }, { "speaker": "Ankush", "text": "但当代理进入生产阶段,并且新的代理加入后,我们现在每周看到的跟踪数量已经超过1.5亿。" }, { "speaker": "Ankush", "text": "如前所述,与代理跟踪相关的载荷很大,并且随着时间的推移变得越来越大。" }, { "speaker": "Ankush", "text": "在过去几年里,发送到Langsmith的代理跟踪所关联的P50载荷大小从6千字节增长到了37千字节。" }, { "speaker": "Ankush", "text": "并且P99已经从当时的相当大的364千字节增长到了今天的12兆字节。" }, { "speaker": "Ankush", "text": "又一个数据点。" }, { "speaker": "Ankush", "text": "今年早些时候,我们有一个客户在单一天发送了50太字节的跟踪数据给我们。" }, { "speaker": "Ankush", "text": "那可真是大量的数据。" }, { "speaker": "Ankush", "text": "这个视频展示了Langsmith中现代代理跟踪的实际样子。" }, { "speaker": "Ankush", "text": "如你所见,有很多中间步骤,嵌套得很深。" }, { "speaker": "Ankush", "text": "这个跟踪实际上是来自我们内部市场推广代理的一个深度代理构建的实例。" }, { "speaker": "Ankush", "text": "值得指出的是,这个跟踪实际上编码了810万个标记。" }, { "speaker": "Ankush", "text": "传统数据基础设施并不是为代理可观测性相关的挑战而设计的。" }, { "speaker": "Ankush", "text": "如果你使用了不理想的基础设施来处理代理可观测性的工作负载,你将经历缓慢查询和摄入瓶颈的问题。" }, { "speaker": "Ankush", "text": "你也将在尝试扩展时遇到不断上升的基础架构成本和复杂度问题。" }, { "speaker": "Ankush", "text": "当你在迭代你的代理时,你无法承受与代理跟踪的缓慢且繁琐的交互过程。" }, { "speaker": "Ankush", "text": "因此今天,我们非常激动地推出SmithDB。" }, { "speaker": "Ankush", "text": "SmithDB是我们专门为代理可观测性工作负载打造的数据库。" }, { "speaker": "Ankush", "text": "我们在过去几个月一直在开发SmithDB,并且在生产中看到的结果令人非常兴奋。" }, { "speaker": "Ankush", "text": "请继续关注本视频以了解更多详情。" }, { "speaker": "Narrator", "text": "介绍SmithDB,这款专为代理可观测性打造的数据库。" }, { "speaker": "Narrator", "text": "这是一个追踪,记录了你的代理所做的一切,它的思考、决策和执行过程。" }, { "speaker": "Narrator", "text": "现在想象一下成千上万个这样的追踪,每天都在增长数百万个,因为代理无处不在。" }, { "speaker": "Narrator", "text": "问题是,这些追踪不像传统的日志和指标那样。" }, { "speaker": "Ankush", "text": "那个视频让我相当兴奋,说实话。" }, { "speaker": "Ankush", "text": "无论谁在制作我们的视频,他们做得真是太棒了。" }, { "speaker": "Ankush", "text": "现在让我们更仔细地看看SmithDB究竟是什么以及它是如何架构的。" }, { "speaker": "Ankush", "text": "首先要指出的是,SmithDB是基于对象存储的。" }, { "speaker": "Ankush", "text": "这给了我们一些不错的特点。" }, { "speaker": "Ankush", "text": "首先,对象存储非常便宜,并且可以几乎无限地扩展。" }, { "speaker": "Ankush", "text": "其次,它为我们提供了所谓的计算存储分离。" }, { "speaker": "Ankush", "text": "这使我们能够在不进行任何复杂的重新排列或数据切分的情况下弹性扩展Baxmyth DB的服务。" }, { "speaker": "Ankush", "text": "第三,这给了我们在自托管环境中相对容易设置的架构,特别是在严格的地域性要求下。" }, { "speaker": "Ankush", "text": "现在从高层面来看,Langsmith服务在从我们的集群管理器获取任务后连接到SmithDB。" }, { "speaker": "Ankush", "text": "我们的集群管理器帮助确保负载均匀分布在服务器上,它还维持了一种称为粘性路由的东西。" }, { "speaker": "Ankush", "text": "粘性路由很重要,因为它有助于利用缓存,还能帮助我们有效批量处理数据以供摄入。" }, { "speaker": "Ankush", "text": "所以在摄取过程中,原始跟踪数据会进入我们的摄取服务。" }, { "speaker": "Ankush", "text": "它会被批量处理,并持久存储到对象存储中。" }, { "speaker": "Ankush", "text": "这些文件在基于Postgres的元存储中注册。" }, { "speaker": "Ankush", "text": "在查询时,我们确定哪些文件需要被扫描以进行查询。" }, { "speaker": "Ankush", "text": "我们从对象存储下载它们,然后进行扫描。" }, { "speaker": "Ankush", "text": "我们还大量利用SSD缓存和内存以最小化与对象存储之间的往返次数。" }, { "speaker": "Ankush", "text": "最后,我们有一个压缩服务,帮助我们优化文件以进行更高效的查询。" }, { "speaker": "Ankush", "text": "SmithDB 特别设计用于代理可观测性访问模式。" }, { "speaker": "Ankush", "text": "我们将在接下来的几页幻灯片中浏览一下这些访问模式。" }, { "speaker": "Ankush", "text": "SmithDB使得点击进入单个跟踪和个别中间步骤变得非常迅速高效。" }, { "speaker": "Ankush", "text": "代理可观测性不仅仅关于询问数百万条跟踪中发生了什么。" }, { "speaker": "Ankush", "text": "这也关于询问在这个特定代理执行中发生了什么。" }, { "speaker": "Ankush", "text": "这就是为什么随机访问非常重要,这也是我们在SmithDB中优化的一个方面。" }, { "speaker": "Ankush", "text": "代理追踪可以包含兆字节的文本数据。" }, { "speaker": "Ankush", "text": "很多时候,你需要使用关键词或短语来搜索你的代理跟踪记录。" }, { "speaker": "Ankush", "text": "如你所见,SmithDB 让全文搜索变得非常迅速且互动性很强。" }, { "speaker": "Ankush", "text": "为了实现这一点,我们实际上构建了一个专门为对象存储设计的自定义倒排索引布局。" }, { "speaker": "Ankush", "text": "并且你经常需要选择一个特定的时间范围,并对元数据、标签、名称、延迟和其他属性应用过滤器。" }, { "speaker": "Ankush", "text": "扫描和过滤速度是我们高度优化在SmithDB中的内容。" }, { "speaker": "Ankush", "text": "你可以看到,结果几乎是即时的。" }, { "speaker": "Ankush", "text": "我们对SmithDB带给Langsmith在这关键代理和可观测性工作负载上的表现感到非常满意。" }, { "speaker": "Ankush", "text": "与之前相比,这些Lang Smith工作负载现在比以前快6到15倍。" }, { "speaker": "Ankush", "text": "但请看,不要只听我们的说法。" }, { "speaker": "Ankush", "text": "我们非常幸运能与Clay和Vanta这样的客户合作,他们是SmithDB的早期采用者。" }, { "speaker": "Ankush", "text": "在Langsmith上。" }, { "speaker": "Ankush", "text": "正如你所见,来自Clay的Jeff和来自Banta的Andy都表示,SmithDB彻底改变了他们在Langsmith中的跟踪体验。" }, { "speaker": "Ankush", "text": "所以SmithDB是专门为代理可观测性设计的,并且我们使用现代技术栈构建了它。" }, { "speaker": "Ankush", "text": "整个系统用Rust编写,我们使用了两个很棒的开源项目。" }, { "speaker": "Ankush", "text": "一个是叫做PEP的。" }, { "speaker": "Ankush", "text": "patchy数据融合,这是一个可扩展、基于Rust的查询引擎。" }, { "speaker": "Ankush", "text": "第二个是Vortex,这是一种可扩展的文件格式,它允许我们选择自定义编码和针对不同列的自定义分块策略。" }, { "speaker": "Ankush", "text": "在此基础上,我们在索引方面进行了大量定制化工作,特别是全文搜索。" }, { "speaker": "Ankush", "text": "我们添加了自定义查询计划和执行计划。" }, { "speaker": "Ankush", "text": "我们也为存储在SmithDB中的所有数据投资了自定义的存储布局。" }, { "speaker": "Ankush", "text": "这是我们构建SmithDB时必须解决的一些技术挑战。" }, { "speaker": "Ankush", "text": "这只是其中的一部分。" }, { "speaker": "Ankush", "text": "它们很多,但我尽量选择了一些。" }, { "speaker": "Ankush", "text": "所以在代理可观测性的工作负载中,你的跨度是分布式的。" }, { "speaker": "Ankush", "text": "它们有不同的部分。" }, { "speaker": "Ankush", "text": "这是因为代理运行在长时间范围内。" }, { "speaker": "Ankush", "text": "所以在查询时间和压缩时间找到并合并这些分散的事件是一项技术挑战,我们必须解决它。" }, { "speaker": "Ankush", "text": "高效地做到这一点是我们投入了很多时间的地方。" }, { "speaker": "Ankush", "text": "Lang Smith内的许多查询都是顶级案例风格的查询。" }, { "speaker": "Ankush", "text": "所以它们包含一个order by和limit。" }, { "speaker": "Ankush", "text": "而更简单的查询计划基本上是找到所有在范围内的文件,将它们分散开来,扫描它们,进行某种类型的合并和Top K操作。" }, { "speaker": "Ankush", "text": "实际上这在对象存储上有点昂贵,实际上相当昂贵。" }, { "speaker": "Ankush", "text": "所以我们做的是我们采取了基于时间窗口的方法,并将其编码到SmithDB内的自定义执行计划中。" }, { "speaker": "Ankush", "text": "最后,在可观测性的工作负载中,你通常需要尽可能快地提供最新摄入的数据。" }, { "speaker": "Ankush", "text": "为了做到这一点,我们在数据被持久化到对象存储之后仍然在摄取服务中缓冲数据。" }, { "speaker": "Ankush", "text": "我们将其缓存在内存和SSD上。" }, { "speaker": "Ankush", "text": "我们将这些数据提供给查询服务以避免下载大量小文件进行领先风格的查询。" }, { "speaker": "Ankush", "text": "Langsmith的性能不仅对人类用户体验很重要,而且对代理用户体验也很重要。" }, { "speaker": "Ankush", "text": "越来越多地,代理不仅是被Langsmith观察的对象,它们也是Langsmith的用户。" }, { "speaker": "Ankush", "text": "使用低效工具让你的代理变慢是一个巨大的打击。" }, { "speaker": "Ankush", "text": "我真的很喜欢Jeff Dean的这句话,他说:随着我们得到比人类快得多的基于代理的系统,你的工具可能会成为AMDell的Blah Blah瓶颈。" }, { "speaker": "Ankush", "text": "我们非常兴奋地宣布,SmithDB现在正在Langsmith上为所有美国云的核心可观测性工作负载提供服务。" }, { "speaker": "Ankush", "text": "所以如果你在使用Langsmith并在smith.langchain.com上,你所有的互动和追踪项目页面现在都由SmithDB提供动力。" }, { "speaker": "Ankush", "text": "很快——我们正在迅速工作以将Langsmith的其余UI带回SmithDB。" }, { "speaker": "Ankush", "text": "并且我们将很快将其带到自托管,并覆盖全球云流量。" }, { "speaker": "Ankush", "text": "所以SmithDB为我们要构建的所有Langsmith功能奠定了非常坚实的技术基础。" }, { "speaker": "Ankush", "text": "为了分享更多关于Langsmith的激动人心的更新,我想要再次请Harrison上台。" }, { "speaker": "Ankush", "text": "非常感谢。" }, { "speaker": "Harrison", "text": "SmithDB真是令人惊叹。" }, { "speaker": "Harrison", "text": "如你所见,我的工作很有趣且轻松,只需谈论我们构建的内容即可,但Cush和整个团队则在外构建复杂的工程项目和数据库,这些都帮助推动了代理开发生命周期中的所有内容。" }, { "speaker": "Harrison", "text": "而这正是我们思考的方式。" }, { "speaker": "Harrison", "text": "我们希望加速这一生命周期中的每一项内容。" }, { "speaker": "Harrison", "text": "我们认为跟踪和SmithDB是其中的关键部分。" }, { "speaker": "Harrison", "text": "有了这个坚实的基础,我们现在思考的一个重要问题是:我们如何进一步加快这一生命周期?" }, { "speaker": "Harrison", "text": "因为即使有跟踪和可观测性提供的可见度,这也是基本要求。" }, { "speaker": "Harrison", "text": "能够看到你的代理在每个步骤中做了什么绝对必要,但这仍然是基本要求。" }, { "speaker": "Harrison", "text": "在你拥有的数十万、数百万条跟踪记录中找到问题仍然很困难。" }, { "speaker": "Harrison", "text": "一旦找到了这些跟踪记录,理解其中的问题仍然是困难的。" }, { "speaker": "Harrison", "text": "它们可能会非常长。" }, { "speaker": "Harrison", "text": "你必须仔细查看,以确定LLM在哪个地方出错、调用了错误的工具。" }, { "speaker": "Harrison", "text": "一旦理解了这些问题,修复它们仍然是困难的。" }, { "speaker": "Harrison", "text": "你想改变提示吗?" }, { "speaker": "Harrison", "text": "你想改变代码吗?" }, { "speaker": "Harrison", "text": "你想改变一些工具吗?" }, { "speaker": "Harrison", "text": "你必须调查很多不同的事情,并将它们与核心问题联系起来。" }, { "speaker": "Harrison", "text": "然后一旦解决了这些问题,避免重复出现这些问题是很难的。" }, { "speaker": "Harrison", "text": "你解决了一个问题,然后改变提示,它又出现了。" }, { "speaker": "Harrison", "text": "那么你怎么避免这种情况呢?" }, { "speaker": "Harrison", "text": "所以我们花了很多时间思考如何更快地启动这个飞轮,因为它仍然很难。" }, { "speaker": "Harrison", "text": "我刚才提到的所有这些事情仍然很烦人。" }, { "speaker": "Harrison", "text": "那么当你有很多很难但又很重要的、你不想做的事情时,你会怎么做?" }, { "speaker": "Harrison", "text": "当然,你会构建一个代理来帮助你处理它们。" }, { "speaker": "Harrison", "text": "这就是为什么今天我们非常兴奋地在Langsmith中推出了一个代理——一个环境中的主动行动型代理,我们称之为Langsmith Engine。" }, { "speaker": "Harrison", "text": "具体来说,它会坐在你的跟踪之上。" }, { "speaker": "Harrison", "text": "它会在后台按计划进行遍历。" }, { "speaker": "Harrison", "text": "它会检测问题并为它们分配优先级。" }, { "speaker": "Harrison", "text": "它会用跟踪来支持其证据。" }, { "speaker": "Harrison", "text": "然后它会建议具体的解决方案行动。" }, { "speaker": "Harrison", "text": "我们过去几周与一些初创公司合作,将这一功能推出给他们。" }, { "speaker": "Harrison", "text": "正如你所见,它已经主动提出了需要添加的评估和需要做出的代码更改,并大大减少了检测时间和优先处理时间。" }, { "speaker": "Harrison", "text": "所以具体来说,Engine 可以在生命周期的各个阶段发挥作用。" }, { "speaker": "Harrison", "text": "它会坐拥在追踪之上。" }, { "speaker": "Harrison", "text": "如果你把它连接到 GitHub 或代码库,它可以建议代码更改。" }, { "speaker": "Harrison", "text": "如果将其连接到 Prompt 或 Context Hub,它还可以在那里提出改进建议。" }, { "speaker": "Harrison", "text": "然后它也可以建议增加在线评估,以跟踪这些问题随时间的变化。" }, { "speaker": "Harrison", "text": "让我们看看一个小视频来展示它的实际操作。" }, { "speaker": "Harrison", "text": "LayingSmith Engine 今天已进入公测阶段。" }, { "speaker": "Harrison", "text": "所以我已经看到一些人在笔记本电脑上登录 LayingSmith 并尝试使用它。" }, { "speaker": "Harrison", "text": "总体而言,作为一家公司,我们正在构建整个平台来支持代理开发生命周期。" }, { "speaker": "Harrison", "text": "在过去的几年里,我们一直在构建各种应用程序和基础设施组件,如可观测性和评估以及 Prompt Hub,这些都帮助推动了这一生命周期的许多方面。" }, { "speaker": "Harrison", "text": "今天,我们推出了 SmithDB 作为基础数据库来支持这一切。" }, { "speaker": "Harrison", "text": "我们还构建了 LangSmith Engine 这个代理,它位于其上,并帮助你更快地转动这个飞轮。" }, { "speaker": "Harrison", "text": "这不仅仅是一个平台,我们还想成为在场每一个人、社区以及整个空间中的合作伙伴。" }, { "speaker": "Harrison", "text": "这也是为什么我们对 General 中断感到非常兴奋的原因。" }, { "speaker": "Harrison", "text": "这是一个中断你一天并稍作休息的机会,从我们这里学习,但也是其他演讲者和生态系统中的其他合作伙伴、其他公司以及你旁边的人那里学习。我鼓励大家充分利用今天以及明天的每一个机会。" } ]