NVIDIA-labs OO Agents: 原生Python面向对象Agent
传统Agent开发分散在提示模板、工具模式、回调代码和工作流图中。我们提出NVIDIA Object-Oriented Agents (NOOA),一个模型无关的Python框架,用于构建可靠的AI Agent。NOOA采用更简单的方式:一个Agent就是一个Python对象。其方法是模型可执行的动作,字段是其状态,文档字符串是其提示,类型注解是合约。方法体由...组成的方法在运行时由LLM驱动的Agent循环完成,而具有正常方法体的方法保持标准的确定性Python。这为开发者和Agent提供了相同的接口,因此Agent行为可以像其他软件一样进行测试、追踪、重构和改进。 本文做出三项贡献:(1) 提出了Agent作为Python对象的编程模型及其设计原则。在Python已有抽象的地方,我们直接采用。Agent特定能力——上下文、事件、状态渲染、长期记忆和验证的LLM循环——通过简单的Pythonic API暴露,使开发者和Agent共享一个熟悉的编程模型。(2) 识别了六个模型端概念,据我们所知,NOOA是首个在单一界面上结合这些概念的方法:类型化输入/输出、对活动对象的引用传递、代码即行动、可编程循环工程、显式对象状态以及模型可调用的上下文和事件harness API。我们发现社区已经在几个这些概念上趋同——通常作为实验性或部分特性——并进行了比较以鼓励进一步采用。(3) 我们展示了当前模型在目标能力测试以及Agent和推理基准(如SWE-bench Verified、Terminal-Bench 2.0和ARC-AGI-3)上有效使用此界面。
论文精读
TL;DR NOOA 以 Python 对象为 Agent,方法即动作、类型为契约,使 Agent 开发、测试与重构与普通软件一致,首次在统一接口上融合类型、状态、记忆等六项关键能力。
问题
问题背景
LLM 驱动的 AI Agent 正从单步工具调用走向多步自主规划与执行,业界急需可靠、可维护的开发范式来应对日益复杂的 Agent 逻辑。
现有方法的局限
当前主流 Agent 框架(如 LangChain、Semantic Kernel)将 prompt 模板、工具 schema 定义、回调处理 和 工作流编排 分散在不同位置,导致:
- 接口割裂:开发者需维护多套抽象,Agent 行为调试困难,测试与重构成本高。
- 代码与提示分离:LLM 看到的指令与运行时执行的代码无直接映射,难以校验一致性。
- 复用与扩展性差:工具通常以 JSON Schema 描述,缺乏类型安全,无法利用 Python 现有类型系统和 IDE 支持。
- 工程化不足:Agent 的状态管理、记忆、事件处理缺乏统一原生机制,多依附于外部存储或自定义回调。
为什么这个问题重要且困难
构建生产级 Agent 要求:确定性逻辑与非确定性 LLM 推理的无缝混合;状态的显式、可审计管理;对多种模型和策略的模型无关支持。现有框架往往将 LLM 交互视为黑盒,导致难以进行版本控制、单元测试和持续集成。NOOA 提出的“Agent 即 Python 对象”统一编程模型将 Agent 能力封装为类方法,docstring 作为 prompt,类型标注作为契约,... 占位的方法体由 LLM 循环自动补全,而普通方法依然是确定性代码。这种设计使开发者与 Agent 共享同一接口,Agent 行为可像普通软件一样被 测试、追踪、重构,直接回应了 Agent 开发的核心工程挑战。
行业类比
类似 React 将 UI 组件化以提升前端工程效率,NOOA 将 Agent 组件化为 Python 对象,让 Agent 开发回归到熟悉的面向对象软件工程范式。
核心洞察
- **代理即 Python 对象** 统一了开发者与代理的编程模型。NOOA 将代理定义为普通类,方法作为可行动作,字段体现状态,文档字符串充当提示,类型注解形成契约。这与主流框架(如 LangChain/LangGraph)将代理拆分为提示模板、工具模式、回调与图的异构范式根本不同,使代理代码可直接进行单元测试、跟踪、重构,回归熟悉的面向对象工程实践,消弭了长期以来开发者与代理之间的接口鸿沟。
- **LLM 驱动的空方法体**(`...`)实现了确定性代码与生成式行动的有机融合。常规方法保持静态执行,仅空方法体在运行时交由 LLM 代理循环动态补全并执行。这比传统工具调用所需的 JSON schema 或函数声明更贴近“代码即动作”的理念,既让代理充分利用模型的理解与规划能力,又无缝嵌入标准 Python 运行时,为构建兼具可靠性与灵活性的复杂代理创造了新的设计空间。
方法
输入:面向对象的代理定义
开发者通过标准 Python 类定义代理,包含:
- 状态字段(类属性):保存代理的上下文和长期记忆,如对话历史、文件系统快照。
- 动作方法:用
def method_name(self, params) -> ReturnType:声明,方法体为...表示由 LLM 驱动执行;正常方法体则维持确定性 Python 逻辑。 - 提示与契约:
docstring作为提示词描述方法意图;类型标注(typing)定义输入/输出的结构约束。 - 配置标记:通过装饰器或元数据指定策略(如推理深度)、事件钩子等。
关键模块:LLM 驱动的代理循环
代理的运行核心是 Agent Loop,它反复执行以下步骤:
- 上下文组装:将当前对象状态、方法签名、docstring、类型信息及对话历史序列化为 LLM 可消费的上下文。
- LLM 调用:将上下文发送给模型(模型无关,支持任意 LLM)。模型返回一个结构化动作,通常为一段 Python 代码片段。
- 代码执行:在安全沙箱中执行 LLM 生成的代码。该代码可以操作传入的实时对象(pass-by-reference over live objects),调用其他代理方法或外部工具。
- 状态与事件更新:执行后更新对象状态,并触发事件机制(如日志、验证钩子)。
- 终止验证:检查方法返回值类型是否符合类型标注,或是否满足自定义终止条件。
- 长期记忆管理:代理可自行将重要信息写入持久化状态字段,实现自主记忆策展(agent-curated memory)。
输出:可测试、可追踪的软件构件
代理方法执行完毕后返回符合类型契约的结果。由于代理即 Python 对象,开发者可使用标准软件工程实践:单元测试、重构、版本控制、性能剖析。
跟同类方法的差异点:与依赖 YAML 流程、模板引擎或图编排的框架(如 LangGraph、OpenAI Agents SDK)不同,NOOA 首次在同一表面集成了类型化输入/输出、实时对象引用传递、代码即动作、可编程循环工程、显式对象状态和模型可调用的上下文/事件 API六大思想,使代理开发与常规 Python 开发完全同构,大幅降低认知负载和维护成本。
实验
实验设计
评估围绕四个维度展开:
- 能力测试:验证模型是否理解 NOOA 的 Pythonic 接口,能否正确调用对象方法并使用类型注解。
- 软件工程与终端交互:在 SWE-bench Verified 和 Terminal-Bench 2.0 上测试智能体修复代码、操作 shell 的能力,考察推理深度与终止准确性。
- 网络安全:在 CyberGym L1 环境中评测安全加固任务。
- 抽象推理:在 ARC-AGI-3 上探索得分与成本的 Pareto 前沿,验证框架的灵活性与效率。 测试模型包括 Nemotron 3 Ultra、Claude Opus 4.8、GPT-5.5 等前沿 LLM。
关键发现
- 模型能有效利用对象方法与类型合约,在无额外 finetune 的情况下完成各类任务。
- 通过
...占位符声明的方法被 LLM 循环自动补全,而显式实现的普通方法仍保持确定性行为,混合执行简化了调试与优化。 - 在 SWE-bench Verified 上,NOOA 智能体利用显式对象状态和可编程循环工程,实现了高效的环境交互与上下文管理。
- ARC-AGI-3 实验表明,调整推理策略可在不显著增加成本的情况下提升性能,展示了自动化成本控制的潜力。
基线对比解读
传统框架将智能体开发分裂成提示模板、工具模式、回调代码和工作流图多个部分,导致维护复杂、可追溯性差。NOOA 采用 Python 原生面向对象的设计,将上述分散概念统一到类内:
- 方法即动作,docstring 即提示,类型注解即合约。
- 率先在单一界面中结合六个模型导向的特性(类型化 I/O、实时对象传递、代码即动作、可编程循环、显式状态、Harness API),而其他框架仅部分或实验性实现。
- 与 LangChain、OpenAI Agents SDK 等相比,NOOA 减少额外抽象层,使智能体行为像普通 Python 代码一样可测试、追踪和重构,显著降低工程复杂度并提升可靠性。
行业影响
落地场景
NOOA 的“Agent 即 Python 对象”范式特别适合需要复杂状态管理和多步工具调用的业务场景。例如,企业级 RPA 平台可利用 NOOA 构建可测试、可追踪的自动化代理,直接复用 Python 方法作为工具,降低脚本与 LLM 集成的胶水代码。在智能运维 (AIOps) 中,代理可封装系统诊断、日志分析等方法,通过 ... 体实现 LLM 自主决策,同时保留部分确定性方法用于安全敏感操作。电商客服场景中,代理类可定义 refund(), track_order() 等方法,docstring 即 prompt,类型注解保证输出合规,与订单系统无缝对接。
商业价值
NOOA 显著降低 Agent 开发与维护成本。传统框架需要维护 prompt 模板、工具 schema、回调代码等分散组件,NOOA 将它们统一为熟悉的类定义,减少了上下文切换与出错可能。通过引入可测试性,Agent 行为能像普通软件一样进行单元测试和回归测试,提升部署信心,降低生产事故风险。在 SWE-bench Verified 等基准上已验证效果,意味着在软件工程和终端交互类任务中,NOOA 可加速开发周期,将人力投入从繁琐的集成工作转向业务逻辑优化,实现增收(更快交付智能化特性)与降本(减少工程消耗)。
与现有产品/工作流的接口
NOOA 作为纯 Python 框架,天然融入现有技术栈。代理类可直接导入已有的 Python 模块、微服务 SDK 或数据库 ORM,无需构建中间服务。可与 FastAPI / Flask 结合暴露 Agent REST 端点,或与 Celery 集成实现异步任务。在 MLOps 流水线中,代理类的实例可被序列化、版本化,与模型实验一同管理。此外,NOOA 的 Context 和 Events 机制可对接可观测性平台(如 Grafana、Datadog),利用标准日志和指标系统监控 Agent 决策。与 OpenAI Agents SDK, LangChain 等框架相比,NOOA 更倾向于统一面向对象接口,而非图/链式编排,这使得集成到现有面向对象架构中的摩擦更小。
具体落地 Use Case
- 电商智能工单处理:定义
SupportAgent类,方法refund(order_id: str) -> RefundResult体为...,让 LLM 根据对话上下文决定是否调用退款,并填充参数;方法escalate(reason: str) -> Ticket则为确定性逻辑。短期内存存储会话状态,长期内存沉淀常见问题模式,随业务变化只需更新类定义,无需重写 prompt 链。 - 内容平台合规审核:
ModerationAgent包含review_content(text: str) -> Verdict方法用于 LLM 判断,block_user(user_id: int)为确定性操作。代理可利用Context注入最新政策文档,通过Events上报审核记录,内部状态缓存审核历史,实现可审计的自动化工作流。
局限
- **语言绑定与生态通用性**:NOOA 深度依赖 Python 的对象模型、类型提示和 `...` 占位符语法,使其与 Python 生态强耦合,难以直接迁移到 TypeScript、Rust 等常见后端语言。在多服务、多语言协作的复杂系统中,需要额外的一层适配或包装,限制了框架的跨语言复用能力。与更轻量的 HTTP/API 接口式 agent 框架相比,语言绑定是一项内在约束。
- **复杂工作流的表达能力**:将 agent 抽象为 Python 对象简化了确定性的工具调用,但对于包含条件分支、并行子任务、动态规划和回退策略的高级工作流,面向对象的方法可能不如显式状态机或图式工作流(如 LangGraph)直观。`...` 方法体由 LLM 自由生成,缺少声明式的流程控制,可能导致不可预测的控制流和调试困难,对高可靠性场景的工程化能力有待验证。
- **评估的覆盖度与对比基线**:论文在 SWE-bench Verified、Terminal-Bench 2.0 和 ARC-AGI-3 上展示了有效性,但未与大量社区主流的 agent 框架(如 AutoGen、CrewAI、Semantic Kernel)进行系统的性能、效率和可复用性对比。评估主要聚焦于特定 LLM 对 NOOA 接口的理解,缺少对框架本身在长时间运行、高并发和资源消耗方面的工程指标分析,其普适性结论尚待更广泛的验证。