agno-3-记忆系统

agno-3-记忆系统

记忆是什么

在智能体(Agent)的语境下,记忆(Memory)指的是智能体存储、回忆并利用过往交互信息的能力

没有记忆的智能体,每次对话都像“第一次见面”,无法从历史中学习,也无法建立持续的关系。记忆系统要解决的,正是这个问题。

它让智能体从“无状态工具”进化为“有状态的伙伴”。有了记忆,智能体才能:

  • 提供个性化体验:记住用户的名字、偏好和习惯。

  • 实现连续对话:在多轮对话中,能自动参考之前的聊天内容。

  • 随时间成长:通过每次交互学习,变得越来越懂用户。

三大核心记忆类型

Agno 将“记忆”分为三种类型,协同工作以提供完整的上下文:

1.会话存储 (Session Storage)

这是短期记忆,是 Agent 进行多轮对话的基础。

  • 存储什么:完整的聊天历史和当前的会话状态(Session State)。

  • 如何工作:每次对话后,系统都会自动将新的消息和状态保存到数据库。当用户继续对话时,Agent 会读取这些历史,从而理解上下文。

  • 解决的问题:确保智能体在一个会话中不会“失忆”,能进行连贯的对话。

2.用户记忆 (User Memories)

这是长期记忆,是真正意义上的“记忆”,目的是构建用户画像,实现个性化。

  • 存储什么:从对话中提取的关于用户的事实、洞察和偏好。

  • 两种管理模式:

    • 自动记忆 (Automatic Memory):通过update_memory_on_run=True启用。Agno 在后台自动提取并存储记忆,无需干预。适合大多数场景。

    • 智能体记忆 (Agentic Memory):通过enable_agentic_memory=True启用。Agent 自己通过工具(Tools)决定何时创建、更新或删除记忆。适合需要精细控制的复杂场景。

  • 解决的问题:让 Agent 能“记住”用户,提供真正个性化的交互体验。

3.会话摘要 (Session Summaries)

这是对长期记忆的优化,用于管理过长的对话历史。

  • 存储什么:对冗长对话历史的浓缩摘要。

  • 如何工作:当对话历史过长、可能超出模型上下文限制时,Agent 可以生成并存储摘要。

  • 解决的问题:节省 Token 消耗,并在长对话中保持关键上下文不丢失。

存储架构与工作机制

Agno 的记忆系统通过“存储后端”实现数据持久化。

  • 核心组件

    • Agent: 业务逻辑的载体。

    • Memory(v2):记忆管理中心,负责创建、检索、更新和删除记忆。

    • MemoryManager: 执行记忆管理任务的实际工作者

    • Storage(Storage Backend):数据持久化层,与数据库交互。

  • 数据模型与存储内容:使用持久化存储时,系统主要存储:

    • 用户记忆 (User Memories):关于用户的洞察和事实。

    • 最后更新时间戳 (Last Updated Timestamps):追踪记忆的修改时间。

    • 记忆 ID (Memory IDs):每条记忆的唯一标识符。

两种记忆管理模式

Agno 提供两种模式让智能体管理用户记忆:

  • 自主模式 (Agentic Memory):通过enable_agentic_memory=True启用。智能体获得管理记忆的工具,可自主决定何时创建、检索或删除记忆。这是官方推荐的起点。

  • 被动模式 (Automatic Memory):通过enable_user_memories=True启用。MemoryManager在每次用户消息后自动运行,提取并存储记忆。

支持的存储后端

Agno 支持 13 种以上的数据库,通过插件式接口接入。主要分为:

  • 开发/测试SqliteDbInMemoryDb(无需配置,数据不持久)。

  • 生产环境PostgresDb

记忆隔离机制

Agno 的所有记忆(包括长期记忆和会话历史)都严格与user_id绑定。只要在调用时传入不同的user_id,系统就能确保不同用户的数据完全隔离。

核心隔离机制

user_id是 Agno 中数据隔离的第一道,也是最关键的一道防线。

  • 记忆的作用域:用户的长期记忆(User Memories)和会话记录都与user_id绑定。在查询或存储记忆时,系统都会通过user_id进行过滤。

  • 关键实践:在生产环境中,必须为每个用户提供唯一的user_id(例如你系统中的用户ID或邮箱)。如果忽略这一点,所有用户的数据都会混在一起,造成严重的数据泄露。

会话层面的隔离

如果说user_id是“人”的维度,那么session_id就是“对话”的维度。

  • 作用:session_id用于隔离同一个用户的不同对话线程。

  • 使用:在同一个user_id下,不同的session_id代表着独立的会话历史。它们之间不会互相干扰,但会共享该用户的长期记忆。

agent_idteam_id:会话归属与组件标识

