对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

代理记忆

标准AI交互是无状态的:会话结束后,模型将丢失有关对话的所有上下文。代理内存为代理提供了跨多个对话的持久知识存储,从而将无状态交互转换为有状态的自适应工作流程。代理从其环境中学习,更新此存储,并为后续任务调用必要的信息。

与每次会话后重置的临时上下文窗口不同,代理内存可确保代理不会恢复为空白。没有它,代理就无法记住回访的用户、之前的决策或已建立的工作流程。

MongoDB Atlas Agent Engine 引入了专用内存服务来管理项目中的这种持久性。该服务在背景解析对话以捕获持久性信息,同时让应用程序写入存储。

内存按数据寿命和结构分为两个不同的层:短期内存和长期内存。背景提取管道将短期对话处理为长期知识。

短期记忆 (STM) 按时间顺序存储原始对话历史记录。平台会实时记录每个回合的发生。当您的代理需要最近轮次的即时会话上下文时,它会从 STM 读取。

Atlas Agent Engine 通过三个阶段的生命周期将会话转换为持久性内存:

  • 回合记录:当代理与用户交互时,平台会将每个回合记录到短期记忆中。

  • 快照生成:当会话达到配置的消息计数或空闲阈值时,背景进程会将对话历史记录编译为汇总快照。

  • LLM 提取:大型语言模型 (LLM) 分析快照并将持久性知识提取到适当的长期记忆类型中。

由于提取是异步运行的,因此记录轮次永远不会阻止代理的响应。从会话中提取的知识可以在长期记忆中用于后续对话,而不是在下一回合中使用。最近的回合仍然可以通过短期记忆立即获得,提取的知识也会在不久后出现。

长期记忆跨会话持续存在,并保存从对话中提取的持久性知识。该平台通过提取短期内存或直接写入来创建长期内存。

对于平台部署的代理,平台会自动将对话记录为短期记忆,并从中提取长期记忆,尽管代理可以在需要时直接写入长期记忆。外部应用程序通常使用用于平台提炼的软件开发工具包 (SDK)写入短期内存。它们还可以通过 SDK 或内存模型上下文协议 (MCP) 直接写入长期内存。

该平台将长期记忆分为四种专门类型:

  • 语义记忆:存储带标签的事实。

  • 情节记忆:将过去的互动和对话存储为离散的情节。

  • 程序内存:存储可重用的分步说明和工作流程。

  • 分类内存:存储领域术语及其定义。

以下部分详细介绍了每种类型。

语义记忆存储有关用户或应用程序的带标签事实。事实是指在产生该事实的对话之外仍然具有相关性的知识。示例,事实可以捕获用户的家乡机场或其对窗口座位的偏好。

Atlas Agent Engine 通过背景提取和直接写入创建语义内存:

  • 后台提取:从对话快照中提取事实,并随着时间的推移整合重复或更新的信息。

  • 直接写入:使用 save_semantic(label=..., text=...) 保存事实。

要检索事实,请使用 get_semantic 按标签查找事实,或使用 search_semantic 按含义查找事实。默认默认下,build_context 中包含语义记忆,因此相关事实会出现在代理检索的上下文中。

以下示例保存事实,按标签检索事实,并按含义搜索聊天:

from agentic_platform_memory import (
Memory,
MemoryRequestContext,
)
memory = Memory(
api_key="<your-access-token>",
project_id="<your-project-id>",
)
chat = memory.bind(
MemoryRequestContext(
user_id="user_1",
session_id="thread_123",
)
)
chat.save_semantic(
label="home-airport",
text="The user's home airport is Boston.",
)
fact = chat.get_semantic("home-airport")
hits = chat.search_semantic("home airport")

情景记忆将过去的对话存储为汇总的情景。情节捕获对话中发生的事情,包括所做的决定和随后的结果。情景记忆回答了代理应该了解用户过去交互的哪些信息。

Atlas Agent Engine 通过背景提取和直接写入来创建情景内存:

  • 后台提取:从对话快照中提取分集及其参与者。

  • 直接写入:使用 save_episode(title=..., content=...) 保存分集。

情节在对话中持续存在。代理可以在后续对话中回忆起一次对话中发生的事情。

