最新n1n v2.0.1 正式上线!企业级大模型接口聚合平台 (LLM API Gateway),为您接入 500+ AI Models,价格低至 1 折, 立即尝试

基于 NVIDIA NeMo Agent Toolkit 与 Amazon S3 Vectors 构建智能体持久化内存

作者
  • avatar
    姓名
    Nino
    职业
    Senior Tech Editor

自主 LLM 智能体正快速从简单的对话机器人演变为复杂的动态推理引擎。然而,在生产环境中,状态保持(Statefulness)依然是制约智能体规模化应用的核心瓶颈之一。当智能体需要执行长流程编排、迭代搜索或复杂的财务报告分析时,标准的上下文窗口会迅速饱和,带来高昂的 API 成本与不可接受的响应延迟。

为了构建生产级的自主工作流,开发者必须为智能体配备高性能、低成本的持久化内存层。通过将 NVIDIA NeMo Agent Toolkit (NAT) 与部署在 Amazon Elastic Kubernetes Service (Amazon EKS) 上的 Amazon S3 Vectors 相结合,企业能够构建出一套足以支撑数百万次交互的持久化内存基础设施。

在驱动多智能体拓扑结构时,稳定可靠的模型 API 接入至关重要。开发团队通常会通过 n1n.ai 等统一 API 聚合平台来路由多智能体的 LLM 请求,从而保证高可用性、降低调用延迟,并在 DeepSeek-V3、Claude 3.5 Sonnet 及 GPT-4o 等模型间实现成本最优的 API 调用调度。

本文将深入剖析 NVIDIA NeMo Agent Toolkit 的内存子系统架构,展示如何实现 Amazon S3 Vectors 自定义内存提供者,并在 Amazon EKS 上部署一套金融投资研究的多智能体实战系统。


深入理解 NVIDIA NeMo Agent Toolkit (NAT) 内存子系统

NVIDIA NeMo Agent Toolkit (NAT) 是一个高扩展性、模块化的开源框架,专为构建、编排和部署高吞吐量多智能体系统而设计。与简单的链式执行框架不同,NAT 将智能体的控制逻辑拆解为独立的感知、规划、内存与动作执行模块。

在 NAT 的设计中,内存子系统主要被划分为三种抽象形态:

  1. 情景内存(Episodic Memory):记录当前会话内的即时执行轨迹、工具调用历史与短期对话上下文。
  2. 语义内存(Semantic Memory):保存长期概念知识、特定领域文档、财务报告或代码库索引,通过向量嵌入进行快速检索。
  3. 程序内存(Procedural Memory):管理智能体的执行工作流、系统提示词规约与动态工具定义。

为了将向量存储硬件与智能体业务逻辑解耦,NAT 提供了标准的 BaseMemoryProvider 接口基类。开发者只需实现数据写入、向量相似度检索以及生命周期管理等抽象方法,即可完成自定义向量数据库的对接。

+-------------------------------------------------------------------------+
|                        NVIDIA NeMo Agent Toolkit                        |
|                                                                         |
|   +-------------------+   +------------------+   +-------------------+  |
|   |     感知模块      |   |     推理引擎     |   |     动作执行     |  |
|   +---------+---------+   +--------+---------+   +---------+---------+  |
|             |                      |                       |            |
|             +----------------------+-----------------------+            |
|                                    |                                    |
|                                    v                                    |
|                      +---------------------------+                      |
|                      | NAT 内存子系统            |                      |
|                      | (BaseMemoryProvider API)  |                      |
|                      +-------------+-------------+                      |
+------------------------------------|------------------------------------+
                                     | 抽象向量检索 / 存储调用
                                     v
+-------------------------------------------------------------------------+
|                      Amazon S3 Vectors (EKS 部署)                       |
|                                                                         |
|   +-------------------+   +------------------+   +-------------------+  |
|   |  S3 对象存储集群  | <--> |  向量索引驱动    | <-->|  EKS Pod 工作节点 |  |
|   +-------------------+   +------------------+   +-------------------+  |
+-------------------------------------------------------------------------+

为什么选择 Amazon S3 Vectors 作为智能体内存?

传统的内存级向量数据库在面对大规模智能体历史数据时,往往会带来高昂的硬件成本。将数百万条智能体对话与知识库的向量索引长期保存在内存(如 RAM 中的 HNSW 索引)中并不符合经济效益。Amazon S3 Vectors 采用了存储与计算分离的云原生架构:

  • 极高的成本效益:高密度向量嵌入直接存放在高耐久度的 S3 对象存储中,相比于纯内存向量集群,基础设施成本可降低高达 70%。
  • 无上限的水平扩展:依托 S3 的 PB 级海量存储能力,向量索引与计算节点可以在 Amazon EKS 内进行独立动态扩容。
  • 可预测的低延迟检索:结合磁盘优化的索引加速驱动,针对 top-k 向量相似度查询的响应时间通常控制在 < 35ms。

实现自定义 S3 向量内存提供者

要将 Amazon S3 Vectors 接入 NAT 框架,我们需要编写一个继承自 BaseMemoryProvider 的 Python 子类。该类负责将 NAT 内存对象转化为嵌入向量,并将向量索引与非结构化原始数据写入 Amazon S3。

以下是 S3VectorMemoryProvider 的核心代码实现:

import uuid
from typing import List, Dict, Any, Optional
import boto3
from nemora.memory.base import BaseMemoryProvider, MemoryRecord

class S3VectorMemoryProvider(BaseMemoryProvider):
    def __init__(
        self,
        bucket_name: str,
        index_prefix: str,
        embedding_dim: int = 1536,
        aws_region: str = "us-west-2"
    ):
        super().__init__()
        self.bucket_name = bucket_name
        self.index_prefix = index_prefix
        self.embedding_dim = embedding_dim
        self.s3_client = boto3.client("s3