Skip to main content
长期记忆 是智能体跨会话保留信息的能力,包括用户偏好、历史决策,以及在会话中总结、凝练的知识或规则。 AgentScope 通过 智能体中间件 的形式实现不同长期记忆能力。每个长期记忆实现都是一个 MiddlewareBase 的子类,以非侵入式的方式完成记忆的注入、检索和写回。 AgentScope 目前支持以下长期记忆,更多实现正在开发中:

Agentic Memory

Agentic Memory 是 AgentScope 原生的长期记忆实现,通过 Markdown 文件的读写和检索实现长期记忆功能。 运行中智能体自主创建各种 Markdown 格式的记忆文件,并通过一个固定的 MEMORY.md 文件维护所有记忆文件的索引,并自动注入到系统提示中,是一种“渐进暴露”的实现方式。
Agentic Memory 通过 backend 参数支持切换不同的运行环境(例如本地、Docker、E2B、云端等),可以在不同的沙箱环境中运行,默认使用 LocalBackend
运行时,智能体通过内置的 ReadWriteEdit 工具创建、访问和修改长期记忆,典型的文件结构如下:
其中每个 Markdown 文件都遵循 frontmatter 规范,包含 namedescriptiontype 字段,便于后续检索和注入:
MEMORY.md 则保持简短,只作为索引并自动注入到系统提示中,示例如下:
Agentic Memory 有两种检索链路:一种是智能体根据提示词和 MEMORY.md 索引自主检索相关文件;另一种是在调用智能体 reply/reply_stream 时,启动一个异步任务使用 LLM 来选择相关的 Markdown 文件,并在后续推理前检查该异步任务是否结束,再以 HintBlock 的形式插入检索结果。 需要注意检索过程是异步的:注入发生在推理-行动循环中推理开始前的检查点,具体时机取决于检索过程耗时;如果本次回复没有进入后续推理轮次(例如模型没有产生工具调用),则该次回复可能不会注入检索到的长期记忆内容。具体工作流程如下: 通过如下代码在不同的环境中使用 Agentic Memory:

Mem0

Mem0Middleware 是由 mem0 驱动的、开箱即用的长期记忆后端,同时支持 mem0.AsyncMemory(开源版)与 mem0.AsyncMemoryClient(托管 Platform 版)。在使用 mem0.AsyncMemory(开源版)时,可以让 mem0 自身的记忆抽取与 embedding 都走你现有的 AgentScope 模型 —— 因此 mem0 无需单独的 provider key。

安装

Mem0Middleware 的依赖位于 AgentScope 的可选依赖中:

快速开始

最快捷的方式是为中间件传入一个专用的 AgentScope chat 模型和一个 embedding 模型;中间件会在内部构建一个开源版 mem0 存储,并把记忆抽取与 embedding 都接到这两个模型上。
Mem0Middleware 通过 list_tools() 提供 search_memory / add_memory 工具,而智能体 不会 自动调用它。要让这些工具对智能体可用,需要开发者手动传入 toolkit —— Toolkit(tools=await mw.list_tools())。在 static_control 模式下 list_tools() 返回空列表。

控制模式

mode 参数决定智能体与 mem0 的交互方式,默认为 "both",与 AgentScope 1.x 的 ReActAgent.long_term_memory_mode 一致。

构造方式

Mem0Middleware 支持三种接入 mem0 后端的方式:
使用 AgentScope chat 模型构造 mem0 后端时,AgentMem0Middleware 必须使用不同的模型实例。 该要求适用于下面两种由模型驱动的接入方式:直接传入 AgentScope 模型,以及将 chat_model 与自定义 mem0 config 一起传入。预构建 client 路径不受影响,因为 Mem0Middleware 会直接使用传入的 mem0 client。之所以需要分离实例,是因为 AgentScope chat 模型采用异步接口,而 mem0 在记忆抽取时调用的是同步 LLM 接口。为衔接这两种接口,Mem0Middleware 会通过 adapter 包装 AgentScope 模型:Agent 在应用自身的 event loop 上调用模型,adapter 则在专用的 bridge event loop 上运行用于记忆抽取的模型协程。如果两个路径共享同一个模型实例,它们也会跨两个 event loop 共享该实例持有的异步 HTTP client 和连接池。连接池的底层资源可能绑定到首次使用它们的 loop;随后从另一个 loop 访问时,就可能间歇性触发 Connection errorRuntimeError: ... is bound to a different event loop。由于故障可能只发生在记忆抽取阶段,Agent 仍可能正常回复,但记忆写入会失败或没有产生新事实。两个模型实例仍然可以使用相同的 provider、模型名称、endpoint 和 API key;只需确保它们是独立的模型/client 对象。在多 Agent 应用中,也不要让多个独立构建、由模型驱动的 Mem0Middleware 共享同一个 mem0 chat 模型实例,因为每个 adapter 都可能拥有不同的 bridge event loop。
传入 AgentScope 模型,让中间件在内部构建开源版 AsyncMemory(mem0 默认的 Qdrant 存储)。embedding 模型的 dimensions 必须与向量存储匹配(默认 Qdrant 期望 1536)。
Mem0Middleware 要求使用异步 mem0 client(mem0.AsyncMemorymem0.AsyncMemoryClient)。同步的 Memory / MemoryClient 不受支持。

关键参数

供智能体调用的工具

agent_controlboth 模式下,中间件提供两个模型可按需调用的工具:
  • search_memory(keywords, limit=5) —— 用一组简短、精准的关键词检索记忆。每个关键词作为独立查询发起,结果合并并去重。
  • add_memory(thinking, content) —— 记录持久信息。只有 content(一组独立完整的句子)会被写入 mem0;thinking 留在对话记录中以便审计。
两个工具都会自动放行(auto-allow),并直接从中间件实例读取 user_id / agent_id,因此除了把它们加入 toolkit 之外无需额外接线。