Announcement

👇Official Account👇

Welcome to join the group & private message

Article first/tail QR code

Skip to content

Nvidia NOOA 深度解析:一个 Python 类就是一个 AI Agent 的面向对象范式革命

引言

2026 年 7 月 27 日,Nvidia 在发起"开放安全 AI 联盟"(Open Secure AI Alliance)的同时,发布了开源研究预览项目 NOOA(NVIDIA Labs Object-Oriented Agents)。这个框架的核心思想简单到近乎粗暴:一个 AI Agent 就是一个 Python 类

这不是又一个 Agent 框架的轮子。NOOA 的真正贡献在于提出了一个根本性洞察——决定 Agent 性能的不是模型本身,而是包裹模型的"挽具"(Harness)。Nvidia 官方数据显示,仅靠 Harness 设计的差异,就能在相同底层模型上产生基准测试结果的两位数波动和 token 成本的显著差距。

本文基于 Nvidia 官方技术博客和 The New Stack 的专家访谈,拆解 NOOA 的六大核心设计理念、内存系统和基准测试表现。

一、核心问题:Agent 开发的碎片化

当前 Agent 开发面临的核心痛点是碎片化。一个典型的 LangGraph 或 AutoGen 项目里:

  • 提示词散落在 Jinja 模板文件中
  • 工具定义写在 JSON Schema 里
  • 回调函数放在 Python 文件里
  • 工作流图画在另一个抽象层里

UST 首席 AI 架构师 Adnan Masood 将这些碎片化的组件统称为"挽具"——harness 就是包裹模型的所有外设。问题在于,这些外设天女散花一样撒在不同的抽象层里,团队需要同时维护四五套碎片化构件。

NOOA 的方案是:把这一切全部挤进一个 Python 类。

二、Agent 即 Python 对象

NOOA 的设计哲学可以用一句话概括:

Its methods are its capabilities. Its fields are its state. Its docstrings are its prompts. Its type annotations are enforced contracts.

翻译过来:

  • 方法 = 能力:Agent 能做什么,就是类里定义的方法
  • 字段 = 状态:Agent 记住什么,就是类里定义的字段
  • docstring = 提示词:告诉模型怎么思考的指令,就是方法的文档字符串
  • 类型注解 = 强制契约:输入输出的类型约束在运行时被验证

最关键的机制是省略号方法体

python
class SupportAgent(Agent):
    """You are a support agent for a customer service system."""

    order_db: OrderDB  # 对象状态:模型可见,按引用传递

    def is_refund_eligible(self, order: Order) -> bool:
        """Return whether an order is eligible for a refund."""
        return order.delivered and order.days_since_delivery < 30

    async def triage(
        self, message: str, photo: Image | None, order: Order | None
    ) -> Ticket:
        """Triage a customer message and create a support ticket."""
        ...

上面这段代码来自 Nvidia 官方博客。注意两个关键点:

  1. is_refund_eligible 方法有正常的函数体(return order.delivered and ...),这是确定性 Python 代码,跟普通函数没有任何区别。
  2. triage 方法的函数体只有三个点 ...,这是一个标准的 Python 语法(等价于 pass),但在 NOOA 中,运行时会由 LLM 驱动的循环自动补全

这意味着同一个类里,确定性代码和概率性 LLM 调用长得一模一样——相同的函数签名、相同的缩进、相同的 docstring。唯一的区别是方法体。

这个设计的收益

Nvidia 强调的核心优势是:Agent 开发回归传统软件开发模式。一个 Agent 可以:

  • git diff 查看变更
  • 代码审查(code review)
  • 单元测试(unit test)
  • 链路追踪(trace)
  • 版本管理(version)
  • 重构(refactor)

这些操作人类可以做,AI 编码 Agent 也可以做——使用的是现有代码库中早已熟悉的工具。这是 NOOA 与 LangGraph/AutoGen 等框架最本质的区别:后者需要学习一套新的抽象(图、节点、边、状态机),前者只需要写 Python 类。

三、六大模型接口设计理念

NOOA 架构识别出六项驱动 Agent 性能的模型接口设计理念。这六个理念不是新概念,但 NOOA 首次将它们统一到一个编程语言表面下。

1. 类型化输入/输出(Typed Input/Output)

Agent 调用具有类型化参数和经过验证的返回值,而非自由文本。

python
# NOOA 的方式:类型化契约
async def triage(
    self, message: str, photo: Image | None, order: Order | None
) -> Ticket:
    """Triage a customer message and create a support ticket."""
    ...

返回值是 Ticket 类型,不是 str。调用方拿到的不是一个需要二次解析的字符串,而是一个结构化对象。类型注解在运行时被验证——如果 LLM 生成的输出不符合类型约束,会触发错误处理而不是静默传递脏数据。

2. 引用传递(Pass by Reference)

模型操作的是实时 Python 对象,查看的是有界预览(bounded preview),而非序列化数据转储。

传统做法是把整个对象序列化成 JSON 塞进上下文窗口。NOOA 的方式是直接把 Python 对象的引用传给模型——模型看到的是一个"窗口"(有界预览),但底层操作的是活的对象。这意味着:

  • 对象的完整状态不需要全部序列化进上下文
  • 模型可以通过方法调用来查询对象的属性
  • 上下文窗口的利用率大幅提升

