AWS 开源研究型智能体运行时 Infinity:调用工具就挂起、结果回来再恢复,基准中每个空闲智能体约占 100KB 内存

AWS 10 月 23 日在开源博客发布 Infinity,这是 AWS 与加州大学伯克利分校合作的 Hydro 项目下的研究型智能体运行时,Rust 编写,Apache 2.0 许可,代码在 GitHub hydro-project/infinity。它借用编程语言里无栈协程挂起异步函数的做法:智能体每次调用工具,运行时就保存对话历史、派发调用并结束当前执行片段,等工具结果进入输入队列再从存储中恢复,等待期间不占进程。AWS 用模拟模型跑了 8 万个智能体、320 万次补全,单线程下每个空闲智能体常驻内存约 100KB,按此推算 8GB 可容纳约 7.5 万个。它还能以 Lambda + SQS FIFO 的无服务器方式部署,并用「合成工具调用」把异步事件和子智能体汇报送回模型。AWS 称这是早期研究版本,用于征求反馈。

智能体大部分时间在等

编码智能体可能启动一次要跑 20 分钟的构建,分诊智能体可能要等几个小时才来下一个 Pull Request,助手可能要等到第二天早上才拿到审批。AWS Hydro 团队研究负责人 Shadaj Laddad 在 10 月 23 日的 AWS 开源博客里指出,多数智能体框架把循环写成阻塞步骤:调用模型、调用工具、等工具返回,等待期间一直占着进程和内存,也没法响应中途到来的事件。

Infinity 是这篇博客发布的回答。它属于 AWS 与加州大学伯克利分校合作的 Hydro 项目,用 Rust 编写,以 Apache 2.0 许可开源,代码在 GitHub 的 hydro-project/infinity 仓库。

把智能体当成无栈协程

Rust、JavaScript、Python 的 async/await 在遇到等待时会挂起函数、保存继续执行所需的状态。Infinity 把这个思路搬到智能体上:智能体调用工具的那一刻,对话历史就包含了恢复它所需的全部信息。运行时把每个智能体拆成一个个有界的执行片段——从存储加载历史、跑一次模型补全、持久化输出、最多派发一个工具调用,然后结束。工具结果、用户输入都作为消息进入共享输入队列,到达时再启动新片段。工具写法也随之变化:execute 只负责发起任务并立即返回,完成后自己把结果送进队列。

AWS 用模拟模型写了基准:8 万个智能体、每个 20 轮,共 320 万次补全,跑在 AMD EPYC 9R14 的单个线程上、使用内存存储。常驻内存随数量线性增长,每个空闲智能体约 100KB,主要是对话历史;按这个速率,约 7.5 万个智能体可以放进 8GB——也就是树莓派 5 的内存。需要注意,这是用模拟模型测出的运行时开销再推算的结果,并不代表 7.5 万个智能体在树莓派上跑真实模型。

无服务器部署与合成工具调用

因为片段不等待任何外部操作、所有状态都从存储读取,Infinity 可以跑在无服务器平台上。AWS 的参考部署用 SQS FIFO 作输入队列(每个线程一个消息组),每次投递触发一次 Lambda,对话历史存 Aurora DSQL,去重状态存 DynamoDB,定时器用 SQS 延迟投递和 EventBridge Scheduler,仓库附带 CDK 构件。一个等待三天 CI 结果的智能体,在此期间不消耗计算。

模型 API 要求每个工具调用恰好对应一个结果,订阅类工具却会持续产生事件。Infinity 的做法是插入一个模型并没有真正发起的「合成工具调用」receive_event__injected,参数指向最初那次调用,结果里放事件内容;内置的 spawn_thread 与 report_to_parent 也用同一机制让父子智能体通信,无需另建消息系统。

AWS 把 Infinity 定位为早期研究版本,不是托管服务,博客列出的待解问题包括:模型多在同步工具调用的轨迹上训练,交错事件会怎样影响决策;调度优先级;长时间运行的智能体树如何压缩上下文;以及面向互联网的智能体如何确认事件来源可信。

via: AWS Open Source Blog:Introducing Infinity: a runtime for extreme agent concurrency、GitHub:hydro-project/infinity