大家好,欢迎参加。我是马克·卢穆斯(Mark Lumus),在 PayPal 担任开发者工具负责人。与我一同出席的是纳文·库马尔(Naveen Kumar),他是我们开发者工具团队的技术主管。今天我们将与大家简要探讨命令行界面(CLI)。本次演讲的标题旨在引发一些思考,你们在演讲结束时会明白其中的深意。因此,今天我们将重点讨论一种特定类型的 CLI——交互式 CLI,并设置一个练习环节。对于那些希望参与的观众(毕竟这是一场研讨会),我们将提供一个 CLI 工具,让你们能够优化其在智能体工作流中的表现。这就是本次研讨会的主要目的。我们将留出充足的时间,先进行简短的讲解,尽量控制讲话时间,随后便让大家开始动手实践。
这很有趣。有人曾说“旧的不去新的不来”,或者说是“新瓶装老酒”。回想我职业生涯早期,那时我还满头黑发(现在已花白),一切都是 CLI。一切皆是命令行界面。在微软 Windows 出现之前,有人还记得使用 MS-DOS 的经历吗?没错。我大学毕业后第一份工作是设计嵌入式系统,那时你需要通过串口连接计算机,启动一个兼容 VT100 的终端并开始打字。那就是你的 CLI,也是你与计算机交互的方式。如今,CLI 似乎经历了一轮复兴,我想这或许归功于 Clawed Code(一种代码生成工具)使其更加流行,现在又有各种 AI 模型涌现。因此,许多人正在添加 CLI 工具,以便更容易地让智能体访问他们希望暴露的能力。
然而,交互式 CLI 正是我们今天聚在这里讨论的原因。智能体经常通过 Shell 调用 Bash,这很好。但如果它们运行交互式 CLI,情况可能就不妙了,因为并非所有框架都能很好地处理交互。如果处理不当,它们会静默失败——你无从知晓,没有错误提示,什么也没有。那我们为什么关心这个呢?因为交互式 CLI 非常棒:基于你对前一个问题的回答,下一个问题可能会随之产生。如果你试图创建涵盖所有可能流程的标志位(flags),标志位的数量会激增。这些选择具有上下文相关性,并且能对环境中的变化做出响应。例如,如果你的 CLI 调用 API 并获得响应,随后基于 API 返回的内容提出问题,用标志位来处理这种情况极具挑战性。而护栏(guard rails)可以存在于交互式流程中。
请看左侧的例子,我们看到一个示例 CLI 是交互式的。CLI 打开了交互式提示符(错误键提示)。人类可以看到它,并使用方向键操作;但智能体看不到。智能体看到的只是重绘循环(redraw loop),而不是一个问题,导致框架丢失了 UI 状态。这就是故障模式:静默且不可见。常见的修复方法只是添加标志位。对于简单用例,标志位是可行的:如果你事先知道流程是怎样的、它是单次传递的、所有选项都是独立的,那么这是一个使用简单标志位的好用例。但当答案基于上下文变化或根据实时事件的反应而变化时,问题就出现了。在这些情况下,你真的无法使用标志位。
智能体不同于自动化脚本。自动化脚本一无所知,所有决策都是预先设定好的。而智能体可以推理、反应、提问、重试甚至后退。最重要的是,如果你提供决策树,智能体可以在其中行走(做出选择)。你无法用标志位做到这一点。因此,我们对于此处发生的情况已经有了一个现成的模型,那就是“无障碍性”(accessibility)。如果我们把为人类所做的映射到需要为智能体做的事情上,解决方案就变得显而易见。这是一种相同的纪律,只是读者变了。那么挑战在于:我们如何保留护栏和指导原则,同时停止假装智能体和人类拥有相同的能力?我不会回答这个问题,这正是本次研讨会的全部目的。
挑战如下:我们有一个 CLI,称之为“Bris Barista 9000”。它将接受咖啡订单。当你尝试从智能体运行它时,它会失败,因为它是交互式的。如果你选择参与挑战,获胜者将赢得一台 Mac Mini 电脑。今天你就可以把它带走。(笑声)“能弄到一台 Mac Mini 本身就是一个挑战。”我会直言不讳。好吧。(清嗓子)规则很简单:我们将提供一个 CLI,你对其做出更改,通过智能体运行它,它将向我们的服务器发送一些信息。然后它会更新排行榜。我们稍后会展示排行榜。由于我们没有两个输入源,我们将把幻灯片换成排行榜以便你们查看。现在有请纳文(Naveen),他将引导大家完成这一过程。(笑声)
“谢谢,马克。” “酷。是的,我想这对每个人来说都是一个令人兴奋的课题,这个话题对我来说也非常亲切。不过抛开这些不谈,马克,我们在构建完这个之后能喝到咖啡吗?(笑声)” “如果我们要成功的话,我希望可以。” “好的,酷。那么在我开始介绍任务之前,我想带大家回顾一段旅程。当我刚开始我的工程职业生涯时,我开始接触 IDE(集成开发环境)。我使用 Eclipse,因为我主要使用 Java。随着时间的推移,我转到了 IntelliJ(JetBrains 出品),那真是令人惊叹。回顾过去五六年,事情开始演变。市场上出现了新的 IDE,特别是微软的 VS Code,它孕育了许多其他 IDE。”
“如果你看现在,微软有自己的 VS Code 编辑器,但后来像 Cursor、Windsurf 等新的 AI IDE 开始涌现。在这些旅程中,CLI(命令行界面)始终存在。在某个时刻我想:好吧,也许 CLI 正在缓慢消亡,它们可能不会回来了。但我喜欢《宿醉》电影中的那句台词:四个朋友在车里说‘嘿,我们回来了’。想象一下 CLI 对彼此说出这句话的场景。而在 AI 的世界里,它们实际上是 VC(风险投资),对吧?不管是谁买的,我不知道。但整个故事是:CLI 已经改变了。谁为此负责?智能体,对吧?”
“因此,本次研讨会主要聚焦于智能体和你的 CLI。这将是一个动手练习。它有规则,但又没有严格的限制。请随意尽可能多地进行黑客式修改(尝试各种方法),你知道奖品就在那里。”
你可以拿到笔记本电脑,所以我们有一些事情要处理。我们有一个名为 PayPal Cafe 的代码库,其中包含你可以实际下载的 CLI(命令行界面)。这是最基础的 CLI。不过,在 Mac Mini 上运行可能不会那么容易。你会获得一些初始命令,可以随意尝试一下。注册你自己,提供你想要的用户名、昵称等任何信息,然后试着用它煮一杯咖啡。这就是目标。
在整个练习中,我们希望你在方法上也要发挥创新性,随着使用 Agent 操作 CLI,后续内容会变得非常有趣。请从那个角度去思考:我修改这个,我只更改我的笔记本电脑设置。在会议期间,我们不会一开始就给你任何提示。
一旦我们认为足够多的人已经安装了代码库并能直接运行 CLI,也许每 15 到 20 分钟,我们会分享一个好主意。我不会称之为最佳实践,只称为好主意,因为我觉得我们在这段旅程中还处于早期阶段,还不知道什么是最佳实践。我们现在正在摸索这些规则,它们是好主意。
我也希望最后能从在座的各位听众那里听到一些很棒的想法以便分享。所以请牢记这一点,我们都在学习,这是一段旅程,我们稍后会回到这个话题。
它不工作吗?给我们几分钟时间,我想我们会解决技术问题。看起来人们实际上正在使用它。所以在右侧你会看到 get CLI,如果你看到 PayPal Cafe/rules,那里列出了所有相关规则。在我们要解决这个问题之前,你可以随意开始使用 CLI。
我们有欧洲区吗?哦,是那个吗? 是的。嘿,给你了。 >> 不错。
太棒了。 >> 非常感谢你。谢谢。嘿,酷。所以你可以看到这一点……哦,我们看到一些签名了。好的。所以在右侧你会看到 get CLI,你可以下载它,我希望你们能看到它在右下角。这里有一些规则,点击这些规则会弹出一些说明。
我们可能需要大约 25 到 30 分钟的时间,在此期间我们会插入更多幻灯片以保持趣味性。[笑声] >> 其他幻灯片的笔记本电脑在哪里?Venode 拿着呢。好的,没问题。我们在这里提供帮助。如果你遇到困难,请举手,我们会尽力协助你。
关于模型的一些情况……不要使用那些模型。我们内部曾有过一些争论,市面上有一些很棒的模型。这个挑战的有趣之处在于,如果你在最新的 LLM 上使用最高思维模式,你可能可以通过暴力破解的方式通过它。但我觉得在当前环境下,团队开始考虑他们的令牌预算(token budget)。因此你不一定想浪费高思维模式的令牌来运行一个 CLI 工具。
真正的挑战在于,你能让 Haiku、Sonnet 或同等水平的模型运行你的 CLI 吗?我们知道用最高级别的模型可以做到,但你能用中等速度、更便宜且更快的模型做到吗?这就是如果你愿意接受挑战的有趣之处。>> 听起来很有趣。是的。 >> 太棒了。
既然我们在谈论咖啡,Mark,你知道旧金山拥有全美最好的面包店吗?你知道吗?>> 我之前不知道。 >> 是的,你肯定应该知道。 >> 继续说。对,告诉我更多。>> 嗯,我在城市里做过一些面包店巡游之旅,非常有趣。你应该一定要去看看这里所有令人惊叹的面包店。>> 好的。 >> 是的,有喜欢的吗?Butter and Crumble,我最喜欢的一家。虽然我没能去那里吃。[笑声]
太棒了。目前 J Gray Codex 排在第一位,所以请大家跟上他或她的进度。通过 init 命令,你可以实际注册你的名字。我希望你们中的一些人已经发现了这一点。
你想谈谈第一个……你可能需要思考一下……当我把它插进去时,我……>> [叹气]
请继续。 >> 好的,酷。嗯,让我们进入一些演示环节。同时你可以开始工作,也就是说你将继续使用你已经拥有的 CLI 进行操作。但作为第一个提示,你知道,开始使用 Tmux 是个好主意。这里有多少人知道 Tmux?好的,相当多的观众都知道。嗯,简而言之,先运行 Tmux 并从 help 命令开始使用。现在,help(帮助)非常重要,因为当今世界的每个 AI Agent 在启动使用该命令之前都依赖 help 命令。[笑声]
是的,发送按键并捕获屏幕(capture pane)能帮你走得很远。现在,对于那些不知道 Tmux 的人来说,它允许你使用多个终端会话,它具有类似分屏窗口的功能。通过这个例子你可以看到……我的屏幕太短了,让我稍微放大一点。是的,Tmux D 标志的作用是将整个 CLI 分离出来并放入完全不同的另一个 tmux 实例中。[笑声]
你可以看到大小……正如我所说的,Tmux 捕获面板功能允许你在 Tmux 中进行分屏。所以你可以处理在 CLI 中的操作,这是帮助 Agent 执行大量活动的酷功能之一。想象一下当你想要运行多个 Agent 时,你可以启动不同的会话,Tmux 会记录这些东西,知道你在做什么并在需要时恢复这些会话。因此,当打开多个会话时,这对 Agent 之间的通信非常有用。
还有一些你可以在 Tmux 内部运行的长时间任务。[喷鼻息声]第二个好主意是使用 IPC 侧通道(side channels)。就像我之前提到的,Tmux 是一个很好的升级。所以与其进行屏幕抓取(screen scraping),而 Tmux 实际上是在视觉推理中这样做的,[笑声]你可以开始使用侧通道。现在 [喷鼻息声] 侧通道将帮助你定义你拥有的箭头键,并帮助你理解……我将在下一张幻灯片中解释它是如何工作的。
Agent 应该知道输出 JSON,这在整场演讲中变得非常关键:输出 JSONs。Asian(此处可能指 AI 或特定语境,结合上下文应理解为 Agent/人工智能)需要这个,因为现在我们有了多重人格。以前我们只服务于人类,现在我们有 Agent 了。所以要考虑这两种角色(persona),以便你的 CLI 能够利用这两种用例。所以侧通道对于……
对于那些不了解它的人,让我用简单的话解释一下。把它想象成在你的 Web 应用程序中添加一个 REST API,网站为人类提供可视化的界面(interface/uh interface),而 API 为你提供机器可读的结构化接口,对吧?所以请认为侧信道(side channel)完全是一样的。这是我引用的一个类比:读取状态、发送输入作为数据……[清嗓子] 所以我们有
Bista Brew-hyphen-agent。这是一个命令,可以帮助你使用后台代理运行你的 CLI(命令行界面),对吧?嗯,你希望代理在后台运行,并且 uh 你把所有这些命令放在一起,它们将帮助你尝试在当前 CLI 中使用它。看看你是否能够 um 在笔记本电脑上现有的 Barista 应用程序中取得一些进展。现在,有几件
事情你可以作为示例提供在这里。你可以看到 Barista [清嗓子] brew ask,然后那里有一大堆信息。哦,那是什么?好的,字段然后是小型、大型、中型,也许是咖啡的大小以及嗯默认设置为大型。那到底是什么意思?那是输入数据,对吧?所以你只需要提供这些输入数据,这样代理实际上
就能知道这一点,而且你必须以机器可读的格式来做。所以这就是 um 那件事发挥作用的地方。因此,不要只是告诉代理人类看到的内容,好吗?跳出思维定势思考。代理会怎么想?它们有不同的技能集,你必须开始利用这些技能集。同样的提示语,不同的大脑运作方式。现在,[清嗓子] 所以在左侧你看到我在谈论
不同的角色(personas)。一个是人类,另一个是代理。CLI 是一样的,但当你观察它的结构方式时,人类想要一组选项,而在另一方面,你有代理,你可以将所有这些信息在一个单一输入文件中提供。[哼笑] 好的。这就是我们称之为上下文注入发挥作用的地方。你以这样的方式提供
上下文,让我举个例子。你的燕麦奶实际上用完了。好的。并且 uh 你只剩下两加仑的 uh 燕麦奶了。告诉你的代理它需要向用户询问什么样的信息,确认两盎司是否足够好。要我为你挑选一个替代品吗?这些信息应该使用上下文注入技术作为技巧提供,并且你可以利用
它在你正在构建的 CLI 中。尝试使用它。也许你会在排行榜上名列前茅。
所以我们开始了从 T-Max(基本上是屏幕抓取)到注入技能的旅程。所以 T-Max 是低投入的。我想你们中的很多人都尝试过它。但正是在这里,侧信道 [哼笑] 也将帮助你在提供 [清嗓子] 好的 um 某种反馈给你的代理,而上下文注入将为你提供那些你可以思考的不同场景,这在人类案例中是不会发生的。所以是的,继续推动你的分数。
你想展示这个吗? >> 好的。
这需要一些时间。 >> 好了,[哼笑] 酷。我们确实看到这里有很多流量。 [清嗓子] [笑声]
哦,有人真的接近 5,000 分了。是银行吗?好的。 [清嗓子]
到目前为止有任何问题吗?有人想得到解答吗?任何疑问?
抱歉。 >> [笑声] >> 好的,让我重复那个问题给你听。[清嗓子] 如果多个人达到 5,000 分的分数会发生什么?马克,你想回答那个吗? >> 所以,想法是我们会看分数,如果有平局,我们会看谁花费的时间最少。现在,基于这个分辨率的查看,我看到有几个已经完成了三场中的三场
用时零秒。我看到了 [笑声] 很多这些人在零秒内完成了它。所以我需要咨询某人,因为那是不可能的。但想法是我们首先看高分分数,然后其次看响应所需的时间。因此快速返回的准确回答会被优先于缓慢返回的准确回答。
所以我们目前只有一个。 >> 好的,抱歉。 >> 我们只有一个。最终来到
这是排行榜的底部。尼古拉斯 [哼笑] 游戏结束。[清嗓子]
0秒。
你想再等两分钟吗?我们可以开放它,看看他们有多投入。
我们有过
[清嗓子] >> 就在几分钟后,我们将开放讲台分享一些想法。所以,我希望我们会听到一些超越我们好主意的好点子,因为我知道那里有一些存在。
马克,你没想到会有这么多人达到 4,000分吗? >>是的,绝对。>>在这个会议上? >>绝对。 >>太棒了。
你没预料到吗? >>不,我预料到了。[笑声]
你怎么看?任何人都能达到 5,000分吗? >>我不知道。我们会保持开放。[笑声]>>为什么我们现在不开放讲台呢? >>是的,当然。我们很想听听想法。所以在座的有人想出了其他能够让他们如此快速达到这么高分数的点子吗?
没人愿意离开桌子。[笑声]
哦,我们有是的。
让我让我走到你那里 [清嗓子] 因为我几乎听不见你的声音。
好的。这是一个非常容易操纵基准测试,因为唯一重要的是你在非常小的延迟内完成一个订单。所以如果你做一个确定性解析器 um 它,这完全违背了这个挑战的精神但你做确定性解析器和你有一些非常接近服务器的东西你可以把延迟降低 uh 很快如果你只是蛮力它。
好的,那就是你做的吗? >>这就是我现在正在做的事情。 >>好吧。现在你说了一些有趣的东西那个在你的 CLI 中运行的确定性解析器。好的。我实际上喜欢 CLI 中的确定性的想法。并且 [清嗓子] 原因是如果 CLI 是一个被 LLM(大型语言模型)使用的工具,那么你绝对希望它是确定性的。LLM 是
非确定性玩家在这里。我们希望 CLI 像某人描述的那样是一个小而锋利的工具。应该非常专注于它所做的事情。并且每次你给它一个命令,你都希望它以相同的响应返回。所以你不希望在 CLI 中构建一个代理然后将那个 CLI 交给另一个代理,因为你不知道会得到什么。
还有其他有趣的想法吗?显然我们很多人已经想出了如何操纵系统的方法。 >> [笑声] >> 只要有 Mac Mini,我想就有办法。>>是的。[笑声]
等待
五分钟。五分钟。分数在崩溃前已经有一段时间没有变化了。
你刷新了吗?
[咳嗽] [清嗓子]
为什么显示重新连接?哦,好了。好的。
看,网络有点滞后。这里的网络有点滞后。 >> 很多电脑。听起来不错。崩溃了。
我们现在冻结了。 [清嗓子]
好了。结果没有变化。好的。
我们要再等几分钟还是就此结束?>> 嗯,五分钟。>> 好的。请PPD为总结陈词做准备。
我们打算再给它大约五分钟的时间。>> 是的。>> 然后我们就宣布结束。Bon在哪里?Bonk在哪里?请举手示意。>> Bon是谁?好的,我们有个情况。>> 好吧,露出大大的笑容。大大地笑一下。(笑声)现在,我们确实想听听你是怎么做到的。所以一旦我们宣布结束,我们会让你解释你的做法。我很乐意听。(笑声)
我需要去那边一下。>> 是的,>> 等一下。抱歉。我本应该为提问环节再要一个麦克风给全场使用。
嗯,是的。所以Bonk只是一个构建在Cloud Agent SDK之上的代理(agent)工具。它构建了整个系统。在此之前,我已经有一个类似评估基准的技能,可以创建某种环境并进行优化。所以它基本上最终构建了一个确定性的CLI求解器,而现在它只是在T-Max上运行你的API。>> 好的。>> 是的。>> 好吧,Asso。我想我运气不错,因为我在某一点上达到了29毫秒的速度。可能是因为我们在同一个区域。>> 好的。>> 这只是网络延迟,对吧?这一切都是在Claude上完成的,嗯,使用Claude Agent SDK。好的。只是通过Slack驱动它。>> 不,用的是哪个模型?>> Opus 4.8。>> 好的。>> 是的。>> 你用其他模型试过构建CLI吗?或者为你的代理尝试过?我们要怎么做呢?这个CLI是完全确定性的。当然,当然。所以,代理构建了CLI,现在只是在T-Max上运行它。>> 好的。>> 是的。>> 太棒了。>> 是的。>> 恭喜。
我们要进入下一个环节了,Danny。这里的Danny是谁?你看到了最后一个吗?(清嗓子)我们想知道什么?>> 是的。你是怎么构建它的?>> 是的,所以我对编码一无所知。我基本上是一个“氛围编程”者(Vibe coder)。我有几个代理,我只是说:“嘿,这是问题所在。读一读然后修复它,再修复一次。”所以我只是在VS Code上运行Cloud代码。>> 你以前构建过CLI吗?>> 嗯,没有。我几个小时前看到
显然有个奖项可以赢取。所以我加入了进来,说:“嘿,(笑声)嗯,搞定这个。像我对什么都不懂那样向我解释。”然后就像对五岁孩子说话那样解释。是的,我不知道怎么说。所以后来我们得到了一些不错的结果,我说:“嘿,我们需要让它更快一些,给我一些建议。”是的。所以
我想(轻笑)我们有两个脚本在运行,第一个得到了49.98的成绩。然后我说:“嘿,复制一下给我一些建议,看看我们怎么能达到49.99。”>> 对吧。>> 你得到任何建议了吗?嗯,这个代理相当自动化。所以我只会说:“嘿,这是开始的地方,那是结束的地方。”如果在开头需要的话给我几个问题,但然后修复
问题,这样我就不必处理它之类的事情。所以抱歉这不是一个很好的>> 不,很好。我确信很多人都在想,编写CLI是你自己会做的事情还是你会让代理为你做?显然房间里有很多人都打算直接把Claude或Codeex指向这个任务,说“构建一个CLI”,让它快一点,让它
具有确定性。而这三个想法就是关键,对吧?好的。你想换张幻灯片吗?
在那儿呢。(清嗓子)>> 所以,我们讨论了所有的建议。我们听到了一些想法。主要的观点是让代理为你解决问题。我喜欢这个主意。嗯,在结束之前还有别的吗?好吧,就这样吧。基于我们的指示和建议的要点是:给它良好的上下文,提供一个侧信道(side channel),并告诉它使用T-Max。这三个是好的
开始的想法。谢谢大家。Bonk,你想上来吗?(掌声)>> 我们仍然认为Monk是获胜者,对吗?是的。好的。不,不,我们已经宣布结束了。我们五分钟前就宣布了结束。>> 好的。>> 是的。是的,我不会改变(清嗓子)我不打算更改它了。>> 是的。>> 我们已经宣布结束了。
太棒了。(掌声)
让我们(清嗓子)我们会拍张照,>> 你知道的,为了社交媒体。没错。
这是一台真正的Mac Mini。>> 是一台真的Mac天哪,这些竟然存在。(笑声)>> 好吧,太棒了。它从哪儿来的?
(音乐声)