agent_idteam_id主要用于标识和区分不同的组件(Agent 或 Team),并作为会话 (Session) 的归属标识。

  • agent_id:标识一个特定的 Agent 实例。在AgentSession数据模型中,agent_id是一个核心字段,用于记录会话属于哪个 Agent。

  • team_id:标识一个特定的 Team 实例。在TeamSession数据模型中,team_id是核心字段。当一个 Agent 作为 Team 的成员时,其team_id会被自动关联。

它们隔离了什么?
agent_idteam_id主要用于在数据库层面区分和归类不同组件产生的会话数据。例如,它们能确保在查询某个 Agent 的历史会话时,不会错误地返回另一个 Agent 的会话。从这个角度看,它们提供了一种组件级别的数据隔离。

代码示例

会话记忆案例

from agno.agent import Agent from agno.db.sqlite import SqliteDb from dotenv import load_dotenv from agno.models.deepseek import DeepSeek load_dotenv() #定义大模型 deepseek = DeepSeek(id="deepseek-chat") db = SqliteDb(db_file="session_store.db") agent = Agent( model=deepseek, db=db, # 注入存储后端 instructions=["你是一个智能助手"], markdown=True, add_history_to_context=True, # 将历史加入上下文(关键) num_history_runs=3, # 包含最近3轮对话 user_id="xiaoxiaoer" ) resp = agent.run("你好,我是小小儿,你是谁?") print(resp.content) resp = agent.run("我是谁?") print(resp.content)

用户记忆自动模式

from agno.agent import Agent from agno.db.sqlite import SqliteDb from dotenv import load_dotenv from agno.models.deepseek import DeepSeek load_dotenv() #定义大模型 deepseek = DeepSeek(id="deepseek-chat") db = SqliteDb(db_file="session_store.db") # 2. 创建 Agent 并启用自动记忆 agent = Agent( model=deepseek, db=db, update_memory_on_run=True, # 👈 自动提取记忆 user_id="xiaoxiaoer", instructions=["你是一个智能助手"], ) resp = agent.run("你好,我是小小儿,我喜欢滑雪跑步你是谁?") print(resp.content) resp = agent.run("我有哪些爱好") print(resp.content)

用户记忆自主模式

from agno.agent import Agent from agno.db.sqlite import SqliteDb from dotenv import load_dotenv from agno.models.deepseek import DeepSeek load_dotenv() #定义大模型 deepseek = DeepSeek(id="deepseek-chat") db = SqliteDb(db_file="session_store.db") # 2. 创建 Agent 并启用自动记忆 agent = Agent( model=deepseek, db=db, enable_agentic_memory=True, # 👈 自动提取记忆 user_id="xiaoxiaoer", instructions=["你是一个智能助手"], ) resp = agent.run("你好,我是小小儿,我喜欢滑雪跑步你是谁?") print(resp.content) resp = agent.run("我有哪些爱好") print(resp.content)

摘要记忆

from agno.agent import Agent from agno.db.sqlite import SqliteDb from agno.session import SessionSummaryManager from dotenv import load_dotenv from agno.models.deepseek import DeepSeek load_dotenv() #定义大模型 deepseek = DeepSeek(id="deepseek-chat") db = SqliteDb(db_file="session_store.db") # 可选:自定义摘要管理器(使用默认也可) summary_manager = SessionSummaryManager( model=deepseek, # 用于生成摘要的模型 ) # 2. 创建 Agent 并启用自动记忆 agent = Agent( model=deepseek, db=db, enable_session_summaries=True, # 👈 开启摘要 add_session_summary_to_context=True, # 默认 True,将摘要放入上下文 session_summary_manager=summary_manager, # 自定义摘要管理器 user_id="xiaoxiaoer", instructions=["你是一个智能助手"], ) resp = agent.run("你好,我是小小儿,我喜欢滑雪跑步你是谁?") print(resp.content) resp = agent.run("我有哪些爱好") print(resp.content)

三者如何协同工作?

层级作用依赖关系
Storage存储完整的原始聊天记录和状态基础层,Summary 和 Memory 都需要它
Memory提取并存储用户画像可在 Storage 之上独立运行
Summary压缩过长的历史,生成摘要必须与 Storage 配合,用于上下文注入
from agno.agent import Agent from agno.db.sqlite import SqliteDb from dotenv import load_dotenv from agno.models.deepseek import DeepSeek load_dotenv() #定义大模型 deepseek = DeepSeek(id="deepseek-chat") db = SqliteDb(db_file="session_store1.db") agent = Agent( model=deepseek, db=db, # 注入存储后端 instructions=["你是一个智能助手"], markdown=True, #会话记忆 add_history_to_context=True, # 将历史加入上下文(关键) num_history_runs=3, # 包含最近3轮对话 # 用户记忆 enable_agentic_memory=True, # 自主模式 update_memory_on_run=True, # 同时自动提取 # 会话摘要 enable_session_summaries=True, add_session_summary_to_context=True, user_id="xiaoxiaoer" ) resp = agent.run("你好,我是小小儿,你是谁?") print(resp.content) resp = agent.run("我是谁?") print(resp.content)