要检索单集,请使用 search_episodes 按含义查找单集,或使用 list_episodes 列出用户的单集。情节记忆是 build_context 中的默认来源之一,因此包括相关情节。

以下示例将保存一个分集、搜索该分集并列出用户的分集:

from agentic_platform_memory import (
Memory,
MemoryRequestContext,
)
memory = Memory(
api_key="<your-access-token>",
project_id="<your-project-id>",
)
chat = memory.bind(
MemoryRequestContext(
user_id="user_1",
session_id="thread_123",
)
)
chat.save_episode(
title="Vacation planning",
content="Planned a summer trip to Lisbon.",
)
episodes = chat.search_episodes("trip to Lisbon")
recent = chat.list_episodes()

程序内存存储可重用的程序:代理为完成特定任务而遵循的逐步工作流程。过程捕获如何执行某些操作,例如比较航班选项或处理退款请求。

Atlas Agent Engine 通过背景提取和直接写入来创建程序内存:

  • 后台提取:从对话快照中提取可重用的过程。

  • 直接写入:使用 save_procedure(procedure=..., description=..., content=...) 保存过程。

要检索过程,请使用 discover_procedures 通过查询查找候选过程,或使用 get_procedure 按名称加载完整过程。程序记忆需要在 build_context 中显式选择加入,而不是语义和情景默认值。

以下示例保存并检索过程:

from agentic_platform_memory import (
Memory,
MemoryRequestContext,
)
memory = Memory(
api_key="<your-access-token>",
project_id="<your-project-id>",
)
chat = memory.bind(
MemoryRequestContext(
user_id="user_1",
session_id="thread_123",
)
)
chat.save_procedure(
procedure="compare-flights",
description="Compare flight options.",
content="Rank flights by price, stops, and total travel time.",
)
candidates = chat.discover_procedures("compare flights")
full = chat.get_procedure("compare-flights")

分类内存存储领域术语及其定义。术语定义了单词在域中的含义,例如 red-eye 在差旅管理中的含义。与用户范围的记忆不同,分类记忆是项目中所有用户和对话都可用的共享领域知识。

Atlas Agent Engine 通过背景提取和直接写入来创建分类内存:

  • 后台提取:从对话快照中提取术语及其领域。

  • 直接写入:使用 save_taxonomic(domain=..., term=..., definition=...) 保存术语。

要检索术语,请使用 get_taxonomic_term 按域和术语查找,或使用 search_taxonomic 按含义查找术语。使用 list_domains 列出您的项目拥有的域。分类记忆需要在 build_context 中显式选择加入。

以下示例将保存、读取并搜索术语:

from agentic_platform_memory import (
Memory,
MemoryRequestContext,
)
memory = Memory(
api_key="<your-access-token>",
project_id="<your-project-id>",
)
chat = memory.bind(
MemoryRequestContext(
user_id="user_1",
session_id="thread_123",
)
)
chat.save_taxonomic(
domain="airline",
term="red-eye",
definition="An overnight flight that lands the next morning.",
)
definition = chat.get_taxonomic_term("airline", "red-eye")
matches = chat.search_taxonomic("overnight flight", domain="airline")
domains = chat.list_domains()

一旦确定信息必须在单次对话后持续存在,请根据数据的形状和预期用途选择长期记忆类型。

内存类型
存储内容
范围
关键问题

semantic

持久标记事实

user

代理知道什么是真实的?

情节

交互历史记录和结果汇总

user

过去的对话发生了什么?

程序化

可重复使用的分步工作流程

user

代理应如何执行此任务?

分类学

领域术语和定义

项目范围(共享)

这个领域术语是什么平均值?

如果信息似乎跨越多个类别,请评估它在这些操作边界上的位置:

  • 事实与事件(语义与情节):语义记忆存储当前状态或事实,例如旅客的首选席位或出发机场。情景记忆存储讨论或使用该偏好的交互的历史叙述,例如过去的航班预订对话。

  • 知识与执行(语义与程序):语义记忆提供代理回忆的事实,例如行李限额限制。程序内存提供代理执行的指令,例如搜索和比较航班所需的步骤序列。

  • 用户上下文与领域标准(语义与分类):语义记忆跟踪特定于用户的详细信息,例如旅行者的飞行常客层级。分类记忆定义了整个项目共享的标准术语,例如定义精英层级或红眼航班的资格标准。

