英文原标题:Build agent memory with NVIDIA NeMo Agent Toolkit and Amazon S3 Vectors

本文为英文原文的机器翻译摘要,原文见:AWS Machine Learning Blog ↗

本文介绍如何将 Amazon S3 Vectors 作为 NVIDIA NeMo Agent Toolkit (NAT) 的持久化记忆后端,并在 Amazon EKS 上部署,以多智能体投资研究为示例。

背景与目标

上一篇文章探讨了多智能体系统记忆工程的重要性,以及 Amazon S3 Vectors 如何满足语义检索、丰富元数据、强一致性和弹性扩展等架构需求。

本文从架构转向实现,展示如何在 NAT 中使用 S3 Vectors 作为持久记忆层,并部署在 Amazon EKS 上以获得完整运维控制。

读者将了解 NAT 记忆子系统的工作原理,以及如何实现自定义记忆提供者,并通过多智能体投资研究用例学习部署。

  • S3 Vectors 是 Amazon S3 的一项能力,用于向量存储。
  • NAT 部署在 Amazon EKS 上。
  • 示例用例为多智能体投资研究。

NVIDIA NeMo Agent Toolkit (NAT) 概述

NAT 是一个开源框架,用于构建、分析和优化 AI 智能体,与 Strands Agents、LangChain、LlamaIndex、CrewAI 等框架无关。

NAT 提供四项生产相关能力:智能体编排(可组合工作流,支持本地 nat run 或服务化 nat serve)、性能分析(跟踪 token 使用、延迟、吞吐量等)、评估(内置准确率、上下文相关性、响应基础性、智能体轨迹等评估器)以及优化(自动超参数调优)。

  • 框架无关,支持多种智能体框架。
  • 编排:定义可组合工作流,配置 LLM、工具和提示。
  • 分析:跟踪 token、延迟、吞吐量和运行时间。
  • 评估:内置多种评估器,支持自定义。
  • 优化:自动调优 temperature、top_p、max_tokens 等。

NAT 记忆模块

NAT 包含专用记忆子系统,用于跨智能体调用存储和检索对话历史、用户偏好和长期知识。

记忆模块可扩展,通过实现插件接口创建自定义记忆提供者。关键组件包括 MemoryEditor(抽象接口,定义 add_items、search、remove_items 方法)、MemoryItem(数据模型,包含对话历史、标签、元数据、user_id 和可选文本记忆)、MemoryBaseConfig(Pydantic 基类,通过 YAML 中的 _type 字段发现提供者)以及自动记忆包装器(auto_memory_agent 工作流类型,自动捕获和检索记忆)。

NAT 目前内置 Mem0、MemMachine、Redis 和 Zep 等记忆提供者,但对于需要弹性向量存储、强写一致性和成本高效扩展的生产多智能体系统,基于 S3 Vectors 的自定义提供者更合适。

  • MemoryEditor:抽象接口,定义 add_items、search、remove_items。
  • MemoryItem:数据模型,包含对话历史、标签、元数据、user_id 等。
  • MemoryBaseConfig:Pydantic 基类,通过 _type 字段发现。
  • 自动记忆包装器:auto_memory_agent 工作流类型。
  • 内置提供者:Mem0、MemMachine、Redis、Zep。

选择 S3 Vectors 作为持久记忆后端的原因

S3 Vectors 满足 NAT 记忆层的多项关键需求:语义检索(支持余弦、欧几里得等距离度量)、范围查询(可过滤元数据)、多智能体协调(强写一致性,插入后立即可见)、扩展性(每索引最多 20 亿向量,无需容量规划)、成本效率(仅支付存储、写入和查询费用,无空闲计算成本)以及访问控制(IAM 策略,支持按租户索引实现硬隔离)。

  • 语义检索:向量相似度搜索,可配置距离度量。
  • 范围查询:每个向量可过滤元数据。
  • 多智能体协调:强写一致性。
  • 扩展:每索引最多 20 亿向量。
  • 成本:仅支付存储、写入和查询。
  • 访问控制:IAM 策略,按租户索引隔离。

实现步骤与前置条件

实现分为三步:创建 S3 Vectors 基础设施、实现自定义 MemoryEditor 插件、配置智能体工作流。

前置条件包括:具有创建 S3 Vectors 资源和 EKS 集群权限的 AWS 账户、现有 EKS 集群、安装 NAT(测试版本 1.6)、Python 3.11 或 3.12、嵌入模型(本文使用 Amazon Titan Text Embeddings V2)以及 kubectl 和 Docker。

  • 步骤 1:创建 S3 Vectors 基础设施。
  • 步骤 2:实现自定义 MemoryEditor 插件。
  • 步骤 3:配置智能体工作流。
  • 前置条件:AWS 账户、EKS 集群、NAT 1.6、Python 3.11/3.12、嵌入模型、kubectl 和 Docker。

创建 S3 Vectors 基础设施与实现插件

第一步使用 boto3 创建向量桶和索引,索引维度为 1024 以匹配 Amazon Titan Text Embeddings V2,距离度量为余弦,并将 content 字段标记为非可过滤元数据。

第二步实现 MemoryEditor 接口作为 S3 Vectors 后端并注册,使 NAT 能够发现。代码定义了 S3VectorsMemoryConfig 配置类和 S3VectorsMemoryEditor 类,后者使用 boto3 客户端调用 S3 Vectors 和 Bedrock 生成嵌入,并实现 add_items 方法将记忆项存储为向量。

  • 创建向量桶和索引,维度 1024,余弦距离,content 非可过滤。
  • 实现 S3VectorsMemoryConfig 和 S3VectorsMemoryEditor。
  • 使用 Amazon Titan Text Embeddings V2 生成嵌入。
  • add_items 方法将记忆项存储为向量,使用 uuid4 防止键冲突。

站内导航