
Agno 多用户记忆持久化实战从 update_memory_on_run 到 Agentic Memory 与记忆优化【免费下载链接】agnoBuild, run, and manage agent platforms.项目地址: https://gitcode.com/GitHub_Trending/ag/agno本篇技术指南围绕 Agno 官方 Cookbook 中cookbook/11_memory/目录展开系统讲解 Agno Agent 如何跨运行run、跨会话session、跨 Agent 持久化并使用用户记忆user memory。读完本文你将掌握四种核心记忆接入方式自动记忆、Agentic 记忆、MemoryTools、MemoryManager 直接 API、多用户多会话隔离下的记忆共享模式以及 Summarize / 自定义策略对记忆体量的优化手段并了解其背后的源码级实现MemoryManager 实现、UserMemory 数据模型。一、Agno 记忆体系概览记忆存在哪、由谁管理Agno 的用户记忆User Memory是结构化、跨会话持久化的每当 Agent 完成一次运行模型可以从对话中提炼出关于用户的持久事实如姓名、爱好、居住地、职业以UserMemory记录的形式写入数据库并在后续运行中自动加载回上下文让 Agent 表现出记得你的能力。从源码看记忆的数据模型定义在 libs/agno/agno/db/schemas/memory.pymemory记忆正文如 The users name is John Doememory_id记忆唯一 ID用于删除、替换topics话题标签列表如[name]、[hobbies]便于检索归类user_id记忆归属用户是记忆共享/隔离的核心键created_at/updated_at创建与更新时间epoch 秒__post_init__自动归一化agent_id/team_id/input/feedback等扩展字段。记忆的写手是MemoryManagerlibs/agno/agno/memory/manager.py它内部封装了对数据库的增删改查add / get / delete / replace / clear并可通过一个 LLM 模型来自动生成记忆内容。用户记忆与会话历史chat history是两个独立概念历史记录属于某一具体 session而记忆是跨 session 归属于 user 的长期事实。二、环境搭建数据库 依赖 运行cookbook/11_memory/下的示例绝大多数依赖 PostgreSQL部分示例也演示了 SQLite全部命令以仓库根目录GitHub_Trending/ag/agno为基准。1. 创建虚拟环境python3 -m venv ~/.venvs/aienv source ~/.venvs/aienv/bin/activate2. 安装依赖pip install -U psycopg sqlalchemy openai agnopsycopg与sqlalchemyPostgreSQL 驱动与 ORM供agno.db.postgres.PostgresDb使用openai默认模型提供方OpenAIChat也是MemoryManager.get_model()的默认回退模型见 manager.pyagnoAgno 核心库。3. 准备 PostgreSQL示例默认连接串为db_url postgresqlpsycopg://ai:ailocalhost:5532/ai db PostgresDb(db_urldb_url)即本机5532端口、用户/密码均为ai、数据库名为ai。仓库 scripts 目录下提供了run_postgres.sh/run_postgres.bat等一键启动脚本如 run_pgvector.sh、run_postgres.sh可按需选择不想启动数据库的读者可以直接改用示例中的 SQLite 写法db SqliteDb(db_filetmp/agent_sessions.db)4. 运行一个示例python cookbook/11_memory/01_agent_with_memory.py注意模型 ID如gpt-5.6-luna、gpt-5-mini以当前仓库示例代码为准运行时请替换为你实际可用的 OpenAI 模型并配置好OPENAI_API_KEY。三、目录结构三大模块、八个核心示例cookbook/11_memory/的目录布局如下见 README.md位置内容01_agent_with_memory.py~08_memory_tools.py核心记忆模式自动记忆、Agentic 记忆、多 Agent 共享、自定义管理器、多用户多会话、记忆工具等memory_manager/直接使用MemoryManagerAPI 的示例基于 PostgreSQL独立 CRUD、记忆创建、自定义指令、记忆检索、DB 工具控制optimize_memories/记忆优化策略示例Summarize 汇总策略与自定义策略integrations/第三方记忆后端集成mem0、zep、memori、dakera 等说明基于 SurrealDB 的 MemoryManager 示例已迁移至 cookbook/integrations/surrealdb/这也是 README 中特别标注的注意事项。四、模式一自动持久化记忆update_memory_on_run核心示例 01_agent_with_memory.py 演示了最简接入方式只要在 Agent 上开启update_memory_on_runTrue每次运行结束后Agent 便会自动从对话中创建或更新用户记忆。from agno.agent.agent import Agent from agno.db.postgres import PostgresDb from agno.models.openai import OpenAIChat db_url postgresqlpsycopg://ai:ailocalhost:5532/ai db PostgresDb(db_urldb_url) agent Agent( modelOpenAIChat(idgpt-5.6-luna), dbdb, update_memory_on_runTrue, )运行流程示例代码核心逻辑if __name__ __main__: db.clear_memories() # 清理历史记忆保证可复现 session_id str(uuid4()) john_doe_id john_doeexample.com agent.aprint_response( My name is John Doe and I like to hike in the mountains on weekends., streamTrue, user_idjohn_doe_id, session_idsession_id, ) agent.print_response(What are my hobbies?, streamTrue, user_idjohn_doe_id, session_idsession_id) memories agent.get_user_memories(user_idjohn_doe_id) pprint(memories) # 已包含 hiking 相关记忆关键点user_id决定记忆归属同一user_id下多次运行共享记忆因此第二次提问 What are my hobbies? 时Agent 能基于记忆作答而不是依赖本次会话历史记忆会自动更新当用户说 Ok i dont like hiking anymore, i like to play soccer instead. 后再次get_user_memories()会发现原有爱好记忆被更新为踢足球——即创建或更新由MemoryManager在幕后完成session_id与记忆解耦即使换一个新session_id同一user_id的记忆依然生效。在 Agent 的源码中对应的开关参数定义于 libs/agno/agno/agent/agent.pymemory_manager、enable_agentic_memory默认 False、update_memory_on_run默认 False三者共同决定 Agent 采用哪种记忆写入方式。五、模式二Agentic Memoryenable_agentic_memory02_agentic_memory.py 演示了Agent 自主管理记忆的模式开启enable_agentic_memoryTrue后Agent 在运行过程中可以主动创建、更新、删除自己的记忆无需固定地在每次运行后批量提炼。agent Agent( modelOpenAIChat(idgpt-5.6-luna), dbdb, enable_agentic_memoryTrue, )示例运行序列及其效果My name is John Doe and I like to hike in the mountains on weekends.→ 生成记忆What are my hobbies?→ 基于记忆回答Remove all existing memories of me.→ 再次get_user_memories()得到空列表说明删除指令被执行My name is John Doe and I like to paint.→ 重新生成记忆I dont paint anymore, i draw instead.→ 记忆从 paint 更新为 draw。与模式一的区别update_memory_on_run是运行后统一提炼enable_agentic_memory是运行中按需管理增/改/删。从 agent.py 的构造逻辑可以推断两种开关可以独立或组合使用业务上允许用户删除自己的记忆这类需求尤其适合 Agentic 模式。六、模式三多 Agent 共享同一份用户记忆1. 通过同一数据库 同一 user_id 共享03_agents_share_memory.py 创建了两个行为不同的 Agentchat_agent负责闲聊、research_agent带WebSearchTools负责调研二者共用同一个db并都开启update_memory_on_runTruechat_agent Agent(modelOpenAIChat(idgpt-5.6-luna), descriptionYou are a helpful assistant that can chat with users, dbdb, update_memory_on_runTrue) research_agent Agent(modelOpenAIChat(idgpt-5.6-luna), descriptionYou are a research assistant..., tools[WebSearchTools()], dbdb, update_memory_on_runTrue)随后chat_agent记录了用户喜欢爬山research_agent在回答量子计算问题时写入新的记忆最终用research_agent.get_user_memories(user_idjohn_doe_id)能看到两个 Agent 写入的全部记忆。结论只要db相同、user_id相同记忆天然共享——这正是多智能体系统中公共用户画像的基础形态。2. 同时共享记忆与会话历史07_share_memory_and_history_between_agents.py 更进一步两个风格截然相反的 Agent一个友好、一个毒舌不仅共享记忆还通过相同的session_id共享完整对话历史。db SqliteDb(db_filetmp/agent_sessions.db) agent_1 Agent(modelOpenAIChat(idgpt-5.6-luna), instructionsYou are really friendly and helpful., dbdb, add_history_to_contextTrue, update_memory_on_runTrue) agent_2 Agent(modelOpenAIChat(idgpt-5.6-luna), instructionsYou are really grumpy and mean., dbdb, add_history_to_contextTrue, update_memory_on_runTrue)运行序列session_id str(uuid4()) user_id john_doeexample.com agent_1.print_response(Hi! My name is John Doe., session_idsession_id, user_iduser_id) agent_2.print_response(What is my name?, session_idsession_id, user_iduser_id) agent_2.print_response(I like to hike in the mountains on weekends., session_idsession_id, user_iduser_id) agent_1.print_response(What are my hobbies?, session_idsession_id, user_iduser_id) agent_1.print_response(What have we been discussing? Give me bullet points., session_idsession_id, user_iduser_id)这里用到了三个关键参数dbdb共享持久化层add_history_to_contextTrue把存储的会话历史注入上下文使第二个 Agent 能接续第一个 Agent 的对话回答 What is my name? 时知道用户叫 John Doeupdate_memory_on_runTrue记忆也随对话不断累积两个 Agent 看到的用户画像一致。注意该示例使用 SQLiteSqliteDb(db_filetmp/agent_sessions.db)无需启动 PostgreSQL是快速验证记忆共享的最佳起点。七、模式四自定义 MemoryManager默认的MemoryManager会随 Agent 自动创建当你需要精细控制记忆生成的指令、模型或读写权限时可以像 04_custom_memory_manager.py 那样独立构造并注入 Agentfrom agno.memory import MemoryManager memory_manager MemoryManager( modelOpenAIChat(idgpt-5.6-luna), additional_instructions IMPORTANT: Dont store any memories about the users name. Just say The User instead of referencing the users name. , dbdb, ) agent Agent( modelOpenAIChat(idgpt-5.6-luna), dbdb, memory_managermemory_manager, update_memory_on_runTrue, user_idjohn_doeexample.com, )运行后即使用户自报姓名 John Doe 且爱好游泳与足球get_user_memories()返回的记忆中也不会出现姓名而是以 The User 代指——自定义指令生效。additional_instructions会被追加到MemoryManager的默认系统提示之后源码见 manager.py用于约束记什么、不记什么、怎么措辞。从MemoryManager.__init__的签名manager.py可以梳理出完整可调参数参数默认值说明modelNone回退 OpenAI gpt-4o负责生成/管理记忆的 LLM可与 Agent 主模型不同system_messageNone覆盖默认系统提示memory_capture_instructionsNone覆盖默认记忆捕获指令additional_instructionsNone追加到默认系统提示的补充指令dbNone记忆存储数据库BaseDb/AsyncBaseDbdelete_memoriesFalse是否允许删除记忆update_memoriesTrue是否允许更新记忆add_memoriesTrue是否允许新增记忆clear_memoriesFalse是否允许清空记忆debug_modeFalse调试日志开关四个布尔开关delete / update / add / clear组成了 MemoryManager 对外的DB 工具权限面直接决定模型在记忆写操作上能调用哪些能力。八、多用户多会话实战隔离与并发1. 串行多用户多会话05_multi_user_multi_session_chat.py 展示了最贴近生产的多租户场景一个 Agent 实例服务多个用户每个用户拥有多个会话。user_1_session_1_id user_1_session_1 user_1_session_2_id user_1_session_2 user_2_session_1_id user_2_session_1 user_3_session_1_id user_3_session_1 chat_agent Agent(modelOpenAIChat(idgpt-5.6-luna), dbdb, update_memory_on_runTrue)核心规律同一 user 的不同 session 共享记忆user_1 在user_1_session_1中介绍自己喜欢动漫和游戏随后在另一个会话user_1_session_2说 Im going to the movies tonight.当回到user_1_session_1询问 What do you suggest I do this weekend? 时Agent 可以综合两个会话积累的记忆给出个性化建议不同 user 的记忆严格隔离user_2John Doe计划徒步、user_3Jane Smith去健身房各自的记忆互不可见验证时分别get_user_memories(user_id...)并断言非空。2. 并发多用户多会话06_multi_user_multi_session_chat_concurrent.py 将上述流程异步化每个用户一个协程通过asyncio.gather并发执行arun同时仍保证记忆按用户、按会话正确落库。async def run_concurrent_chat_agent() - None: await asyncio.gather( user_1_conversation(), user_2_conversation(), user_3_conversation() )每个会话函数内部使用await chat_agent.arun(...)异步运行接口而非同步的print_response。这一模式验证了 Agno 的AsyncBaseDb记忆写入链路在并发下的隔离正确性是搭建高并发聊天服务如 WebSocket 多房间时的直接参考模板。九、把记忆交还给模型MemoryTools08_memory_tools.py 展示了一种更灵活的接入方式把记忆能力封装成**工具Tool**交给模型自主调用与WebSearchTools组合实现边规划旅行边记用户偏好from agno.tools.memory import MemoryTools from agno.tools.websearch import WebSearchTools memory_tools MemoryTools(dbdb) agent Agent( modelOpenAIChat(idgpt-5-mini), tools[memory_tools, WebSearchTools()], instructions[ You are a trip planner bot and you are helping the user plan their trip., You should use the WebSearchTools to get information about the destination and activities., You should use the MemoryTools to store information about the user for future reference., Dont ask the user for more information, make up what you dont know., ], markdownTrue, )MemoryTools的实现位于 libs/agno/agno/tools/memory.py为模型暴露了get_memories、add_memory、update_memory、delete_memory四个工具函数。运行时模型在回答给我规划非洲旅行前可以先用get_memories读取用户画像再结合搜索结果生成个性化 itinerary当用户在对话中透露新偏好时模型自主调用add_memory/update_memory落库。相比update_memory_on_run的每次运行统一提炼这是由模型按需读写的声明式用法与 Agentic Memory 理念一脉相承。十、直接使用 MemoryManager APImemory_manager/不想让 LLM 参与记忆生成、只想用代码手动管理记忆时可以绕过 Agent 直接操作MemoryManager。该子目录包含五个示例见 memory_manager/README.md01_standalone_memory.py独立 CRUD02_memory_creation.py记忆创建03_custom_memory_instructions.py自定义记忆指令04_memory_search.py记忆检索05_db_tools_control.pyDB 工具开关控制。以独立 CRUD 为例关键 API 一目了然from agno.db.postgres import PostgresDb from agno.memory import MemoryManager, UserMemory memory MemoryManager(dbPostgresDb(db_urldb_url)) # 新增返回 memory_id memory_id_1 memory.add_user_memory( memoryUserMemory(memoryThe users name is Jane Doe, topics[name]), user_idjane_doe_id, ) memory_id_2 memory.add_user_memory( memoryUserMemory(memoryShe likes to play tennis, topics[hobbies]), user_idjane_doe_id, ) # 查询 memories memory.get_user_memories(user_idjane_doe_id) # 删除 memory.delete_user_memory(user_idjane_doe_id, memory_idmemory_id_2) # 替换 memory.replace_user_memory( memory_idmemory_id_1, memoryUserMemory(memoryThe users name is Jane Mary Doe, topics[name]), user_idjane_doe_id, )这里直接实例化UserMemory(memory..., topics[...])并调用add_user_memory/get_user_memories/delete_user_memory/replace_user_memory适合批量导入、数据清洗、后端管理脚本等不需要 LLM 参与的确定性场景。MemoryManager还提供基于语义相似度的记忆检索MemorySearchResponse见 manager.py对应04_memory_search.py示例。若使用 SurrealDB 作为存储后端示例位于 cookbook/integrations/surrealdb/。十一、记忆优化策略optimize_memories/随着对话积累用户记忆会越来越多占用上下文 token 也水涨船高。optimize_memories/子目录专门演示记忆体量优化见 optimize_memories/README.md。1. Summarize 汇总策略01_memory_summarize_strategy.py 先让 Agent 在多次运行中写入 4 段长记忆宠物狗 Max、旧金山生活、周末爱好、学钢琴再统计优化前后对比strategy SummarizeStrategy() tokens_before strategy.count_tokens(memories_before) memory_manager.optimize_memories( user_iduser_id, strategyMemoryOptimizationStrategyType.SUMMARIZE, applyTrue, ) memories_after agent.get_user_memories(user_iduser_id) tokens_after strategy.count_tokens(memories_after)脚本会打印优化前记忆条数 / token 数 → 优化后记忆条数 / token 数 / 压缩百分比。其原理是把所有记忆合并成一条综述记忆用 LLM 重写去重去冗实现 token 削减。策略类型枚举定义于 libs/agno/agno/memory/strategies/types.py当前内置SUMMARIZE summarize工厂类MemoryOptimizationStrategyFactory负责按类型实例化策略。2. 自定义策略02_custom_memory_strategy.py 演示如何通过继承MemoryOptimizationStrategy实现自己的策略——示例RecentOnlyStrategy只保留最近 N 条记忆class RecentOnlyStrategy(MemoryOptimizationStrategy): Keep only the N most recent memories. def __init__(self, keep_count: int 2): self.keep_count keep_count def optimize(self, memories: List[UserMemory], model: Model) - List[UserMemory]: sorted_memories sorted( memories, keylambda m: m.updated_at or m.created_at or datetime.min, reverseTrue, ) return sorted_memories[: self.keep_count] async def aoptimize(self, memories: List[UserMemory], model: Model) - List[UserMemory]: # 异步版本逻辑与 optimize 一致 ...策略接口需要同时实现同步optimize与异步aoptimize两个方法返回裁剪后的记忆列表。自定义策略通过MemoryOptimizationStrategyType枚举之外的工厂通道接入当前枚举仅内置 summarize自定义策略可直接实例化后使用适用于按时间窗保留按话题过滤按记忆置信度裁剪等业务定制场景。十二、源码级总结记忆写入的完整调用链综合 agent.py、manager.py 与示例代码可以梳理出 Agno 记忆系统的整体脉络触发Agent上的update_memory_on_run/enable_agentic_memory/memory_manager/tools[MemoryTools()]决定记忆如何被触发自动、Agentic、工具调用生成MemoryManager调用其model默认回退 OpenAI gpt-4o见 manager.py从对话上下文提炼记忆并受additional_instructions、memory_capture_instructions约束落库记忆以UserMemorydb/schemas/memory.py形式通过dbBaseDb/AsyncBaseDb抽象PostgresDb / SqliteDb 为具体实现持久化权限由delete_memories/update_memories/add_memories/clear_memories控制召回后续运行按user_id加载记忆注入上下文多 Agent 场景下共享同一db与user_id即可共享画像叠加相同session_id还能共享会话历史优化当记忆膨胀时通过MemoryOptimizationStrategy内置 Summarize 或自定义策略在保证信息量的前提下压缩 token 开销。这一链路覆盖了从单 Agent 记住用户到多用户、多会话、多 Agent、可优化的完整记忆工程能力是构建个性化 Agent 应用时可复用的标准范式。更进一步Agno 的 OS 层还提供MemoryManagerMetadatalibs/agno/agno/os/schema.py等元数据结构为记忆的托管化、可观测化提供扩展空间感兴趣的读者可沿此方向继续深入。【免费下载链接】agnoBuild, run, and manage agent platforms.项目地址: https://gitcode.com/GitHub_Trending/ag/agno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考