内存类型是互补的,而不是互斥的。单个代理通常会在同一工作流程中查询多种内存类型。示例,旅行预订代理可能会引用:

  • 语义记忆,用于回忆旅行者的家乡机场、座位偏好和常旅客号码。

  • 情景记忆,用于查看过去行程中的讨论、预订的行程和取消的航班。

  • 程序内存,用于执行分步工作流程,以比较航班选项或重新预订已取消的转机。

  • 用于解释航空业术语的分类记忆,例如 open-jaw routing、layover 或 red-eye。

如果您的数据不适合四种内置类型中的任何一种,则可以改为声明自定义内存类型。要学习;了解如何操作,请参阅《为代理添加内存》指南中的声明自定义内存类型。

后台提取针对在 project-config.yaml 的 memory.extraction区块中启用的内存类型运行。要提取内存类型,请将其添加到 enabled 列表中:

memory:
extraction:
enabled:
- semantic
- episodic
- procedural
- taxonomic

每种启用的类型都运行自己的提取处理程序,该处理程序从对话快照中提取此类内存。

enabled 列表适用于自动背景提取。即使关闭了该类型的自动提取,您的应用程序仍可使用 SDK 保存任何内置内存类型。

要启用内存服务并将应用配置应用于已部署的项目,请参阅为代理添加内存指南。

您的代理通过两种不同的检索模式查询和读取内存:组合上下文或原始记录。

  • 汇编上下文:为代理格式化单个提示就绪文本区块。 build_context 和 build_context_from_sources 方法查询选定的内存类型,对匹配项进行排名和去重,并根据令牌预算修剪结果。

  • 原始记录:返回自定义应用程序逻辑的结构化数据对象。使用 search 或每种类型的搜索方法来检查或过滤代码中的记录。

默认下,上下文构建者搜索情景记忆和语义记忆。要包含短期记忆、程序记忆或分类记忆,请在 enabled_sources 中列出这些来源。

以下示例为聊天会话构建上下文,包括程序内存:

from agentic_platform_memory import (
Memory,
MemoryRequestContext,
)
memory = Memory(
api_key="<your-access-token>",
project_id="<your-project-id>",
)
chat = memory.bind(
MemoryRequestContext(
user_id="user_1",
session_id="thread_123",
)
)
context = chat.build_context(
query="What is relevant to the next trip-planning task?",
enabled_sources={"episodic", "semantic", "procedural"},
)

注意

平台部署的代理会收到一个预连接的 app.memory客户端,其身份已由运行时设立。独立运行的应用程序会构造 Memory 并绑定 user_id 和 session_id 本身。

所有内存记录都与创建它们的项目隔离。数据永远不会跨越项目边界。在项目中,平台通过两个可见性范围控制记录访问权限:

  • 私有:只有与该记录关联的用户身份才能访问。语义记忆、情景记忆和程序记忆默认为 private。

  • 组织:项目中的任何用户都可以访问。分类内存默认为 org,因为领域定义和术语应在整个项目中共享。

当代理执行 读取 或搜索时,平台会将读取限制为调用者的项目和用户范围,因此结果仅包含调用者可以读取的记录。

重要

服务帐户内存身份

当服务帐户调用已部署的代理时, Atlas Agent Engine 会使用服务帐户自己的身份作为运行时内存身份。平台会忽略调用请求或 agentengine invoke --user-id 标志提供的任何最终用户 user_id 值。

自动轮流记录、提取、合并和 app.memory 操作会使用此已解析身份。因此,通过同一服务帐户进行身份验证的调用股票一个内存用户作用域。

此限制仅适用于服务帐户调用的已部署代理。独立运行的、项目范围的内存服务不受影响。此服务继续接受来自调用者的显式 user_id 和 session_id 值。

要按最终用户隔离内存,请从应用程序中调用独立运行内存服务,并将显式 user_id 和 session_id 值传递给每个调用。要学习;了解更多信息,请参阅使用独立内存服务。

要学习;了解如何为代理启用内存,请参阅为代理添加内存。

要学习;了解如何在未部署完整代理的情况下使用内存,请参阅使用独立内存服务。