3. 代码即动作(Code as Action)

模型通过编写 Python 代码来执行操作,支持控制流和内联方法调用。

这不是"让 LLM 生成代码然后执行"的简单模式。NOOA 的设计是让模型在 Agent 类的上下文里编写 Python——模型可以调用同一个类里的其他方法,可以写 if/else 控制流,可以组合多个工具调用。

但这也带来了安全风险——The New Stack 采访的专家 Masood 指出:"这扩大了提示词注入的爆炸半径"。恶意文档或网页中的文本可能引导模型编写并执行危险代码。Nvidia 的应对方案是搭配 Nvidia OpenShell 安全运行时用于生产部署。

4. 可编程循环工程(Programmable Loop Engineering)

编排循环是普通 Python 代码,开发者可以写,模型自己也可以写。

传统 Agent 框架的编排循环是框架内部的黑盒——你不知道 LangGraph 的 agent executor 内部到底怎么调度。NOOA 把循环暴露为普通 Python 代码,开发者可以自定义循环逻辑,模型也可以在运行时修改自己的编排策略。

5. 显式对象状态(Explicit Object State)

持久化、类型化的状态存在于 Agent 对象上,而非仅仅在对话历史里。

python
class SupportAgent(Agent):
    order_db: OrderDB       # 数据库连接
    customer_history: list[Interaction]  # 历史交互
    escalation_count: int  # 升级计数器

这些字段是 Agent 的持久状态。它们不是每次对话都要重新生成的上下文窗口内容,而是存在于对象上的活数据。模型可以读取和修改这些字段,它们会跨会话持久化。

6. 模型可调用 Harness API(Model-Callable Harness APIs)

上下文块和事件历史是模型可以检查和管理的 API。

模型不只是被动地接收上下文——它可以主动调用 Harness 级别的 API 来检查自己的事件历史、管理上下文块。这给了模型一定程度的自我调节能力:当上下文过长时,模型可以主动裁剪不再需要的历史记录。

四、长期记忆:SQLite 知识图谱

NOOA 包含一个长期记忆子系统。与传统的自动后台摘要管线不同,记忆是一个由 Agent 自己策展的存储——模型通过可调用工具主动写入、查询和纠正记录。

记录结构

每条记忆记录包含:

  • 类型(type):记录的数据类型
  • 重要性(importance):优先级标记
  • 标签(tags):分类标记

知识图谱

记录之间通过类型化关系连接,构成一个知识图谱而非扁平日志:

  • supports(支持)
  • contradicts(矛盾)
  • derived-from(派生自)

这些关系让 Agent 能进行简单的推理——比如发现一条新记录与已有记录矛盾时,主动标记冲突。

后台反思

一个后台反思进程定期整合存储:

  1. 合并重复:检测语义重复的记录并合并
  2. 链接关联:将相关记录连接起来
  3. 蒸馏洞察:将具体事件序列提炼为抽象洞察
  4. 修剪过时:删除不再相关的信息

存储和共享

  • 所有记忆持久化在一个人类可读的 SQLite 文件
  • 团队可以用标准工具检查、备份和审查
  • 存储的记忆可以引用 Agent 的活状态,保持知识最新
  • 多个 Agent 可以共享一个存储,同时保持各自的归属权

基准效果

在 ARC-AGI-3 评测中,使用 NOOA 记忆系统的 Agent 比使用文件笔记的同一 Agent 的 RHAE 指标提高了 11.8 个百分点

五、基准测试表现

Nvidia 在三个基准测试上验证了 NOOA 的表现:

基准测试NOOA 得分说明
SWE-bench Verified82.2%软件工程能力,修复真实 GitHub issue
CyberGym L186.8%网络安全能力,CTF 式任务
ARC-AGI-385.1%抽象推理能力,图形模式推理

在同等效果下,NOOA 的 token 消耗约为对比方案的一半。Nvidia 将这归因于引用传递和显式状态管理减少了对上下文窗口的依赖。

需要注意的是,这些是 Nvidia 自己发布的数据,作为研究预览项目,社区还需要独立复现。Nvidia 已公开代码、数据和评估方法,鼓励社区复现、挑战和改进。

六、专家评价与争议

The New Stack 采访了三位行业专家,反馈并不一致。

正面评价

Adnan Masood(UST 首席 AI 架构师)认为 NOOA 迈出了有意义的一步。将能力、状态和提示词收入一个 Python 类,至少从工程直觉上,是朝着可测试、可追踪的正规软件工程迈了一步。他指出一个可审查、可追踪的 Agent 比逻辑散布在提示词文件和脚本碎片里的 Agent 更容易审计。

审查困境

Karthik Karunanithi(IBM 解决方案架构师)提出了一个尖锐的审查问题:

"这个类里,一个带省略号的方法交给大模型现场生成,另一个普通方法老老实实执行 Python——两者的函数签名、缩进、docstring 长得一模一样,代码审查的时候你怎么区分哪一段是可控的代码,哪一段是概率性的魔法?"

