MiddlewareBase 的子类,以非侵入式的方式完成记忆的注入、检索和写回。
AgentScope 目前支持以下长期记忆,更多实现正在开发中:
Agentic Memory
Agentic Memory 是 AgentScope 原生的长期记忆实现,通过 Markdown 文件的读写和检索实现长期记忆功能。 运行中智能体自主创建各种 Markdown 格式的记忆文件,并通过一个固定的MEMORY.md 文件维护所有记忆文件的索引,并自动注入到系统提示中,是一种“渐进暴露”的实现方式。
运行时,智能体通过内置的 Read、Write 和 Edit 工具创建、访问和修改长期记忆,典型的文件结构如下:
name、description 和 type 字段,便于后续检索和注入:
MEMORY.md 则保持简短,只作为索引并自动注入到系统提示中,示例如下:
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 模型
- 模型 + 自定义 config
- 预构建 client
传入 AgentScope 模型,让中间件在内部构建开源版
AsyncMemory(mem0 默认的 Qdrant 存储)。embedding 模型的 dimensions 必须与向量存储匹配(默认 Qdrant 期望 1536)。关键参数
供智能体调用的工具
在agent_control 与 both 模式下,中间件提供两个模型可按需调用的工具:
search_memory(keywords, limit=5)—— 用一组简短、精准的关键词检索记忆。每个关键词作为独立查询发起,结果合并并去重。add_memory(thinking, content)—— 记录持久信息。只有content(一组独立完整的句子)会被写入 mem0;thinking留在对话记录中以便审计。
user_id / agent_id,因此除了把它们加入 toolkit 之外无需额外接线。