Overview
标准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 值传递给每个调用。要学习;了解更多信息,请参阅使用独立内存服务。