这是一个真实的工程难题。传统软件工程好不容易建立起来的确定性,在这种"混合体"里可能被重新冲散。

规模化质疑

Siddhartha Saxena(Thine 和 Merlin AI 联合创始人)肯定了类型化输入输出给调用结构加了骨架,但认为 Agent trace 的测试在很大程度上是一个可观测性问题,不是一个框架能独立解决的。当活动规模达到数百万次工具调用时,单靠 NOOA 的类结构不足以支撑测试需求。

安全权衡

Saxena 还指出了一个悖论:集中化让代码更可读,但"如果什么东西对人类可读,意味着它对外来者也可读"——可审计性同时降低了攻击门槛。

Masood 和 Karunanithi 都强调了生产部署需要的配套措施:沙箱、范围化凭据、为每个 Agent 分配独立身份。Nvidia 的方案是搭配 OpenShell 安全运行时。

七、NOOA 在 Agent 生态中的定位

NOOA 不是要替代现有的 Agent 框架。Nvidia 在官方论坛中明确表示:

"这是一个研究预览——不是你现有 harness 的替代品。重点是把实现和评估放在人们可以实际检查、复现、质疑和改进的地方。"

NOOA 的定位更接近一个实验性参考实现——它验证了"面向对象 Agent"范式的可行性,提供了可复现的评估数据,但生产使用仍需搭配安全运行时和完整的可观测性方案。

与现有框架的关系

维度NOOALangGraphAutoGenCrewAI
核心抽象Python 类有向图对话协议角色编排
学习曲线低(写 Python 类)中(图概念)中(对话模式)低(角色定义)
状态管理对象字段Graph state对话上下文共享内存
记忆系统SQLite 知识图谱外部集成外部集成外部集成
可测试性高(标准 Python 工具)
生产成熟度研究预览1.0 GA成熟成熟

八、实战:定义一个安全审计 Agent

以下是一个基于 NOOA 范式的安全审计 Agent 概念示例(基于 Nvidia 官方示例改写):

python
from nooa import Agent
from dataclasses import dataclass
from typing import Literal

@dataclass
class Vulnerability:
    cve_id: str
    severity: Literal["critical", "high", "medium", "low"]
    description: str
    affected_component: str

@dataclass
class AuditResult:
    vulnerabilities: list[Vulnerability]
    summary: str
    risk_score: float

class SecurityAuditAgent(Agent):
    """You are a security audit agent specializing in web application
    vulnerability assessment. Analyze code and configurations for
    common security issues including OWASP Top 10 categories."""

    # 对象状态:持久化跨会话
    scan_history: list[AuditResult]
    known_patterns: dict[str, str]  # 漏洞模式库

    def classify_severity(self, finding: str) -> str:
        """Classify the severity of a security finding."""
        # 确定性 Python 代码:基于规则
        if "RCE" in finding or "SQL injection" in finding:
            return "critical"
        elif "XSS" in finding or "CSRF" in finding:
            return "high"
        elif "info_leak" in finding:
            return "medium"
        return "low"

    async def audit_codebase(
        self, repo_path: str, scan_type: str = "full"
    ) -> AuditResult:
        """Perform a security audit on the codebase at repo_path.
        Analyze source code, dependencies, and configurations.
        Return structured findings with CVE references where applicable."""
        ...  # LLM 补全:执行实际的安全分析

    async def generate_report(
        self, results: AuditResult, format: str = "markdown"
    ) -> str:
        """Generate a human-readable security audit report.
        Include executive summary, detailed findings, and remediation steps."""
        ...  # LLM 补全:生成报告文本

这个示例展示了 NOOA 的核心模式:

  1. classify_severity 是确定性方法——规则明确,不需要 LLM 介入
  2. audit_codebasegenerate_report 是 LLM 补全方法——需要模型推理
  3. scan_historyknown_patterns 是持久化状态
  4. 类型注解(-> AuditResult-> str)是运行时验证的契约

九、对开发者的实际意义

什么时候考虑 NOOA

  • 你已经熟悉 Python 面向对象编程
  • 你的 Agent 需要可审计的行为追踪
  • 你需要 Agent 状态跨会话持久化
  • 你想用标准开发工具(git、pytest、IDE)管理 Agent 代码

什么时候不用

  • 生产环境(NOOA 仍是研究预览)
  • 需要复杂的多 Agent 协调(NOOA 的多 Agent 能力仍在早期)
  • 对沙箱隔离有严格要求的场景(需搭配 OpenShell)
  • 团队已经深度投入 LangGraph/AutoGen 生态

十、开放安全 AI 联盟

NOOA 是 Nvidia 向新成立的"开放安全 AI 联盟"(Open Secure AI Alliance)贡献的首批项目之一。该联盟的目标是构建和共享开源、开放权重的 AI 开发工具。

Nvidia 强调开放模型很重要,但"开放权重和数据本身并不能让整个 Agent 可审查"。模型的 harness——决定模型看到什么上下文、能调用什么工具、保持什么状态、何时停止——同样是可审查性的关键。

参考资料

上次更新于: