
开发者探讨如何设计常驻型AI Agent
来源标题:Designing an Always-On Agent
一篇技术文章讨论了如何设计始终在线的Agent(类似钢铁侠中的Jarvis),而非当前需要用户主动触发才响应的聊天机器人。作者认为,人们对于是否已实现AGI的分歧更多源于产品形态而非模型能力,并提出常驻型Agent应能主动感知环境、统一处理各类任务。文章还分析了当前模型在实现这一形态上的局限。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
在ChatGPT发布之前,我常常想象AI会像《钢铁侠》里的Jarvis那样。我想象它始终在运行,有个性,并且对我周围环境的感知和我一样。
但如今的聊天机器人和agent并非如此。我们为了完成任务和项目而启动它们,但如果不给它们发消息,就什么也不会发生。它们干巴巴的、机械刻板,只知道我们给它们的上下文。
我有个直觉:人们之所以对“我们是否已实现AGI”意见不一,更多是因为产品形态,而非模型能力。
(过度)简化地说,我会把这种always-on、Jarvis式的形态定义为:
聊天机器人与always-on agent
这篇文章里,我们聊聊我们如何为always-on agent设计架构,以及当今模型的哪些局限让这件事变得困难。
与其管理一堆不同的对话线程、为每个线程配置好工作所需的正确上下文,我们只想跟一个“AI”对话——它了解我们,替我们处理一切。
假设我们一觉醒来病了。我们希望一个agent就能取消会议、点汤、查症状,必要时还能预约医生。
乍一听这很简单:把所有东西统一到一个线程里,称之为单线程agent就行了。难的是上下文窗口管理,因为把所有东西都塞进一个agent,很快就会把它的上下文窗口填满。
我们还常常想同时做几件事。预约医生或点餐可能要花些时间,因为它们是比较重的浏览器操作任务,而我们希望一边继续聊症状,一边不必等其它事情全部做完。
Compaction是管理上下文窗口的事实标准,但我们发现,compaction会让agent的势头被“切除脑叶”,尤其是当它由第三方进程执行时。
更合理的做法是给agent提供compact的工具,并让它感知自己上下文窗口有多满,然后由它自己管理token,这样它既能保持势头,又能避免溢出。
在实践中,我们的agent倾向于等到一个间隙——比如任务结束时——再执行compact。然后它们把不会再需要的推理过程和工具调用折叠收起,保留一切仍在进行中的内容。
一个agent折叠并丢弃自己的上下文
Dispatch
即便有良好的compaction,如果agent把所有重活都放在一个线程里做,这个线程也会很快被填满。所以我们还给主agent配备了可以派发工作的sub-agent。
这是一石二鸟:既释放了主线程,让它容纳更多关于全局的、更高层的上下文,又让agent能在更深层的工作上多任务并行——比如点餐和预约医生——同时还能继续跟你对话。
点汤在附近找汤鸡肉面,14美元结账中下午12:40送达 预约医生查询保险今天有3个空位预约下午3:15已预约下午3:15
一个线程里的病假一天,配两个sub-agent
Proactive
Proactive agent无需被提示就能做事,也能主动发消息。比如,agent知道你周三要飞Austin,它可以找到你Airbnb的入住信息,规划出从机场到那里的最佳路线,并在你落地时把这些一并发给你。
要在架构上解锁这种行为,我们首先得摆脱agent基于请求的本质。典型的系统运作起来很像同步函数:我们发一个请求,然后等agent返回。
要实现proactivity,agent需要在它想醒着的时候醒着,并且无论我们有没有给它发请求,都能给我们发消息。
我们给agent一个heartbeat。heartbeat就是一条简单的消息“heartbeat”,我们把它推入聊天历史。如果agent在休眠,它会把agent唤醒。
我们可以按固定节奏运行heartbeat(比如每小时一次),也可以让agent通过安排自己的heartbeat来管理自己的清醒状态。
我们还给agent一个向用户发消息的工具。在普通聊天中,agent在一轮中的最后一条消息就是对我们的回复。而在这里,只有当它调用这个工具时,消息才会到达我们,所以它可以醒来、做点事,然后判断没什么值得说的。它的最后一条消息会留在该线程里,作为它自己关于发生了什么事的备注。
在Austin那个例子里,agent在一次例行heartbeat中醒来,发现了航班。它派一个sub-agent去汇总路线和入住信息,然后安排在航班落地前后再来一次heartbeat,好在合适的时机给你发消息。
我们正在从用AI构建产品中学到的东西。每月两封简短邮件。
Situational awareness
Proactivity的前提是知道自己正在做什么、什么时候做。我们希望agent能够根据我们不完整的信息采取行动,并且像Austin例子那样,甚至能根据来自外部世界的触发因素开始工作,而不仅仅是我们直接下达的指令。
在基础层面上,我们可以通过广泛的访问权限来实现situational awareness:给agent对我们邮箱、浏览器和文件系统的完全访问权,让它能发现我们预订的航班和住宿、搜索过往订单,并从我们的行为中发现模式,从而浮现出我们的偏好。
这里的一个简单诀窍就是给agent提供computer use工具,并让它访问我们的电脑。coding agent靠一个在我们电脑上运行终端命令的简单工具就变得很强大,通用agent用computer use也能做到同样的事。
但agent不知道自己不知道什么,而在技术上具备发现上下文的能力,往往不足以实时理解正在发生什么。
所以我们给agent一个通知系统,信息一可用就被注入agent的上下文窗口。通过订阅世界中的事件,agent可以更早发现重要上下文,并在需要时介入。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。