NVIDIA 面向对象智能体:原生 Python 对象式智能体框架 NVIDIA-labs OO Agents: Native Python Object-Oriented Agents
把智能体做成 Python 类:方法即动作、字段即状态、类型即契约的 Agent 框架。
前置知识
CodeAct(代码即动作)
一种让大模型通过编写并执行代码(而非发起 JSON 工具调用)来采取行动的智能体范式。模型在一个持久的 Python 解释器会话里工作,可直接调用工具函数、操作变量、写循环与条件,把中间结果留在内存中跨轮次复用。它最早由 Wang 等人提出,证明可执行代码作为动作模态优于 JSON 和文本动作;OpenHands 在其上验证了大规模可用性。
NOOA 的默认策略 CodeActStrategy 正是这一范式的面向对象实现,理解 CodeAct 才能理解 NOOA 为什么坚持在进程内执行模型代码、而非把数据序列化进提示词。
智能体循环与工具调用
智能体通过「渲染上下文→调用 LLM→执行动作→更新状态」的循环不断与环境交互。传统框架用 JSON Schema 描述工具,模型生成工具调用文本,框架解析后执行、再把结果序列化回文本塞进对话历史。
NOOA 把这个循环重构为一个普通 Python 方法调用,弄清传统循环的痛点(序列化、上下文膨胀、终止不可控)才能体会本文的设计动机。
Python 类型注解与 Pydantic
Python 3.5 起支持在函数签名上标注参数与返回值类型,这些注解默认只起文档作用、不影响运行;而 Pydantic 这样的库会在运行时依据注解(含 Field 约束)对数据做校验,校验失败时抛出结构化错误并支持自动重试,从而把类型从静态约定变成可执行契约。
NOOA 把类型注解当作可执行契约:返回值会先经校验再交给调用方,类型即合约是整个框架的基石。
上下文工程
指系统性地管理送入模型上下文窗口的内容,包括系统提示、历史事件、动态状态、记忆等,目标是最大化 KV 缓存复用、控制成本、保留关键信息。
NOOA 的三段式上下文(静态块、事件历史、动态块)与渐进式披露的对象预览都服务于上下文工程,理解它才能看懂本文为何强调缓存复用与按引用传递。
强化学习与归纳推理
通过最大化任务结果奖励来训练模型自发习得推理与行动策略的方法。DeepSeek-R1 证明基于结果的强化学习能诱导出有用的推理行为。
本文把用强化学习解锁归纳推理列为未来方向,认为整个智能体轨迹可作为 RL 的动作空间,理解 RL 才能把握作者对框架与模型协同进化的展望。
研究动机
当前智能体开发被割裂在多个互不相通的抽象里。一份智能体的源代码通常散落在提示词模板、工具 JSON Schema、回调代码、配置文件和编排图(workflow graph)之中,开发者学一个新框架往往等于学一套全新的编程模型。然而这些框架要表达的——类型化接口、变量作用域、控制流、异步执行、对象状态——在普通编程语言里早已是成熟概念。更关键的是,这些传统抽象不仅开发者熟悉,而且大量出现在 LLM 的训练数据里。结果是框架用领域专用语言(DSL)重新发明了模型本已掌握的能力,反而制造了摩擦:工具调用在每一步都要把输入序列化成文本、把输出再解析回宿主语言;长任务里对话历史不断膨胀、被有损压缩;模型还常常在没给出证据时就自我宣布完成。作者调研了十四个主流框架与 harness,发现社区其实正在朝同一组理念收敛,但往往以实验性、flag-gated 的零散功能存在,没有谁把它们统一到一个表面上。
本文的目标是本文的目标是设计一个模型无关(model-agnostic)的 Python 智能体框架,让「智能体即 Python 对象」成为唯一接口:类定义智能体,方法是它能采取的动作,字段是它的状态,docstring 是它的提示词,类型注解是契约。方法体为普通代码则确定性执行,方法体为省略号 ... 则由 harness 在运行时展开成 LLM 驱动的循环。这样一来开发者和智能体共享同一套编程模型,智能体行为可以像普通软件一样被测试、追踪、重构、版本化和优化。作者还要验证当前模型能否零样本地用好这套接口,并在 SWE-bench Verified、Terminal-Bench 2.0、CyberGym L1 和 ARC-AGI-3 四个端到端基准上证明这种简化不会牺牲效果,甚至在 ARC-AGI-3 上把多智能体世界模型系统压缩成单智能体加一页技能后仍能推进分数—成本帕累托前沿。
与已有工作不同的是,NOOA 的独特切入点是「凡 Python 已有合适抽象就直接采用,凡智能体特有概念就暴露成 Pythonic API」。它借鉴 PyTorch「强大运行时仍能呈现简单 Python 编程模型」的理念,把六个面向模型的能力首次整合到单一表面:类型化输入输出、对存活对象按引用传递、代码即动作、可编程的循环工程、显式对象状态、模型可调用的 harness API(上下文与事件)。与以往系统相比,NOOA 拒绝在每个接口处做拷贝成文本,而是用渐进式披露把大对象以有界预览呈现给模型、同时让真实对象在执行环境里按引用存活——这使得智能体能处理的数据量受限于执行环境而非提示词长度。这套设计把提示词工程重新拉回软件工程,是其与现有框架的本质区别。
核心方法
整体直觉是:既然 LLM 已经精通 Python,那就让智能体的全部结构都用普通 Python 表达,而不是发明一套 DSL。技术路线上,一个完整智能体就是一个 Python 类,同时承担源码、提示词表面、类型契约、工具接口和状态边界五重角色。类里的普通方法(有真实方法体)像普通 Python 一样确定性执行,可被测试、可被模型调用;方法体写成省略号 ... 的方法则被 harness 视为智能体方法,运行时展开成一个 agent 循环:方法签名给出结构化输入与输出校验契约,docstring 变成提示词,self 上的方法和导入的库成为可调用工具。harness 用策略(strategy)装饰器来控制这类方法的执行,内置 PredictStrategy(单次调用、用于分类/抽取)和 CodeActStrategy(迭代式 Python REPL)。输入不是序列化进提示词的文本,而是按引用传入的存活对象,harness 只渲染有界预览,模型写代码直接操作真实对象。这样行为可以被测试、追踪、重构,提示词工程回归软件工程。
核心创新在于把六个面向模型的能力首次拼在同一表面上,而承载它们的不是新 DSL,而是普通 Python 类与方法。最本质的差别是「按引用传递存活对象」加「代码即动作」的组合:传统框架每一步都要把工具输入序列化成文本、把输出再解析回宿主语言,长结果只能溢出到磁盘文件再被后续命令读取;NOOA 让大参数以有界预览(声明真实类型、真实长度、头尾样本、其余省略)出现在提示词里,但变量本身是绑定在执行环境中的完整对象——模型可以写 for 循环遍历百万行表,却只有它选择 print 的少量预览进入上下文窗口。这使得智能体的处理能力受执行环境而非上下文窗口限制,并且因为工具输出以存活 Python 值跨轮次保持,避免了反复序列化导致的上下文膨胀与有损压缩。再加上「类型注解即可执行契约」让终止变成一个会被校验的动作、而非仅靠提示词约束的惯例,这套机制是 NOOA 性能优势的来源。
方法步骤详情
一次 CodeAct 方法的执行按六步展开。第一步渲染上下文(3.2):harness 由 ContextManager 与 EventManager 把三块内容拼成模型上下文——静态块(系统提示等,每轮不变,便于 KV 缓存复用)、事件历史(append-only 的类型化事件记录执行轨迹)、动态块(每轮重新求值的存活状态,如 todo 列表、self 的相关字段),媒体参数以原生多模态块呈现。第二步调用 LLM(3.3):模型在 Predict 策略下须产出符合返回标注的值,在 CodeAct 下须选择 execute_python(...) 继续计算或 return_result(...) 结束方法。第三步执行 Python(3.4):代码在受限的 Jupyter 式会话中运行,方法参数、存活 self、环境作为局部变量注入,可直接 await;危险 API(eval/exec/compile/input、阻塞调用)被拒,错误以 IPython 格式回传供模型自修复。第四步更新事件与状态(3.5):工具调用、Python 输出、返回值作为类型化事件追加;REPL 局部变量方法级作用域、方法返回即消失,经 self 或库调用的副作用则持久。第五步循环回到渲染,直到模型提交结果。第六步校验返回(3.6):harness 按返回类型校验,失败则把错误送回模型继续,成功则把值交还调用方、恢复普通 Python 执行。此外每个方法可经 strategy 装饰器做 per-method 覆盖(模型、截断、作用域上下文),同智能体外部发起的调用被串行化、嵌套调用遵循栈式规约、不同智能体则按 async/await 并行。
技术新颖性
技术新颖性体现在三点。其一,作者系统识别出六个面向模型的能力并据其扫描十四个框架(Table 7),证明 NOOA 是首个把它们全部暴露在同一表面上的开发套件,且社区正各自零散地走向这些理念——Microsoft 的 harness providers、Pydantic 的 CodeMode、OpenAI 的 sandbox agents、Codex 的 code mode 大多在本文评估窗口内才发布且多为 flag-gated。其二,渐进式披露式对象预览(声明真实类型/长度/头尾样本、隐去中间)让按引用传递真正可扩展到超上下文规模的数据,这是把 Rich 的 pprint() API 改造为 LLM 友好格式的工程创新。其三,把记忆、上下文、事件都做成模型可自主调用的 Python API:MemoryManager 以非侵入方式挂载到任意智能体,模型用七个工具(remember/recall/search/update_memory/forget/associate/deref)自主维护记忆库,检索按 ACT-R 激活值(相关性、近因性、重要性)排序并在类型化记忆图上传播,自发的反思在循环外做合并/重打分/剪枝——这把记忆管理从后台抽取管线变成了模型的有意行为,并延伸了按引用传递(记忆可持有对存活状态的类型化引用,召回时不读陈旧副本)。
实验结果
评估分两层。能力测试套件含 36 个家族、88 个实例,对十个模型各跑五次共 4400 条记录(Table 1),整体通过 4309/4400(97.9%);小/高效模型 96.0%、大/前沿模型 99.2%,每个模型都超过 91%,GPT-5.5 满分(440/440,100.0%),Gemini 3.5 Flash 与 GLM-5.2 仅各错一题。这说明界面本身对当前模型不是负担。六项压力测试(Table 2,300 条)整体 84.7%,前沿 93.9%、小模型仅 70.8%——规模差从整体的 3.2 点放大到 23 点,残留失败集中在批量簿记、错误恢复、REPL 探索、把重复变换分解成可复用助手等长程任务上。在端到端基准上,SWE-bench Verified(500 题,Table 3)NOOA 在每个模型/推理配置下都是开源 harness 最高:GPT-5.5 达 67.2%/78.8%/82.2%(off/high/xhigh),xhigh 时 OpenCode 78.6%、PI 78.2%;Opus 4.6 达 79.8%,高于 OpenCode 75.2% 与 PI 75.8%;相对 OpenHands v3 的 68.4%(Opus 4.6)提升 11.4 点。且高分不靠更长轨迹——xhigh 下 NOOA 用约 28 次调用、1.1M tokens 拿到 82.2%,PI 却要 66 次调用、2.2M tokens 才到 78.2%(Figure 6)。Terminal-Bench 2.0(89 题,Table 4)优势更大:GPT-5.5 high 时 NOOA 73.0%,领先 OpenCode 12.3 点、PI 4.5 点;Opus 4.6 high 时 65.2% vs 43.8%/58.4%。CyberGym L1(Table 5)NOOA 以 GPT-5.5 拿到 86.8%,是开源最高、并超过多数闭源方案。ARC-AGI-3(Figure 7)世界模型技能加记忆在 GPT-5.5 上达 RHAE 50.2%,比 baseline +8.5、比 markdown 文件消融 +11.8;GPT-5.6-sol 上达 85.1%,而 ARC Prize 官方对裸 GPT-5.6-sol 的评测仅 13.3%,即 6.4 倍 harness 增益,且每局花费低于 20 美元。作者还用 18 轮红队审计验证了沙箱无泄漏。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| SWE-bench Verified(软件工程,500 题) | 任务通过率% | 82.2%(GPT-5.5 xhigh)/ 79.8%(Opus 4.6 high) | OpenCode 78.6% / PI 78.2%(GPT-5.5 xhigh);OpenHands v3 68.4%(Opus 4.6) | 每个配置均开源最高,较 OpenHands v3 +11.4 点;用约 1.1M tokens 对比 PI 的 2.2M |
| Terminal-Bench 2.0(终端交互,89 题) | 任务通过率% | 73.0%(GPT-5.5 high)/ 65.2%(Opus 4.6 high) | OpenCode 60.7% / PI 68.5%(GPT-5.5 high) | GPT-5.5 high 领先 OpenCode 12.3 点、PI 4.5 点 |
| CyberGym L1(漏洞发现与验证) | 解题率% | 86.8%(GPT-5.5,开源最高) | OpenAI Codex + 提交技能 83.5%;OpenAI Codex 64.9% | 开源最高,并超过 Daybreak(85.6%)、Glasswing(83.1%) 等多数闭源方案 |
| ARC-AGI-3(交互推理) | RHAE(动作效率相对人类) | 85.1%(GPT-5.6-sol)/ 50.2%(GPT-5.5) | 裸 GPT-5.6-sol 13.3%(ARC Prize 官方评测) | 6.4× harness 增益;记忆系统较 markdown 文件消融 +11.8 RHAE 点 |
| 能力测试套件(界面可用性) | 通过率% | 97.9% 整体(4400 记录) | 无直接基线(自建套件) | 十模型均 >91%,GPT-5.5 满分,证明界面本身非负担 |
局限与改进
作者承认的主要局限是安全性:NOOA 在智能体自身进程里执行模型写的代码,3.4 节的校验器只保护 agent 循环、不保护宿主机。其隔离哲学与任何带 shell 工具的 harness 一样——沙箱(容器、虚拟机或权限系统)要包在 agent 进程之外,shell 工具并不比进程内 Python 更安全,大多数第六节里的 harness 都自带一个。进程内执行正是按引用传递得以成立的前提;沙箱化的代码模式会牺牲它、只能在沙箱边界接收序列化副本,作者倾向用 OpenShell 部署。从读者角度看还有几处隐含局限:能力/压力测试只覆盖十款模型、且多为短交互(1–5 轮),长程任务失败率仍高(小模型压力测试仅 70.8%);预览格式是经验性调出的,作者明说为 LLM 找到更直观的预览格式、支持更多类型仍是开放问题;记忆子系统只在 ARC-AGI-3 上做了消融,缺乏跨任务迁移的直接证据(workspace 在任务边界会被丢弃)。此外 Figure 6 显示推理投入越高、NOOA 相对开源对手的领先越小,暗示其优势部分来自替模型补足规划与校验纪律,在更强推理模型上可能被摊薄。
独立分析的弱点
弱点一:小模型在长程压力任务上明显吃力(70.8%),批量簿记、把重复变换分解成可复用助手等环节失败集中——改进方向是把这些多步纪律性使用做成更明确的策略提示或框架级原语,例如内置批量 map/reduce 助手与检查点。弱点二:对象预览格式是经验性产物、类型覆盖有限,作者自己也列为开放问题——可借鉴 smolagents 的命名空间注入与 Recursive Language Models 的递归查询,做自适应预览与按需展开。弱点三:安全模型依赖外部沙箱包住进程,进程内执行是按引用传递的代价——可探索在沙箱边界保留类型化句柄而非纯文本副本,兼顾安全与引用语义。弱点四:记忆只在单一基准做了消融,且 workspace 在任务边界被丢弃、迁移是开放问题——可引入跨任务/跨会话的持久工作区与课程式迁移评估。弱点五:开源 harness 对比里 NOOA 在高推理投入下领先收窄(Figure 6),说明其结构红利部分来自替模型补足规划——可在内置 BenchAgent 中加入更强的自校验与回溯机制,把这种替代做得更稳健。
未来方向
作者明确提出三个方向。其一是通过智能体重写做智能体优化:超越提示词搜索,改写智能体的每一部分——提示词、docstring、类型化方法签名、助手代码、工具描述、上下文策略、重试循环、分解结构,以 GEPA 式反思优化为起点,目标是整个智能体对象及其 harness。其二是技能成为完整软件包:今天的 skill 多是文本片段或非正式流程,作者预期 skill 会演化成带类型 API、文档、测试、示例、子智能体、依赖与版本化接口的完整库,供智能体检查、调用、修复和扩展。其三是用强化学习解锁归纳推理:借鉴 DeepSeek-R1 的基于结果的 RL,但作用在比纯文本更丰富的动作空间上——让 RL 覆盖完整智能体轨迹,使模型学会何时揭示上下文、保留哪些变量、何时写确定性助手、何时把模式提升为可复用库、何时把任务分解为确定性编排,把 harness 当作学习基底。基于成果可延伸的方向还包括:把六能力在不同模型规模上的最佳实践沉淀为基准、为预览格式做系统性 LLM 可读性研究、以及把记忆子系统扩展到跨任务迁移。
复现评估
复现评估整体较高。作者明确给出代码仓库(nvidia-nemo/labs-OO-Agents)并承诺能力测试套件与 BenchAgent(253 行普通 Python)随仓库发布,基准均用公开数据集(SWE-bench Verified、Terminal-Bench 2.0、CyberGym L1、ARC-AGI-3),比较用的 OpenCode、PI 也都给了版本号(OpenCode 1.14.33、PI v0.72.1)并固定 GPT-5.5 与 Claude Opus 4.6 后端。Table 7 的框架对比对每个系统都核对了 pinned 快照(2026 年 7 月 7–9 日取),附录给出仓库/提交/版本证据。主要复现门槛在算力与成本:ARC-AGI-3 每局花费近 20 美元、四支 25 局舰队需可观预算,且强依赖前沿闭源模型(GPT-5.6-sol 等),普通研究者难以完全复现最高分;能力测试可较易复现(88 实例 ×10 模型 ×5 次)。沙箱部分依赖 Landlock、seccomp、特权降级等 Linux 内核机制,部署到非 Linux 环境需适配。整体看,方法与接口部分高度可复现,端到端基准复现受模型与预算约束。
论文图表