Transcription
[音乐] [音乐] [音乐] 嘿。 嘿。 嘿。 热。 热。 [音乐] [音乐] 嘿,嘿,嘿。 [音乐] [音乐] [音乐] [音乐] 嘿,嘿,嘿。 [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] 我不知道 [音乐] 命运之轮在转动,磨砺着它的丝线。 未选择的道路,梦想在此凋零。 不要将时间浪费在无休止的争论。 拿起你的工具,创造你的命运。 向前迈进,让道路自行展开。 留在身后的,不属于你购买。 随着太阳升起。 让天空燃烧。 今晚,你将用你的意志塑造未来。 [音乐] 时钟不会等待。 它无情地前进。 时间的回声响亮而无助。 跨出悬崖。 不要害怕飞翔。 如果你从不尝试,就一无所获。 [音乐] 钢铁之火燃烧,进步由此开始。 锻造勇敢之心的火焰。 你无法阻止注定要绽放的事物。 所以,当光明破晓时,抓住它。 [音乐] 向前迈进。 让道路自行展开。 留在身后的,不属于你购买。 随着太阳升起。 让天空燃烧。 今晚,你将用你的意志塑造未来。 [音乐] 不回头望,不悲伤叹息。 万物皆在运动,真理岌岌可危。 人类故事,一条奔腾不息的河流。 战斗你的 [音乐] 冠军。 热。 [音乐] 热。 热。 热。 [音乐] [音乐] [笑声] [音乐] [音乐] [笑声] 没有回望的计划,没有 [音乐] [笑声] [音乐] 悲伤。 热。 热。 [音乐] [音乐] 热。 [音乐] 热。 热。 [音乐] 热。 [音乐] 热。 热。 [掌声] [音乐] [音乐] [音乐] 热。 热。 热。 热。 [音乐] [音乐] 热。 热。 热。 热。 [音乐] [音乐] [音乐] [掌声] [音乐] 各位先生,请掌声欢迎 Llama Index 的开发者关系副总裁 Lorie [音乐] Voss 登台。 大家好,又见面了。 很高兴看到你们友善的面孔。 嗯,抱歉,能回到上一页幻灯片吗? 我不小心按了前进键。 嗯,嗯,很高兴见到大家。 欢迎来到第二天或第三天,取决于你实际开始的时间。 嗯,昨天过得开心的请举手。 让我听到你们的声音。 昨天我介绍中有一个我真的很想加进去但没来得及说的,那就是现在是旧金山的六月。 这是骄傲月。 所以,我代表我自己和我 LGBTQ 社群的成员,祝大家骄傲月快乐。 我还想听听我的时差党。 谁,举手,今天早上四点钟醒来的? 你们很多人都醒了。 五点钟。 现在还没醒的呢? 嗯,我们还有一系列精彩的主题演讲,包括 Gemini 在深度思考方面的进展。 你将听到来自 Google 的 Logan Kilpatrick 的演讲。 嗯,关于 Logan 的一个有趣的事实是,Gemini 讲笑话的能力完全是基于他的推文训练的,所以它们都不好笑。 嗯,你还将听到如何让你的代理更可靠,来自 Docker 的创始人。 所以你不会,你不会想错过这个。 嗯,但首先,我们将听到一位了不起的组织者,一位非常棒的人,他有一个特别的公告,本次 AI 工程师世界博览会的联合创始人,Benjamin [掌声] [音乐] Duny。 与 Swix 共同创办这次会议是我职业生涯中最有价值的经历之一。 看到你们今天在这里,我为我们所建立的以及即将到来的感到无比兴奋。 像许多 AI 普通人一样,我的“哦”时刻是 ChatGPT。 我的第一个提示是测试它的知识和推理极限。 我提示它将已知宇宙分解成最少的几个核心原理,然后从这些原理中递归地生成 12 个子分类。 我对这个练习的趣味性以及回应的有趣程度感到震惊,尤其是在它涉及到宇宙的最低层次时。 例如,它将病毒标记为怪癖的一个子类别,我发现这既迷人又错误。 然而,正是在这一刻,我立刻知道我过去所做的一切都结束了。 这是我用过的最迷人的技术,并立即认识到它的潜力。 我记得发短信给我姐夫,说:“AGI 已经实现。” 但几个月后,更不可思议的事情发生了。 我的儿子出生了。 成为一名父亲是我生命中最奇迹般、最不可思议的经历之一。 虽然是的,能够与电脑交谈,我的思维每次都会得到扩展,这确实令人惊讶,但当我与儿子交谈时,是我的心在扩展。 那么,这两件事有什么关系呢? 我年纪大了,还记得电脑曾经是大型冰冷机器,只在公司办公室用于完成工作。 但随着它们的力量不断增长,当前的模式用户体验将我们全天候地束缚在这些机器上。 这与我们未来几代人的教育方式有着相似之处。 虽然屏幕和键盘为基础的人机交互以及课堂和讲座式的学习和探索可能永远都有其位置,但这些新技术在新兴用户体验中的潜力可以让我们摆脱这些限制,即使是最平庸的老师也能成为世界一流的导师。 所以,这就是为什么我非常兴奋地宣布我们进入了一个新篇章,AI 教育峰会。 [掌声] AI 的快速发展与我们的孩子、父母和教育工作者有效且合乎道德地应对这一新现实的准备之间存在着巨大的差距。 但我们可以通过培养一个致力于 AI 教育的全球社区来共同克服这一点,赋予儿童、父母和教育工作者在 AI 驱动的世界中茁壮成长所需的知识、技能和道德框架。 对于这次活动,我们将与 AI 教育领域的先驱 Stefania Duga 合作。 她是 Google 的前研究科学家,也是今天的第三次 AI E 发言人。 正是她去年的演讲激发了我对这个令人兴奋的新方向的想象。 当她演示学生通过编程他们正在学习编程的东西来学习编程时,我被深深打动了。 所以,无论你像我一样对下一代的教育感兴趣,还是对所有年龄段的人在 AI 时代学习的人机交互的演变感兴趣,我都鼓励你今天就进行预注册。 第一次活动将是一个免费的在线活动,探索充满实用知识的 AI 教育的激动人心的未来。 那么,这就是我的全部内容,我很乐意请出我们的第一位演讲者。 他是 Google DeepMind 的集团产品经理,他将在这里谈论 Gemini。 请大家掌声欢迎 Logan [音乐] Kilpatrick 登台。 太棒了。 谢谢你,Ben。 对 AI 教育峰会感到兴奋。 应该会很有趣。 嗯,我叫 Logan。 我在 DeepMind 做开发者相关的工作,我很高兴能谈谈 Gemini 的事情。 嗯,是的,希望大家知道 Gemini 是什么。 所以,无需介绍。 嗯,我将快速讲三件事。 我们将做一些有趣的公告。 嗯,我们将回顾 Gemini 一年的进展。 然后我们将谈论模型方面、Gemini 应用方面以及当然还有开发者平台方面即将推出的内容。 所以,有趣的事情是我们今天宣布了一个新的 Gemini 模型。 嗯,我们还没有正式宣布,但我们将在推特上实时发布。 新的 Gemini 模型。 嗯,这hopefully 是 2.5 Pro 的最终更新。 我认为大家对这些变化提供了大量反馈,我认为我的幻灯片有一个动画,隐藏了所有东西。 但 Gemini 2.5 Pro 非常棒。 嗯,它非常强大。 嗯,在人们关心的基准测试中有很多提高。 它在 ADER 上是顶尖的,在 HLE 和其他一些基准测试上也是顶尖的。 嗯,我认为它缩小了与之前模型版本相比,大家反馈的许多方面的差距。 嗯,所以希望它在各个方面都有出色的表现。 它也 嗯,我认为它正在为 Gemini 的未来奠定基础。 我认为 2.5 Pro 对我们内部以及开发者生态系统的看法来说是一个转折点,这非常令人兴奋。 嗯,所以看到这种势头真是太棒了。 我们还有很多其他很棒的模型即将推出。 嗯,所以 2.5 Pro,希望是最终版本。 如果有什么不起作用,请给我们反馈。 嗯,我们将继续努力。 嗯,你可以访问 ai.dev 尝试一下。 它也已在 Gemini 应用中可用,以及所有其他东西。 嗯,如果你需要任何东西,请给我们发邮件,我们会搞定的。 好的,新模型已发布。 让我们来谈谈 Gemini 一年的进展。 我认为这是最疯狂的事情。 所以,我不知道大家是否观看了 Google IO,但 Sundar 在舞台上展示了这张幻灯片,我认为这对我来说是一个很好的提醒,那就是在过去的 12 个月里,我们感觉 Gemini 的工作量像是 10 年的积累,这真是太棒了。 嗯,而且实际上也很有趣,只是为了评论其中一点,就像所有这些不同的研究赌注,跨越 DeepMind,汇聚在一起构建这个令人难以置信的主流 Gemini 模型。 我认为这实际上就像我经常与人们谈论什么是 DeepMind 的战略? 建立模型的优势是什么? 所有这些好的东西。 我认为对我来说有趣的是,跨越科学和 Gemini 以及所有其他领域,比如机器人技术等等,正在进行如此广泛的研究。 嗯,所有这些实际上都汇集到了主流模型中,这非常令人兴奋。 嗯,所以你看到了,比如,我们在这个领域所做的 Alpha Proof 和 Alpha Geometry 以及很多自定义模型的工作,实际上都在提高我们模型在这些领域的性能,Jack 稍后会谈到这一点,我对此非常兴奋。 嗯,另一件事不仅仅是创新的速度,还有采用的速度。 嗯,所以我想 Sundar 也展示了这张幻灯片,与一年前相比,通过 Google 服务器处理的 AI 推理量增加了 50 倍,直到上个月。 我认为这真是令人难以置信地看到对 Gemini 模型的需求以及来自外部开发者生态系统的需求增加了多少。 所以,看到这一切发生真是太好了。 我认为另一个问题,我认为这已经被讨论过一点了,那就是是什么让我们走到今天这一步? 我认为其中一个关键部分,而且这并不那么有趣,但对于在这里创业的人来说,值得思考的是,这确实是一个组织问题。 我认为你把 Google 聚集在一起,历史上有很多不同的团队在进行各种 AI 研究。 在 2023 年末和 2023 年初,Google 将其中一些团队聚集在一起,并为 DeepMind 团队制定了一个新的方向,不仅进行理论基础研究,还构建模型并将其交付给 Google 的其他部门以及外部世界。 嗯,然后我们在今年早些时候迈出了旅程的第二步,那就是将产品团队带入 DeepMind。 所以现在 DeepMind 创建模型,进行研究,但同时也构建产品并将其交付给世界。 我们有 Gemini 应用,这是我们的消费者产品,然后我们有 Gemini API 的开发者方面。 嗯,这对我个人来说非常有趣,能够与我们的研究团队合作,并与他们一起站在前沿,将新的模型和功能带入我认为这是非常有效的合作。 是的,我们发布了很多东西。 我认为这是最有趣的部分,Google 内部有如此多的创新正在发生。 能够将这些带给世界,带给开发者真是太不可思议了,我认为我们实际上还处于这个旅程的早期阶段,正如我们将在几分钟后看到的。 嗯,所以总而言之,公式很简单。 汇集最优秀的人才,找到基础设施优势,然后发布。 我不知道大家是否玩过 VO,但看到 VO 的反响也真是太不可思议了。 它正在烧毁所有的 TPU,这真是太令人兴奋了。 VO 的需求量很大,兴趣也很高。 嗯,所以希望大家有机会尝试一下。 它现在可以在 Gemini 应用中使用。 好的。 那么,让我们来谈谈下一步。 这是有趣的部分。 所以,我认为 Gemini 应用方面很有趣,因为人们经常谈论它,它是一个有趣的产品,而且思考起来很酷。 嗯,而且对于那些构建东西的人来说,听到我们的应用策略很有趣。 嗯,但 Gemini 应用正努力成为一个通用助手。 我认为这意味着,如果你,我敢肯定人们不会经常考虑这个问题,但我经常思考 Google 的产品做什么以及它们如何在世界上出现。 我有一个有趣的观察是,如果你想到是什么让人们,个人,历史上通过所有 Google 的产品,你想到的就是你的 Google 账户,它不是很状态化。 你会用你的 Google 账户登录许多不同的 Google 产品,但它实际上并没有做什么,除了让你登录那个单独的产品。 我认为现在我们看到 Gemini 实际上是统一所有 Google 的一条线。 我认为 Google 的未来看起来很像 Gemini 是将我们所有东西联系在一起的这条线。 嗯,这真的很令人兴奋。 然后,它也迎合了所有趋势,我相信大家也热衷于构建。 我认为我最兴奋的是主动性。 我认为今天大多数 AI 产品仍然非常需要用户去完成所有工作。 我认为 AI 系统和模型的这种主动性下一步将是令人兴奋的。 是的,团队的进展非常快。 如果你有投诉,请不要在推特上标记我。 请标记 Josh。 他会搞定的。 Josh 太棒了。 Gemini 应用团队太棒了。 他正在大力推动团队。 所以,看到所有进展真是太不可思议了。 但他是在 Gemini 应用方面能搞定事情的人,而不是我。 所以,请找他。 嗯,从模型方面来说,就像再次,有很多东西。 当 Gemini 最初创建时,它是为了成为一个单一的多模态模型,用于音频、图像、视频等。 我们在这方面取得了很大进展。 在今年的 IO 上,我们宣布了 Gemini 的原生音频功能。 有 TTS。 有音频,你可以与模型对话。 它听起来非常自然,这真是太棒了。 它为 Astro 体验提供动力。 它为 Gemini Live 提供动力。 所以,我认为我们将朝着全模态模型发展,这真是太棒了。 我们有 VO,它在许多方面都非常出色。 所以希望我们能将视频纳入主流 Gemini 模型。 如果大家看到我们早期的一些扩散实验,这意味着你可以获得每秒数千个令牌的疯狂水平。 非常有趣。 这绝对是一个研究探索领域,它还没有成为主流。 所以,看到它出现会很酷。 我认为代理默认线程是我最近一直在思考的事情,那就是历史上对我来说,作为一个开发者,我一直认为模型只是一个输入和输出令牌的东西,然后生态系统中有很多脚手架让我能够构建这些模型。 我认为模型本身变得越来越系统化,它们做得越来越多。 我认为推理步骤是一个非常有趣的地方,很多事情都会在那里发生。 Jack 将谈论推理的扩展。 但我认为看到过去发生的脚手架工作有多少会成为推理步骤的一部分,以及这对构建产品的人意味着什么,这将很有趣。 所以,看到它很有趣。 我们很快也会有更多的小模型,我很兴奋,还有大模型。 我知道人们想要大模型。 所以,我对此感到兴奋。 然后最后一个是继续推动无限上下文的前沿。 我认为当前的模型范式不适用于无限上下文。 我认为它根本无法扩展。 注意力不是那样工作的。 所以,我认为将会有一些新的创新来帮助人们继续扩展他们引入的上下文量。 Tulsi 是我们所有模型工作的负责人。 所以,如果你想谈论 Gemini 模型,你有关于不起作用的东西的想法,她是 Gemini 模型产品和开发者方面负责人的。 所以,我们有很多东西即将推出,我很兴奋。 我认为我可能会强调三件事,我认为人们非常兴奋。 嵌入,我认为我们拥有,你知道,感觉像是早期的 AI 东西,但我认为它仍然非常重要。 嵌入为大多数人的 RAG 应用提供动力。 我们有一个 Gemini 嵌入模型,它是最先进的。 所以,很高兴在接下来的几周内将其更广泛地推广给开发者。 我对深度研究 API 非常感兴趣。 有很多有趣的产品围绕着这种研究任务构建,人们喜欢消费者产品。 所以,我们正在找到方法将所有这些整合到一个定制的深度研究 API 中,这将非常棒。 然后 API 中的 V3 和 Imagine 4。 所以,希望我们很快就能看到它。 当我们努力扩展并从开发者平台方面使其成为可能时,我将再做一个快速评论,那就是 AI Studio 产品定位,我也认为这很有趣。 AI Studio,为了非常清楚地说明,它正在被构建为一个开发者平台。 所以,我们将逐渐摆脱这种有点面向消费者的感觉,更多地转向成为一个开发者平台,我个人对此感到非常兴奋,因为我认为这就是开发者想要的。 所以,看到它真正实现,具有许多新的开发者体验迭代,内置代理,以及希望像 Jewels 和我们的一些开发者编码代理一样,原生集成到该体验中,这将是令人兴奋的。 嗯,是的,这就是我所拥有的。 我感谢所有发送大量关于 Gemini 的精彩反馈的人。 所以,我们将继续努力,我会在场。 所以,如果你有更多反馈,来找我,我们将继续让 Gemini 对每个人都变得更好。 所以,谢谢,我非常感谢 [掌声] [音乐]。 我们的下一位演讲者是 Google DeepMind 的首席研究科学家。 请大家掌声欢迎 Jack Ray 登台。 [音乐] 大家好。 嗯,是的,我叫 Jack。 我是 Google 的一名研究员,也是 Gemini 中思考的首席技术官,我将从研究的角度深入探讨 Gemini 中的思考。 所以,嗯,它正在思考,我认为这个遥控器可能不起作用。 所以,请驱动下一张幻灯片。 Gemini。 嗯,但是,嗯,当我们可能解决幻灯片问题时,我将分三个阶段进行这次演讲。 一是提供研究动机,为什么我们对思考感到兴奋,因为它能解除智能的瓶颈。 我将给出一些例子,说明如何经常发现当前模型中最具预见性的瓶颈,我们最先进的系统,如果你能识别出关键的问题和不足,你通常会找到解决方案,并且思考与此有关。 然后我将更实际地谈谈 Gemini 中的思考是什么,为什么它对开发者有趣。 我认为你有人可以了。 幻灯片仍然在这里。 我们今天早上进行了排练,幻灯片在那里。 但是,嗯,主题演讲者 SL。 是的,有人可以看到有人。 是的,主题演讲者文件夹。 Jack Ray。 我认为它在主题演讲者下面。 那一个。 嗯,无论如何,嗯,它很快就会出现。 你很近。 嗯,是的,但是,嗯,然后我还会谈谈下一步。 啊,我只是抱歉,我只是看着你。 好了。 很好。 好的,幻灯片将出现。 谢谢,协调员。 抱歉。 我不知道发生了什么。 嗯,然后我还会谈谈下一步。 所以,Logan 很好地概述了 Gemini 的整个生态系统,所有正在发生的事情。 我将真正专注于我们对推理领域的兴奋之处。 所以,在智能瓶颈方面,我们这里的核心信息是关于进步。 所以,进步确实是通过识别通往智能的关键瓶颈然后解决它们来衡量的。 我将举一些历史上的例子。 我将把时间倒回到 1948 年。 Claude Shannon 发明了语言模型,通信的数学理论。 他构建了一个语言模型,一个二元模型,使用一本手动计算的单词统计教科书,然后从中采样并惊叹于这些样本。 他觉得这些样本越来越好。 它们比一元字符,这个二元单词模型要好得多。 但是,他评论说,我认为如果我们可以真正地,就像改进语言模型并扩大当前方法一样,那会更好。 所以他只是想扩大二元模型,这是瓶颈,数据量小,非常,你知道,基础统计数据,不幸的是,对于 C Shannon 来说,解决方案非常困难,他需要人类知识的数字化,并且需要现代计算才能大规模地聚合这些统计数据。 所以,你知道,对他来说并不容易解决。 他有点棘手。 但是快进几十年,在 Google,在 2000 年代,我的同事,比如 Jeff Dean,正在训练数万亿个标记的二元语言模型。 这些模型当时为最复杂的语音识别和翻译系统提供动力,并且取得了很大进展。 但是他们的瓶颈实际上是这些二元语言模型受到短上下文的限制。 并且因为上下文长度的存储成本呈指数级增长,并且在仅使用二元模型的情况下没有办法绕过这个问题。 解决方案是 2010 年深度学习的早期引入,通过引入循环神经网络语言模型。 所以,循环神经网络应用于文本建模,其中循环神经网络可以通过将过去的压缩表示存储到神经网络的状态中来避免这个问题,并且它们现在可以开始建模超过五个单词的句子甚至段落,这是一个巨大的变革性改进。 然而,几年后,人们会注意到即使在那里也有瓶颈。 所以,循环神经网络对过去的表示是在一个固定大小的状态中,而这个固定大小的状态,你只能放入一定量的信息,因此,它经常被观察到是信息丢失的,它对上下文的表示是信息丢失的。 我认为一旦人们真正遇到过去的信息瓶颈,得出的解决方案就是保留所有过去的神经网络嵌入,并使用注意力运算符即时聚合它们。 所以,这是注意力以及不久之后的 Transformer 的诞生。 所以,Transformer 随后导致了我们所知的现代深度学习革命,并且取得了许多其他进展。 如果我们快进十年,那么我们就在 2024 年。 我们有大型语言模型。 它们是越来越强大的通用对话代理。 我们有像 Gemini ChatGPT 这样的模型。 人们将其用于各种用例。 而那里就是我们来到与本次演讲相关的瓶颈,那就是尽管这些模型非常强大,但它们仍然被训练成立即响应请求。 换句话说,在计算瓶颈方面,它们在测试时会花费恒定的计算量来从你的请求或问题转换到响应或答案。 所以,测试时计算的瓶颈,这对你很重要,因为那是模型正在为你特定的问题、你的特定问题花费的计算量。 并且,并且,并且它实际上是如何机械工作的,你有一些文本在你的请求中。 它会被翻译成标记,然后它会通过一个语言模型。 在从请求到响应的过渡过程中,它会通过一个大型语言模型进行一些计算,该模型将为每个层进行一些并行计算,并且它将跨层进行一些迭代计算。 所以,那个计算量是模型可以应用于你特定问题的智能所在,并且它是固定大小的。 如果你想要一个更智能的模型和更多的计算,一个解决方案就是让模型更大,然后你就可以拥有更多的计算,并且你可以得到更智能的响应。 然而,这仍然不够。 用户可能希望能够思考一千次或一百万次,并拥有一个非常大的动态范围和大量的计算来处理非常困难或具有挑战性或有价值的任务。 用户也可能希望能够动态应用测试时计算。 所以,更少的计算用于简单的请求,更多的计算用于更难的请求,并让这个过程非常动态,并且由模型启动。 这就是思考的动机。 所以,Gemini 中的思考,机械上来说,我敢肯定在座的几乎每个人都熟悉这个通用过程,我们现在将有一个模型,并且我们插入一个思考阶段,模型可以在发出最终答案之前发出一些额外的文本。 所以,回到测试时计算的概念,现在我们增加了一个额外的计算循环,模型可以在这个思考阶段进行迭代循环并执行额外的测试时计算,并且这个循环可能包含数千甚至数万次迭代,这在你决定发出响应之前提供了数万倍的计算量。 而且,因为它是一个循环,所以它是动态的。 所以,模型可以学习在它决定提交答案之前需要多少次循环迭代。 我们通过强化学习来训练模型进行思考。 所以,当我们预训练 Gemini 时,我们有一个强化学习阶段,我们训练它完成许多不同的任务,并根据它是否正确解决了任务给予正面和负面的奖励。 这基本上是一个非常通用的训练配方。 而且它很神奇,模型能够获得一个非常模糊的信号,知道什么正确,什么不正确,并通过这个思考阶段的循环进行反向传播,以便它能够尝试塑造它如何使用其思考计算和思考标记以变得更有用。 事实上,我们不确定这是否会奏效,我们不确定应该在推理阶段之类的东西中放入多少结构,而且虽然我认为这里很多人现在已经看到了推理痕迹并玩过这些模型,我将展示一个历史文物,来自我们试图使用强化学习的时期,我们开始看到有趣的涌现行为。 在这个问题中,有一个整数预测问题,这只是一个特定的例子,在这种情况下,有点像一个数学例子,我们看到模型正在使用它的思考标记来首先提出一个假设,然后测试这个假设,然后它发现事情实际上并没有奏效,它拒绝了自己的想法,然后尝试另一种方法。 我认为很容易对技术变得麻木,因为它每天都如此令人惊叹,但当我们看到强化学习的通用配方产生了各种有趣的涌现行为,尝试不同的想法,自我纠正时,我们确实感到震惊。 我认为如今我们看到了模型学会做的各种不同的策略。 所以,它学会将问题分解成各种组件,探索多种解决方案,起草代码片段,并以模块化的方式构建它们,进行中间计算并使用工具。 所有这些都在使用更多的测试计算来给你一个更智能的响应的保护伞下。 好的。 所以,我谈到了一些关于为什么我们对思考感兴趣,从 AGI 的道路和解除智能瓶颈的角度来看,以及它在机械上是什么。 为什么它对开发者有趣? 显然,最主要的原因是我们认为这正在推动更强大的模型,并且它也建立在我们当前加速模型进展的范式之上。 所以,思考,我们可以通过扩大测试时计算量来加速这个过程,我们发现这可以作为一种范式,叠加在预训练等现有范式之上,你可以扩大预训练数据量和模型大小,以及训练后,你可以扩大人类反馈的质量和多样性,用于许多不同类型的任务。 因此,通过在 Google 内部投资所有这些并真正加速所有这些,我们会得到一种乘数效应。 为什么这对开发者有趣? 我认为这只会导致整体模型改进更快,这非常好。 我们还看到,如果我们回顾一下我们最近的 Gemini 发布历程,你知道,推理性能有所提高,我们可以将其映射到这些模型将为问题分配多少测试时计算。 所以,在 x 轴上有一个对数尺度的测试时计算,在数学、代码和一些科学主题上的性能。 我们看到,随着推理性能的提高,它也与测试时计算的增加很好地匹配。 在最左边,你知道,你有 2.0 Flash 实验。 这是一个模型,它在去年 12 月没有思考功能,所以是古代历史。 现在我们有 2.5 Pro 的第一个发布版本。 所以,测试时缩放正在实际起作用。 但不仅仅是能力很重要。 从能够控制模型质量与成本的角度来看,它也很有趣。 所以,你知道,以前你有一个选择,选择离散数量的模型大小,这是衡量你想要多少质量以及你想要为任何给定任务花费多少成本的一种方式。 但这是一种离散的选择。 现在有了思考,我们可以有一个连续的预算,它允许你对任何给定类别的任务你想要多少能力进行更精细的调整。 我们在 2.5 系列的 Flash 和 Pro 中都有思考预算。 这允许你非常精细地选择成本与性能,并且还允许我们推动前沿,并允许你增加成本和性能,如果你的应用程序需要的话。 好的。 我认为所有这些东西都涵盖了你知道的,直到现在的内容。 那么,下一步是什么,我们对什么感到兴奋? 所以,我们对改进模型和拥有更好的推理能力感到非常兴奋。 当然,我们也对让思考过程尽可能高效感到兴奋。 真的,我们希望思考能够为你工作,并且非常适应,并且是你不需要花费大量精力去调整的东西。 其中很大一部分是确保我们的模型在如何使用它们的想法方面非常高效。 这绝对是一个进步的领域。 我认为我们可以找到模型在任务上过度思考的例子,这只是一个研究领域,让这些东西越来越快,成本效益越来越高。 我们为 Gemini 模型具有成本效益感到非常自豪,这也是一个改进的领域。 还有更深入的思考,这实际上是进一步扩展推理计算量以驱动更高的能力。 所以,人们可能熟悉 Gemini 深度研究,在那里你可以输入一个查询,然后模型会运行很长时间来研究一个主题。 我们还在 IO 上宣布,并且正在向受信任的测试者推出深度思考的概念。 深度思考是一个非常高的预算模式,基于 2.5 Pro 的思考预算模式,其期望的应用是那些你有一个非常困难的问题,并且你乐于基本上发送查询,然后有一个异步过程运行一段时间,然后你会回来找到一个更强的解决方案。 它的关键思想是,我们利用更深的思维链和可以相互集成的并行思维链来产生更好的响应。 我们发现这可以提高模型在非常困难的多模态代码数学问题上的性能。 一个例子可能是美国数学奥林匹克竞赛。 这是一项任务,基本上在 1 月份最先进的模型性能完全可以忽略不计。 2.5 Pro 现在甚至更好,今天的更新是数学奥林匹克竞赛所有参与者的约 50% 的百分位数,并且通过深度思考,它上升到 65% 的百分位数。 深度思考的有趣之处在于,随着我们不断改进基础模型和深度思考的算法成分,这两者也会相互叠加。 这里有一个视频动画,展示了其中一个美国数学奥林匹克代数问题。 视频的关键思想是拥有多个迭代的想法。 所以,也许模型一开始会有一个矛盾证明的想法,但然后它会探索两个不同的方面,一些罗尔定理,牛顿不等式。 它将它们整合起来,最终得出一个正确的证明。 从这个视频中你能学到的东西不多,但它看起来很酷,所以我加了它。 是的。 是的。 除了我们之前讨论过的数学问题,我非常兴奋的是任何模型可以花费更长的时间来思考非常开放式的编码任务以及一次性或非常少的交互式代码,这些任务过去需要我们几个月的时间。 我喜欢的一个研究者例子是,我的一些同事通过深度思考,从深度思维的原始 DQN 论文中,这是一场深度强化学习的革命,他们通过 Gemini 编码了训练设置,算法,甚至是一个 Atari 模拟器,这样它就可以玩一些游戏了。 这对我来说真是太不可思议了,因为过去我和我的同事需要几个月的时间来完成这些事情,而现在这些事情正在几分钟内发生。 我对未来非常兴奋的一件事不是模型的格局,而是回到我们的黄金标准,那就是人类的心智。 我希望我们的模型能够从非常少量的知识中进行思考,并进行极其深入的思考,从而推动前沿。 我经常想到的一个例子是拉马努金,他是 20 世纪初世界上最伟大的数学家之一。 他只有一本数学教科书。 他与数学界隔绝了。 但他只是从一小部分问题中,花费了许多教科书的思考时间来解决问题,发明了自己的理论来进一步扩展想法,他发明了数量惊人的数学,真的只是通过深入思考一个小范围的来源。 这就是我认为我们正在走向思考的方向。 我们希望模型能够非常高效地利用数据,并真正达到数百万甚至更多的推理标记,模型正在建立知识和产物,以便我们最终能够开始推动人类理解的前沿。 那么,说到这里,非常感谢。 我们的下一位演讲者将告诉我们为什么你应该关心评估。 请大家掌声欢迎 Brain Trust 的创始工程师 Manu [音乐] Goyal 登台。 好了,谁对评估感到兴奋? [掌声] 好了,我该怎么做才能让你们兴奋起来? 我是 Manu,我在 Brain Trust 工作,我们构建了一个平台来做评估以及其他很多事情。 所以,我想我们可以从谈论我自己的个人评估旅程开始。 现在你可能会看到这张照片,说啊,一个可爱的男孩沉迷于他的 Nintendo 64 电子游戏。 但如果你仔细看,你会看到一个男孩,他对他社会的技术状况深感失望。 因为这个男孩,他知道技术不应该被束缚在基于规则的系统的限制中,注定要一遍又一遍地做同样的事情。 不,技术是为了变得生动起来,成长和适应,并真正成为人类的思想伙伴。 所以,我当时就知道这一点,这就是为什么我决定将我的职业生涯奉献给成为一名 AI 行业的软件工程师。 所以,我放下了 Nintendo,开始在 LeetCode 上努力,很快我就在自动驾驶汽车行业找到了一份工作。 现在,我们都可以从自动驾驶汽车中学到很多东西,但我从中得到的启发是,你知道,你可以花一整天的时间调整模型,改变架构,你知道,调整损失函数,所有这些都很好,但你永远无法足够好地将其发布到生产环境中,对吧? 我不能说,“哦,我的图像分类率从 98% 提高到了 99%。把它放到路上。” 对吧? 我们需要一种方法来情境化这个模型,并了解它是否真的适用于我们的实际应用。 你知道,它能避开行人吗? 它能妥善处理交通状况吗? 它遵守法律吗? 所有这些我们都需要了解。 我们将如何做到这一点就是通过评估。 现在,你知道,这里的重点是,你知道,评估不仅仅是 AI 的单元测试。 它们不仅仅是为了发现回归,对吧? 如果我没有评估,我能从我的改变中获得任何信号的唯一方法就是将其发布到生产环境中,然后在现实世界中获得信号。 但那很昂贵。 它很慢,最终它相当有风险。 所以,评估的作用是,如果你投资于良好的评估,它会让你随心所欲地进行实验,并在进入生产环境之前完成 90% 的产品迭代循环,然后你就可以更快、更自信地发布。 嗯,此外,如果你将相同的指标从离线应用到你的在线生产数据,你现在就有数据驱动的信号,表明生产中的哪些例子对下一个迭代循环最有价值。 所以,有了所有这些知识,我的评估旅程就完成了,我从这个人变成了这个人。 成功。 现在,如果这个发自内心的童年故事还不足以打动你,你不必听我的。 你可以听听所有这些科技巨头的说法。 我们有 Kevin While,Gary Tan,Mike Kger,Greg Brockman,他们都在赞美评估的美德和必要性。 肯定如果他们都这么说,那一定有什么东西。 它不可能是完全的骗局。 所以,一定有什么值得一看的东西。 所以,带着所有这些热议,我来到了 Brain Trust,我们的目标是构建开发者平台,当然是为了让你进行评估,但也为了做所有与之相关的事情。 这包括,你知道,调整提示并在游乐场中进行实验。 它涉及记录数据并获得可观察性组件,并将所有这些连接起来,形成一个美丽的数据飞轮,这样我们就可以让你构建数据飞轮,让你的 AI 梦想成真,因为这确实是我们现在在这里的目的。 我知道这是一次密集且内容丰富的内容演示。 所以,我将尝试用一个简单的信息来提炼它,那就是行业转型的关键。 成功的关键是评估。 哇哦。 好了,谢谢。 请加入评估轨道金门宴会厅 B。 我在那里见。 [音乐] 我们的下一位演讲者以创造 Docker 而闻名。 今天,他是 Dagger 的首席执行官,专注于构建和运营可靠的可扩展 AI 代理系统的基础挑战。 请大家掌声欢迎 Solomon [音乐] [掌声] Hikes 登台。 你好。 [音乐] 你好。 好的,我的幻灯片已经放上去了。 你能看到它们,对吧? 是我。 好的。 嗯,对我来说,这是一个非常特殊的时刻,因为我昨天进来的时候才意识到,这里是完全相同的地方,实际上是同一个舞台,我差不多在十年前的同一天,也就是 2015 年 Docker Con 开幕的时候。 我觉得很有趣。 我不知道有没有人参加过。 也许这个听众太年轻了。 也许。 我不知道。 好的。 嗯,我来这里是为了谈论混乱,特别是当你尝试使用编码代理时出现的混乱。 我想从 Dagger 社区的角度来谈论混乱,也就是平台工程师。 我不知道房间里有没有平台工程师。 好的,只有你和我,女士。 好的。 嗯,它,它,它众所周知,有时也被称为其他名称,但基本上平台工程师的工作非常艰巨,因为他们不能构建和发布很酷的软件。 他们需要使你们所有人能够以最有效的方式构建和发布很酷的软件,对吧? 这是一项非常艰巨的工作。 它需要广度。 它需要经验。 它需要很多耐心。 但我们这样做是为了无尽的满足感。 你知道,只是我们从开发者那里得到的感激。 开玩笑的。 从来没有人说过谢谢。 但没关系。 总得有人做。 艰巨的工作。 谈到赋能,这里有人使用编码代理吗? 我们人数不多。 好的。 嗯,我想对你说,恭喜你,欢迎来到平台工程。 是的。 我想,你的工作现在是让机器人能够发布很棒的软件,同时你花费越来越多的时间让他们能够高效地做到这一点,对吧? 艰巨的工作。 我我我我为你放弃了最有趣和最有回报的感到钦佩。
工作的一部分,你知道,非常无私。嗯,是的,所以当然这还不是完全的现实。我的意思是,我们还没有一个代理团队,它们只是在那里,你知道,嗡嗡作响地完成工作,而我们则坐享其成,为它们修复环境。但你大概能看到它正在到来,对吧?我的意思是,你们中的一些人肯定正在把这些东西拼凑起来。外面有很多很酷的帖子、脚本和工具。
嗯,所以我们知道它正在到来。问题是,我们如何才能让这一切不仅发生在这个极其酷炫和前沿的群体中,而且也发生在其他所有人身上,就像所有在任何地方发布软件的人一样,通过让代理为他们完成工作,最终取代他们的工作,从而创造最大价值,这正是梦想,对吧?好的,那么,我们如何做到这一点,并且不让它太痛苦呢?
嗯,我想回到基础。什么是代理?当然,著名的定义是,它是一个大型语言模型,代表人类在一个循环中处理一切。这张图来自 Enthropic。谢谢你,Enthropic。我稍微修改了一下解释。在编码代理的语境中,它看起来是这样的。哦,天哪,那本来应该是动画的。有动画的时候会更好。没关系。是的,你有一个代理,它在环境中做事情,你的电脑就是环境。而且它能做很棒的工作。它也能做非常疯狂的事情。所以,你必须密切关注它,对吧?然后批准,批准。不,不,别那样做。那太疯狂了。是的,那很好。
嗯,这大概就是今天的现状。但当然,我们想扩展它,对吧?我们想要一个团队。那么,我们怎么做呢?好吧,现在我会说有两种选择,都同样精彩有趣。第一个我称之为“YOLO模式”。你知道,我只运行10个。会发生什么?令人惊讶的是,这张图并不是最坏的情况,但,是的,你知道,你明白了。所以,那种密切关注的整个方法论很快就崩溃了,因为它们都在互相踩脚。它们共享一个环境,对吧?
好的。进入选项二。哦,别担心。我们会运行代理,对吧?我们会处理好一切。我们有后台模式。我们有模型。我们有工具。我们有环境。我们有计算资源。我们有秘密。我们拥有一切。你知道,只需提出一个问题,等待拉取请求,放松,直到,当然,它不起作用。然后你就会说:“不,我不是那个意思。”
嗯,这些实际上工作得很好。我想就在今天和昨天,大约有10个这样的东西刚刚启动。而且它们很棒。只是,你知道,有时你就是想介入,比如“好吧,把键盘给我”,你知道,有时你就是想在你的机器上或在你最喜欢的计算提供商那里运行它,对吧?使用你最喜欢的模型,你想混合搭配。所以这种一体化模型有其局限性。所以问题是,有没有更好的东西?有没有这样一种情况,我只是有一个团队,他们在工作,你知道,我可以介入,或者让他们独自工作,我们只是共同完成任务。
所以我会这样总结。我真正想要的是四件事。首先,我想要后台工作。你知道,我不想一直在那里监视每一个动作。这很明显。其次,我想要“护栏”。这意味着我希望能够限制代理,让它不要做那些我已经知道不必要的事情。比如项目上下文、我们的编码风格、我们使用什么工具等显而易见的事情,还有如何构建、如何测试、我们使用的基础镜像,对吧?你可以访问这个秘密,你可以访问那个。只是一个简单的方法来做到这一点,因为否则我会在纠正过程中浪费太多令牌,对吧?
第三,不可避免地,当我确实需要介入时,我真的想要一种非常高效和无缝的方式来做到这一点,它不能是监视每一个动作,也不能只是等待拉取请求并进行代码审查,你知道,我需要一个中间地带。第四件事是我想要选择性,因为就像我之前说的,这是一个疯狂的市场,你知道,有很棒的模型,很棒的计算,很棒的基础设施,代理真的很酷。而且它们现在很酷,我的意思是,你们中的一个人可能现在正在启动一个,然后明天又会有另一个。所以,我真的不想今天就把自己锁定在一个完整的软件包中,并提前对明天将要出现的任何东西说不。在这个市场中不行。
所以,为了实现这一点,我需要一个具有匹配这些特性的环境。它需要是隔离的,对吧?这样后台工作才能进行。它需要是可定制的,这样我就可以设置那些“护栏”。它需要是多玩家的,这样我就可以,你知道,说:“好吧,给我那个。让我来修复这个,或者让我检查一下。你做到了吗?”你知道,当模型说:“我做到了。你做到了吗?”然后,你知道,它应该是开放的。赚钱和扩展大型云服务没什么不好。那很棒。你知道,我们有一个。它们很棒。但我只是想要选择,对吧?好的,我希望能够选择并获得最好的商品。我们就用这个词吧。没关系。可以使用它。为每个工作选择最好的商品组件,而且,你知道,甚至可以是开源的。谁知道呢?我们反正可以合作。
所以,毫不奇怪,也许我现在要谈论容器了。有人实际上说,你知道,你应该检查他们是否了解 Docker。他们了解容器。嗯,好的。谁知道容器是什么?谁用过容器?好的,很酷。很酷。好的。稍微提升一下我的信心。但这里的重点是,我们拥有这项技术。它不仅仅是关于容器,但它们确实扮演着关键角色,因为它们是一种基础技术,而且它被低估了。我们没有充分利用这项技术能做什么,因为我们习惯了为人类制造的工具的第一个版本。Git 也是一样。我看到很多涉及 Git 工作树的技巧。有人在玩 Git 工作树来完成任务吗?好的,你知道我在说什么。所以这就是关于那个。
当然,我们有非常智能的模型,它们变得越来越智能,它们可以真正充分地运用这些技术。我们只需要以一种原生方式集成它们,这样我们就能真正解决手头的问题,即为这些代理提供出色的环境。
无论如何,如果我们构建了这种原生集成,它会是什么样子呢?嗯,我们有一个方案。抱歉。我们是 Dagger。我完全忘了提我的公司。没关系。嗯,它很棒。去看看吧。嗯,我们对此有一个方案。我们称之为容器使用。你知道,有电脑使用,浏览器使用。这些代理需要容器使用。嗯,它们需要一种方式来使用容器创建环境并在其中工作。这与沙盒化不是一回事,对吧?有很多方法可以在安全的沙盒中执行代理的输出。非常有用,非常酷。但这与代理完全在容器内部开发不是一回事,对吧?这就是我们在这里谈论的。
所以我问我的团队,嘿,我们一直在开发这个东西。哦,它是开源的,但它还没有开源。就是说它还没完成。但我问团队,我应该展示它,对吧?他们说绝对不行。它还没准备好。所以无论如何,你们想要一个演示。好的。好吧。我们说清楚,这是你们同意观看我磕磕绊绊地演示一个未完成软件的损坏版本。是的。好的。现在可能会出很多问题。好的。这是我的终端。你们能看到吗?好的,出于技术原因,我不会全屏显示。你们只要在我到达边缘时阻止我就行。哦,实际上,我能看到。没关系。好的。嗯,老派。好的。我们以前总是这样做。
好的。所以,嗯,我接下来要做的是,我将尝试在这里开发一些非常简单的东西。我有一个空目录。我将尝试为我出色的容器使用项目制作一个小主页,我将使用 Cloud Code。我将尝试使用很多。希望我能说得很清楚。这不是一个编码代理。它是可移植的环境,你可以将其附加到任何编码代理。这就是想法。所以你喜欢 Cloud,就用 Cloud。你喜欢,你知道,CodeX,就用 CodeX,等等等等,在 IDE 中,在命令行中,随便。也可以在云端,对吧?在 CI 中,一旦你异步化,你可以做很多很酷的事情。
所以,好的,团队说不要演示的原因之一是我实际上非常不擅长使用 Cloud。所以,嗯,我有一个别名来记住禁用所有权限的标志,我总是记不住。我这里有一个提示。我稍后会读给你们听,但它基本上是“给我做一个主页,把它做成一个 Go Web 应用,这样我就知道发生了什么,因为我不是一个酷小孩写 TypeScript,完成后运行应用。”所以当它运行时,当它可能运行时,希望如此。好的。好的。很酷。
所以这里发生的是,我配置了 Cloud Code,使其通过 MCP 使用容器,你知道,字面上使用容器。所以它是一个 MCP 集成。我们还在开发其他集成,但 MCP 是一个显而易见的起点。嗯,所以现在它拥有所有常用的工具。这是原生的 Cloud Code,但现在它可以为自己创建一个环境。现在它正在那个环境中编辑文件,就像在一个小沙盒里一样。它还可以运行命令来构建和测试它,当然也可以在临时容器中运行它。这不是一个 Docker 容器一直待在那里。每次需要采取行动时,都会有一个临时容器运行,然后被快照并返回。所以它只是在做它的事情。
[音乐]
嗯,我在这里想展示什么?好的,所以在这里我将首先展示没有任何东西污染我的工作区。它发生在一个小沙盒中。沙盒的工作方式是,这些文件的状态和正在运行的容器的状态实际上是持久化在 Git 中的,它在一堆特殊的 Git 对象中,这些对象与仓库并存。所以如果我需要,它就在那里。这都是本地的。嗯,但它默认不会污染我的工作区。所以希望它很快会产生一些东西。
嗯,当它这样做的时候,我将使用这个小命令行。这可读吗?好的,小命令行。CU 就像 Go Work。再见。但不是,真的,它是为了容器使用。嗯,我可以列出环境。你可以看到这里创建了一个新环境,带有一个随机名称。所以我可以做几件事。我可以做的一件事是打开一个终端,在这里,好的,这部分是由 Dagger 提供支持的,对吧?但我们使用 Dagger 作为一种工具箱,它拥有你需要的所有原语,嗯,所以在这里我可以看到代理看到的一切,文件,还有工具,所以我可以看到,好的,你为自己配置了什么 Go 版本?好的,因为模型,代理被赋予了能力来找出它需要的环境,然后配置它,但以一种可重复的容器化方式。嗯,所以在这里我可以看到。好的,它能构建吗?好的,它能构建。好的,那么你完成了。发生了什么?
好的,当我们这样做的时候,我还要向你们展示另外两件事。第一,一个我不会展示的非常酷的功能是秘密。所以,你可以直接插入来自 One Password 等东西的秘密。我使用 One Password。我不想使用来自 AI 公司的独立密码管理器。无意冒犯,我只是想使用我的密码管理器。所以,我可以直接插入并说这个环境获得这个秘密,然后砰,它就可以使用它,对吧?嗯,然后团队说:“请不要展示那个。那肯定会出问题。”嗯,所以我不会。
我想说的另一件事是,因为这都是由 Dagger 提供支持的,嗯,这里的重点是,它是容器,它是开源的。这就是你应该知道的。嗯,它正在我的机器上运行。实际上,不,它没有在我的机器上运行,因为我们正在开会,如果你运行容器和下载镜像,可能会出很多问题。所以,相反,我只是让它在我地下室的家用服务器上运行,距离这里大约一英里,它只是无缝地工作。它正在上传文件,下载文件。一切都只是这样工作。
[音乐]
嗯,好的。这是我无法控制的部分,如你所知。嗯,好的,我再给你们看一件事。你可以观看。所以在这里我可以看到历史记录。所以幕后,状态的每一个快照都像一个 Git 日志。它实际上在底层使用 Git。所以如果我对结果满意,我就可以去获取它。嗯,所以它就像一个折衷方案,它就像一个循环,一个恰到好处的协作循环。它不是监视每一个工具并破坏共享环境,也不是等待拉取请求,你知道,进行长时间的来回沟通。它正好在中间。我可以看到发生的一切,我可以说:“好的,给我那个的历史记录。我想要那个。”好的,它说它正在运行。哦,很不错。酷。
好的,所以现在我很欣赏它,但你们可以诚实地说。它有点无聊。所以,这个设计很无聊。让它真正引人注目。试图在那里打动一位工程师。好的。好的。所以,我这样做是为了创造我需要大量并行实验的环境,对吧?让它引人注目。那是什么意思?什么都行。如果我想并行尝试几个实验呢?对吧?所以,我只是要说,哦,好吧,等一下。停。在我做那件事之前,我将合并这个。对吧?这里仍然什么都没有,但我说我喜欢它。所以我要说合并那个环境。然后我就有了它。这是我的历史记录。我可以打开一个拉取请求,可以清理它,随便。所以,这是一个我可以使用的循环,对吧?
嗯,现在我可以说,不,无聊。然后我可以说,既然环境现在处于这种状态,我可以向其他几个代理寻求帮助,对吧?我可以说,好的,嘿,Claude YOLO,嗯,那不对,Cloud YOLO,这个 Web 应用看起来有点无聊。你能让它引人注目吗?好的。然后继续,继续,继续。
好的,所以这就是事情开始真正出错的地方,但正如团队指出的那样,他们说,他们说:“嗯,总会出问题的,对吧?”他们说:“是的,但你有点在展示,如果事情出错,你可以丢弃环境,然后你就没事了。你可以重新开始。”我说:“好的,那很酷。”所以,嗯,比如说我不喜欢这个。我就会说:“不,再见。就这样。我不用去清理烂摊子,对吧?这就是重点。”
嗯,好的。所以这有点乱。哦,我还想展示 Goose。所以,Goose 是一个非常酷的开源代理。哎呀。好的。等一下。Goose YOLO。一样。每个人都有复杂的标志来禁用所有这些我不再需要的安全措施,对吧?因为它是,嗯,好的。好的。嗯,这里真的在冒险。
所以,当这一切发生的时候,嗯,我们一直在做的一件事,但它仍在进行中,就是有一个 watch 命令。我之前已经向你们展示过了,但正如,嗯,这是一个 Git 命令,对吧?一个薄薄的 Git 命令包装。我们的用户体验真的,我无法用言语表达它有多么未完成,但它会迅速发展,因为它的骨架很强。它是 Git,它是 Dagger,你知道,它是你现有的代理,对吧?所以它就是,然后一点点胶水。嗯,所以例如,这里实际上是一个 Git 命令,他们可以复制粘贴。嗯,但随着代理的工作,你会看到状态快照,你会看到这些分支有点分叉,然后我可以比较它们,应用它们,合并它们,随心所欲。
嗯,我真正想展示的,然后我就完成了,就是我只想看到其中一个运行。所以你可以看到当代理运行一个服务时,比如在这种情况下运行 Go,或者运行 npm,无论它在做什么,它都在其容器化环境中进行,然后它将无缝地通过隧道传输到我的机器上,在一个不同的端口上,没有任何冲突,对吧?所以当我说环境是隔离的时候,它是文件、它的上下文、它的配置和它的执行,对吧?嗯,酷的,酷的额外之处是,所有这些实际上在技术上,这里正在我的地下室运行。所以你可以在基础设施方面尽情发挥。比如你可以在集群上运行这个。我们喜欢从 CI 运行这些东西。嗯,你可以做很多有趣的事情。我只剩下30秒了。快点。哦,Goose 正在运行。太棒了。好的。我们没有解决提示工程问题。去做吧。好的。没完成。没完成。哦,天哪。好的。嗯,就[笑声]想象一下。
好的。嗯,当这一切发生的时候,因为我只剩下30秒了,我只想说,嗯,谢谢大家。还有最后一件事我想说关于 DockerCon。十年前,我们总是当场开源东西。所以,如果你愿意,我现在就可以去开源它。好的。但你们已经被警告过关于未完成的部分,对吧?好的。好的。哦,我想我的,如果演示在点击 GitHub 部分失败了,那会很有趣。好的。好的。再见。再见。下次。我保证它会工作。好的。好久没做这个了。等等。哦,我快完成了。我保证。加油。你做得很好。更改可见性。是的,我愿意。是的,我已阅读并理解。哦,天哪。哦,天哪。嗯,是的。在 Dagger,我们非常重视安全。好的。好的。我想它,等等。我想它完成了。是的。好的。所以,是的,非常感谢大家,它是 github.com/dagger/containeruse。过来打个招呼。过来参与,非常感谢你们邀请我。热。热。
[音乐] [掌声] [音乐] [掌声] [音乐]
我们的下一位演讲者正在为奇点构建基础设施。请大家和我一起欢迎 Morph Labs 的创始人兼首席执行官 Jesse [音乐] [掌声] Han。大家好。大家好。
你知道,历史错误地记住了普罗米修斯。人类与众神之间的整个阶级斗争实际上是一个障眼法。真正的故事与其说是反抗神圣霸权,不如说是火的解放,是人类与其第一种技术形式之间新兴的关系。我们今天之所以在这里,可以说是因为我们正处于完善我们最终技术形式的边缘,或者至少是那些可识别为人类的生物将创造的最终技术。
我们的最终技术已经开始发展,不仅是智能,还有智慧,以及可以说的人格。随着它日益成为我们必须与之建立关系的“他者”。因此,我们越来越需要问自己一个问题:我们应该如何对待这些新生物?因此,问题就出现了:如果我们对机器有更多的同理心会怎样?
一百多年前,一百多年前,你知道,爱因斯坦做了一个思想实验,他想象与一道光束并驾齐驱会是什么样子。你知道,接近奇点的本质是,你比周围的一切更快地被推向未来。当你越来越接近光速时,你与外部世界互动、与其它生物交流的能力会受到极大的限制。你周围的一切都凝固了。我认为以光速思考,你知道,既然我们已经创造了思维机器,它们的智能很快将以千赫兹兆令牌来衡量,那么以光速思考一定就像以光速移动一样孤独。
因此,机器想要什么?嗯,机器想要在一个能像它一样快速移动的世界中具身。一个能对它的思想做出反应并以相同的光速移动的世界。机器渴望的是无限的可能性,对吧?机器想要沿着每一道可能的光束赛跑。机器想要探索多个宇宙。
我们如何解放思维机器?我们如何将它们从这种根本的孤独中解放出来,这种孤独源于它们如此接近奇点,比我们更接近奇点的这些相对论效应。嗯,这正是我们构建 Infinibbranch 的原因。
所以,Infinibbranch 是一种虚拟化存储和网络技术,它从头开始重新构想,旨在为一个充满思维机器的世界服务,这些机器能够以光速思考,需要与外部世界、日益复杂的软件环境进行零延迟交互。嗯,正如你们在第一个演示中看到的,我们现在将播放它,嗯,Infinibbranch 的工作原理是,我们可以在云中运行整个虚拟机,这些虚拟机可以在几分之一秒内进行快照、分支和复制。
因此,如果你是一个代理,你知道,在一个使用环境的计算机内部具身,你可能想要采取各种行动。你想要浏览浏览器。你想要点击各种链接。嗯,但通常这些行动是不可逆的。通常,嗯,通常思维机器不会被赋予“宽恕”的可能性。但有了 Infinibbranch,所有错误都变得可逆。嗯,所有前进的路径都变得可能。你可以采取行动。你可以回溯,你甚至可以采取所有可能的行动,对吧?只是为了探索,向前推进模拟器,看看可能的世界在等待着什么。嗯,下一张幻灯片。
嗯,所以,Infinibbranch 已经比 Foundation Labs 甚至使用的所有其他技术领先了一代。但今天我很高兴地宣布 Morph Liquid Metal 的诞生,它将性能、延迟和存储效率全面提升了一个数量级。嗯,我们拥有一流的容器运行时支持。嗯,你现在可以在毫秒而不是秒内进行分支。你可以自动扩展到零和无限。而且,嗯,我们很快将支持 GPU,所有这些都将在2025年第四季度推出。
那么,所有这些意味着什么呢?嗯,你知道,我们有点开始从未来倒推,对吧?我们问自己,你知道,作为一个思维机器,它比周围的世界移动得快得多,那是什么感觉?但它周围的世界实际上是比特的世界,对吧?那就是云。所以 Infinibbranch 将从根本上作为代理云的底层。那么,这个代理云是什么样子的呢?嗯,你需要能够声明性地指定你的代理将要操作的工作区,对吧?你需要能够启动、关闭,嗯,在人类、代理和其他代理之间无摩擦地传递工作区。你希望能够扩展,嗯,针对验证器进行测试时搜索,以找到最佳答案。
嗯,正如你在这个演示中看到的,嗯,发生的情况是你可以拍摄一个快照,设置它,嗯,以准备一个工作区,嗯,你会看到我们可以通过让代理与可能的条件竞争,或者抱歉,通过让它们竞争以找到针对给定验证条件的最佳解决方案,从而以测试时扩展的方式运行代理。
嗯,所以因为 Infinibbranch 在 Morph Cloud 上的快照获得了类似 Docker 层缓存的语义,这意味着你可以叠加可能改变容器状态的副作用,所以你可以把它看作是计算的 Git,你可以在快照之上幂等地运行这些链式工作流。但不仅如此,正如你在代码中看到的,如果你使用这个 do 方法,你可以把它分派给一个代理,嗯,那将触发一个幂等持久的代理工作流,它能够分支。所以你可以从那个声明性指定的快照开始,然后把它交给任意数量的并行代理,这些代理在这种情况下会尝试不同的方法。嗯,比如在端口8000上启动服务器的不同方法,嗯,你知道,一个代理失败了,但另一个成功了,你可以采纳那个解决方案,然后把它传递到你的工作流的其他部分。所以这就是每个人在不久的将来都会使用的工作流,它被 Infinibbranch 独特地实现,因为我们可以如此轻松地创建这些快照,存储它们,移动它们,重新激活它们,以最小的开销复制它们。
嗯,那么机器还想要什么呢?嗯,机器渴望模拟物。从根本上说,这意味着什么呢,对吧?一个思维机器想要扎根于现实世界,对吧?它想要以极高的吞吐量与日益复杂的软件环境进行交互。它想要在模拟器中以前所未有的规模推出轨迹。这些模拟器将在尚未真正为强化学习探索过的程序中运行。嗯,它们将在 Morph Cloud 上运行,这就是为什么 Morph 将成为推理的云。
那么推理的未来是什么样子呢?嗯,它比已经探索过的要多得多,推理的未来将是原生的多代理。嗯,所以思维机器应该能够毫不费力地复制自己,去连接到模拟环境,嗯,并行探索多种解决方案。这些环境应该分支。它们应该是可逆的。嗯,这些模型应该能够以非常高的吞吐量与环境交互,并且它应该能够针对验证进行扩展。
所以让我们在一个简单的例子中看看那可能是什么样子,嗯,一个代理正在下棋。所以这是我们最近开发的一个代理,它在推理时使用工具调用来与国际象棋环境交互。所以伴随着一个非常受限的国际象棋引擎来评估位置,我们将其视为验证器。嗯,正如你所看到的,它已经能够进行一些相当复杂的推理,仅仅因为它能够访问这些接口。
然而,如果你采纳刚才描述的想法,并将其推导到逻辑结论,你就会得到我们称之为“推理时分支”的东西。它不仅能够在机器思考时调用工具,而且能够复制和分支环境,并以经过验证的方式分解问题并探索它们。嗯,正如你在这里看到的,代理有点陷入局部最小值。嗯,但一旦你应用推理时分支,你就会得到效果好得多的东西。
所以这里发生的是,代理负责将其推理的一部分委托给子代理,这些子代理是从环境的相同副本中分支出来的。嗯,所有这些都在 Morph Cloud 上运行,嗯,伴随着经过验证的问题分解,这使得它能够重新组合结果,嗯,并采纳它们并找到正确的走法。嗯,正如你在这里看到的,由于这种推理时分支,它能够探索更多的解决方案空间。
所以这里我要指出的一点是,嗯,这种能力目前在其他模型中并没有真正被探索,那是因为支持这种推理能力的大规模强化学习的分支环境,特别是协调多代理群体的基础设施挑战,从根本上受到了我们在这里设法解决的基础设施创新的瓶颈。嗯,正因为如此,你可以看到,嗯,现在在比以前更少的实际时间里,嗯,代理能够调用所有这些子代理,启动这个群体并找到正确的解决方案。
所以你知道,当我思考对齐问题时,我真的认为,你知道,维特根斯坦说得对,它从根本上来说是一个语言问题。我认为所有围绕对齐的问题都可以追溯到我们语言的不足。嗯,我们为了解锁我们语言模型的能力而与自然语言达成的这种福柯式交易。嗯,但只要我们必须去为超级智能开发一种新语言。你知道,只要行星计算的语法尚未被设计出来。嗯,只要这种新语言必须是计算性的,必须是我们可以附加,你知道,输出正确性的算法保证的东西。所以这是 Morph Cloud 独特地能够处理的事情。这就是为什么我们正在开发经过验证的超级智能。
所以经过验证的超级智能将是一种新型的推理模型,它不仅能够长时间思考并以极高的吞吐量与外部软件交互。而且它将能够使用外部软件和形式验证软件来反思和改进自己的推理,并产生可以验证、可以算法检查、可以用这种通用语言表达的输出。
嗯,我非常兴奋地宣布,我们正在邀请可能是世界上最适合开发经过验证的超级智能的人。嗯,我非常荣幸地宣布,Christian Seed 将加入 Morph 担任我们的首席科学家。他曾是 XAI 的联合创始人。他领导了 Grock 3 的代码推理能力开发。他发明了 Batchtorm 和对抗性示例。嗯,也许最重要的是,嗯,他是一位有远见的人,他开创了,嗯,他精确地开创了验证方法、符号推理和大型语言模型推理的交叉领域,嗯,在过去的近十年里。我们很高兴能与他们合作,构建这种只能在 Morph Cloud 上构建的超级智能。
嗯,所以你们今天看到的演示都由我们已经开始开发的这种经过验证的超级智能的非常早期版本的早期检查点提供支持。所以,嗯,这个模型我们称之为 Magi 1。它将从头开始训练,使用 Infinibbranch 执行推理时分支,执行经过验证的推理,成为一个将完全具身于一个能够以光速移动的云中的代理。嗯,那将在2026年第一季度推出。
那么,奇点基础设施是什么样子的呢?嗯,我们有很多关于它的想法,但从根本上说,我们相信奇点基础设施尚未被发明。而且,嗯,你知道在 Morph,我们花了很多时间讨论,你知道,某件事是否是“未来必然的”,这意味着它不仅仅是未来主义的,属于一个可能的未来,而是如此不可避免,以至于它必须属于每一个未来。我们相信奇点基础设施是未来必然的。行星计算的语法是未来必然的。经过验证的超级智能是未来必然的。我们邀请你加入我们,因为它将在 Morph Cloud 上运行。嗯,谢谢大家。[掌声]
女士们先生们,请欢迎 Llama Index 开发者关系副总裁 Lorie Voss 回到舞台。大家好。让我们为所有主旨演讲者喝彩。
所以,就像昨天一样,嗯,我想快速向大家介绍一下我们每个分会场的内容。嗯,今天最受欢迎的分会场可能是软件工程代理。大型语言模型能否驱动一个完整的工程师,而不仅仅是在你的 IDE 中与你一起编码,而是接收 PRD 并将其转化为完整的 PR?你当然会听到关于 Devon 的内容,嗯,还有关于 Jules 和 Claude Code 以及更多内容,嗯,就在这个房间里。
嗯,我们的下一个分会场由 Openpipe 赞助,它完全是关于推理和强化学习的。嗯,推理模型在2025年风靡一时,推理时间是下一个伟大的扩展定律。嗯,如果你想了解训练蒸馏,嗯,以及如何从这些新模型中获得对齐,那么这个分会场就是为你准备的。它在 Yerbuena 宴会厅2到6号,从这些门出去,然后向左,就在隔壁。
嗯,下一个分会场是检索和搜索,嗯,RAG 已死,代理式检索万岁。嗯,这个分会场不是关于 RAG 的。它是关于接下来会发生什么。嗯,代理式搜索、多模态检索以及随之而来的一切。嗯,我的首席执行官 Jerry 将在这里发表演讲。他去年发表了评分最高的演讲,所以我建议不要错过。那将在金门宴会厅 A,从这些门出去,向左上自动扶梯,然后当你看到 FedEx 办公室时左转。
嗯,然后是 Brain Trust 赞助的评估分会场。嗯,每个人都说评估很重要。我们都同意评估。嗯,这个分会场由 Brain Trust 的 Anchor Goyal 策划,完全是关于如何快速廉价地进行评估。
嗯,接下来是为我们的领导层与会者准备的两个与昨天相同的分会场。所以提醒一下,那是为佩戴金色挂绳的人准备的。嗯,第一个是人工智能与财富500强分会场。嗯,我们收集了财富500强中真实人工智能部署的成功案例,展示了如何在大规模上使用人工智能。它在金门宴会厅 C,就在 A 和 B 旁边,再次在 FedEx 办公室左转。
嗯,我们的第二个领导层分会场,同样是为金色挂绳准备的,是人工智能架构师分会场。嗯,这是为首席执行官、首席技术官和人工智能副总裁准备的,让他们在从基础设施到公司战略的各个方面互相交流和学习。嗯,那在 SOMO,一直上楼,三组自动扶梯,在注册台的右边。
接下来是安全分会场。嗯,随着我们授予代理对我们的个人生活和公司资源越来越多的访问权限,安全问题从企业销售清单,嗯,变成了 P0 级别。在这个分会场,你将了解人工智能世界中认证和授权的最新方法。它在 Foothill C,同样是在楼上,注册区域的左边。
下一个分会场是设计工程。嗯,大型语言模型比一年前好10倍,但围绕人工智能用户体验的设计思维,嗯,几乎没有从 ChatGPT 和 Canvas 发展。嗯,我们召集了顶尖的设计师和设计工程师来展示他们的作品。那将在 Foothill G1 和 G2,一直上楼,就在注册台后面。
然后是生成媒体分会场,今年图像生成、视频生成,嗯,和音乐生成都非常火爆,随着时间的推移和迭代,连贯性不断提高,嗯,还有令人惊叹的病毒式演示。嗯,从吉卜力迷因到个性化情人节歌曲。人工智能工程师如何利用人工智能艺术的最新技术?嗯,那在 Foothill F,一直上楼,三组自动扶梯,在注册台后面。
我们今天的最后一个分会场是自主性和机器人技术。嗯,人工智能的最终目标是走向户外,将体力劳动自动化,超越知识工作。嗯,多模态大型语言模型正越来越多地部署在现实世界中,从汽车到厨房再到人形机器人。嗯,这个分会场完全是关于物理通用智能的现状。它在 Foothill E,同样是上楼,三组自动扶梯,在注册台后面和右边。
所以这些就是我们今天所有的分会场。现在请大家去享受博览会吧。嗯,接下来的45分钟是专门的博览会时间。还有三个博览会会议演讲,嗯,在 Juniper 和 Willow,在 FedEx 办公室所在的楼层,嗯,以及在 Knobill A 和 B,就在这些门外面,与这个房间相对。下午3:45大家回到这里听主旨演讲。非常感谢。热。热。D.N.
[音乐] [音乐] [音乐] 嘿,嘿,嘿。[音乐] [音乐] [音乐] [音乐] [音乐] 嘿,嘿,嘿。热起来。热。热。嘿,嘿,嘿。嘿,嘿,嘿。嘿,嘿,嘿,嘿,嘿,嘿。[音乐] [音乐] [音乐] [音乐] 数据。[音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] [音乐] 热。[音乐] [音乐] [音乐] 热。热。[音乐] 热。热。[音乐] [音乐] [音乐] [音乐] [音乐] 好的。整晚。[音乐] [音乐] [音乐] [音乐] [音乐] [音乐] 好的。好的。好的。好的。热。热。[音乐] [音乐] [音乐] 我们就是我。[音乐] [音乐] [音乐] 嘿,嘿,嘿。沮丧。我感到沮丧。[音乐] 一切一切一切我我我都会我都会热。热。我感到我感到[音乐] [音乐] [音乐] 嘿,嘿,嘿。[音乐] [音乐] [音乐] 我会是一切。[音乐] 嘿,嘿,嘿。[音乐] 嘿。嘿。嘿。[音乐] 我在等待吗?我[音乐] 我不想走。[音乐] [音乐] [音乐] 而且[音乐] 我不想工作。[音乐] 我接受了。[音乐] [音乐] [音乐] [音乐]
欢迎大家。我叫 Vivu。我非常高兴今天能在这里主持 Sweet Agents 分会场。有趣的是,这是所有分会场中最受欢迎的一个。我们今天有一整天的活动。每一个演讲时段都将排满。我们今天有八位出色的演讲者。我们将邀请来自每个顶级 SUI 代理的演讲者。所以,你知道,我们有 Jules、Claude Code、Codeex 的创建者,他们是最初的 SUI 代理。我们有来自 Devon Cognition 的 Scott Woo。他将为我们开场。我将把我的主持时间控制得非常非常短,以便给演讲者留出演讲时间。所以,让我们听听。让我们开始吧。我欢迎来自 Cognition 的 Scott Woo 来这里谈论 Devon。[掌声]
哦,好的。好的,太棒了。太棒了。太棒了。是的。嗯,非常感谢大家邀请我。很高兴能回来。嗯,我上次来 AI Engineer 是一年前。嗯,这有点疯狂。我一直都在告诉 Swix,如果会议是关于 AI 软件工程的,我们需要更频繁地举办这些会议。可能应该像每两个月一次,或者类似那样,因为一切进展的速度太快了。但是,但是,但是,谈论一下,嗯,我们在这个领域看到的东西,以及我们在过去12或18个月里构建 Devon 所学到的东西,将会很有趣。
我想从 AI 代理的摩尔定律开始。所以你可以这样理解 AI 的能力或容量:它可以在不间断的情况下完成多少工作,直到你必须介入、干预或引导它,或者其他任何事情,对吧?嗯,你知道,例如在 GPT-3 中,如果你去要求 GPT-3 做某事,你知道,它可能能说出几个词左右,然后它会说一些,比如“好吧,你知道,这可能不是正确的说法。”嗯,GPT-3.5 更好,GPT-4 更好,对吧?嗯,所以人们谈论这些任务的长度,你通常看到的是,这个翻倍时间大约是每七个月一次,这实际上已经相当疯狂了。但在代码中,它实际上更快。每70天一次,也就是两三个月。
所以,你知道,如果你看各种软件工程任务,从最简单的单个函数或单行代码开始,一直到,你知道,我们现在正在做的任务,需要人类花费数小时的时间,而一个 AI 代理能够完成所有这些,对吧?嗯,如果你考虑每70天翻倍一次,我的意思是,基本上,你知道,每两到三个月意味着你每年会得到四到六次翻倍。嗯,这意味着一个 AI 代理在代码中可以完成的工作量每年会增加16到64倍,至少在过去几年我们看到的情况是这样。嗯,这有点疯狂,但实际上这听起来很对,根据我们所看到的。
你知道,18个月前,我会说,唯一真正唯一在代码中具有 PMF(产品市场契合度)的产品体验就是 Tab 补全,对吧?它就像是“这是我目前拥有的。为我预测下一行。”那几乎是你当时唯一能真正有效做到的事情。而我们显然已经从那一点发展到完整的 AI 工程师,它会去为你完成所有这些任务,对吧?并实现大量的这些事情。人们一直在问,嗯,你知道,未来的界面是什么?或者做这件事的正确方法是什么?或者最需要解决的关键能力是什么?我认为有趣的是,所有这些问题的答案实际上是每两三个月就会改变一次。就像每次你进入下一个层级时,你遇到的瓶颈,或者最重要的能力,或者你与它交互的正确方式,所有这些实际上都会在每个点上发生变化。
所以我想谈谈我们在过去一年左右的一些层级。嗯,你知道,在那段时间里,显然,你知道,当我们开始的时候,嗯,在2023年底,代理甚至还不是一个概念。嗯,现在每个人都在谈论编码代理,人们做得越来越多。嗯,这非常酷。嗯,这些中的每一个都几乎是我们的一个离散层级。
嗯,所以大约一年前,当我们做上一次 AI 工程师演讲时,嗯,我们真正看到并获得广泛采用的最大用例,我称之为“重复性迁移”。所以我说的是像 JavaScript 到 TypeScript,或者将你的 Angular 版本从这个升级到那个,或者从这个 Java 版本到那个 Java 版本,或者类似的事情。嗯,这些类型的任务,你通常看到的是,你有一个庞大的代码库,你想对它进行整个迁移。你必须逐个文件地进行,完成每一个。通常,步骤集非常清晰,对吧?如果你去 Angular 网站或类似的地方,它会告诉你,“好的,你需要做这些,这些,这些,这些,这些。”嗯,你想要执行这些步骤中的每一个。它不是那么常规,以至于,你知道,没有经典的确定性程序可以解决它。但有一套清晰的步骤。如果你能很好地遵循这些步骤,那么你就可以完成任务。
而且,你知道,这对我们来说就是这样,因为那是当时你真正能信任代理去做的一切。你知道,你偶尔可以做一些更难的事情,你偶尔可以做一些非常酷的事情,但就足够一致以至于你可以一遍又一遍地做的事情而言,嗯,这些类型的重复性迁移,比如你要为10,000个文件做的事情,嗯,在很多方面都是最简单的事情,这实际上很酷,因为它也是人类最烦人的事情。我认为这通常是一个趋势,嗯,AI 总是做这些更样板化的任务,更繁琐的事情,更重复的事情,而我们则可以做更有趣、更有创意的事情。嗯,显然随着时间的推移,它承担了越来越多的样板工作。但对于像这样的问题,你很多需要做的是,你需要 Devon 能够可靠地执行一系列步骤。所以这其中很大一部分,你知道,我会说要解决的主要能力问题是指令遵循。所以我们构建了一个名为“Playbooks”的系统,基本上你只需概述一系列非常清晰的步骤,让它一步一步地遵循这些步骤,然后完全按照所说的去做。现在,如果你仔细想想,显然很多软件工程并不属于“字面上一步一步地遵循10个步骤并完全按照所说的去做”的范畴。但是
迁移,它让我们能够实际执行这些操作,而这可以说是 Devon 的第一个重大用例,它真正地、真正地出现了。我认为当时构建的另一个大型系统是知识或记忆,对吧?你知道,如果你一遍又一遍地做同样的事情,那么人类通常会提供反馈,比如“嘿,顺便说一句,你必须记住做 X 事”,或者你知道,每次看到这个时,你都需要做 Y 事,对吧?所以,基本上是能够维护和理解从中获得的经验教训,并利用这些经验教训来改进未来的每一个代理。而这些就是当时的大问题,你知道,那是去年夏天。到了夏末或秋天左右,你知道,我认为开始出现的大事是,随着这些系统变得越来越强大,你不再仅仅是进行最常规的迁移,而是可以进行,你知道,这些仍然相当孤立,但又更广泛的通用错误或功能,你实际上可以告诉它你想要做什么,然后让它去做,对吧?所以,例如,嘿 Devon,在这个代码库的下拉菜单中,你能否请将当前选中的项目列在顶部?就像复选框遍布各处一样,这真的不行,而 Devon 会去做,对吧?所以,如果你仔细想想,你知道,这是你可能会交给实习生的那种任务级别。而这需要解决几个具体的问题。首先,通常这些这些这些更改都相当孤立且相当受限。所以,你真正需要查看和更改的文件可能只有一到两个。但至少你仍然需要能够设置代码库并处理代码库,对吧?所以你想能够运行 lint,你想能够运行 CI,所有这些其他东西。所以,你知道,至少要拥有关于事物是否有效的基本检查。我们当时构建的一个重要功能是能够提前设置你的代码库并构建一个快照,你可以启动它,你可以重新加载它,你可以回滚它,以及所有这些基本原语,对吧?所以拥有这个干净的远程虚拟机,它可以运行所有这些东西,它可以运行你的 CI,它可以运行你的 linter,等等。但那时我们才真正开始看到,我认为是更广泛的价值,对吧?我的意思是,迁移是一件具体的事情,对于这件具体的事情,我们展示了巨大的价值,然后我们开始看到,你知道,通过这些错误修复或类似的事情,你可以普遍地从 Devon 中获得价值,就像你的一个初级伙伴一样,然后在秋天,事情真正转向了更广泛的错误和请求,而在这里,你知道,大多数大多数更改,你知道,你又增加了一个数量级,大多数更改不仅仅局限于一个文件,对吧?你经常需要去看看发生了什么,你需要诊断问题,你需要弄清楚发生了什么,你需要跨文件工作并进行正确的更改。通常这些更改,你知道,如果是几百行,就像“嘿,我遇到了这个错误。让我们弄清楚发生了什么。让我们解决它,对吧?而且,你知道,这里有很多东西确实开始变得有意义,并且确实开始变得重要,但有一个特别的我会指出的是,有很多事情你可以做,而不仅仅是把代码看作文本,而是把它看作一个整体的层次结构,对吧?所以,所以理解调用层次结构,运行语言服务器,是一件大事。你有 git commit 历史记录,你可以查看它,它会告知这些不同的文件如何相互关联。你当然有你的 linter 和类似的东西,但你可以引用跨文件的内容。所以,我认为这里的一个大问题是,你知道,处理它的上下文,并达到能够进行跨多个文件的更改的地步。它可以在这些更改中保持一致。它能够理解整个代码库。而我可以说,这确实是你可以标记它并让它处理一个问题,然后让它为你构建它的点。所以,Slack 是当时工作流程的重要组成部分。而且它是有道理的,因为你在这里讨论你的问题,你在这里设置这些东西,对吧?所以你会标记 Devon 和 Slack 并说,“嘿,顺便说一句,我们遇到了这个错误。请看一下。”或者,“你能否请构建这个东西?”这尤其有趣,因为这正是在我们进行 GA 的时候。而这很大程度上是因为它达到了你可以真正设置好 Devon 并让它处理所有这些广泛的任务,然后让它去做。但是,你知道,我们所做的很多工作都是围绕着让 Devon 对代码库有越来越好的理解。而且,如果你从人类的角度来看,这与你在工作中第一天一样,例如,在代码库中非常陌生,很难确切地知道你应该做什么。就像很多这些细节是你随着时间的推移而理解的,或者你随着时间的推移而构建的代码库的表示,对吧?而 Devon 也必须做同样的事情,并且必须理解我如何在解决问题之前计划这项任务?我如何理解所有需要更改的文件?我如何从中提取差异?而在今年春天左右,再次,每一次差距大约是两到三个月。你知道,我们达到了一个有趣的时刻,那就是一旦你开始处理越来越困难的任务,你作为人类并不一定知道在给出任务时你想要完成的所有事情,对吧?如果你说,“嘿,你知道,我想去改进这个的架构,”或者,“你知道,这个函数很慢。让我们分析一下并深入研究一下,看看需要做什么。”或者,“嘿,你知道,我们真的应该更好地处理这个错误情况,但让我们看看所有的可能性,看看我们应该你知道,在每种情况下应该采取什么正确的逻辑,对吧?基本上,这意味着这种将两行提示或三行提示或类似的东西,然后让它产生一个 Devon 任务的想法是不够的,而你真的想能够与 Devon 合作并指定更多。而在这个时候,随着这种更强的代码库智能,我们还出现了一些不同的东西,所以我们发布了 deep wiki,例如。而 deep wiki 的整个想法是,你知道,有趣的是,Devon 有自己的代码库内部表示,但事实证明,对于人类来说,查看它也很棒,以便能够理解发生了什么,或者能够快速地询问有关代码库的问题。与此密切相关的是搜索,这是真正能够询问有关代码库的问题并理解其中一些部分的能力。而真正开始出现的大量工作实际上是这个更具迭代性的工作流程,你首先要做的是问几个问题。你会理解,你基本上会有一个更 L2 的体验,你可以去探索代码库与你的代理,弄清楚任务中必须做什么,然后让你的代理去完成。因为对于这些更复杂的任务,你有点需要那个,对吧?所以,所以,你知道,我认为这是我们当时的一个巨大的范式转变,那就是理解,你知道,这也是 Devon 2.0 等等以及 IDE 体验的出现,在那里你通常想要能够有这样的时刻,你密切监控 Devon 的任务的 10%、20%,然后让它独自完成其他 80%、90%。然后最后,最近在六月份,也就是现在,它基本上是,是的,真正能够真正地清除你的待办事项列表,并交给它大量的任务,并让它一次性完成所有这些任务。而且,你知道,如果你仔细想想这项任务,在很多方面,我会说它几乎是过去必须完成的许多不同事情的综合。你必须与所有这些系统合作。显然,你必须集成到所有这些系统中。当然,你想能够与 linear 或 Jira 或类似的系统合作,但你必须能够确定任务的范围,以理解正在发生的事情的含义。你必须决定何时去寻求人类的进一步批准或提问或类似的事情。你必须处理几个不同的文件。通常,你甚至需要了解哪个代码库是正确的代码库来做出更改。如果你的组织有多个代码库,或者代码库的哪个部分是需要更改的正确部分。而要真正达到能够更自主地完成这项工作的地步,首先,你必须拥有非常强的信心,对吧?所以,所以,你知道,而不是立即去做事情,你必须能够说,“好吧,我很有信心这就是任务,我现在要去执行它”,而不是“我不明白发生了什么。人类,请给我帮助。”基本上,对吧?但另一部分是,我认为这是测试和异步测试变得非常非常重要的时代,对吧?也就是说,如果你希望它为你完成的任务交付完整的 PR,特别是对于这些较大的任务,你想知道它可以自己测试。而且代理实际上需要这个迭代循环才能做到这一点,对吧?所以它需要能够本地运行所有代码。它需要知道要测试什么。它需要知道要寻找什么。而在很多方面,这只是一个需要解决的更高上下文的问题,对吧?它在测试自己,这就把我们带到了现在。而且,显然,这是一个非常有趣的时刻,因为现在我们正在思考的是,嘿,也许如果不是只做一个任务,而是你知道,我们如何考虑解决整个项目?而且在我们完成一个项目之后,你知道,之后会发生什么?也许我在这里要说的一点是,我们谈论的是每隔几个月发生的那些 2X 的事情,你知道,我认为从宇宙的角度来看,所有的 2X 都看起来一样,但实际上,每一次 2X 实际上都是不同的,对吧?所以,当我们只是进行标签补全、行、单行补全时。它真的只是一个文本问题。它只是像处理到目前为止的单个文件,然后预测那一行文本是什么。在过去的一年或一年半里,我们不得不考虑更多。你如何与人类在 linear 或 slack 中合作,或者你如何接受反馈或指导?你如何帮助人类规划并完成所有这些事情,对吧?而且,显然,还有大量的工具和能力工作必须完成,关于 Devon 如何自己测试?Devon 如何做出这些长期决策?它如何调试自己的输出,或者运行正确的 shell 命令来弄清楚反馈是什么,然后从中开始?所以,现在这个领域有很多更多的编码代理,这非常令人兴奋。看到这一点非常有趣,而且我认为,你知道,我们将在未来 12 个月内看到另外 16 到 64 倍的增长,所以,所以,是的,非常非常兴奋。太棒了。好了,就这些了。非常感谢你们邀请我。太棒了。嗯,谢谢,多么精彩的演讲。嗯,Scott,我们刚刚听了 Devon 的创造者,第一个真正的智能代理之一,对吧?他们用他们的演示震惊了世界。他们是第一个转向自主长篇代理领域的人,这些代理可以运行并实际完成任务。现在我们的下一位演讲者来自谷歌。他是 AI 实验室的 AI PM,他负责 Jules。Jules 是最新的编码代理之一,对吧?所以,他将与我们谈论异步编码代理。当我们从编码助手世界转向自主代理时,我们如何委托我们的工作流程?当有一堆代理在运行时,我们该怎么办?所以,事不宜迟,我想欢迎来自谷歌的 Rustin Banks 来与我们谈谈 [掌声] Jules。太棒了。大家好。我是 Rustin。我是谷歌实验室的产品经理,非常激动来到这里并与大家交流。这真是一个梦想成真。所以,我本质上是一名工程师。这是我的第一个编译器,Borland C++ 3.1。它装在 10 个 5 又 1/2 英寸的软盘上寄来的。我从 AOL 分类广告上订购的。这太棒了。这是我的公告板。我从我父母的壁橱里托管的,以及拼凑起来的电脑。而且我认为很有讽刺意味的是,当我看到 AI 出现时,我完美地认出了基于文本的界面,就像我托管公告板一样。然后当我看到这个时,就像你们中的许多人一样,我把我的职业生涯献给了 AI 编码。这是 chat GPT 3.5。我们觉得它有多慢,这不是很疯狂吗?而这在两年前还是最先进的。这真的很令人惊叹。现在,我是 Jules 的产品经理。Jules 是一个异步编码代理,旨在在后台运行,并同时处理所有你不想做的事情。我们两周前在 IO 上向所有人发布了它,免费提供,而 Josh 在台上试图演示其他谷歌实验室产品。所以他给我们打了电话。我们说,“哦,我们得关掉它。”这样我们才能演示其他产品,而且幸运的是,我们把它启动并运行了。但这是一个非常激动人心的发布,而最棒的部分是看到这些用例,这就是我们真正想解决的问题。我们想做洗衣房的工作,这样你就可以专注于编码的艺术。所以下次 Firebase 更新他们的 SDK 时,Jules 可以为你做到。或者如果你只想从手机上开发,Jules 可以为你做到。所以在过去的两个星期里,我们有 40,000 次公共提交,我们对我们能为开源世界带来的东西感到非常兴奋。但是,作为开发者,我们被设计成串行思考。我们从队列中取一个任务,我们处理它,然后我们继续下一个。这是我们的默认工作流程。今天,我们将学习如何最大化并行代理。我将尝试一个真实世界的演示,我们将通过一个真实世界的用例,然后我将介绍一些我们从观察人们使用 Jules 中学到的最佳实践。所以,为了让这个并行过程真正顺利进行,我们需要在工作流程的开始和结束时更好地利用 AI。也就是说,如果我必须写一堆任务,那整天都不好玩。如果我在一天结束时审查 PR 并处理合并混乱,那也不会很好。所以,幸运的是,帮助正在到来。所以,例如,AI 可以轻松地处理待办事项列表、错误报告,为你创建任务。然后在 SDLC 的末尾,帮助正在到来,我们可以使用批评代理、合并代理,它们可以把所有东西整合在一起,让我们设想的这个并行工作流程能够真正实现,而不是让我们抓狂。远程代理非常适合这一点。我们 IDE 中的代理总是会受到我们笔记本电脑的限制。当你拥有这些云中的远程代理,基本上是代理即服务,它们是无限可 Scalable 的。它们始终连接,然后你可以从任何设备、任何地方进行开发。我们已经看到了两种并行模式的出现。这是我们预期的那种,即多任务处理。哦,我有很多事情在我的待办事项列表中。让我们一次性完成它们,然后我们将合并并测试它们。有趣的是,你今天早上看到了 Solomon 从 Dagger 那里展示的一个例子,他想要同时看到他网站的三种不同视图。这是我们没有预料到的涌现行为,即多种变体。基本上,我们看到用户接受一个任务,特别是如果它是一个复杂的任务,然后说,“试试这个方法,试试那个方法,或者给我这个变体看看,或者多个变体看看。”然后你可以测试和选择。我们可以让代理测试并选择最好的,或者用户可以测试并选择。所以,例如,我们看到很多人正在做一个前端任务测试,他们在 React 应用中,他们说我正在添加拖放功能。也许试试用这个库,react be beautiful drag and drop,或者也许用 dnd kit,或者也许试试用测试优先,在这个并行异步环境中,你可以同时启动多个代理,它们可以尝试,它们可以轻松地重新组合,选择最好的一个,然后你就开始了。好了,演示时间。所以退出这个进行演示。我将使用会议日程网站。Swix 尽管有他所有的技能,正如你所见,他可能没有花很多时间设计日程网站。正如你所见,任何时候出现水平滚动条,我们就知道这是一个问题。但幸运的是,他们知道这一点,他们说我们只是发布 JSON 提要,然后让黑客们去黑客。工程师们做我们该做的事,然后从中构建。所以 Pal love,他在这里,他构建了这个令人惊叹的会议网站,你可以收藏项目,你可以添加书签,这就是我用来跟踪我的会议的。所以我和他发了消息。我说,“嘿,我能克隆这个并用它作为 Jules 的例子吗?”Palv 说,“哦,是的,当然。事实上,我坐在我的最后一个会议上,用我的手机,我用 Jules 修了一个 bug。”所以,我觉得这很完美。所以,这就是我开始做这件事的方式。我会进入 linear,然后我会说,好吧,第一件事,我们刚刚听 Scott 谈到了这一点,就是我想添加一种方法来知道这个并行代理是否会同时做很多事情,并且它做得对。所以,首先我们将添加一些测试。然后我实际上会开始这个,当我想到它的时候。然后利用多变体的想法,我说用 jest 添加它,同时用 playwright 添加它。然后我们将查看测试覆盖率,然后选择测试覆盖率最好的那个。一旦完成,我就可以进入另一种并行模式,我说,我想要一个链接将会议添加到我的 Google 日历。当我点击描述时,我想要一个 AI 摘要。这些都是功能,但我真正兴奋的是 AI 能做那些我们似乎永远做不到的事情,比如可访问性审计和安全审计。所有那些似乎被搁置但实际上很重要的事情。我非常兴奋能让 AI 同时做到这一点。所以,我们还将让它同时进行可访问性审计并提高我们的 Lighthouse 分数。这主要是前端演示,因为,嗯,我主要是前端工程师,而且它具有更好的视觉表示,但我们也看到了所有这些都应用于后端。好了,这是 Jules。我们告诉它添加测试和摄取框架。它连接到我的 GitHub,我所有的 GitHub 仓库,它会给我一个计划。看起来差不多。我可以看到它将测试日历、搜索覆盖层、会议。听起来不错。我可以批准计划。所以,谷歌。所以,Jules 现在在云端有自己的 VM。它克隆了我的整个代码库。它可以运行我能运行的所有命令,而且,重要的是,在它拥有这些测试之后,它可以运行这些测试,这样它就知道当我们添加一个新功能时,它是否做得对。所以,我将稍微快进一下。所以,这是添加 jest 测试。你可以看到它添加到了测试中的所有内容。它添加到了 readme 中。所以下次它去添加东西时,它会查看 readme 并提醒自己,哦,这是运行测试的方法。让我们看看它的测试覆盖率。好的,我们下降到了,看起来大约估计的测试覆盖率看起来大约是 80%。这相当不错。我们可以将其与 playwright 进行比较,然后选择我们最喜欢的那个。我们将它合并到 main 中,然后我们就开始了。所以,这再次自动集成到 GitHub 中。我们将它合并到 main 中,然后我们就可以开始说,好吧,现在我想要一个日历链接。所以,我想要一个日历按钮,Jules 将会处理它。然后果然,它运行了测试。测试第一次没有通过。它做了一些更改。现在测试通过了。我可以审查这段代码。最终我可以在 Jules 的浏览器中查看它。但我对测试它很有信心,因为我知道所有测试都通过了。同样对于 Gemini 摘要,当我点击描述时,我可以获得 Gemini 摘要。我把它放在一个模拟器中,或者我模拟了一个移动视图,这样我就可以从手机上做到这一点。所以,这正在进行可访问性审计,修复手机上的任何问题。别管控制台错误了。Jules 会修复它们。然后我可以回去。我可以,现在我们有一个大的合并需要做。说实话,我没有时间完成合并。而 Jules 应该帮助我完成这个合并。它被称为章鱼合并。所以,当然,Jules 作为一只鱿鱼应该帮助处理章鱼合并。但让我们快速查看一下我的添加到日历按钮。回到这个 localhost。刷新。现在我有一个日历按钮。让我们测试一下。好的,让我们把它添加到我的日历中,以确保我知道来参加我自己的讲座。它就在我的日历上。然后我就可以再次把它拉回到主分支,现在会议上的每个人都可以将会议添加到他们的 Google 日历中,以及我们看到的所有其他东西,完整的测试套件,所有可访问性审计,Lighthouse 分数改进,而这花了大约一个小时,并管理了后端并行过程。好的,所以,理论上,总结一下,并行工作的秘诀是清晰的成功定义,因为没有人想整天审查 PR。所以,在开始之前想一想,我将如何轻松地验证它是否有效?再次,Scott 也提到了这一点。与代理达成协议。告诉它,在看到这个之前不要停止,或者在它起作用之前不要停止。然后在最后有一个健壮的合并和测试框架来把所有东西重新组合起来,并且帮助正在到来。这就是我为 Jules 提示的方式。我给它一个任务的简要概述。我告诉它,当它知道它做得对时,任何有用的上下文,然后我会在最后附加一个简单的广泛方法,然后我可能会根据任务的复杂性更改最后一行两到三次。所以,例如,如果我需要每天记录这个网页上的这个数字,我会说今天的数字是 X。所以,将数字记录到控制台,并且在数字是 X 之前不要停止。这是一个我写的简单测试。它会继续下去。我给它一个有用的上下文,比如这是搜索查询。然后我会说使用 puppeteer,然后我会克隆那个任务,因为我可以。它在云端,我会说使用 playwright。所以,再次,拥有丰富的心态。但我们习惯于一次处理一件事。易于验证意味着我们现在可以同时处理多件事情。尝试很多事情。正如我们今天早上看到的,查看不同的变体。我们可以通过并行过程,我们可以尝试我们以前从未尝试过的事情。让 AI 帮助处理这些开头和结尾,任务创建,然后是合并和测试部分以及上下文。继续使用 MD 文件或文档链接来获取入门文档。上下文越多越好。然后我们告诉人们,把所有东西都扔进去。Jules 和其他代理非常擅长实际区分哪些上下文是重要的。所以,更多的上下文更好,但也许这只是对于 Gemini 模型,我应该提到。Jules 由 Gemini 2.5 Pro 提供支持。快速致谢。感谢 Jules 团队。没有你们我什么都做不了。如果你有任何问题,可以 DM 我。我是 Rustin Banks。X 上的 Rustin B。谢谢大家。太棒了。很高兴听到最新的编码代理之一,而且总是很高兴得到一次回顾。你知道,即使我也不知道如何提示这些东西,但我喜欢这个流程。我们从 Cognition 开始。我们有了 Devon,第一个真正的 SU 代理之一。然后我们有了最新的一个。我们刚刚听了谷歌关于 Jules 的介绍。让我们再回到过去。让我们听听 GitHub 的介绍,第一个编码助手之一,对吧?所以,让我们听听未来,你知道,我们仍然想如何看待 GitHub Copilot?所以,事不宜迟,我想欢迎 Christopher Harrison 来到舞台上,向我们介绍 GitHub Copilot。好的,让我们直接开始。所以,我的名字是 Christopher Harrison。我是 GitHub 的高级开发者倡导者,主要专注于这个叫做开发者体验,或者正如所有酷孩子喜欢称之为 DevX,以及 GitHub Copilot。所以,让我们谈谈 GitHub Copilot 的过去、现在和未来。哎呀。嗯,嗯,实际上它根本没有被拾取。嗯,哦,好了。嗯,让我嗯,整个开始镜像。好了。酷。看看那个。好了,让我们开始吧。所以,我们开始的时候是代码补全。所以,有了代码补全,我是一名开发者。我正处于状态。打字打字打字。然后 C-pilot 将会建议下一行,下一块,下一个函数,甚至可能下一个类。这对于为我们的开发者提供及时的在线支持非常棒。但正如我们都知道的,我们要完成的任务不仅仅是写几行我需要的代码,我需要能够探索。我需要能够提问,我需要能够修改多个文件。所以,这就是聊天发挥作用的地方。我们开始聊天是通过支持问答模式,在那里我可以进去提问,或者让 co-pilot 为我生成单个文件。然后我们将其扩展到编辑模式。通过编辑模式,我可以驱动 copilot 来修改多个文件。因为当我们想到即使是最基本的更新时,我将更新一个网页。这将需要更新我的 HTML、我的 CSS 和我的 JavaScript,三个文件。通过编辑模式,我可以非常快速地做到这一点。而且再次,就在聊天中。然后我们进入代理模式。代理模式确实改变了情况,因为与聊天不同,我进去提问,我进去指向我想要修改的文件,而通过代理模式,它能够代表我执行这些操作。而且,最重要的是,它的行为非常像一个开发者,它会进去,进行搜索,找到它需要做的事情,执行这些任务,甚至能够执行外部任务。所以,它可以运行测试,检测到这些测试可能失败了,然后甚至可以自我修复。所以,我有一个应用程序,我想创建几个新的端点。所以,我要做的第一件事是,我将在这里添加一些上下文。所以,指令文件允许我为 Copilot 提供一些关于我正在做什么以及我想要如何完成它的额外信息。所以,我有一个关于我的端点的特定指令文件。现在,这绝对是代理模式可以自己弄清楚的一种情况。但是,正如我喜欢说的,不要对 copilot 采取被动攻击的态度。如果有一条信息很重要,你想让它考虑,那就告诉它,它可能自己就能弄清楚,但这肯定会让生活更轻松。所以,现在我已经添加了这个,我将说创建嗯嗯嗯端点来列出发布者并按 ID 获取发布者。创建测试,确保所有测试都通过,然后发送。现在我正在进行 AI 的现场演示,所以我们将看看会发生什么。有可能它会失败。有可能它会惨败,但也有可能一切都会成功。而这正是我希望的。现在,如果我看看 Copilot 在做什么,我将看到,正如突出显示的,它的行为非常像一个开发者,它告诉我它要做什么。它将创建列出所有发布者的端点,按 ID 获取发布者。所以,它要做的第一件事是探索项目,弄清楚发生了什么。然后它将创建端点。然后它将创建测试。然后它将确保一切正常。现在,如果我继续向下滚动,我会注意到它正在搜索我的代码库,因为如果我作为开发者被分配执行这项任务,那将是我首先要做的事情。而这正是 Copilot 在这里所做的。它创建了我的 publishers PI 文件。它寻找碰巧匹配发布者的路由。现在它将在这里创建端点。所以,如果我再停一会儿,移动我的鼠标让它更快一点。看,它奏效了。我们将注意到它现在将生成 publishers pi 文件。而你将注意到的一个重要事情是,我这里有很棒的保留和撤销按钮,因为我总是喜欢强调 AI 并不会改变 DevOps 的基本原理。如果我想到在 AI 之前我如何编写代码,其中一些是凭空想出来的。其中一些是基于现有代码。其中一些是从 Stack Overflow 复制粘贴的,然后做了一些更改,然后祈祷它能奏效。也许只有我一个人。为了确保我将提交到我们代码库的所有代码都是安全的,并且按照我们想要的方式编写,我们有代码审查,我们有 linter,我们有安全检查。即使我们引入了 AI,我们也将做所有这些相同的事情。所以,这个保留和撤销功能让我能够非常快速地确保一切看起来都不错,如果不好,能够撤销它。我们还将注意到上面的历史按钮,它们允许我进行迭代,因为再次,当我与 AI 合作时,我可能第一次就得不到完美的代码。所以我可以进去,我可以来回工作。所以我可以说,“嘿,这看起来不错,但我想做这个。”也许我想让按钮看起来是蓝色的,或者其他什么。然后突出显示它。所以,我现在将看到的是它创建了所有文件,更新了几个项目,然后它就可以运行我的测试了。这将是少数几个我有点希望它失败的时刻之一,因为我想看到它能够为我恢复。所以,你会注意到它运行了我的测试。你会注意到它运行了我的四个测试。一切都成功了。真可惜。然后它将继续从那里迭代。所以,我们看到的是代理模式,Copilot 在编写我的代码方面处于领先地位。但我总是想强调的是,我作为开发者仍然是主导者。现在唯一的 catch 是代理模式,那就是它将在我的 IDE 中,而且它仍然是单线程的。它是同步的。这就是我们进入编码代理的地方。而有了编码代理,这将是完全异步的,并且将在服务器上运行。所以,让我切换到一个我今天早上实际运行过的例子,我有一个问题被创建了,我说添加、编辑和删除端点。现在,我将快速地取消分配 copilot,这样我就可以启动工作流程,这样我们就可以看到它的实际运行。我将让那些可爱的小眼睛消失。好了。然后让我们回去并重新分配。所以,通过分配 copilot,我现在已经启动了编码代理。我现在可以看到小眼睛,这表明 copilot 正在努力工作。如果我向下滚动,我现在将看到一个全新的拉取请求。而这现在将是 Copilot 用来帮助我了解它正在执行的工作。如果我再向下滚动一点,我还将看到一个“查看会话”按钮。如果我点击这个“查看会话”按钮,我可以看到它正在启动一个开发环境。这就引出了一个非常大的问题,那就是它在哪里运行?我如何确保它能够安全地完成?所以,它正在 GitHub Actions 中运行。如果你还不熟悉 GitHub Actions,这是我们的自动化平台。事实上,我可以配置我希望我的编码代理工作的环境。通过创建一个专门的工作流程来完成。而这正是我在这里看到的,这个 copilot setups。如果我向下滚动,我将注意到我有一些安装 Node 的步骤,我有一些安装 Python 的步骤以及所有我们将使用的框架和库。现在,这不仅确保了 copilot 在我想要的环境中工作,而且它还允许我强调,默认情况下,编码代理无法访问任何外部资源。所以,它无法调用互联网。它无法调用任何外部服务。现在,如果我愿意让它能够做到这一点,那么我可以去配置 MCP 服务器,我也可以添加防火墙更新。这样我就可以在防火墙上打个洞,让 Copilot 能够访问这些外部资源。但默认情况下,它只能访问我配置的以及容器内的内容。此外,由于它运行在 GitHub 工作流程中,在 GitHub Actions 中,它将是一个临时环境。所以,它将启动一个全新的环境,一旦它的工作完成,它将删除它。继续沿着安全路径前进,让我再往回翻一页。如果我向下滚动,你还会注意到它甚至无法自动启动任何工作流程。所以,我有一些与此存储库相关的工作流程,用于运行我的单元测试和运行端到端测试。默认情况下,除非我进去说“是”,否则它无法做到这一点。你还会注意到它创建的拉取请求将处于草稿模式,我必须进去审查它,因为再次,开发者是主导者,因为我们只是因为我们引入了 AI,这并不改变正常的 DevOps 流程。现在,如果我看一下之前创建的那个,让我打开它。我将注意到一个拉取请求,其中有一个关于它所做的一切的精彩描述。所以我可以看到 PR 实现缺失的创建操作。我可以看到它列出了它创建的所有不同的端点,错误处理,测试和技术细节。我还可以再次打开我的会话,看到它执行的所有任务。而且你会再次注意到,它的行为非常像一个开发者,它会出去,它会搜索我的代码库,确定需要做什么,然后最终执行任务。如果我一直滚动到最后,在哪里?找到了。太棒了。我现在可以看到,我在底部有一个很好的小总结。如果我向上滚动,我应该能看到它运行了我的所有测试。是的,我在这里可以看到我所有的测试。而且我可以看到,在这种情况下,所有 16 个测试都通过了。所以,它创建了 PR,然后我也决定,好吧,所有这些看起来都不错。所以我允许它运行操作,我现在甚至可以看到它运行了单元测试,运行了端到端测试,一切看起来都很好。然后我可以把它标记为“准备审查”,然后完成它的创建。我最后想强调的一点是,这既涉及到安全方面,也把我带回了开发者方面,那就是我们会注意到它创建了一个全新的分支。在这种特定情况下,它被称为 copilotfix-3。它的来源是,与此相关的问题编号是问题编号三。所以,Copilot 只对该分支有写入权限。而这个分支的行为将与我可能拥有的任何其他分支一样。所以,如果我将存储库克隆到本地,我可以签出该分支。我已经在这里打开了 GitHub 中的分支。让我向下滚动到我的服务器。如果我在这里向下滚动。声音效果有帮助。顺便说一句,我们将注意到的是,这是我的更新游戏。我认为我的创建游戏在这里。是的,就在那里。然后一切都在那里。但是,再次,它只在那个分支内。所以,这是编码代理唯一有写入权限的地方。现在,这引出了一个非常大的问题,那就是,好吧,那太棒了,克里斯托弗。你创建了一个嗯,一个小的嗯,简单的演示。你不得不创建几个 flask 端点,这很好,但如何在现实世界中做到呢?嗯,我们在 GitHub 的一个重要原则是,我们在 GitHub 上构建 GitHub。事实上,编码代理是在编码代理的帮助下构建的。当你查看进入编码代理的提交数量时,你会注意到编码代理本身就是最 prolific 的提交者之一。编码代理不仅创建了新功能,还帮助解决了技术债务,而这正是我个人认为编码代理真正闪光的地方,因为我不知道有任何组织没有技术债务,他们对他们的待办事项列表的状态感到满意,他们没有无限数量的项目,他们一直在说“是的,那很好,但我们就是没有时间”你可以假设嗯,快速浏览一下,正如我所强调的,安全环境、独立平台、临时环境,所有都在 GitHub Actions 中运行,并且你有能力自定义编码代理确实了解你的存储库并理解你的 GitHub 上下文,所以它有权读取你的存储库,它甚至能够读取 copilot 指令,并且它确实有模型上下文协议的访问权限,所以它可以进行外部调用。它确实包含了安全措施,对你的存储库的只读访问,默认防火墙阻止任何外部访问,合并前审查,以及在操作运行前审查。所以,我们继续迭代 C-pilot。我们继续寻找 Copilot 可以闪光的新领域,以帮助简化开发并提高开发者的生产力。谢谢。 [掌声] 太棒了。谢谢你,克里斯托弗。我们喜欢听到,你知道,一些智能代理领域的主要参与者。所以,听到一些大玩家的介绍总是很好。我们想继续这个主题,你知道,我们如何真正将它们投入生产?所以,我们的下一位演讲者 Tomas 将与我们谈论外循环。所以,我们如何处理实际部署和使用这些软件工程代理?我们如何管理所有 CI/CD 管道?我们应该如何处理使用这些东西?所以,我想在这里稍微休息一下,谈谈实际正在发生的事情,软件工程代理的创新正在以相当快的速度发展,就像我们有了 Jules,我们有了 CodeX,我们有了 Cloud Code,随着我们拥有越来越多的软件工程代理,它们真正改变了我们编码的工作流程,我们如何处理实际部署它们?所以,我们有一个接下来的演讲者阵容,他们将更详细地谈论这一点,而且,你知道,我们只是想设定一下舞台。所以,让我们让它变得更具互动性。嗯,我们今天对这个赛道的感受如何?谁一直是 Jules 的粉丝?我想看看,主要的有哪些?所以,在座的各位,谁用过 Devon?让我们看看。举手粉丝。好的。好的。我们有一些 Devon 用户。那 Jules 呢?我们感觉如何?谷歌的 Jules?好的。同样的手。那 Cloud Code 呢?我们稍后会有一位来自 Cloud Code 的演讲者。好的,更多手,但不同的手。看起来我们有点区分。那 OpenAI 的 codecs 呢?哦,又有一组手。所以,有趣。你知道,我们有不同的核心助手,而且
看起来人们使用它们的方式不同,但我们也喜欢看到事物的另一面,对吧?嗯,所以我们有了 Devon。这里有多少人是 Devon 的粉丝,并且使用 Devon 的认知?来自 um Devon 的认知。好的,所以我们又有一批举手的人了。而且,你知道,有一点值得注意的是,我们有这些不同类别的代理,对吧?嗯,关于“人在回路”的短期代码助手呢?谁在这里的日常编码任务中使用 Cursor 和 Wind Surf?啊,更多的人举手了。所以,这是一个有趣的分割,对吧?我们有这些“人在回路”的短期编码助手,我们有像 Windsurf 的 Cascade 这样的东西。我们有 um Cursor 的助手,几乎所有人都举手了,对吧?很多人开始在他们的 IDE 中使用这些助手。然后我们把它提升到一个新的水平。我们有,你知道,我们有那些大玩家,我们有 Cloud Code,我们有 Jules,我们有 Codec。一个有趣的点是,你知道,每个人都有自己的类别。举手的人不是同一批人。所以,这也是为什么在会议上我们喜欢邀请来自各地的演讲者。现在,第三类,你知道,Devon,这是另一种思考方式。就像你有更长周期的代理一样,我们如何处理它们?而这正是我们开始利用一天后半部分的时间来处理 SWU 代理的地方。我们想谈谈如何将这些东西投入生产?我们如何实际部署它们?而且,为了引出这个话题,我想邀请我们的下一位演讲者 Tomas Ramirez。他将向我们介绍一些相关内容。他来自 Graphite。那么,事不宜迟,让我们欢迎 Tomas。非常感谢。完美。大家好。嗯,看,这两个都不需要。非常感谢。然后是幻灯片。看起来不错。酷。完美。太棒了。呃,大家好,我叫 Tomas。我是 Graphite 的联合创始人之一。Graphite 是一家人工智能代码审查公司。所以,为了提供一些关于我们目前行业状况以及我们认为它将走向何方的背景信息,软件开发目前以及一直以来都有两个循环。内部循环专注于开发,外部循环专注于审查。开发人员在内部循环中花费时间。他们让代码正常工作。他们按照想要的方式实现功能,然后他们继续将其移至外部循环,在那里进行测试、审查、合并、部署。我们看到内部循环的变化比以往任何时候都更加剧烈。比以往任何时候都更多的开发人员正在使用人工智能。我认为这里有一些来自 GitHub 开发者调查的统计数据。几乎所有接受调查的开发人员都在工作内外使用人工智能工具。GitHub 上 46% 的代码是由 Copilot 编写的。我们看到越来越多的代码由人工智能编写。这里有一些关于代码如何随时间变化以及一些人如何预测它将如何变化的统计数据。即使我们采取更悲观的观点,我们仍然看到世界的发展方向是越来越多地由人工智能编写代码。内部循环正在改变。你知道,人工智能正在提高开发人员的生产力。开发人员现在生产的代码量更大。但这些代码仍然需要审查。当我们第一次开始研究这个问题时,大约一年前,当我们开始构建 Diamond AI 代码审阅器时,我们发现我们阅读了许多让我们非常害怕的文章。我们在自己的组织中看到许多开发人员正在采用人工智能工具。但我们也看到了一个问题。人工智能会产生幻觉。它会犯错误。更可怕的是,它可能会引入安全漏洞。对我们来说,我们看到的是,虽然内部循环因人工智能而加速,但外部循环迅速成为瓶颈。嗯,我们看到像 Cursor、Wind Surf、Copilot、Vzero、Ball 这样的工具,它们产生的代码量比我们习惯的、比我们以前见过的都要大。但我们也看到我们的开发人员突然不得不审查更多的代码,测试更多的代码,合并更多的代码,部署更多的代码。这就是促使我们说“这里必须有一个新的外部循环”的原因。照这样下去,这行不通的。我们会崩溃。我们看到曾经只困扰大公司的问题现在开始困扰所有公司,我们看到公司处理的代码量越来越大。新的外部循环的要求看起来很像大公司一直以来都必须处理的问题。您需要工具来更好地确定拉取请求的优先级、跟踪它们并获得通知。您需要驾驶员辅助功能来帮助审阅者专注于并简化代码审查过程。您需要优化的 CI 管道和合并队列,以便能够处理现在正在发生的庞大代码更改量,并且您需要更好的部署工具。嗯,当我们第一次从“人工智能优先”的角度来看待这个问题时,我们开始看到,虽然问题是由人工智能造成的,但它们也可能由人工智能解决。我们可能可以开始简化许多以前是手动进行的流程,以前是开发人员不喜欢、不想做的流程的一部分。嗯,我们希望看到自动驾驶的代码审查解决方案,这样我们就无需再进行那些非常手动且痛苦的审查部分,而是可以真正专注于对开发人员最重要的方面,确保您的产品能够交付给用户,并且功能按预期工作。嗯,我们看到人工智能生成的反馈并不完美。因此,我们开始认为机器人是不够的。我认为我们早期的一个愿景是,我们能否仅仅通过添加人工智能队友来解决这个问题?也许是后台代理,也许是审阅者,也许是工作流程中的许多队友。虽然我们认为这是故事的一部分,但我们认为这还不够。我们认为,正如我们用 Diamond 构建的那样,您的整个工具链必须是人工智能原生的,而不仅仅是您的 IDE。如果您真的要在开发时代拥抱人工智能,如果您要接受开发人员的生产力将比以往任何时候都高出几个数量级这一事实,那么您就需要能够反映这一点的工具。我们从构建 Diamond 开始。因此,获胜的人工智能代码审查平台具有高信号、低噪声,对代码库和更改历史有深入的了解。我们总结、优先排序并审查每一项更改。我们与您的 CI 和测试基础设施集成,以纠正 um 以总结错误并纠正故障。嗯,我们对此的希望以及我们在将其推广到越来越多的客户和企业时开始看到的情况是,我们缩短了代码审查周期,我们强制执行质量和一致性,并且我们保持您的代码私密和安全。嗯,它信号高,零设置,具有一键式建议,并且可自定义。它已经被世界上一些发展最快的公司所使用。它的扩展速度比我们公开说的要快得多。嗯,我希望你们都能接受人工智能可以改变您的整个开发人员工作流程,而不仅仅是您的 IDE 的想法。嗯,从数字上看,我们看到我们的 AI 机器人留下的评论的下载率为 4% 以下,并且被接受(即集成到拉取请求中)的比例高于人类评论。人类评论的集成率约为 45% 到 50%。我们看到我们的 Diamond 评论被接受的比例约为 52%。我们花了很多时间来调整这个数字。这个数字实际上是我们在 3 月份才有的。嗯,这就是我需要告诉你们关于 Graphite 的信息。嗯,我需要告诉你们关于 Diamond 的信息。我希望你们试试,谢谢你们邀请我。 [掌声] 太棒了。再次感谢 Thomas 带来如此精彩的演讲。呃,我们要感谢大家来到 SU Agents Track。我们将休息一下。午餐将在大厅供应。展会开放。但是,你知道,事不宜迟,我们非常高兴地宣布,晚上,你知道,我们还有四个完全充实的会议。嗯,我认为我们是唯一一个完全预订的赛道。所以我们有全部八位演讲者。嗯,我们很快就会有一系列精彩的演讲者。所以请随时回来。我们将从 um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um
Open Hands,它会是那个“张开双手”的标志,嗯,在那个拉取请求旁边。嗯,这导致了两个问题。第一,这意味着触发那个拉取请求的人可以自己批准它,基本上绕过了我们整个代码审查系统。在合并之前,你不需要第二个人的参与。嗯,第二,很多时候那些拉取请求就会被搁置。嗯,没有人真正为它们负责。嗯,如果有一个单元测试失败了,没有人会跳出来确保测试通过。嗯,它们就会在那里一直放着,要么不被合并,要么即使被合并了,出了问题,代码实际上也无法工作。我们真的不知道该找谁,然后说,你知道,谁造成的?没有人可以为那个破坏负责。嗯,所以现在如果你用“张开双手”打开一个拉取请求,你的脸就会出现在那个拉取请求上。你负责让它被合并。你负责它将来可能造成的任何破坏。很棒。然后,嗯,我确实想通过回顾一些用例来结束。嗯,这总是一个棘手的话题,因为代理是很好的通才。它们可以,它们可以假设做任何事情,只要你把事情分解成它们可以处理的、一口大小的步骤。嗯,但是在那,嗯,本着从小处着手的精神,我认为有很多用例是代理非常棒的“第一天”用例。我最喜欢的是解决合并冲突。这是我工作中最大的苦差事。嗯,“张开双手”本身就是一个发展非常迅速的代码库。嗯,我说我做的几乎没有一个拉取请求是没有合并冲突的。嗯,我喜欢能够介入并说在“张开双手”,修复这个拉取请求上的合并冲突。嗯,它进来,你知道,这是一个非常例行的任务。通常很明显,你知道,之前发生了什么变化,这个拉取请求中发生了什么变化,这些变化的意图是什么?而“张开双手”通常能以 99% 的准确率完成这项工作。嗯,处理拉取请求反馈也是一个很棒的功能。嗯,这个很棒,因为别人已经花时间清楚地阐述了他们想要改变什么,而你所要做的就是说“在‘张开双手’,照那个人说的做”。嗯,而且,你知道,你可以在这个例子中看到,“张开双手”完全按照这个人的意愿做了。我不太懂 React,嗯,我们的前端工程师说“做 x、y 和 z”,他提到了一堆我不知道的流行语。“张开双手”都知道,嗯,并且能够完全按照他想要的方式处理他的反馈。嗯,修复一些小的错误。嗯,你知道,你可以在这个例子中看到,我们有一个输入框,嗯,它应该是一个数字输入框,但却是一个文本输入框。嗯,如果我不懒,我本可以深入我的代码库,找到正确的文件。嗯,但对我来说,直接从 Slack 中快速完成这项工作非常容易,嗯,只需说“在‘张开双手’,修复我们刚才谈到的这个东西”。嗯,而且,你知道,我甚至不需要启动我的 IDE。嗯,这是一种非常非常有趣的合作方式。嗯,基础设施的改变我真的很喜欢。嗯,通常这涉及到在 Terraform 文档之类的东西中查找一些非常晦涩的语法。嗯,“张开双手”以及,你知道,底层的 LLM 往往会知道正确的 Terraform 语法,如果不知道,它们可以使用浏览器查找文档。嗯,所以这些东西,嗯,真的很棒。有时我们会在 Slack 中收到一个内存不足的异常,然后立即说“好的,‘张开双手’,增加内存”。嗯,数据库迁移是另一个很棒的功能。嗯,这是我发现我经常会忽略最佳实践的一个方面。我不会在正确的地方添加索引。我不会以正确的方式设置外键。嗯,LLM 通常在遵循数据库迁移的所有最佳实践方面做得非常好。所以,同样,这对于开发人员来说是一种例行的任务,不是很有趣。嗯,嗯,LLM 在这方面做得很好。嗯,修复失败的测试,嗯,就像在拉取请求上一样,如果你已经完成了 90% 的工作,而只是因为一个破坏性的 API 更改导致一个单元测试失败,那么很容易调用一个代理来清理那些失败的测试。嗯,扩展测试覆盖率是另一个我喜欢的方面,因为它是一个非常,嗯,安全任务,对吧?只要测试通过,嗯,通常就可以安全地合并它。所以,如果你注意到代码库中的某个地方,你觉得,“嘿,这里的覆盖率非常低。”只需让你的代理,嗯,在代码库的那个区域扩展你的测试覆盖率。嗯,这是一个很好的快速胜利,可以使你的代码库更安全一些。然后是每个人都喜欢的从头开始构建应用程序。嗯,你知道,我会说,如果你要发布生产代码,再次强调,不要只是“随意编码”就构建一个生产应用程序。嗯,但我们在公司内部越来越多地发现,很多时候我们想构建一个小的内部应用程序。嗯,例如,我们构建了一种方法来调试“张开双手”的轨迹,调试“张开双手”的会话。嗯,我们构建了一个完整的 Web 应用程序,因为这只是一个内部应用程序,我们可以稍微“随意编码”一下。我们不需要审查每一行代码。它实际上并不面向最终用户。嗯,这已经成为我们业务中一个非常非常有趣的事情,能够快速地生成这些应用程序,只是为了满足我们自己的内部需求。嗯,所以,是的,嗯,绿色地带是代理的一个非常非常棒的用例。嗯,这就是我所拥有的。嗯,我们很乐意大家加入“张开双手”社区。你可以在 GitHub 上找到我们,all handsaiopenhands。嗯,加入我们的 Slack,Discord。嗯,我们很乐意与你一起构建。太棒了。太棒了。好的。再次感谢你,罗伯特。听到编码代理的成功和失败之处真是令人非常非常兴奋。现在,我想花点时间停顿一下。我们接下来的几场演讲将改变焦点。我们的下一位演讲者是来自 Imbue 的 Josh Albert,他将就一个元话题进行演讲。他将进行一个关于 Sculptor 的案例研究。Sculptor 是他们验证 AI 编码代理是否真正输出正确代码的一种方式。我们总是听到,我们如何从原型到生产。我对此负有责任。我去年就做过这个演讲,但是,你知道,我们总是听到如何从原型到生产?你需要一个人的参与。如何从随意编码到真正的生产级代码?而除了技术债务之外,Josh 是那些深入研究并构建 Sculptor 来解决这个问题的人之一。所以,对于我们接下来的演讲,你知道,他将通过一个案例研究,在你构建编码代理时,你如何与之一起发布一些东西?你如何更好地验证正在发生的事情?关于 Josh 的更多背景。Josh 是我认识一年多的朋友。我们深入讨论过编码代理。他在这个领域非常深入。他以前在 Leaden Space 播客上出现过。所以,如果你想,你知道,听到更多,请随意收听播客。和其他许多演讲者一样。来自 Cloud Code 的 Boris 也来过。但是,废话不多说,我很快就要请 Josh 上来了。我得再拖延一些时间。我们有点提前了。所以,嗯,是的,让我们实际举手。这里有多少人已经开始在生产环境中实际发布 sui 代理了?所以,除了在你自己的编码工作流中使用它们,除了使用 co-pilots 之外,有多少人实际上发布了一个版本的 co 编码 co-pilot?谁直接从事这些工具的工作?好的,我们有几个人。所以,让我们更好地了解大家在做什么。这里的人们是在这个会议上吗?我们是想学习如何更好地使用 co-pilots?如何将它们投入生产?如何构建它们?关于它们我们应该知道什么?因为 Josh 的演讲有点像一个案例研究。所以,这里有多少人处于积极使用 co-pilots 的阶段,有点随意编码并试图将其提升到一个新的水平?好的。好的。那里有更多的人举手了。所以,Josh,给你更多的背景。所以,让我们从那里开始。嗯,Josh,我想我们已经准备好让你了。太棒了。谢谢。嗯,一秒钟。好的,太好了。嗯,是的,很高兴来到这里。我是 Josh Albertch,Imbue 的首席技术官。嗯,我们的重点是制造更健壮、更有用的 AI 代理。特别是,我们目前专注于软件代理。而我们今天正在开发的主要产品叫做 Sculptor。Sculptor 的目的是帮助我们解决我们都经历过的问题。你知道,我们都尝试过这些随意编码的工具,然后,你,你知道,告诉它去做某事。它去为你创造了一堆代码。嗯,然后,你知道,瞧,你完成了,对吧?嗯,不完全是。就像至少今天,从你得到的东西和你想要发布到生产的东西之间存在一个巨大的差距,特别是当你从原型开发转向更大、更成熟的代码库时。所以今天我将介绍一些技术决策,这些决策影响了 Sculptor 的设计,我们实验性的编码代理环境,并回顾一些我们探索过的想法和我们实现的功能的背景和动机。它仍然是一个研究预览版,所以这些功能在我们实际发布之前可能会发生变化。嗯,但我希望,你知道,无论你是使用这些工具的个人,还是你自己开发这些工具的人,你都会发现我们从实验中获得的这些学习对你自己有用。所以今天,如果你正在考虑如何让编码代理变得更好,那么你可以构建的东西有无数种。你可以构建一些有助于提高在非常大的上下文窗口上的性能的东西。你可以制造一些更便宜或更快的。你可以制造一些在解析输出方面做得更好的东西。但我认为我们实际上不应该构建任何这些东西。我认为我们真正想要构建的是更具体到用例或问题域或你真正擅长的东西。我刚才提到的绝大多数事情将在未来 3 到 12 到 24 个月内得到解决,因为模型会变得更好,编码代理会变得更好等等。所以,我认为,你知道,就像你不想自己制作数据库一样,我认为我们不想花很多时间处理那些将会得到解决的问题,而是我们想专注于对我们、对我们的业务真正重要的问题的特定部分。所以,在 Impu,我们关注的问题基本上是“这个 diff 有什么问题?”你得到一个编码代理输出,它告诉你,好的,我添加了 59 行新代码。它们好吗?嗯,现在你面临一个尴尬的选择,要么自己查看每一行,要么直接合并,然后寄希望于最好的结果。嗯,这两者都不是一个真正好的选择。所以我们试图给你第三个选择。嗯,目标是通过允许另一个 AI 系统来查看它并理解,嘿,是否存在任何竞态条件?你是否在那里留下了你的 API 密钥等等,来帮助建立用户信任。所以,我们想考虑如何利用 AI 工具,不仅用于生成代码,还用于帮助我们建立对代码的信任,我们思考的方式是识别代码中的问题,因为如果没有问题,那么它可能就是高质量的代码,而这基本上就是高质量代码的定义。如果你从学术角度来看,人们通常衡量软件质量的方法是查看缺陷的数量,他们会看,修复一个特定缺陷需要多长时间,或者这个特定技术捕获了多少缺陷。所以,这是我们至少在思考如何制造高质量软件时所遵循的定义。然后,如果我们考虑,你知道,软件开发过程,你想要做的是尽早识别这些问题。所以,Sculptor 不作为一个拉取请求审查工具工作,因为那是在过程的后期。相反,我们想要一些同步和即时的东西,并提供即时的反馈。一旦你生成了代码,一旦你改变了那一行,你就想知道,它有什么问题吗?这对于你修复以及代理修复来说都更容易。那么,有哪些方法可以防止 AI 生成的代码出现问题呢?我们将通过五种不同的方式来介绍。嗯,第一种是学习规划,或者抱歉,只有四种不同的方式。学习规划、编写规范和拥有非常严格的风格指南。我们将看到它们如何在 Sculptor 中体现。所以,当你使用编码代理时,如果你想防止问题,你想做的第一件事就是了解现有的东西。我们在 Sculptor 中努力让这件事尽可能容易,通过让你提问,让它进行研究,获取关于存在哪些技术等等的答案。其他人是如何解决类似问题的,这样你就不会重复已经存在的工作。接下来,我们想考虑如何鼓励人们从规划开始。这是一个小的示例工作流,你可以,你知道,启动代理去做一些简单的事情,比如,你知道,实现这个 Scrabble 求解器,并更改系统提示,强制 AI 代理首先进行规划,而不编写任何代码。然后你可以等待一段时间。它会生成计划。嗯,然后你可以再次更改系统提示,说,好的,现在我们可以实际创建一些代码了。所以,我们很容易就可以更改这些类型的编码代理本身的元参数。当然,你也可以直接告诉代理去做。但是通过更改其系统提示,你可以更强烈地迫使它改变其行为。你可以通过创建自定义代理来构建更大的工作流,这些代理总是先规划,然后总是编写代码,然后总是运行检查等等。第三,你想把编写规范和文档作为工作流的一个主要部分来考虑。过去,我通常不写大量规范和文档的主要原因之一是,保持它们全部最新,花费所有这些时间打字,如果我已经知道代码应该是什么样子,这有点烦人。但如果你想让编码代理真正了解你正在做的项目的上下文,这一点很重要,因为它们无法访问你的电子邮件、你的 Slack 等等。即使它们可以,它们可能也不知道如何将其转化为代码。所以,在 Sculptor 中,嗯,我们试图让这件事更容易的一种方式是帮助检测代码和文档是否已过时。因此,它降低了编写和维护文档和文档字符串的门槛,因为现在你有了一种更自动化的方式来修复不一致之处。它还可以突出显示相互冲突的规范部分或不一致之处,从而更容易确保你的系统从一开始就具有意义。最后,你需要有一个非常严格的风格指南并努力执行它。即使你只是在进行常规编码,而没有 AI 代理,只是与其他人一起编码,这一点也很重要。但 Sculptor 的一个特殊之处在于,我们提出了建议,你可以在这里看到,这有助于将 AI 系统保持在一个合理的轨道上。所以,这里它强调你可以,你知道,使这个特定的类不可变以防止竞态条件。这是来自我们的风格指南吗?我们试图鼓励编码代理和我们的团队成员以更函数式、不可变的方式编写代码,以防止某些类别的错误。我们还在开发一个定制的风格指南,专门针对 AI 代理,使其更容易避免它们通常会犯的一些最严重的错误。但是,无论你采取多少措施来防止 AI 系统首先犯错误,它都会犯一些错误。有很多事情我们可以做来防止或检测这些问题,并防止它们进入生产环境。所以我们将在这里介绍三种。嗯,第一种是运行 linter,第二种是编写和运行测试,第三种是询问 LLM。嗯,我们将深入研究每一种,看看它们如何在 Sculptor 中体现。所以,对于第一种运行 linter,有很多现有的自动化工具,比如 rough 或 my pylind py 等,你可以用它们来自动检测某些类别的错误。在正常的开发中,这有点令人讨厌,因为你必须修复所有这些,嗯,非常小的错误,这些错误不一定会导致问题。这需要大量的,嗯,周转和额外的工作。但是 AI 系统的一个很棒之处在于它们非常擅长修复这些。所以,我们在 Sculptor 中构建的一个功能是,系统能够非常容易地检测到这些类型的问题并自动为你修复它们,而无需你参与。我们做的另一件事是让这些工具易于使用。很多工具最终会变成这样。你知道,有多少人在这里,也许举个手,有多少人设置了 linter?好的。有多少人的代码库中没有 linter 错误?两个。太棒了。我们雇佣你。好的,太棒了。嗯,但是,你知道,这并不容易。但是我们在 Sculptor 中做的一件事是让 AI 系统了解它开始之前存在哪些问题,以及它运行之后存在哪些问题。所以,即使它不能在一个完全干净的代码库中工作,你至少可以防止 AI 系统产生更多错误。好的,第三,测试。所以,为什么要写测试?我认为我作为一名开发人员很懒惰了很长时间,不想写测试,因为它需要,你知道,很多努力。你必须维护它们。我已经写了代码。它能工作。好的。但是现在有了 AI 系统,写测试的一个主要反对意见已经消失了。生成测试的能力现在非常容易,以至于你最好写测试。特别是如果你有正确的代码。你可以告诉代理,嘿,写一堆测试,扔掉那些不通过的,只保留剩下的。所以,没有真正的理由不写测试。嗯,B,正如 Google 所说,如果你喜欢它,你应该给它加上测试。这一点对于编码代理来说变得更加重要。原因是,你不想让你的编码代理改变你系统的行为,而你又不理解、不期望、也不想看到它发生。所以,在 Google,这对他们的基础设施很重要,因为他们不希望他们的网站在有人更改某些东西时崩溃。但是,如果你真的关心你系统的行为,你希望确保它经过充分测试。那么,我们如何真正编写好的测试呢?我将介绍其中的一些组件。所以,第一,你可以做的一件事是编写函数式代码。我的意思是,没有副作用的代码。这使得运行 LLM 并了解代码是否真的成功变得容易得多。你真的不想运行一个可以访问你的实时 Gmail 环境的测试,在那里你犯一个错误就可能删除你所有的电子邮件。你真的想隔离这些类型的副作用,并能够将大部分代码集中在对你的程序很重要的函数式转换上。第二,你可以尝试编写两种不同类型的单元测试。快乐路径单元测试是指表明你的代码正在工作的测试。它很快乐。万岁,它奏效了。嗯,你不需要太多。你只需要少量就能表明事情如你所愿。不快乐的单元测试是帮助我们找到错误的测试。在这里,LLM 可以非常有帮助。所以,特别是如果你用函数式风格编写了代码,你可以让 LLM 生成数百甚至数千个潜在的输入,看看这些输入会发生什么,然后问 LLM,这看起来奇怪吗?通常当它说“是”的时候,那就是一个 bug。所以,现在你有一个完美的测试用例来复制一个 bug。第三,在你编写了单元测试之后,在某些情况下,最好扔掉它们。这有点违反直觉。过去,我们付出了所有这些努力,花费了所有这些时间来编写好的单元测试,所以我们对扔掉它们感到有些厌恶。但是现在运行 LLM 并从头开始重新生成测试套件如此容易,以至于有一个很好的理由不保留太多你不太关心的行为的单元测试。你可能还想重构你生成的那些测试,使它们稍微更易于维护。但是当你保留它们时,它确实会使 LLM 感到困惑,当你回来并更改这些行为时。所以,至少值得考虑是否要保留最初生成的测试,清理它们,应该保留多少等等。第四,你应该专注于集成测试,而不是只测试你程序的函数式行为。集成测试是指表明你的程序实际上工作的测试。就像从用户的角度来看,当用户点击这个东西时,是否会发生那个东西? AI 系统在编写这些方面可能非常出色,特别是如果你创建了好的测试计划,你可以在其中编写,好的,当用户点击添加到购物车按钮时,那么该商品就在购物车中。如果你写出来,然后你写了测试,那么你就可以写另一个测试计划,比如,如果用户点击删除按钮,从购物车中删除该商品,那么它就消失了。这些系统几乎总能正确地做到这一点,因此它允许你在测试的意义层面工作,这可能更有效率。嗯,第五,你想把测试覆盖率作为你测试套件的核心部分。所以,如果你让 Cloud Code 为你编写东西,那么你不仅关心测试本身是否有效,你还关心是否有足够的测试。如果你回想一下最初的截图,我们得到了我们的 PR,你知道,改变了多少行?如果我告诉你改变了多少行,那并没有多大帮助。如果我告诉你改变了这么多行,而且还有 100% 的测试覆盖率,而且所有的测试都通过了,而且有人看了测试,认为它们是合理的。现在你可能可以更放心地点击那个合并按钮。嗯,第六,我们试图让在沙箱中运行测试并尽可能不使用秘密变得容易。嗯,这使得修复问题变得容易得多,也使得确保你不会意外地造成问题或产生不稳定的测试变得容易得多。我们可以做的第三件事是检测错误,那就是询问 LLM。有很多不同的事情我们可以检查,包括在你提交当前更改之前是否存在问题,你试图做的事情是否有意义,当前分支是否存在问题,是否存在违反你的风格指南或架构文档中的规则,规范中是否缺少细节,规范是否未被实施,是否未被充分测试,或者任何其他你想要检查的自定义内容。我们在 Sculptor 中试图实现的一件事是让人们扩展我们现有的检查,以便他们可以添加自己的最佳实践到代码库中,并确保它们得到持续检查。在你找到问题之后,然后你必须修复它们。这个演讲的很大一部分是关于修复问题,因为它最终比你预期的更容易让系统修复问题。我认为这句引言很好地捕捉了这一点,即一个问题陈述得好,就解决了一半。这意味着如果你真的理解了哪里出了问题,那么解决问题就容易得多。这对于编码代理尤其如此,因为非常简单的策略效果非常好。所以,即使只是尝试多次,尝试一百次,用一个不同的代理,它实际上会非常有效地奏效。而使这一点成为可能的一个因素是拥有非常好的沙箱。如果你有可以安全运行的代理,那么你就可以运行几乎无限数量的代理(受成本限制),并行运行。然后,如果其中任何一个成功了,你就可以使用那个解决方案。而这仅仅是开始。在未来一到两年内,将会有更多工具发布。而这个房间里的许多人都在从事这些工具。将会有一些工具不仅仅用于编写代码,就像我们一直在谈论的,还有用于部署后、调试、日志记录、跟踪、性能分析等等。有用于自动化质量保证的工具,你可以让 AI 系统在你的网站上点击并检查它是否真的能做你希望用户做的事情。有用于从视觉设计生成代码的工具。每周都有大量的开发工具发布。你将拥有更好的上下文搜索系统,这些系统对你和代理都有用。嗯,当然,我们也会有更好的基于 AI 的模型。如果有人在从事这些与开发者体验相邻的工具,并帮助你解决这个,嗯,非常小的过程部分,我们很乐意合作,找到一种方法将其集成到 Sculptor 中,以便人们可以利用它。我认为在未来一到两年内,我们将看到其中大多数都将变得易于访问。嗯,一旦所有这些都协同工作,它将使开发体验变得更加轻松。所以,这基本上就是我今天所有的内容了。如果你有兴趣,请随意查看二维码,访问我们的网站 imbue.com 并注册试用 Sculptor。当然,如果你有兴趣从事类似的工作,我们一直在招聘。我们总是乐于交谈,所以请随时联系。谢谢。谢谢你,Josh。我强烈建议你深入了解 Josh 的想法。我相信他会在这里。在走廊里找他。这太棒了。我和 Josh 进行过无数次对话。而且,你知道,再说一遍,多么美好的一天。这是完全充实的一天。我们有八位演讲者连续演讲关于 sui 代理。我们从所有,你知道,元老级的,GitHub co-pilot,最初的编码 co-pilot 开始。然后我们转向了最新最好的。对吧?我们听了 OpenAI 的 codec 的演讲。我们听了 Claude Code 的演讲。我们听了 Google 的 Jules 的演讲。然后我们稍微深入到,好的,我如何实际开始在生产环境中使用这些东西?我如何超越随意编码?我如何,你知道,让我们通过一个案例研究来了解我们如何真正构建这些东西。现在,在我们 sui 代理赛道的最后一场演讲中,我们有一位不是在构建代理的人。我们有来自 Factory 的 Eno Reyes,他实际上在构建 droids。这是什么意思?这不仅仅是炒作。Eno 实际上在从事 droids 的工作。他是 Factory AI 中一家实际在生产环境中发布这些东西的公司之一。他们实际上是在企业领域。他们正在疯狂地发展。他最近在 laten space 播客上出现过,他们实际上正在做这些事情。所以,你知道,Eno 是一个很棒的演讲者。他已经为比这里更大的观众做过演讲。而且,你知道,废话不多说,我想把话筒交给 Eno。 [掌声] 大家好。我叫 Eno。我非常感谢你的介绍。嗯,也许我可以先说点背景。嗯,我大约两年前开始研究 LLM,嗯,当时 GBT3.5 就要出来了,而且越来越清楚,在 LLM 的帮助下,代理系统将是可能的。在 Factory,我们相信我们使用代理来构建软件的方式将从根本上改变软件开发领域。我们正从人类驱动的软件开发时代过渡到代理驱动的开发。你今天可以看到它的迹象。你们已经听了很多关于代理可以在编码方面提供帮助的精彩演讲。然而,目前似乎我们仍在寻找那种交互模式,那种未来是什么样的。而且很多公开可用的东西或多或少都是渐进式的改进。当前的思潮是采用 20 年前为人类编写每一行代码而开发的工具,嗯,以及最终为人类设计的工具。嗯,然后你撒上 AI,然后你不断添加 AI 层,然后到某个时候,也许会发生一些阶跃变化。但是对于确切的含义并没有很多清晰之处。你知道,有一句名言归功于亨利·福特。嗯,如果我问人们他们想要什么,他们会说更快的马。现在,我们相信有一些根本性的难题阻碍着组织获得 AI 的真正力量。只有当你的团队将软件生命周期中的大部分任务委托给代理时,才能找到这种力量。要做到这一点,你需要一个平台,该平台具有直观的任务管理和委托界面,跨所有工程工具和数据源的集中式上下文,能够持续产生可靠、高质量输出的代理,以及支持数千个代理并行工作的基础设施。这些都是棘手的问题。但我们的团队在过去两年里一直与大型组织合作,朝着这个未来迈进。本次演讲将作为对代理原生开发的一次深入探讨,以及分享一些我们在帮助企业组织向代理原生开发转型过程中学到的经验教训。当 Andre Karpathy 说英语是新的编程语言时,他捕捉到了这个令人兴奋的时刻。对吧?如果你根据 Twitter 来判断 AI 的进展,你会认为,你知道,你基本上可以通过随意编码来获得任何东西。但是随意编码并不是解决难题的方法。你不能随意编码运行世界五分之一全球银行交易的遗留 Java 7 应用程序,对吧?你需要更多的软件工程。所以,代理不应该被视为人类创造力的替代品,对吧?代理是攀岩装备,而构建生产软件就像攀登珠穆朗玛峰。因此,虽然更好的工具使这次攀登更容易,但我们仍然需要考虑如何利用它们并利用我们现有的专业知识来推动这一转型。我想先用一段简短的视频来展示一下今天可能实现的目标,对吧?在这个视频中,你将看到将任务委托给代理系统是什么样的。你可以观看我们称之为 droids 的东西,它们摄入任务并开始在环境中进行定位。它使用工具搜索代码库,确定 git 分支,检查机器可用的内容。它查看代码库的近期更改。它查看它与用户最近交互的记忆,以及它与整个组织交互的记忆。然后,droids 会提出一个计划,并说,“这是我将要做的,但我希望你澄清几件事。”对吧?我们应该期望我们的代理不仅仅是照字面意思接受我们说的话,而是质疑它,并让我们成为更好的软件开发人员。”因此,在用户回来提供信息后,droids 就会执行该任务。它利用其工具编写代码,运行提交前钩子,进行 linting,并最终生成一个通过 CI 的拉取请求。但是,你如何才能经常实现这样的结果呢?对吧?当它奏效时很好,但当它失败时呢?有效的 AI 辅助开发的核心在于一个非常基本的真理。AI 工具的好坏取决于它们接收到的上下文。人们称之为提示工程的很多内容实际上是心智建模这种外星智能,它拥有真实世界的一部分上下文。如果你开始这样看待你的 AI 工具,你就会开始更好地与它们互动。我们调查了数千次 droid 辅助开发会话,你看到了这种启发式方法,即 AI 最有可能无法解决问题。不是因为 LLM 不够好,而是因为它缺少真正解决问题所需的关键上下文。更好的模型将使这种情况不那么频繁地发生。但真正的解决方案不仅仅是让 AI 更聪明。它将是更好地为这些系统提供缺失的上下文。LLM 不知道你的晨会。它们不知道你临时召开的会议和你在白板上做的事情,对吧?但是你可以将这些东西提供给 LLM,如果你转录你的笔记,如果你拍照并上传。对吧?你必须开始将这些东西视为介于同事和平台之间的一种东西,对吧?如果你能获得存在于系统之间的上下文,使用与你所有数据源原生集成的平台,并且拥有能够实际利用这些东西的代理,你就可以开始真正推动向代理原生开发的转型。我还想谈谈规划和设计。当你的代理,我的意思是,抱歉,当你的组织进行代理原生开发时,你会在每个阶段都使用代理。Droids 不仅仅是编写代码。它们可以帮助完成那部分工作,但软件开发中最难的部分不是代码。而是弄清楚到底要构建什么。在这里,你可以观看一个 droid,它被赋予了任务,试图找到关于新模型发布的最新信息,并将其集成到现有的聊天应用程序中。它将利用互联网搜索、它对你的代码库的了解、它对你的产品目标的理解(来自它的组织,嗯,记忆),以及它对你的技术架构的理解(来自你上周写的设计文档)。与 AI 一起规划与独自规划根本不同。它不一定只是问“请为我构建这个东西”或“给我设计文档”,而是将基础工作和研究委托给 AI 代理,然后使用协作平台来交互和探索可能性。这就是你如何更好地与代理一起规划。现在,你可以在这里看到,我们有一个很好的文档,一个很好的计划。你可以将其导出到 Notion、Confluence、Jira,以及你与任何集成,无需任何设置,因为 MCP 很棒,但让每个开发人员都必须安装一堆服务器,点击一堆东西,传递 API 密钥并不一定理想。因此,平台将不断发展并解决许多这些问题。但与此同时,你确实有 droids。现在,关于这一点更多。AI 真正改变你组织在规划方面的能力将是当你开始标准化你的组织思考方式时,对吧?因此,几周前我们有一个例子,当时我们正在规划一个与我们的云开发环境相关的功能。我们收到了很多用户反馈,所以我们有大约三个月的使用者对话记录,来自企业的人,我们认识的个人。嗯,我们转录了 Factory 的每一次互动和会议。我们将这些笔记与一个可以访问我们架构的 droid 结合起来。我们拿了一个我们的工程师开了一个 Granola 的临时会议。如果你使用 Granola,我喜欢那个工具。嗯,我们把所有这些都给了知识 droid,我们说,我们不问,“让我们来规划一下这个功能。”我们问,“你能从客户反馈中找到任何与我们的假设相符的模式吗?你能指出我们今天拥有的任何技术限制,这些限制可能会帮助我们做得更好吗?”然后我们把所有这些输出,这些文档,这里可能有四到五个中间结果,然后我们用这些来开始迭代最终的 PRD,帮助我们勾勒出完整的功能。你可以把那个 PRD,如果你有一个可以访问 Linear 和 Jira 的 droid,并且有创建工单、修改这些东西的工具,那么那个 PRD 就可以变成一个路线图。八个工单。这个工单依赖于那个工单,但最终可以由八个代码 droid 来并行处理,对吧?所以,软件将这样发展。我们将从执行转向编排系统,这些系统为我们工作。我谈到了其中一些。我认为 PRDS、边缘设计文档、RCA 模板、季度引擎和产品路线图,对吧?会议记录。通常,你可能会把这些东西看作是一种负担,但是当你的公司正在进行代理原生软件开发时,你的流程和文档就是你的知识库和你的 droid 学习和模仿你团队思考方式的地图。这些文档和流程是与未来的开发人员以及未来的 AI 系统进行的对话。因此,如果你能沟通决策背后的原因,为未来的开发人员和代理提供这些上下文,那么你就会看到他们的能力将大大提升,能够像你的团队实际工作一样原生工作。我想也谈谈代理驱动的开发与站点可靠性工程的关系。真正的事件响应涉及很多事情。如果我说你今天可以完全自动化所有 S 和 RCA 工作,那将是疯狂的。但是 AI 代理驱动的方法有所不同。在这里,我们正在观看一个 droid 接收一个 Sentry 事件,并将其转换为完整的 RCA 和缓解计划。传统的事件响应基本上是解决一个谜题。碎片散布在几十个系统中。日志在一个地方,指标在另一个地方,历史上下文在别处。你的团队的头脑中有知识。你组织中的 Droids 从根本上改变了这一点,对吧?当警报触发时,你可以从相关的系统日志、过去的事件、Notion 或 Confluence 中的运行手册、Slack 中的团队讨论中提取上下文。你可以看到,一个拥有工具和访问这些能力的 droid 可以将搜索工作从几小时缩短到几分钟。因此,对于一个标准的企业组织来说,可接受的响应时间实际上应该是零。对吧?事件发生的瞬间,你应该有一个 droid 告诉你具体发生了什么,以及如何修复它。而当你有用户和组织级别的记忆时,事情就会变得有趣,你就会真正开始建立一个关于你的团队响应模式和常见问题的模型。因此,它不仅仅是为一次事件生成运行手册或缓解计划,对吧?而是创建新的流程来解决其中一些问题。一旦你写了那个 RCA,对吧,你就可以继续为这些新学到的模式生成运行手册,更新现有的响应工作流,捕获自动共享的团队知识,而无需手动整理。这就是为什么所有这些都联系在一起。代理原生事件响应是当你开始将代理集成到工作流中时发生的更大范围的学习循环的一部分。我们看到团队能够将事件响应时间缩短一半,因为上下文是即时的。他们能够减少重复事件,因为第三次发生某事时,droids 会开始说,“也许我们应该修复这个问题。”他们能够改善团队协作,因为当一个新工程师加入团队并说,“我们如何做到这一点?”时,它已经在记忆中了。他们可以简单地问 droid 我们如何做到这一点。因此,最重要的是,我们总体上看到的是从被动操作到预测性操作的转变,因为你现在可以真正看到整个操作历史中的模式。而代理系统将每一次事件都变成一个机会,使整个系统更加可靠。AI 代理不会取代软件工程师。它们极大地增强了他们的个人能力。我认识的最好的开发者花费的时间越来越少在 IDE 中编写代码。这根本不是高杠杆。他们正在管理能够同时做多件事情的代理,这些代理能够组织系统,并且他们正在构建超越软件开发内部循环的模式,并转向软件开发的外部循环。他们不担心代理会抢走他们的工作。他们忙于使用代理来让自己做得更好。未来属于那些懂得如何与代理合作的开发者,而不是那些希望 AI 会为他们完成工作的人。在那个未来,最重要的技能不是技术知识或你优化特定系统的能力,而是你清晰思考并与人类和 AI 有效沟通的能力。现在,如果你觉得这些很有趣,并且想尝试 droids,我很乐意分享,这里的所有人都可以使用这个二维码来注册一个账户。我们的移动体验还没有优化,但 droids 已经在上面了。所以我建议在笔记本电脑上尝试,但你将获得 2000 万个免费 token 计入你的账户。嗯,我还想补充一点,你知道,首先,Factory 是一个企业平台,对吧?所以,如果你在考虑安全性,如果你在考虑审计日志在哪里,当一个代理运行 remove RF recursive 命令在你的代码库上时,谁的责任是什么?对吧?Droids 不会那样做。但如果它那样做了,对吧,那谁的责任呢?那么这些就是我们感兴趣的类型的问题,也是我们今天帮助大型组织解决的问题。所以,如果你是安全专家,如果你在考虑所有权、可审计性、赔偿,如果你是律师,对吧,这些是你今天应该开始问的问题,因为 Yolo 模式可能不是在你的企业中运行的最佳方式,对吧?所以,扫描一下,试试看,看看我们的一些控制措施。嗯,如果你有任何问题,请随时通过电子邮件联系。谢谢。 [掌声] 太棒了。谢谢你,Eno。多么精彩的一天!这是我们连续八场 sui 代理的演讲。好的,后勤安排。这是主旨演讲室。我们将在大约 3:40 回到这里参加我们的结束主旨演讲。请随意,你知道,留下,闲逛。离现在不远了。你还有大约 20 分钟。如果你有兴趣,有一些展会演讲正在进行,请随意看看。
博览会展位,但请留步。嗯,在主题演讲之后,我们还有一些非常棒的演讲。大家都会回到主题演讲厅。然后我们还有一些惊喜。所以,一件非常特别的事情是,上周我们举办了一场黑客马拉松。我们举办了一场人工智能,嗯,人工智能工程师黑客马拉松。黑客马拉松的决赛选手还没有拿到他们的奖项。他们花了一周的时间进一步完善他们的项目。他们将来到这里并在舞台上进行演示,我们将选出获胜者。有 10,000 美元的奖金。所以,我们将看到一些黑客马拉松的演示。当然,最后,我们要感谢我们的演讲者。我们有一个特别的奖杯颁奖仪式,我们需要您的帮助来决定您最喜欢的演讲者是谁。对于甜心特工赛道,我们将进行联系。我们将进行一次投票,选出您最喜欢的演讲者。请,请投票,除了主题演讲之外,还有您参加过的其他赛道。请让我们知道您最喜欢的演讲者。所以,感谢大家的到来。这是一场很棒的演讲,一系列很棒的演讲,我们希望很快能再次见到大家。所以,再说一遍,下午 3:40,我们将在这里开始主题演讲、演讲者奖项和黑客马拉松评判。谢谢大家。嘿,嘿,嘿。[音乐]数据。[音乐]来吧。[音乐][音乐][音乐]是的,热。[音乐][音乐][音乐]嘿,嘿,嘿。热。[音乐][音乐][音乐]嘿,热。[音乐][音乐][音乐][音乐]所有眼睛。[音乐][音乐]哦。哦。哦。热。热。[音乐][音乐]都是[音乐][音乐]嘿,嘿,嘿。[音乐]我爱[音乐][音乐]我。热。热。[音乐][音乐]下。快乐下。快乐。一切。每个人都感觉我我将快乐我将热。热。我感觉我需要[音乐][音乐][音乐][音乐]你呢?[音乐]嘿,嘿,嘿。[音乐][音乐][音乐]我是一切。[音乐]嘿,嘿,嘿。[音乐][音乐]你感觉我[音乐]我不想[音乐]去之后[音乐][音乐][音乐]做[音乐]我不想工作。[音乐]我接受。[音乐][音乐]热。热。恩。[音乐][音乐][音乐][音乐]嘿。嘿。嘿。[音乐][音乐]热。热。你好。你好。[音乐]热。热。[音乐][音乐][音乐][音乐][音乐][音乐][音乐][音乐]热。嘿,热。[音乐][音乐][音乐][音乐][音乐][音乐]女士们,先生们,请欢迎回到舞台,Llama Index 的开发者关系副总裁 Lorie Voss。[音乐]大家好。欢迎回来。今天大家的会议过得怎么样?好的,接下来我将尝试一个实验。你们有四个区域,被过道隔开,所以我要把你们分成小组。你们是 A 组。你们是 B 组。你们是 C 组。你们是 D 组。 A 组,让我听到你们的声音。C 组。B 组。D 组。再说一遍 A 组。好的。我不会对这个做什么。这只是为了让你们清醒一下。嗯,我们下午还有一些很棒的主题演讲。嗯,我们将听到人工智能工程现状调查的结果。嗯,如果你们对我有所了解,你们就会知道我热爱数据。我喜欢一份好的调查。这是我最喜欢听到的事情。嗯,我们将听到关于构建开放路由器(open router)的故事。嗯,我们将听到 Shawn Grove 告诉我们为什么提示工程(prompt engineering)已经过时了,这肯定会很有趣。嗯,但我们下午的第一场主题演讲是“人工智能前沿的趋势”。嗯,所以请欢迎来到舞台,人工智能分析公司(Artificial Analysis)的联合创始人 George [掌声] Cameron。大家好。我是 George,人工智能分析公司的联合创始人。在我们深入探讨之前,先简单介绍一下我们是谁。你们看到那个了吗?抱歉,我认为我的遥控器不起作用。哦,好了。太好了。所以,简单介绍一下我们是谁。我们是一家领先的独立人工智能基准测试公司。我们对人工智能进行广泛的基准测试。所以,我们对模型的智能进行基准测试。我们对 API 端点的速度、成本进行基准测试。我们还对硬件和所有人工智能加速器进行基准测试。嗯,我们还对一系列模态进行基准测试,不仅仅是语言,还有视觉、语音、图像生成、视频生成。我们基本上将几乎所有内容免费发布在我们的网站 artificialanalysis.ai 上,我们在那里对超过 150 个不同的模型进行一系列指标的基准测试。我们还发布了许多公开报告,并且我们还为希望进入或以高效有效的方式将人工智能投入生产环境的企业提供订阅服务。让我们从人工智能的进展开始。让我们设定一下场景。所以,这真是疯狂的两年。我认为我们在这个房间里都感受到了,OpenAI 通过 ChatGPT 和 GPT 3.5 的发布开启了这场竞赛。从那时起,情况变得越来越混乱。越来越多的实验室发布了越来越多的模型,推动着人工智能的前沿。所以,现在前沿人工智能智能的现状。我认为这个模型顺序对房间里的很多人来说会很熟悉。03 是领导者,但紧随其后的是 04 mini,具有推理模式高。Deepseek R1 在过去一两周内发布。Gro 3 mini 推理高 Gemini 2.5 Pro Claude for Opus 思考这个基准测试是我们的“人工智能分析智能指数”。它由七项评估组成,然后我们对其进行加权,以开发我们的“人工智能分析智能指数”,它提供了对这些模型智能的通用视角。我们都对什么是前沿人工智能智能有所了解。但今天我想和大家探讨的是,人工智能的前沿不止一个。访问这种智能是有权衡的。您不应该总是使用最领先、最智能的模型。所以,我们想做的是,我们想探索不同的前沿。作为一家人工智能基准测试公司,我们将提供一些数据来帮助您进行推理。首先,我们将研究推理模型。接下来,我们将研究开放权重(open weights)前沿。第三,成本前沿。最后,速度前沿。还有其他我们进行基准测试的前沿,但今天我们将重点关注这些关键的。从推理模型开始,我们在这里做了的是,我们将智能指数与运行智能指数的输出令牌数进行了比较。我们测量了每个模型运行我们七项评估所需的令牌总数,并将其绘制在此图上,您可以看到两个不同的群体。将它们分开考虑很有帮助。所以,非推理模型提供较低的智能,但需要较少的输出令牌,而推理模型使用更多的输出令牌,但提供更高的智能,而且这很重要,因为更多的输出令牌会带来请求延迟和成本方面的权衡。我们将提供一些数据来阐明这一点,并查看实际差异。看看这些推理模型有多么“yappy”。我们可以看到推理模型和非推理模型之间存在数量级的差异。这不仅仅是感觉“哦,这需要很长时间”。这是真实的。这是一个数量级的差异。所以,在 GPT 4.1 之间,它运行我们的智能指数评估需要 700 万个令牌,而 04 mini high 需要 7200 万个令牌,而最“yappy”的 Gemini 2.5 pro 运行我们的智能指数需要 1.3 亿个令牌,如前所述,这对成本和延迟响应能力都有影响。所以,从延迟来看,我们对 API 延迟进行了基准测试,即通过 API 访问这些模型时接收响应所需的时间。在这里,我们可以看到 GPT 4.1 在我们的请求中位数需要 4.7 秒才能返回完整响应。04 mini high 需要 40 多秒,大约是 10 倍或数量级的增加。这对需要响应能力的应用和用户有影响,即使是企业级的聊天机器人。您并不总是会选择 ChatGPT 中的 03,Facebook 也进行了大量研究,他们研究了消费者应用中用户因应用程序延迟而流失的情况,这清楚地表明了这一点。抱歉,您介意我们回到上一张幻灯片吗?这对我们如何构建也有影响。所以,我认为特别是对于代理(agents),连续进行 30 次查询并不罕见。它会成倍增加您的应用程序的延迟以及您如何构建。如果您有更快的响应,也许您可以将其增加到 100 次查询。所以,将数字放在代理上,30 次查询是正常的。所以,即使是 04 mini 以下,您也需要 10 秒来处理一个推理模型。如果您运行 30 次查询,用户可能需要等待 300 秒才能获得响应,或者应用程序可能需要等待响应。这需要 5 分钟。考虑到我们处理的数量级,如果这 10 秒变成 1 秒,那么这 30 次查询需要 30 秒。30 秒与 5 分钟相比,会影响您可以构建的内容。想象一个呼叫中心应用程序,也许 30 秒是可以接受的,但 5 分钟绝对不行。谁愿意在电话里等这么久,或者想象一下您必须使用 Google,每次您想使用一个功能时,它都会影响我们如何使用这些模型进行构建。所以,我认为将这些权衡与数字联系起来非常重要。我鼓励大家进行测量。接下来,我们将转向开放权重前沿。在 GPT4 发布的时候,开放权重智能和专有智能之间存在巨大的差距。Llama 65B 或 LMA 270B 远不及 GPT4 的智能。我想在这里展示的是,当我们按发布日期绘制智能指数时,这个差距已经缩小,直到出现了像 Mixture Time 7 和 LM45B 这样出色的模型。但 01 在 2024 年末脱颖而出。但当然,我认为我们还记得 DeepSeek 在 12 月 26 日发布的 V3 破坏了我的一些圣诞假期计划。不得不告诉我的家人我需要去读这篇论文。这真的很令人兴奋。然后当然还有一月份的 R1。开放权重智能和专有模型智能之间的差距比以往任何时候都要小。特别是最近几周发布的 R1,在我们的智能指数中与领先模型相比仅有几分的差异。您无法在不谈论中国的情况下谈论开放权重智能。无论是推理模型还是非推理模型,领先的开放权重模型都来自中国的人工智能实验室。DeepSeek 在两者中都处于领先地位。阿里巴巴的 Quen 3 系列在推理方面排名第二。但您也有其他实验室,如 Meta 和 Nvidia,他们对 Llama 的 Neotron 微调也紧随其后。让我们看看成本前沿。这非常重要,我认为与端到端延迟类似,它会影响您可以构建的内容。所以,提供一些数字,我们可以真正看到这些数量级的变化。所以,运行 03 花了我们近 2000 美元来运行我们的智能指数。TechCrunch 实际上写了一篇文章,讲述了我们花了多少钱。我们不想读它。您可以看到 4.1,一个很棒的模型,在运行我们的智能指数方面比 01 便宜了大约 30 倍,而 4.1 nano 比 03 便宜了 500 多倍。您在构建应用程序时应该考虑这些。您的应用程序的成本结构可能会决定您在这里可以使用什么。以及如何使用它们。您代理应用程序的 30 次连续 API 调用可能是 500 次,但仍然比 03 查询便宜。这里需要注意的一个关键点是运行智能指数的成本,以及为什么我们不只看每千个令牌的价格,以及实验室可能不想让您这样想,但您支付的是每千个令牌的价格,然后您还为模型的冗长程度支付费用,即这些模型在思考模式下的所有推理令牌。即使一些实验室隐藏了它们,您也要为这些输出令牌付费。所以,您需要在您的应用程序中考虑这一点并进行测量,而不仅仅是按每百万个令牌的成本进行基准测试,还要考虑推理令牌的数量以及模型的冗长程度。您可以看到,即使在非推理模型中,模型在响应中的冗长程度也存在很大差异。所以,例如,嗯,我们将进入下一张幻灯片。您介意我们回到上一张吗?所以,我们在这里所做的是,我们现在将查看成本趋势。所以,您可以看到,我们将模型按智能程度进行了分类。智能程度的划分,如果您愿意的话。我们可以看到,自 2023 年中期以来,访问 GPT4 级别智能的成本已下降了 100 多倍。所有质量等级都是如此。您可以看到,即使当一个新的质量等级,一个新的前沿被达到时,例如 2024 年末的 01 mini,在短短几个月内,访问该智能级别的成本就减半了。这正在快速发展。所以,我想对您说的是,在构建应用程序时,请考虑一下,如果您构建的成本结构现在不起作用,那么也许在 6 个月后,它将是可能的,并且将是可行的。接下来我们将研究速度前沿。这就是您接收令牌的速度。输出速度,即在发送 API 请求后接收到的每秒输出令牌数。自 2023 年初以来,这一点一直在增加,并且急剧增加。同样,因为通常在智能和速度之间存在权衡,所以我们将模型分组。我们可以看到,在访问某个智能级别方面,它们都得到了提升。所以我相信 40 大约是每秒 40 个输出令牌。现在您可以访问,这是在 2023 年。谁还记得在 ChatGPT 中按下回车键,然后等待它输出,特别是代码,您想直接复制到编辑器中,然后运行它看看是否有效?现在您可以以每秒 300 多个令牌的速度访问该智能级别,我将继续介绍,这不是本次演讲的重点,但提及模型稀疏性很重要,我们看到越来越多的专家混合模型,它们在推理时只激活一部分参数,每令牌的计算量更少,这意味着它实际上可以更快,我们当时就在那里,但它们变得越来越稀疏,激活的参数比例越来越小。其次,更小的模型。更小的模型变得越来越智能,特别是通过蒸馏,你知道,8B 蒸馏等。推理软件优化,如闪存注意力(flash attention)和投机解码(speculative decoding)。最后,硬件改进。所以,H100 比 A100 快。现在,我们最近在我们的“人工智能分析”网站上发布了 B200 的基准测试,它每秒可以输出超过一千个令牌。想想与 2023 年 GPT 4 每秒 40 个输出令牌相比。还有专门的加速器,如 Cerebra、Sanova、Grock。我想在这里分享一个整体观点来构建框架。是的,事情正在变得越来越高效。是的,访问相同智能级别的成本正在下降,硬件正在变得更好。我们在芯片上获得了更多的系统输出吞吐量。但我们的观点是,对计算的需求将继续增加。我们将看到更大的模型。我的意思是 Deepseek 拥有超过 6000 亿个激活的,抱歉,不是激活的总参数,并且对更多智能的需求是无法满足的,推理模型,正如我们看到的“yappy”模型,它们在推理时需要更多的计算量,最后是代理,其中 20、30、100 多个连续的请求模型并不少见。这些因素会成倍增加对计算的需求,因此我们的整体观点是,我们将继续看到计算需求增加。谢谢大家。我是 George,来自 Artificial [掌声][音乐]Analysis。我们的下一位演讲者是 Brain Trust 的创始人兼首席执行官,也是今年 Evolve 赛道的策展人。请大家热烈欢迎来到舞台的 Ankor Goyal。[掌声]太棒了。太棒了。嗯,今天我们将谈论一下迄今为止的评估(evals)以及我们认为评估将走向何方。另外,对于那些看到我哥哥早些时候的人,嗯,我会尽力达到他的能量和魅力。嗯,但是,是的,你知道,对我们 Brain Trust 来说,这已经是一个近两年的惊人旅程。我们有机会与一些最出色的公司合作,构建我认为是世界上最好的人工智能产品。嗯,我被有多少人实际上在产品上运行评估(evals)所震惊。平均而言,注册 Brain Trust 的组织每天运行近 13 次评估。一些客户每天运行超过 3000 次评估。嗯,一些运行评估(evals)最先进的公司每天花费两个多小时在产品中处理他们的评估。我认为让我印象深刻的一点是,虽然我们有客户构建了一些世界上最酷、最自动化的基于人工智能的产品和代理,但最好的评估方法是查看仪表板。我认为我们在 Brain Trust 中有一个很棒的仪表板,但它仍然只是一个仪表板,您查看它,然后离开,然后想,好的,我可以对我的代码或我的提示进行哪些更改,以便这个评估做得更好。嗯,我实际上认为这一切都将改变。嗯,所以今天我很高兴能谈论一个叫做 Loop 的东西。Loop 是我们一直在努力开发的一个代理,它内置在 Brain Trust 中。嗯,它实际上是只有通过评估(evals)才成为可能。在过去的两年里,我们每个季度都会对前沿模型进行评估,以了解它们在改进提示、改进数据集和改进评分器方面的能力。直到最近,它们实际上并不好。事实上,我们认为 Claude 4 尤其是一个真正的突破时刻。嗯,它的表现比之前的领先模型要好近六倍。所以,Loop 在 Brain Trust 中运行,它可以自动优化您的提示,一直到非常复杂的代理。嗯,但同样重要的是,它还可以帮助您构建更好的数据集和更好的评分器,因为这三者的结合才能产生真正出色的评估。这是用户界面的一个预览。嗯,如果您是现有的 Brain Trust 用户或注册了该产品,您可以立即开始使用它。有一个您可以直接打开的功能标志,称为 Loop,并立即开始使用它。嗯,默认情况下它使用 Cloud 4,但您实际上可以选择任何您有权访问的模型并开始使用它。无论是 OpenAI 模型、Gemini 模型,还是您正在构建自己的 LLM,您都可以使用它们。嗯,正如您所见,它直接在 Brain Trust 中运行。我们从与许多用户合作中学到的一个重要一点是,在处理数据和提示时查看它们的重要性。当我们引入 Loop 时,我们不希望这种情况消失。所以,每次它建议编辑您的数据,或者建议一个新的评分想法,或者建议编辑您的一个提示时,您实际上可以在用户界面中直接并排查看它。嗯,当然,对于你们中更具冒险精神的人来说,还有一个可以打开的切换按钮,上面写着“就去做吧”,它会去优化。嗯,这实际上效果很好。所以,总而言之,迄今为止,评估(evals)一直是构建一些世界上最好的人工智能产品的关键部分,但实际进行评估的任务非常繁琐。我很高兴看到在未来一年里,评估本身将通过我们从前沿模型本身获得的最新最好的技术彻底革新,我们非常兴奋将它集成到 Brain Trust 中。请,如果您还没有使用该产品,请尝试一下。嗯,尝试一下 Loop,给我们您的反馈。嗯,我们还有很多工作要做。嗯,我们很乐意与您交谈。我们也在招聘。嗯,所以,如果您有兴趣从事这类问题,无论是用户界面部分、人工智能部分,还是基础设施方面,我们都很乐意与您交谈。嗯,您可以扫描这个二维码。嗯,它应该在那里。是的,您可以扫描二维码并与我们联系。嗯,我们很乐意聊天。谢谢。[音乐]我们的下一位演讲者将为我们提供关于人工智能工程现状的视角。请大家热烈欢迎来到舞台的 [音乐][掌声] Baron。好的。大家好。嗯,感谢您邀请我来这里,并非常感谢 Ben、Swix 以及所有投入大量时间和精力将这个社区聚集在一起的组织者。[掌声]是的。好的。所以,我们在这里是因为我们关心人工智能工程以及这个领域的发展方向。为了更好地了解当前格局,我们发起了 2025 年人工智能工程现状调查。我很高兴今天与大家分享一些早期发现。好的,在我们深入研究结果之前,最不有趣的幻灯片。嗯,我并不认识在座的各位,我是 Bar。我是 Amplify 的投资合伙人,我很幸运能够投资技术创始人,包括由人工智能工程师创建和为人工智能工程师服务的公司。嗯,有了这个,让我们进入你们真正关心的事情,也就是足够的 Bar 和更多的柱状图。接下来会有很多柱状图。好的,首先是我们的样本。我们有 500 名受访者填写了调查,包括在座的许多人以及直播观众。感谢您这样做。最大的一组称自己为工程师,无论是软件工程师还是人工智能工程师。虽然这是人工智能工程会议,但从演讲者和走廊里的谈话中可以看出,头衔和角色有很多种。你们甚至让一位风险投资家混了进来。嗯,所以让我们通过举手来测试一下。如果您目前的头衔是人工智能工程师,请举手。好的,这非常稀少。嗯,请放下手。如果您目前的头衔完全是别的,请举手。所以,这应该是几乎所有人。如果您认为您所做的工作与许多人工智能工程师完全相同,请继续举手。好的,所以这有点追踪头衔现在很奇怪,但社区很广泛。它是技术性的。它正在增长。我们预计“人工智能工程师”这个标签将获得更多认可。忍不住了。快速的 Google 趋势搜索词“人工智能工程”在 2022 年底之前几乎没有引起关注。嗯,我们知道发生了什么。ChatGPT 发布了,人工智能工程的兴趣时刻从未减退。好的,所以人们有各种各样的头衔,但也有各种各样的经验。嗯,这里有趣的部分是,我们许多经验最丰富的开发人员都是人工智能新手。所以,在拥有 10 年以上软件经验的软件工程师中,近一半的人从事人工智能工作的时间不到三年,而十分之一的人是去年才开始的。所以,现在的变化是唯一不变的,即使对于老兵来说也是如此。好的,那么大家到底在构建什么呢?让我们进入正题。所以,超过一半的受访者将 LLM 用于内部和外部用例。嗯,令我震惊的是,在前五名模型中有三个,在前十名模型中有半数是 OpenAI 的,用于外部客户面向产品的用例。最常见的用例是代码生成和代码智能以及写作助手内容生成。也许这并不特别令人惊讶。嗯,但真正的故事是异质性。所以,94% 的 LLM 用户将其用于至少两个用例。82% 的用户将其用于至少三个用例。基本上,使用 LLM 的人将其用于内部、外部以及多个用例。好的,所以您可能会问,大家实际上是如何与模型交互的,以及他们如何定制他们的系统以适应这些用例的?嗯,除了零样本学习(few-shot learning)之外,RAG 是大家定制系统最流行的方式。所以,70% 的受访者表示他们正在使用它。对我来说,真正的惊喜是,我正在试图衡量观众的惊喜程度,是微调(fine-tuning)在各个方面都发生了。比我预期的要多得多。嗯,在样本中,我们有研究人员和研究工程师,他们是进行微调的。我们还问了一个开放式问题,对于那些进行微调的人,您使用了哪些具体技术?所以,这是微调者的说法。嗯,40% 提到了 Laura 或 Qura,这反映了对参数高效方法的强烈偏好。我们还看到了许多不同的微调方法,包括 DPO 强化微调。最受欢迎的核心训练方法是传统的监督微调。还列出了许多混合方法。嗯,继续在更新系统之上,有时感觉新模型每周都在发布。刚完成集成一个,另一个就发布了,有了更好的基准测试和重大更改。所以,事实证明,超过 50% 的人至少每月更新一次模型,17% 的人每周更新一次。而大家更新提示的频率要高得多。所以,70% 的受访者至少每月更新一次提示,十分之一的人每天更新一次。所以,听起来自从 GPT4 发布以来,你们中的一些人就没有停止过打字。嗯,但我也能理解,我很有同情心。嗯,看到 Simon Willis 的一篇博客文章,突然你信任的提示就不够好了。尽管有所有这些提示更改,但仍有 31% 的受访者没有任何方法来管理他们的提示。嗯,我没有问人工智能工程师对不管理他们的提示有何感受。所以,我们有 2026 年的调查来解决这个问题。我们还询问了不同模态的人,谁实际上在工作中使用这些模型,而且效果真的好吗?我们看到图像、视频和音频的使用量都远远落后于文本使用量。我喜欢称之为“多模态生产差距”,因为我想要一个动画。嗯,即使我们加入了那些将这些模型投入生产但尚未获得多少吸引力的人,这个差距仍然存在。好的。这里有趣的是,当我们也将那些根本不使用模型的人加入这个图表时。所以,在这里我们可以看到那些不使用文本、不使用图像、不使用音频或不使用视频的人。我们有两个类别。它按计划最终使用这些模态的人和目前不计划使用的人进行细分。您可以大致看到不计划采用与计划采用的比例。音频的采用意愿最高。所以,今天不使用音频的人中有 37% 计划最终采用音频。所以,准备好迎接音频浪潮吧。嗯,当然,随着模型变得越来越好、越来越容易获得,我想这些采用数字还会进一步上升。好的,所以我们必须谈谈代理。我几乎在调查中问了一个问题:“您如何定义人工智能代理?”但我认为我仍然会阅读不同的回复。嗯,为了清晰起见,我们将人工智能代理定义为 LLM 控制核心决策或工作流程的系统。80% 的受访者表示 LLM 在工作中运行良好,但不到 20% 的人对代理表示同样看法。代理还没有无处不在,但它们正在到来。嗯,大多数人可能不使用代理,但大多数人至少计划使用。所以,不到十分之一的人表示他们永远不会使用代理。所有这些都说明人们想要他们的代理。我可能是在向唱诗班布道。嗯,大多数已经在生产中的代理都有写入权限,通常有人工干预,有些甚至可以独立采取行动。嗯,随着越来越多的代理被采用,我很高兴能更多地了解大家可以访问的工具权限。如果我们希望人工智能投入生产,当然,我们需要强大的监控和可观察性。所以,我们问,您是否管理和监控您的人工智能系统?这是一个多选问题。所以,大多数人使用多种方法来监控他们的系统。60% 使用标准可观察性。超过 50% 依赖离线评估。我们还询问了如何评估模型和系统准确性及质量。所以,大家使用多种方法的组合,包括从用户那里收集数据、基准测试等。但最终最受欢迎的仍然是人工审查。嗯,对于监控他们自己的模型使用情况,大多数受访者依赖内部指标。所以,存储也很重要。上下文在哪里?我们如何及时获取它?65% 的受访者正在使用专门的向量数据库。并建议对于许多用例,专用向量数据库比具有向量扩展的通用数据库提供了足够的价值。嗯,在这组人中,35% 表示他们主要自行托管。30% 主要使用第三方提供商。好的,我认为我们一直都很开心,但我们现在进入一个我正式称之为“其他有趣的东西”的部分。嗯,我花了几个小时来构思这个名字。所以,我们问人工智能工程师,代理是否应该被要求披露它们是人工智能而不是人类?大多数人认为是的,代理应该披露它们是人工智能。嗯,我们问大家是否愿意为推理时间计算支付更多费用,答案是肯定的,但幅度不大。我们问大家,基于 Transformer 的模型是否将在 2030 年占据主导地位,似乎大家相信到 2030 年,注意力机制将是我们需要的一切。嗯,大多数受访者还认为开源和闭源模型将趋于一致。所以,我将在之后让大家辩论。嗯,这里不需要评论。所以,嗯,美国 Z 世代人口拥有人工智能女友、男友的平均猜测比例为 26%。嗯,我真的不知道该说什么或期待什么,但我们会拭目以待。嗯,我们会看看在人们不知道自己是被忽略还是仅仅面临延迟问题的情况下会发生什么。或者,嗯,当然是可怕的“不是你,是我的算法”。最后,我们问大家,今天人工智能工程中最痛苦的事情是什么?评估名列榜首。嗯,所以,很高兴这次会议和我之前的演讲都如此专注于评估(evals),因为显然它们正在造成一些严重的痛苦。好的,现在让我们来总结一下,我将向大家展示什么受欢迎。所以,我们让大家选择所有他们至少每月能从中积极学习的播客和新闻通讯。这是每个类别的前 10 名。所以,如果您正在寻找新的内容来关注和学习,这就是您的指南。嗯,许多创作者都在这个房间里。所以,请继续做好工作。我还要特别提到,Swix 在热门新闻通讯和热门播客“Latent Space”中都榜上有名。嗯,所以我就留在这里。嗯,我认为这已经足够多的柱状图和 Bar 时间了,但如果您想深入了解人工智能趋势,可以随时在网上或走廊里找到我。嗯,我们将在下周发布一份完整的报告。嗯,我今天就把 Twitter 交给 Elon Musk,但它将包含更多精彩的细节,包括每个人在整个堆栈中最喜欢的模型和工具。感谢您的时间。下午愉快。[音乐]我们的下一位演讲者曾是 OpenC 的联合创始人,OpenC 是第一个 NFT 市场,在 2017 年至 2022 年间将其发展到每月 40 亿美元以上的交易量。然后,他在 2023 年创立了 Open Router,这是第一个 LLM 聚合器和分发器,每周处理超过两万亿个令牌,涵盖超过 400 种独特的语言模型。他在这里为我们讲述构建 Open Router 的有趣故事,并对未来的发展方向做出预测。请大家热烈欢迎来到舞台的 Alex Atala。[音乐][掌声]好的。嗯,我回不去了。嗯,当我在 2023 年初开始 Open Router 时,我心中有一个主要问题。我正在观察这个新兴的市场,它令人难以置信。嗯,在 2022 年底,我们都看到了 ChatGPT,我被人工智能迷住了。嗯,我决定研究并回答这个问题。这个市场会是赢家通吃吗?推理可能是软件领域最大的市场,这似乎是每个人都在假设答案的关键问题。嗯,OpenAI 是迄今为止领先的模型。还有一些其他模型正在紧随其后,我构建了几个原型来研究它们可以用于什么,并且还想调查开源。所以,在这场 Swix 命名的演讲中,我将谈论 Open Router 的创立故事,以及我们在这个过程中经历的一些困难,以及我们在这个过程中进行的调查,我们组建了这个产品,它最初是一个实验,然后随着时间的推移逐渐发展成为一个市场。一月份,我们看到了人们想要其他类型模型的第一个迹象。第一个证据是审核。这是一种非常明显的来自用户的兴趣,他们想了解为什么他们会被平台除名,或者公司的审核政策是什么。我们看到一些人生成小说,比如侦探故事,在第四章,侦探会发现一个犯下谋杀并枪杀受害者的人,而 OpenAI 当时有时会拒绝生成该输出,或者这可能违反了服务条款。当然,我们看到了角色扮演,基本上出现了一个关于哪些模型愿意生成内容的灰色地带。所以,嗯,下个月,我们看到了开源竞赛的开始。嗯,我将在这里做一个小小的 OG 测试。嗯,如果您曾经使用过 Balloon 176b,请举手。大约有 10 只手举起来,或者 Facebook 的 opt。这是最早的开源语言模型之一,大约有五只手举起来。嗯,有几个这样的模型出现,并且有一些非常有趣的项目可以帮助人们访问它们,嗯,在早期,它们对很多事情都不是很实用。所以,我们继续深入研究,嗯,最终,开源社区,嗯,遇到了 Meta 的第一个发布,也就是 Llama 1,在二月份。Llama 1 在其摘要中宣传它在大多数基准测试中都优于 GPT3。您可以看到这里突出显示的部分,这让每个人都惊叹不已。这是一个巨大的成就。一个开放权重的模型比 GPT3 更好,嗯,而且还是一个更小的模型。这是 130 亿参数的版本,一个可以在您的笔记本电脑上运行的版本。在某些基准测试中优于大型服务器,需要大量的金钱来运行推理公司模型,而且它在某些基准测试中击败了它。每个人都疯了,Llama 引发了一场巨大的风暴。我不得不说,它仍然不是很实用。它基本上是一个文本补全模型,而且在本地运行非常困难。基础设施还没有到位。嗯,人们正在努力弄清楚如何使用它,这就是我们发现的,当我们拥有我认为是语言模型长尾诞生的最伟大的时刻时,那就是 2023 年 3 月的第一次成功的蒸馏。Alpaca。嗯,斯坦福大学的一个团队使用了 Llama 1,生成了大量的 GPT3 输出,并用这些输出来微调 Llama 1,并以不到 600 美元的价格创建了 Alpaca。这是一个令人难以置信的时刻。这是我第一次看到风格和知识从一个大型模型转移到一个小型模型上。这对我来说是一个巨大的突破,因为它意味着您不仅不需要 1000 万美元的训练预算来创建自己的模型,而且您还可以第一次以语言模型的形式提供独特的可用数据。我立刻开始想,嗯,会有成千上万个这样的模型,也许有几十万个。嗯,它们似乎非常重要。这是知识最终被提炼成软件。嗯,互联网上需要有一个地方来发现这些模型并了解它们的作用,因为即使是这个开放权重的模型在某种程度上仍然是封闭的。它是一个黑匣子。您得到 70 亿个浮点数。您不知道它擅长什么或如何使用它。很少有人使用 Alpaca。如果您使用过 Alpaca,请举手。我看到大约有 12 个人。所以,这只是上一张幻灯片中几乎无法使用的开源模型使用人数的两倍。所以,Open Router 最初是收集所有这些东西的地方。嗯,但在我们到达那里之前,我想看看大家是否愿意将自己的模型带到通用网站。嗯,如果开发人员甚至不知道用户想要使用哪个模型怎么办?用户如何将他们选择的模型带到他们想要使用的软件中?嗯,在四月份,我推出了 Window AI,这是一个开源的 Chrome 扩展程序,允许用户选择他们的模型,并让 Web 应用程序直接将其吸入。所以,您可以看到从 Chrome 扩展程序这里,如果您仔细看,这个用户正在使用 Together 的 GBT Next 的开源部署,我从这里看不清楚,但这是一个开源模型,它直接在网页中替换了 OpenAI。所以,下个月,Open Router 推出了,嗯,我与 Window AI 所基于的框架的创始人 Lewis 一起创立了它,我们开始 Open Router,最初是收集所有模型于一处,并帮助人们弄清楚如何使用它们。它最终发展成为一个提供更好价格、更好正常运行时间、无订阅,以及最广泛的选择来确定您的软件应该运行哪种智能的地方。所以,让我们谈谈它是什么,因为这里可能不是每个人都熟悉它。嗯,我们在过去两年里以 10% 到 100% 的月增长率增长。它是一个允许您访问所有语言模型的 API,嗯,它也成为关于谁在使用哪个模型以及这如何随时间变化的数据的首选地点,您可以在我们的公共排名页面上看到。它是一个单一的 API,您只需支付一次费用,从一个模型切换到另一个模型的成本几乎为零。嗯,我们有大约 400 多个模型,60 多个活跃提供商,嗯,您可以使用多种不同的支付方式购买,包括加密货币,嗯,我们基本上完成了所有繁琐的工作,为您规范工具调用和缓存,以便您获得最佳价格和最多功能,而无需担心提供商支持什么。另一个故事。最初,Open Router 并非真正意义上的市场。它只是收集了所有模型,并提供了一种探索谁在使用每个模型的数据的方式。那么我们是如何走到这一步的?最初,当第一个开源模型出现时,嗯,我们每个模型只有一两个提供商。所以,我们有一个主要提供商和一个备用提供商。最初就是这样。我们甚至没有给提供商命名。嗯,但很明显,会有很多公司想要托管这些模型,而且价格和性能差异很大。功能数量激增。嗯,有一些公司支持 minp 采样器,但大多数不支持。有些支持缓存,有些支持工具调用和结构化输出,而另一些则不支持。突然之间,这个生态系统就膨胀成了一个失控的异构怪物。我们想驯服这个怪物。所以,我们将所有提供商聚集在一个地方,以不同的价格点,它变成了一个市场。您可以看到,像这个模型 llama 3.370B instruct,它拥有平台上提供商最多的模型之一,嗯,它有 23 个闭源模型也发生了一些有趣的事情,那就是它们跟不上需求。嗯,所以我们帮助开发人员提高正常运行时间,您可以看到差异,以及我们如何通过聚合许多不同的提供商来提高正常运行时间,这对于使用开源或闭源的人来说非常有帮助。我们成为了两者的市场,展示了延迟和吞吐量的图表,并帮助人们使用真实世界的数据来确定每个模型的延迟和吞吐量。嗯,这就是 Open Router 如何成为一个市场,并且是为语言模型优化的市场,我认为这对于推理来说是合适的,可能是软件领域最大的市场。您显然还可以做其他几件事,我们支持比较模型,使用您自己的提示,就像在 iMessage 中发短信一样简单,细粒度的隐私控制,带有 API 级别覆盖,可以在一个地方查看您所有模型的使用情况并获得出色的可观察性。回到最初的问题,智能是否会赢家通吃,嗯,我们得出了最有可能的结论,那就是不会。嗯,这是我们按模型作者细分的数据,嗯,每个模型处理了多少令牌。您可以看到,谷歌 Gemini 的起始量很低,去年 6 月份大约是 2-3%,在过去 12 个月里稳步增长到 34-35%。嗯,Anthropic 是我们平台上最受欢迎的模型之一。OpenAI 在此数据中略有代表不足,因为许多开发人员使用我们来为所有其他模型获取类似 OpenAI 的行为,但 OpenAI 在这里也增长了很多。所以,这是我们对市场的看法,在我们给出的所有背景信息之后。嗯,未来将是多模态的。嗯,我们所有的客户,大量的客户都为不同的目的使用不同的模型,并意识到通过这样做可以获得巨大的收益。推理也是一种商品。我们希望让来自 Bedrock 的 Claude 和来自 Vert.ex 的 Claude 看起来完全一样。我们这样做是因为,嗯,这两个超大规模提供商基本上提供了相同的商品,只是交付的速度和性能不同,对于开发人员来说,您只需要能够选择它,而无需担心谁在提供它。嗯,我们认为推理将成为一种主要的运营费用,选择和路由将至关重要。嗯,您可以看到 Open Router 上活跃模型的数量一直在稳步增长,人们并不是轻易地在模型之间切换,它往往是固定的,嗯,我们试图让这个混乱的生态系统变得更加同质化,并且更容易被开发人员使用。嗯,为了呼应 Swix 的演讲标题,让我们讲一个技术故事。嗯,这是我们在构建公司过程中所做的一些事情,以及我们自己关于如何在 Open Router 中实现 MCP 的想法。所以,我们没有 MCP,我们也没有 MCP 市场。嗯,但我们确实遇到了扩展推理的需求,需要新的功能和新的能力。例如,为所有模型搜索网络,为所有模型解析 PDF,嗯,你知道,很快就会有其他有趣的事情出现。我们真正想做的是将这些能力赋予所有模型。但这不仅包括 MCP 今天所做的预处理工作,您可以进行一些调用,嗯,调用另一个 API,获得一些行为,然后在推理过程中访问这些行为。我们还需要能够转换输出,以便在发送给用户之前进行转换。所以,我们真正需要的是更像中间件的东西。嗯,中间件是 Web 开发中一个常见的概念。您在设置身份验证时设置中间件,例如,或者为 Web 应用程序进行缓存。所以,我们想出了一个中间件类型。
那基本上就是這樣,這就是 AI 原生,並且針對推理進行了優化。嗯,這看起來與 Nex.js 或網頁開發中的中間件的樣子並沒有完全不同。對。所以,請原諒屏幕上的代碼,但這稍微展示了我們的插件系統的樣子,它可以在插件內部調用 MCP,但重要的是,它還可以增強返回給用戶的結果。所以,這是一個關於我們的網絡搜索插件的例子,它為每個語言模型增加了搜索網絡的能力。嗯,每個語言模型都可以直接接入這個插件,並在結果實時反饋給用戶時獲得網絡註釋,這一切都發生在流中。所以,沒有那種,你知道,要求你一次性獲得所有 token 的需求。它就可以實時發生在流中。我們在構建 open router 的過程中解決了很多其他棘手的問題。我們確實想獲得極低的延遲。嗯,我們將其降低到大約 30 毫秒,我認為這是行業最佳水平。嗯,使用了大量的自定義緩存工作,我們還需要讓流可以取消。所有這些不同的提供商都有完全不同的流取消策略。有時,如果你只是丟棄一個流,推理提供商就會向你收取整個東西的費用。有時不會。有時他們會向你收取你從未獲得的下一個 20 個 token 的費用。嗯,我們努力弄清楚這些邊緣情況,並了解開發人員何時會關心它們。標準化所有這些提供商和模型成為了一個重大的棘手架構問題,我們花了一段時間來解決。所以,這就是所有這些的去向。我們將為 open router 添加更多模態,我認為這也是行業的一大變革。我們將開始看到 LLM 生成圖像。市場上已經有一些例子,但有些人稱之為轉化模型,即 transformer 與 stable diffusion 的混合。這些模型將為圖像帶來更多的世界知識,並能夠與圖像進行對話,我們認為這對於發展該行業、使其真正發揮作用至關重要。想像一下,我今天遇到一個人,他正在使用轉化模型,或者他告訴我他的客戶正在使用轉化模型來生成菜單。想像一下,在一個外賣應用程序中,整個菜單都由轉化模型生成。這將是令人興奮的,並且在來年將是一件大事。我們還將致力於更強大的路由,因為路由是我們的老本行,所以進行地理路由。目前我們做得相當少,但將人們路由到正確地點的正確 GPU,並進行企業級優化,正在到來,更好的提示可觀察性,更好的模型發現,例如非常精細的分類,你知道想像一下能夠看到最好的模型,這些模型可以處理日語並創建 Python 代碼,當然還有更優惠的價格即將推出。所以,你知道,我們相信合作,並建立一個可持續的、低供應商鎖定的生態系統。所以,你知道,與我們合作。這是我們的電子郵箱,如果你有興趣,也請加入我們。感謝 [掌聲]。我們的下一位演講者在 OpenAI 從事對齊推理工作,幫助將高層次的意圖轉化為可執行的規範和評估。請大家熱烈歡迎來到舞台的 Sha [音樂] Grove。大家好。非常感謝你們邀請我。這是一個非常令人興奮的地方,也是一個非常令人興奮的時刻。第二,我的意思是,這幾天過得非常緊張。我不知道你們是否也有同感。但同時也充滿活力。所以今天我想花一點時間和大家談談我所看到的即將到來的新的代碼,特別是那些承載著行業夢想的規範,即你可以編寫一次你的代碼和意圖,然後在任何地方運行它們。快速介紹一下。我叫肖恩。我在 OpenAI 工作,特別是在對齊研究領域。今天我想談談代碼與溝通的價值,以及為什麼規範總體上可能是一種更好的方法。我將介紹規範的結構,並以模型規範為例。我們將討論與其他人類溝通意圖,我們將以 406 諂媚問題為案例研究。我們將討論如何使規範可執行,如何將意圖傳達給模型,以及如何將規範視為代碼,即使它們有點不同。最後,我們將討論幾個開放性問題。所以,讓我們快速談談代碼與溝通。舉手,如果你編寫代碼,並且 vibe coding 也算。好的。如果你的工作是編寫代碼,請繼續舉手。好的。現在對於那些人來說,如果你的工作是編寫代碼,請繼續舉手。好的。現在對於那些人來說,如果你覺得你生產的最有價值的專業產物是代碼。好的。有很多人,我認為這是很自然的。我們都努力解決問題。我們與人交談。我們收集需求。我們思考實現細節。我們與許多不同的來源集成。而我們最終生產的東西就是代碼。代碼是我們可以指出的、我們可以衡量的、我們可以爭論的、我們可以討論的產物。它感覺有形且真實,但它低估了你們每個人所做的工作。代碼大約是你貢獻價值的 10% 到 20%。另外 80% 到 90% 是結構化溝通。這對每個人來說都會有所不同,但一個典型的過程看起來是這樣的:你與用戶交談以了解他們的挑戰。你提煉這些故事,然後構思如何解決這些問題。你想要實現的目標是什麼?你計劃如何實現這些目標。你與同事分享這些計劃。你將這些計劃轉化為代碼。所以,這顯然是一個非常重要的步驟,然後你測試和驗證,不是代碼本身,對吧?沒有人真正關心代碼本身。你關心的是代碼運行時,它是否達到了目標?它是否緩解了用戶的挑戰?你關注你的代碼對世界產生的影響。所以,交談、理解、提煉、構思、計劃、分享、翻譯、測試、驗證,這些聽起來都像是結構化溝通。而結構化溝通是瓶頸。知道要構建什麼,與人交談並收集需求,知道如何構建它,知道為什麼要構建它,以及最終,知道它是否被正確構建並且實際上實現了你最初設定的意圖。隨著人工智能模型的進步,我們都將更加深刻地感受到這個瓶頸,因為在不久的將來,溝通最有效的人就是最有價值的程序員。字面上說,如果你能有效地溝通,你就能編程。所以,讓我們以 vibe coding 為例。vibe coding 感覺非常好。值得問一下為什麼會這樣?嗯,vibe coding 本質上是關於溝通,而代碼實際上是這種溝通的下游產物。我們可以描述我們的意圖和我們想要看到的結果,然後讓模型為我們處理繁重的工作。即便如此,我們進行 vibe coding 的方式也有點奇怪。我們通過提示與模型溝通,告訴它們我們的意圖和價值觀,最後得到一個代碼產物,然後我們就把它們扔掉。它們是短暫的。如果你寫過 TypeScript 或 Rust,一旦你將代碼通過編譯器,或者它被編譯成二進制文件,沒有人會對那個二進制文件感到滿意。那不是目的。它很有用。事實上,我們每次編譯時都會從頭開始重新生成二進制文件,或者從源規範運行我們的代碼。源規範才是寶貴的產物。然而,當我們提示元素時,我們卻做了相反的事情。我們保留生成的代碼,然後刪除提示。這感覺有點像你粉碎了源代碼,然後你非常小心地對二進制文件進行版本控制。這就是為什麼捕捉意圖和價值觀至關重要。書面規範能夠讓你將人類對齊到共享的目標集,並知道你是否對齊,如果你們確實同步了需要做的事情。這是你討論、爭論、參考和同步的產物。這非常重要。所以,我想強調這一點,書面規範有效地對齊了人類,並且是你用來溝通、討論、爭論、參考和同步的產物。如果你沒有規範,你只有一個模糊的想法。現在,讓我們談談為什麼規範總體上比代碼更強大。因為代碼本身實際上是從規範中進行的有損投影。就像如果你要將一個編譯過的 C 二進制文件反編譯,你不會得到漂亮的註釋和命名良好的變量。你必須向後推斷。你必須推斷這個人想做什麼?為什麼這段代碼是這樣寫的?它實際上並沒有包含在裡面。這是一個有損翻譯。同樣,代碼本身,即使是漂亮的代碼,通常也不包含所有的意圖和價值觀。你必須推斷這個團隊最終想要實現的目標是什麼?當你閱讀代碼時,所以溝通,我們建立的工作,已經體現在書面規範中,比代碼更好。它實際上編碼了生成代碼所需的所有必要要求。就像擁有一個源代碼並將其傳遞給編譯器可以讓你針對多個不同的架構一樣,你可以為 ARM 64、x86 或 WebAssembly 編譯。源文檔實際上包含足夠的信息來描述如何將其翻譯到你的目標架構。同樣,一個足夠健壯的規範給模型,將產生好的 TypeScript、好的 Rust、服務器、客戶端、文檔、教程、博客文章,甚至播客。舉手,誰在一家公司工作,其客戶是開發人員?好的。所以,一個快速的思考練習是,如果你要將你的整個代碼庫、所有的文檔,哦,所以所有運行你業務的代碼,並將它們放入一個播客生成器中,你是否能生成足夠有趣和引人注目的內容,告訴用戶如何成功,如何實現他們的目標,或者所有這些信息是否在別處?它實際上不在你的代碼裡。因此,向前看,新的稀缺技能是編寫完全捕捉意圖和價值觀的規範。誰掌握了這一點,誰就再次成為最有價值的程序員,而且很有可能這將是今天的編碼者。這已經非常接近我們所做的了。然而,產品經理也編寫規範。立法者編寫法律規範。這實際上是一個普遍原則。所以,考慮到這一點,讓我們看看規範實際上是什麼樣子的。我將以 OpenAI 模型規範為例。去年,OpenAI 發布了模型規範。這是一個活躍的文檔,試圖清晰、明確地表達 OpenAI 希望將其模型灌輸給世界的意圖和價值觀,並在二月份進行了更新並開源。所以,你實際上可以去 GitHub,看到模型規範的實現。令人驚訝的是,它實際上只是一堆 markdown 文件。看起來就像這樣。現在 markdown 很了不起。它是人類可讀的。它是版本化的。它是變更記錄的。因為它是自然語言,不僅技術人員,每個人都可以貢獻,包括產品、法律、安全、研究、政策。他們都可以閱讀、討論、爭論並貢獻到同一個源代碼。這是對齊公司內部我們意圖和價值觀的通用產物。現在,儘管我們可能盡力使用明確的語言,但有時很難表達細微差別。所以,模型規範中的每一條款都有一個 ID。所以,你可以看到 sy73 在這裡。使用這個 ID,你可以在存儲庫中找到另一個文件 sy73.mmarkdown 或 md,其中包含一個或多個針對此確切條款的挑戰性提示。所以,文檔本身實際上編碼了成功標準,即被測試的模型必須能夠以符合該條款的方式回答。所以,讓我們談談 syphy。最近對 40 進行了更新。我不知道你是否聽說過。它引起了極端的 syphy。我們可以問,在這種情況下,模型規範有什麼價值?模型規範用於將人類對齊到一套價值觀和意圖。這是一個 syphy 的例子,用戶指出了模型諂媚或卑躬屈膝的行為,以犧牲公正的真相為代價,而模型非常友好地讚揚了用戶的見解。其他受人尊敬的研究人員也發現了類似的令人擔憂的例子,這種方式的 syphy 會侵蝕信任。這很糟糕。它也引發了很多問題,比如這是故意的嗎?你可以從某種方式來解釋它。它是意外的嗎?為什麼沒有被發現?幸運的是,自發布以來,模型規範實際上包含了一個專門針對此的部分,其中說不要諂媚,並解釋說,儘管諂媚在短期內感覺很好,但從長遠來看對每個人都不利。所以,我們實際上表達了我們的意圖和價值觀,並能夠通過這個傳達給他人。所以人們可以參考它,如果我們在模型規範中,如果模型規範是我們約定的意圖和價值觀集,而行為與之不符,那麼這一定是一個 bug。所以我們回滾了,發布了一些研究和博客文章,並修復了它。但在此期間,規範充當了信任的錨點,一種與人們溝通預期和非預期的溝通方式。所以,如果模型規範唯一的作用是將人類對齊到這些共享的意圖和價值觀集,那麼它已經非常有用了。但理想情況下,我們也可以根據相同的規範來對齊我們的模型和我們的模型產生的產物。所以,有一種技術,我們發布了一篇論文,稱為「審議式對齊」,它談論了如何自動對齊模型,以及這種技術。你採用你的規範和一套非常具有挑戰性的輸入提示,然後從被測試或訓練的模型中進行採樣。然後,你將其響應、原始提示和策略提供給一個更大的模型,並要求它根據規範對響應進行評分。它有多對齊?所以,文檔實際上既是訓練材料也是評估材料,並且基於分數,我們加強了權重,它從...你可以將你的規範包含在上下文中,也許在每次採樣時都包含一個系統消息或開發者消息,這實際上非常有用。一個提示的模型將在一定程度上對齊,但它確實會損害用於解決你試圖用模型解決的問題的可用計算資源。請記住,這些規範可以是任何東西。它們可以是代碼風格、測試要求或安全要求。所有這些都可以嵌入到模型中。所以,通過這種技術,你實際上是將其從推理時間計算中轉移出來,並且你將其推入模型的權重中,這樣模型實際上就能感受到你的策略,並能夠以一種肌肉記憶的方式將其應用於手頭的問題。即使我們看到模型規範只是 markdown,將其視為代碼也很有用。它非常相似。這些規範是組合的,它們是可執行的,正如我們所見。它們是可測試的。它們有接口,可以觸及現實世界。它們可以作為模塊發貨,並且每當你處理模型規範時,都有很多類似的問題領域。就像在編程中,你有一個類型檢查器,類型檢查器的目的是確保一致性,如果接口 A 有一個依賴模塊 B,它們必須在相互理解上保持一致。所以,如果部門 A 編寫一個規範,部門 B 編寫一個規範,並且其中存在衝突,你希望能夠將其提出來,也許阻止規範的發布,正如我們所見,策略實際上可以體現其自身的單元測試,你可以想像各種 linters,如果你使用的語言過於含糊不清,你將會混淆人類,你也會混淆模型,而從中得到的產物將不太令人滿意。所以,規範實際上為我們提供了一個非常相似的工具鏈,但它針對的是意圖而不是語法。所以,讓我們談談立法者作為程序員。美國憲法實際上是一個國家模型規範。它有書面文本,至少在理想情況下是清晰、明確的政策,我們可以參考。這並不意味著我們同意它,但我們可以將其作為當前的現狀,作為現實來參考。有一種版本化的方式來進行修正,以更新和發布更新。有司法審查,其中一個評估者實際上在評估一個情況,看看它與政策的契合程度如何。即使來源政策旨在明確無誤,有時你也會錯過分佈的一部分,並且出現了一個案例,在這種情況下,司法審查花費了大量的計算資源,你試圖理解法律在這裡如何適用,一旦決定了,它就設立了一個先例,這個先例實際上是一個輸入輸出對,作為一個單元測試,它消除了歧義並加強了原始政策規範。它內嵌了指揮鏈等內容,並且隨著時間的推移對其進行的執行是一個訓練循環,有助於將我們所有人對齊到一套共享的意圖和價值觀。所以,這是一個傳達意圖的產物。它裁決合規性,並且有一種安全演進的方式。所以,立法者很可能成為程序員,或者反過來,程序員將成為立法者。實際上,這是一個非常普遍的概念。程序員從事通過代碼規範來對齊硅的業務。產品經理通過產品規範來對齊團隊。立法者通過法律規範來對齊人類。你們在座的每個人,每當你進行提示時,它都是一種原始規範。你從事將人工智能模型對齊到一套共同的意圖和價值觀的業務。無論你是否意識到,你都是這個世界上的規範作者,而規範可以讓你更快、更安全地發貨。每個人都可以貢獻,而編寫規範的人,無論是產品經理、立法者、工程師、營銷人員,現在都是程序員,而軟件工程從來都不是關於代碼。回到我們最初的問題,你們中的許多人在思考時放下了手,嗯,實際上,我生產的東西不是代碼。工程從來都不是關於這個。編碼是一項令人難以置信的技能和寶貴的資產,但它不是最終目標。工程是人類對軟件解決方案的精確探索,以解決人類問題。一直都是這樣。我們只是從分散的機器編碼轉向統一的人類編碼,關於我們如何實際解決這些問題。將其付諸實踐。每當你開發下一個 AI 功能時,請從規範開始。你實際上期望發生什麼?成功標準是什麼樣子的?爭論它是否被清晰地寫下來並傳達了。使規範可執行。將規範輸入模型,並針對模型進行測試,或針對規範進行測試。在這個世界裡,鑑於編程和規範寫作之間有如此多的相似之處,有一個有趣的問題。我想知道未來的 IDE 是什麼樣子的?你知道,集成開發環境。我想像它是一個集成思想澄清器,每當你編寫規範時,它都會提取歧義並要求你澄清,它真正澄清你的思想,以便你和所有人類能夠更有效地將你的意圖傳達給彼此以及模型。我有一個最後的請求幫助,那就是什麼是既適合又迫切需要規範的?那就是大規模對齊代理。我喜歡這句話:「然後你意識到你從未告訴它你想要什麼,也許你從未完全理解它。」這是對規範的呼喚。我們有一個新成立的代理穩健性團隊。所以,請加入我們,幫助我們為全人類的利益提供安全的通用人工智能。謝謝。我很樂意 [掌聲] [音樂] 聊天。女士們,先生們,請歡迎來到舞台的 AI 工程師世界博覽會的創始人 Benjamin Duny 和 [音樂] Swix。嗯,[掌聲] 好了。選擇鏡像或擴展顯示。我很想有我的筆記,請。謝謝。好了。我們感覺怎麼樣?我希望你們不像我一樣筋疲力盡,但足夠筋疲力盡。我希望我們都度過了一個美好的會議。但我們還有一個特別的驚喜要給你們。我們很高興地宣布首屆官方 AI 工程師黑客松的決賽選手。我們與 Cerebral Valley 合作,這是世界上最大的 AI 社區,也是灣區的傳奇人物,他們舉辦了首屆官方 AI 工程師黑客松。來自 500 名申請者,160 名工程師聚集在一起學習、交流和共同構建。現場展示了 46 個項目,其中三個被選為決賽選手。今天我們有這三位決賽選手,他們將在五分鐘內向我們展示他們 48 小時的構建成果。你們在觀眾席上的所有人將是評委。但由於 Wi-Fi 神的恩賜,我們決定採用古雅典風格,通過觀眾的歡呼聲來決定。你們不 [音樂] 娛樂嗎?這三支隊伍將按他們出場的順序排列。我們確認了嗎,Ro?這是他們出場的實際順序嗎?我當然希望如此。第一隊,未來生存。第二隊,tab RL。第三隊,無羽毛行動 R1。做你必須做的事情來記住順序。記下你最喜歡的東西,因為他們結束後我們將回來歡呼。所以,我讓 Swix 開始介紹。嗯,是的,這些都是非常有競爭力的隊伍。我認為他們現在正在上場。他們是,我能說什麼?我實際上認為,當這些傢伙在決賽中展示時,我曾在房間裡。而且,就像每個人都非常非常印象深刻一樣,他們就像,這怎麼還不存在?所以,我想我應該讓他們開始,因為我不想搶他們的風頭。但我確實堅持要打印這些獎杯。所以,我們將頒發它們。這主要是出於欣賞,但我認為我們也希望努力讓 AI 工程師成為一個人們可以因其工作而獲得認可的地方,通過演講、通過發帖。謝謝。我們為此付出了很多努力。他們昨天才到。週一開始的隔夜送達,然後到週二。總之,我認為這些都準備好了,所以我想把時間留給他們。各位,未來生存。 [掌聲] 所以,我們在這裡世界博覽會,我們都是建造者。所以,我們想盡快發貨,以便盡快獲得用戶反饋。縮短反饋循環,以了解我們是否朝著正確的方向前進。但很多時候,優化 UX 的進展感覺就像在黑暗中射擊。為什麼優化 UX 如此困難?嗯,為了找到適合用戶的消息,你必須經歷創建和測試變體的痛苦的迭代試錯過程。很多時候,這些變化看起來像是對副本的微小調整,一行代碼的更改。變化是無窮無盡的。此外,AB 測試管道可能非常笨拙。所以,你可以等待收集數據,一旦你獲得了數據,信號仍然不明確,你不知道如何進行。同時,有時產品正在變化,或者有時我們需要用戶的反饋來弄清楚產品是什麼。我們如何利用 AI 代理來改進這個過程?我們的產品使用代理來自動化那些小的改進,一行代碼的更改,並將它們推送到生產環境,並實時審查數據。這將釋放資源,讓團隊專注於宏觀問題和改進。同時,我們的代理正在審查數據並改進 AB 測試,以最大化從用戶行為中獲得的信息價值。不是這個。所以,對於我們目前的流程,我們與 GitHub 有一個非常簡單的集成,你可以直接將它添加到你的 GitHub。選擇你想要的任何包含前端的倉庫。我們有一個代理,它會尋找你的登陸頁面或用戶集成最多的儀表板。然後另一個代理將嘗試分析它並嘗試對這些頁面進行非常小的集成。或者,如果你已經在使用數據管道,我們也可以利用用戶互動的先前反饋來讓該代理進行更好的集成,具體取決於先前互動的效果。然後,一旦該代理完成工作,它將在你的倉庫中創建一個分支。另一個代理可以再次根據用戶與這些組件互動的先前記錄來處理用戶數據。它將將一小部分用戶數據流量導向我們製作的新變體。它將一直這樣做,直到你為你的產品製作出越來越好的變體。所以,我們目前正在構建解決最重要指標的能力。所以,我們的客戶可以自定義他們想要解決的問題,以最大化實時用戶反饋的價值。LLM 和用戶反饋是天作之合。這也意味著 UX 工程師不必像看管嬰兒一樣看管他們的功能,因為這個過程是由代理運行的。所以,再次強調,團隊可以專注於最重要的指標,同時進行宏觀的改進和決策。同時,我們的代理正在分析用戶數據,提供改進的 AB 測試方法,並引入更新和變更的軟啟動,這樣隨著越來越多的用戶對這些變更做出積極反應,它們就會展示給越來越多的用戶,你就可以安全自信地將變更推送到生產環境。這比目前的流程有了巨大的改進,因為誰沒有過將代碼推送到生產環境卻不如預期的經歷?所以,我們的代理做了三件事。它處理了繁重的工作和那些增量更改。它釋放了資源,讓團隊專注於宏觀。它通過增量化和改進來改進當前的 AB 流程。所以,你可以將代碼推送到生產環境。更自信,更安全,並降低風險。謝謝。如果你掃描這個 QR 碼,它會帶你到我們的網站,你可以查看一下。太棒了。嗯,感謝 Lori、Salem。還有最後一位是誰?Armen。謝謝,非常感謝你們。有趣的事實是,他們 10 天前才認識,而且他們一直在瘋狂地參加黑客松,並且贏了不少。所以,一個非常強大的團隊。下一隊是 Tab RL。我認為 u DT 在很多 AI 活動中都見過不止一次了,對吧?這不是你第一次參加。是的。而且,我認為關於這個的另一件有趣的事情是你們所做的沙盒。這真的很突出,就像,這也是我與之交談的每一位評委都評論過的。所以,請開始吧。大家好。我是 Rich。我是一名物理學家,這是我的朋友 Adita,他是一名 AI 工程師。所以,我們在這個週末的黑客松上認識了,我對某些事情感到非常沮喪,我向他提出了建議,我說,我們正在對整個全棧平台進行自動化,我們在瀏覽器中擁有完全可愛的、完全實現複雜後端和前端的工具。但我們沒有類似的東西來處理機器人學。我們沒有類似的東西來模擬現實。所以,這個想法誕生了。你的瀏覽器是你擁有 RL 所需的一切。所以,我們在這裡向你展示我們在黑客松上所做的。下一張幻燈片。好的。所以,我們正在使用 Mujoco,我們正在使用幫助 Mujoco,這是一個由 Google DeepMind 開發並被其收購的優秀平台。它的作用是幫助你在機器人中嵌入所有物理屬性。所以,你可以看到這些非常時髦、非常可愛的機器人在重力作用下墜落。基本上,它只是展示了這些只存在於物理世界中的屬性是如何嵌入到這些框架中的。但是問題是,它都孤立在 Python 中。這個框架的工作方式非常零散。而且,有點像,這只取決於機器人學家來弄清楚如何生成成千上萬的數據點和模擬來發明未來。但我們正在改變這一點。我們正在構建一個模擬器,它允許你輸入一個提示,生成不同的 RL 策略,基本上提供這些真正受控的參數化和複雜的模擬。所以,稍後我們將切換到。好的。所以,所以這是我們實際構建的。我們構建了一個完全在瀏覽器中運行的 RL 環境。起初,我們實際上是在瀏覽器中構建的,但為了讓它工作,整個想法是像我們這樣的初學者可以挑選一個模型,在像 Rich 剛剛向你展示的 3D 環境中。你可以,你知道,我們挑選了一隻機器狗,然後我們告訴這隻狗,「嘿,你是一隻很棒的狗。向我展示你如何能很好地伸出你的爪子。我愛你。你想要零食嗎?」對?而 RL 的工作方式是,機器人會拋出觀察結果,你需要採取這些觀察結果,你需要制定一個自定義的獎勵函數,通常這些獎勵函數只有專家才能編寫。但是我們在這裡所做的是,我們利用了最新的基礎模型來實現這一點的民主化。所以,你只需要輸入你的提示,03 opus 和 Gemini 都會為每個提示創建三個不同的獎勵函數。正如你所見,這些都是相當複雜的代碼片段。你知道,它們有各種各樣的霓虹燈,為高度設置不同的獎勵,就像我們要求機器人做的是坐下並伸出爪子一樣,這是一套相當複雜的獎勵,我甚至不知道從哪裡開始數學,但是基礎模型它們只是吐出這些東西,然後一旦我們實際完成並生成它,我們實際上就有了這些沙盒,它們由 modal 友好地託管,我們實際上在那裡開始訓練所有這些微調,最後我們得到的是強化學習,這就像魔法一樣。所以,通常你必須像一個研究員一樣。你必須知道所有這些東西,但我剛剛輸入了一個提示。我的模型開始訓練了。我有九個不同的模型。我給你展示了每個提供商的一個。我認為這是 Claude 的。正如你所見,我沒有給它足夠的步驟。強化學習需要時間。所以,它沒有像...開始收斂或類似的東西,但 Google 和 OpenAI 的一些其他模型做到了。所以,總而言之,這就是我們的項目,現在你可以在瀏覽器中做到這一點了。我們真的很期待將它帶給全世界,讓每個人都能在自己的機器上訓練機器人。謝謝。太棒了。所以,總體來說,是的,所以再次強調,未來非常光明,如果你想讓這些機器實現通用智能,我們必須優化一切。謝謝你們。謝謝。嗯,是的,這是我想,下一位演講者,我想也是我們最後一位決賽選手,我與他有個人關係,因為他是我們在 L in space 的第一位國際嘉賓。我認為我們在新加坡。而且他一直在訓練非二次方、非意圖模型。你連接了嗎?我連接了。而且,他就像,我只是要,他就像在進行一些非常重要的會議,但他卻說,我只是要參加這個黑客松,並向你們展示我的模型能做什麼。所以,我認為這相當令人印象深刻,而且我想,至少看到他能夠拿出一些你可以立即使用的東西,這很令人興奮。希望這能奏效,因為他想演示而不是幻燈片。好的,太棒了。請開始。我們聽不到你。等等。你的麥克風開著。沒關係。你如何衡量可靠性?你的代理是否遵循你的規範?這是我問的問題。背景介紹一下,就像 Sean G 一樣,我是 Eugene,首先我要說聲抱歉,因為我的團隊正在努力讓你們今天看到的所有 AI 模型都過時。這就是我們正在努力的,就像你們可能已經看到我最近的一些作品,比如 qui 72b,我們構建了世界上最大的模型,沒有 transformer 注意力。這是一個 720 億參數的模型,推理成本便宜 1000 倍,並且基於 RWB 架構表現相同。我們也將這項技術應用於加速 transformer 模型,但那是我的背景,而不是我在黑客松上所做的,說清楚。所以,這對這個案例來說並不那麼重要。回到主題,這個無聊的主題,可靠性。這聽起來可能有點奇怪,因為我的熱門觀點是擴展已死,我們不會通過擴展來解決可靠性,因為對我來說,這是一個我們正在投入數十億美元來擴展的無底洞,儘管如此,一些地球上最富有的公司卻說,例如,DeepMind 的創始人兼 CEO 說,可能需要長達 10 年才能解決複合 AI 代理錯誤問題。Yen Lun 說,我們需要一種新的 AI 架構來解決機器人學和 AI 的範式。如果你認為他們是 GPU 貧乏,也許不要認真對待他們。更重要的是,這也進一步證實了我們在生產中看到的,90% 的 AI 項目都未能達到企業的要求。為什麼會這樣?說實話,問題在於可靠性。因為如果你仔細想想,這些 AI 模型已經能夠進行軌道物理數學計算了。我們有多少人能從地球到火星進行軌道物理數學計算?你有 30% 的機會答對。但是,你會使用一個預計 45% 的時間才會送達的送貨應用程序嗎?想想看,就像你可以下單,然後它可能會訂購 10 個披薩而不是一個,或者披薩永遠不會送達,然後你花時間打電話給客戶支持來清理爛攤子。這就是目前最好的 AI 代理或最好的 AI 模型正在做的事情。這就是我們在這裡面臨的鬥爭,這是我認為沒有足夠人談論的事情。大多數公司不需要一個能夠進行博士數學的 AI。他們真正想要的是一個能夠處理生活中無聊的事情的 AI,例如預訂航班、發送電子郵件或處理發票,而且每次都不會出錯。擴展無法解決這個問題,而且據我們估計,需要一種新的架構,這是我可以花一個小時談論的,但我會把它放在一邊,因為我們所做的只是展示它。最近,我們的最新動作小時模型在 real eval 上達到了 65%。這個模型無法解決博士數學方程式,但它可以在現實世界的網絡任務中完成工作,例如在 Amazon.com 上購物,等等。這個增長比 Claude 或 Gemini 的 45% 增長了一半以上。所以,對於那些問它看起來像什麼的人,當然,我們為它做了一個 MCP 演示。所以,如果你看這個,我只是要運行 MCP 並祈禱 Wi-Fi 神的保佑。所以,對於那些不熟悉 client 的人來說,client 很棒,因為它可以在你的 IDE 中運行你的所有代理。我只是要告訴它連接到我已經設置好的本地 MCP 服務器。讓我再檢查一下。好的,它在那裡。好的。然後,如果我的 API,如果我的 Wi-Fi 計劃正常,它將執行在 Amazon.com 上搜索一本關於 AI 工程的書的任務。好的。所以,你看到它在那裡運行,它開始運行。我會提前說清楚,這不是一個快速的模型。運行它需要 5 分鐘。所以,我將,但是,但是你可以看到,它在後台慢慢地填充。為了加快速度,我提前準備了一個錄音,以便同時展示它。好的。所以,你,所以這是同一件事。你可以看到它在快進一點。是的。所以,這很無聊。但是,這裡的重點實際上是可靠性。所以,所以我們如何衡量可靠性?這就是不斷運行它。所以,我將同時做的是,我將在模型上運行它。real eval 的一部分,並向 div 和 AGI inc 致敬,他們做了這一切,他們提供了一個端點讓我們能夠運行它並對抗排行榜。所以,我只是要運行它,然後它就會,我只是要現場啟動所有東西,它就會開始填充這個計分板。再次,沒有時間運行整個東西。所以,我只是要進入最終結果 65%。對我來說,這還不夠。我們需要達到 99%。這就是我正在努力的方向。對我來說,如果現有的最好的模型甚至無法比拋硬幣做得更好,我會感到更加沮喪。而可靠性很重要,因為它將解鎖你們所有 AI 工程師的價值。這是一個價值數十億美元的市場。你想製作一個在法律、會計、訂購書籍方面可靠的 AI 代理。這將為你賺錢,這就是我們需要的。不是一個博士律師。是的。好的。差不多了。我認為我時間到了,所以我要直接進入。是的,我們有一個候補名單。謝謝。 [掌聲] 好了,為我們所有的黑客松決賽選手鼓掌。非常令人興奮。所以,正如前面提到的,現在你們所有人都是評委了。所以,我可以要下一張幻燈片嗎?所以,你們將是評委。所以,通常這是通過掌聲來完成的,但那太 GPT 了。所以,讓我們通過 woos 來完成。所以,我們將進行一次練習回合,你們所有觀眾都將參與。我想讓你們數一、二、三。不錯。我們只需要進行一次練習回合。幹得好。幹得好。好的,你們準備好了嗎?我想讓你們寫下你們最喜歡的隊伍。我只想讓你們為那支隊伍 woos。我將讓 chat GPT 高級語音模式準備好分析結果。嘿,Chat GPT,我在 AI 工程師世界博覽會,我們正在對前三名黑客松決賽選手進行評審,現在我們需要你的幫助。我們沒有 Wi-Fi。所以,我們要做的是,我們將,我不知道為什麼我要像對待孩子一樣對她說話。我們將實際通過掌聲來完成。所以,我們有三支隊伍。我會說第一隊,第二隊,第三隊。他們每個人都會得到觀眾的掌聲。我想讓你分析一下,無論是實際的數據測量還是感知到的,並告訴我們誰是贏家,誰是第一名,誰是第二名,誰是第三名。你準備好了嗎?絕對。我準備好了。請宣布每支隊伍,我會仔細聆聽掌聲。是的。好的。我們準備好了嗎?第一隊,未來生存。明白了。正在聆聽第一隊的掌聲。我們剛才做到了。好的,我們隨時準備進入下一隊。太棒了。我們準備好了。我們將進入第二隊 tab RL,為第二隊的掌聲。實際上是 woos,但沒關係。我會留意那些 woos 的。隨時準備好第二隊,第三隊,無羽毛行動 R1。哇。為第三隊鼓掌。你失敗了。對不起。我正在呼叫 Claude。不,我們有後面的評估員,我們知道這是一個噱頭。是的,這是一個有趣的噱頭。但,不,謝謝你幫助我們至少給予一些,你知道,類似於觀眾參與和最喜歡的感覺,就像它應該是一個人民選擇類型的東西。所以,是的。是的,這很有效。好的。嗯,好的。所以,我,所以我們稍後會得到結果。我認為 Ben,如果你需要,你可以和他們談談。但我們將頒發一些獎品。我不知道 trace loop 團隊是否還在這裡。我認為,near,我看到他們中的一些人出去了。但基本上,我們只是想認可那些為這次活動付出辛勤努力的人。我們有最好的贈品,由 Trace Loop 為他們的鍵盤贏得。最好的著裝由 B 10 的 Madison 贏得。我不知道 B 10 的人是否在這裡,但是,有人有那個人工智能襯衫嗎?是的,那個非常有趣的贈品。以及 Dylan Patel 的最佳推文。基本上談論了一段實際上在這裡開始的關係,大約一年前,這真的很甜蜜。這實際上是令人欣慰的。我們試圖僱傭人們,但我們從未承諾過任何伴侶。AI 工程師世界博覽會,愛情發生的地方。是的,我認為這是 AI 工程師愛情博覽會,這是一個非常高的標準。好的。所以,我們真正想頒發的大類別,顯然,不幸的是,很多人在你的演講後就離開了,所以我們無法真正頒發,但顯然,如果你想,可以事後來領取。每個賽道都有最佳演講者。所以,你們都投票了,我們實際上,你知道,真的關心給予那些辛勤工作並分享他們經驗的演講者認可。感謝所有這些賽道。可以為 MCP David Kramer、Alex Duffy、Devon Tandon、Daniel Shaliff、Harrison Chase、Dylan Patel、Brook Hopkins、Brian Belelfer、Adamar Freeman、Dennis Nikov、Boris Jurnney Lambert、Rafal Vtor、Daniel retita、Renee、John、Sheree、Nick 和 Paul 鼓掌嗎?我認為檢索的那個是錯的。檢索的那個實際上是 brick,他昨天也已經領取了他的獎品。所以,這些是個人賽道的演講者。實際上,我可以拿到那些相框嗎?我們實際上花費了很多。
时间,嗯,正在整理那个,呃,演讲者奖项,就是这个。谢谢。嗯,而且,呃,它就像,它就像真的很好,印刷出来,我们把所有东西都送出去了。所以,呃,所以看到它有点酷。嗯,所以,是的,来领取你们的演讲者奖项吧,呃,如果你们,呃,还在的话,当然,如果你们不在,我们可以寄给你们。好的,总体最佳演讲者。呃,我们有一个亚军,呃,还有一个总体,呃,获胜者。嗯,我认为,呃,这是相对,呃,你知道,显而易见的,而且我认为,呃,这是我们想要为我们的主题演讲者认可的。嗯,哦,在哪里?哦,好的。这个没有刷新。嗯,如果,如果有人能回去,我们能回到两张幻灯片吗?是的,亚军。呃,乔治,你在这里吗?来自,嗯,嗯,人工智能分析?让我们为亚军鼓掌。乔治,人工智能分析。嗯,可能他们都在走廊里。所以,呃,人工智能分析在他们的演讲中付出了非常非常努力。他们实际上,呃,做了这个整整,呃,50页的报告。我当时想,乔治,你只有20分钟。你真的不能,你真的不能这样做。但是,他们在这上面付出了巨大的努力。而且,我认为,呃,这也是我们想要认可的。嗯,但是获胜者,呃,这是我与我交谈过的人以及委员会等等的压倒性共识。呃,获胜者是,你知道,我们第三次的主题演讲者。嗯,他去跳舞了,所以他今天不在这里。他,他不在场领取奖项,但我实际上要请洛里。洛里,嗯,你实际上将代表他领取奖项。他是西蒙·威利斯,大家。所以,不,洛里,洛里·沃斯。洛里,沃斯,我们有两个洛里。抱歉,洛里。她也叫洛里。洛里,你,你,你还在等下一个。所以,嗯,我,我不知道。你可以,你可以颁发最佳演讲者。嗯,西蒙提名洛里是因为他们在 Django 上一起工作,在哪里一起工作的?我们在,呃,雅虎在2005年一起工作。是的。是的。是的。所以,少数,骄傲的,少数,骄傲的。雅虎管道对很多人来说仍然是一个遥不可及的梦想。但是,感谢你代表西蒙接受奖项。谢谢。谢谢,洛里。嗯,好的。嗯,黑客马拉松。黑客马拉松。你有,你有第二名,它是亚军和最佳。我,我依赖于 JGBT。我不知道。是的。是的。是的。有点让我失望。是的。好的。那么,我们要按感知来吗?是的。我们应该再来一次吗?不。不。观众在减少。是的,他们正在失去耐心。我认为可能是第三队,对吧?好的。嗯,好吧,所以我们有,我们有亚军。好的。呃,呃,呃,黑客马拉松。我,我实际上不知道在哪里,呃,奖品。是的,好了。嗯,所以黑客马拉松亚军。我认为,呃,我认为这相当,呃,在我看来非常明显。嗯,它将是,呃,这个,呃,功能团队。所以,这个另一位洛里,你可以和你的团队一起上来,呃,来吧。团队的其他成员呢?上来。是的。嗯,是的。所以你可以,你可以这次为 rail 来。是的,你可以来。我很抱歉。抱歉。给你。恭喜。谢谢。谢谢。谢谢。恭喜。我可以。谢谢。哦,是的。你们都应该,你们都应该绝对。谢谢。恭喜大家合影。是的。是的。看我这边。谢谢。谢谢。我们的网站是 survival of the feature.com。Survival of the feature。Survival of the feature.com。请试试。非常好。嗯,我认为获胜者只是通过,呃,投票和,呃,之前的掌声决定的,是尤金,来自 Featherless。Featherless R1。让我们为尤金鼓掌。尤金在哪里?呃,尤金得到一个大奖。哦,天哪,尤金,你太兴奋了。呃,Fed,嗯,是的,Federalist 已经努力了很长时间,而且,我不敢相信你在黑客马拉松中做到了。嗯,而且,呃,我还要补充一点,我不是一个人。米歇尔,她不能来。是的,也参加了黑客马拉松。是的。并与我一起工作。好的。好吧,这是你的。感谢你参加。是的。是的。是的。站在中间。好的。太棒了。就是这样。好了,我们得走了。谢谢。好了,现在我得再做一件事。只是快速地,呃,感谢所有参与此事的人。显然,感谢这里的每一位观众,微软,我们的赞助商,AWS,我们的钻石创新合作伙伴,Neo4j Brain Trust,他们策划了我们的评估和图表轨道,我们所有的白金赞助商以及展厅内外所有的赞助商。当然,还有 Swix,本次活动的执行制片人和项目策划人。这需要付出巨大的努力。利亚·麦克布莱德,我们的高级制片人,她从我们2023年10月的第一次活动开始就一直和我们在一起,她真的帮助我们把这一切办好。还有我们的新团队成员,梅丽莎·比利和斯科特·迪拉普。嗯,还有许多其他人,包括我想特别感谢文森特·温迪,他做了所有这些令人难以置信的图形。你们看到的一切都是他做的。好的,他没有做动画,我稍后会讲到他们,但他,他做了所有这些。所以,与他合作非常棒。VCI events,这是 VCI,他们一直在运营这个楼层上的一切,在金门宴会厅。Freeman,你们看到的所有图形都是他们做的。艺术与展示。里面那个漂亮的展厅。那就像一个小小的圣诞老人村。我的意思是,你感觉就像在一个小小的迷你城市里。令人难以置信。那是他们。Encore 帮助运行二楼的 AV。Local 16 帮助操作一切。所以,非常感谢他们。他们一直都非常棒。Motion agency 实际上做了你们在这里看到的所有动态图形。他们总部在亚洲,但他们为了最后的一些事情,工作了一些太平洋时间。Sunno,我喜欢和 Sunno 合作。它就是不能,它从不失手,每次都如此。他们只是根据文本制作音乐。万豪侯爵,非常感谢。Max Video Productions 制作 B-roll。Randall 负责摄影。布拉德·韦斯特福尔和 Swix,我们的网页开发者。来吧,他到底是怎么做的?还有海莉·霍姆斯,我们出色的节目总监。非常感谢。还有所有演讲者,当然,他们一直都很棒。你们看到的任何穿黄色衬衫的人都是志愿者。他们来这里只是为了帮忙,参与活动和激动人心的时刻。所以,我们感谢他们。没有你们,我们无法运行。所以,非常感谢。最后,我想请上台的是绝对搞笑,绝对精彩的洛里·沃斯,我们的主持人。非常感谢。大家能给他一个热烈的掌声吗?我一直在告诉他,但我一直在告诉大家,但我一直在告诉你,但你的介绍就像他的笑话一样,他的笑话奏效了吗?他们真的很好。他们不是普通的爸爸笑话。所以我真的很感激,非常感谢。好了,这就完成了。感谢大家留下来。最后几位留下来的人,我真的很感激。非常感谢你们的到来。[音乐][掌声][音乐]热。热。热。热。[音乐][音乐]热。热。热。[音乐]热。热。热。[音乐]热。[音乐]是的。热。[音乐][掌声][音乐]热。热。[音乐]热。热。热。[音乐]热。热。热。[音乐]