agno中的智能体记忆系统:短期与长期记忆的设计与实现
在多智能体系统(Multi-Agent System, MAS)中,记忆系统是实现智能体持续学习和个性化交互的核心组件。agno作为高性能多智能体运行时框架,其记忆系统通过分层设计实现了短期会话记忆与长期用户画像的协同管理,支持智能体在动态环境中保持上下文连贯性并积累持久知识。本文将深入解析agno记忆系统的架构设计、核心功能及工程实践,帮助开发者构建具备类人记忆能力的智能体应用。
记忆系统的分层架构
agno的记忆系统采用"双轨存储+统一管理"的架构模式,将记忆划分为短期会话记忆和长期用户记忆两个逻辑层次,通过MemoryManager组件实现统一调度。这种设计借鉴了人类记忆的工作原理——短期记忆处理当前交互上下文,长期记忆则存储可复用的用户特征,两者通过记忆编码与检索机制动态交互。
架构核心组件
- 短期记忆(Short-term Memory):存储当前会话的交互历史,默认随会话结束自动清理,对应Agent实例的
session_id上下文。 - 长期记忆(Long-term Memory):以用户为粒度持久化存储关键信息,支持跨会话复用,通过UserMemory数据结构建模。
- 记忆管理器(MemoryManager):提供CRUD操作接口,支持多存储后端(PostgreSQL、Redis等),对应memory_manager模块。
数据流向设计
短期记忆:会话上下文的动态管理
短期记忆聚焦于当前交互场景的上下文保持,通过会话ID(session_id)进行隔离,确保多用户并发场景下的记忆独立性。在agno中,短期记忆默认通过内存存储实现高效访问,适合高频读写的会话数据。
核心实现机制
短期记忆的启用通过Agent初始化参数控制,设置enable_user_memories=True即可激活上下文记忆功能:
agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"),
db=PostgresDb(db_url=db_url),
enable_user_memories=True, # 启用短期记忆
)
上述代码片段来自01_agent_with_memory.py,展示了基础记忆功能的激活方式。当智能体处理用户输入时,系统会自动将交互内容编码为会话记忆,并在后续响应生成时注入上下文:
# 存储用户自我介绍到短期记忆
agent.print_response(
"My name is John Doe and I like to hike in the mountains on weekends.",
user_id=john_doe_id,
session_id=session_id # 会话隔离标识
)
# 从短期记忆中检索上下文
agent.print_response(
"What are my hobbies?", # 无需重复提供上下文
user_id=john_doe_id,
session_id=session_id
)
工程优化策略
- 上下文窗口控制:通过
max_tokens参数限制记忆长度,防止上下文膨胀影响模型性能。 - 增量更新机制:仅存储新交互内容而非完整历史,通过session_id关联上下文片段。
- 自动清理策略:非活跃会话记忆自动过期(默认24小时),可通过
session_ttl参数自定义。
长期记忆:用户画像的持久化存储
长期记忆解决跨会话知识积累问题,通过用户唯一标识(user_id)关联持久化数据。agno提供两种更新模式:被动记忆(系统自动提取)和主动记忆(智能体显式操作),分别对应enable_user_memories和enable_agentic_memory配置项。
被动记忆采集
当启用enable_user_memories=True时,系统会自动从对话中提取实体信息并更新长期记忆。例如在01_agent_with_memory.py中,智能体通过自然语言理解识别用户陈述中的"hiking"爱好,并自动存储为结构化记忆:
# 用户陈述触发被动记忆更新
agent.print_response(
"My name is John Doe and I like to hike in the mountains on weekends.",
user_id=john_doe_id
)
# 长期记忆存储结果
memories = agent.get_user_memories(user_id=john_doe_id)
# 输出: [{"memory": "John Doe likes hiking", "topics": ["hobbies"]}]
主动记忆操作
通过enable_agentic_memory=True开启智能体对记忆的主动管理能力,支持记忆的显式增删改查。在02_agentic_memory.py示例中,智能体可根据用户指令直接操作记忆:
# 用户指令触发主动记忆删除
agent.print_response(
"Remove all existing memories of me.",
user_id=john_doe_id
)
# 验证记忆已清空
memories = agent.get_user_memories(user_id=john_doe_id)
# 输出: []
这种设计赋予智能体记忆自主性,使其能够处理记忆冲突(如用户更新爱好)和隐私请求(如"忘记我的信息")。
多智能体记忆共享机制
在团队协作场景中,多个智能体需要共享统一的用户视图。agno通过中心化存储+分布式访问模式实现记忆共享,所有智能体连接同一数据库实例,通过db参数指定共享存储后端。
跨智能体协作示例
03_agents_share_memory.py展示了聊天智能体与研究智能体共享用户记忆的场景:
# 初始化共享数据库
db = PostgresDb(db_url=db_url)
# 聊天智能体存储用户爱好
chat_agent = Agent(
model=OpenAIChat(id="gpt-4o"),
db=db, # 共享数据库连接
enable_user_memories=True
)
chat_agent.print_response(
"My name is John Doe and I like hiking.",
user_id=john_doe_id
)
# 研究智能体复用用户信息
research_agent = Agent(
model=OpenAIChat(id="gpt-4o"),
tools=[DuckDuckGoTools()],
db=db, # 共享同一数据库
enable_user_memories=True
)
research_agent.print_response(
"I love asking questions about quantum computing.", # 结合记忆生成个性化回答
user_id=john_doe_id
)
数据一致性保障
- 事务支持:通过数据库事务确保记忆更新的原子性,对应PostgresDb的事务方法。
- 乐观锁机制:使用版本号控制并发更新冲突,防止记忆数据损坏。
- 缓存策略:热门用户记忆通过Redis缓存加速访问,降低数据库压力。
工程实践:构建个性化健康助手
基于agno记忆系统,我们可以快速构建具备记忆能力的健康管理智能体。以下是实现步骤与核心代码:
1. 环境准备
# 创建虚拟环境
python3 -m venv ~/.venvs/aienv
source ~/.venvs/aienv/bin/activate
# 安装依赖
pip install -U psycopg sqlalchemy openai agno # 来自[cookbook/memory/README.md](https://link.gitcode.com/i/165e829c152cdb1fe363a560c69e3fe1)
2. 初始化记忆感知智能体
from agno.agent.agent import Agent
from agno.db.postgres import PostgresDb
from agno.models.openai import OpenAIChat
# 初始化数据库连接
db = PostgresDb(db_url="postgresql+psycopg://ai:ai@localhost:5532/ai")
# 创建具备长期记忆的智能体
health_agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"),
db=db,
enable_user_memories=True, # 被动记忆采集
enable_agentic_memory=True # 主动记忆操作
)
3. 记忆交互流程
user_id = "patient_001"
# 1. 采集用户健康信息(长期记忆)
health_agent.print_response(
"我有高血压病史,需要低钠饮食建议",
user_id=user_id
)
# 2. 动态更新健康状态
health_agent.print_response(
"我的血压最近控制良好,可以恢复正常饮食吗?",
user_id=user_id
)
# 3. 记忆检索与个性化建议
response = health_agent.print_response(
"推荐今天的晚餐菜单",
user_id=user_id
)
print(response) # 输出考虑高血压病史的低钠食谱
4. 记忆管理工具集成
通过memory_tools扩展智能体的记忆操作能力,实现记忆查询、过滤和导出功能:
from agno.tools.memory_tools import MemoryTools
health_agent.add_tools([MemoryTools()])
health_agent.print_response(
"列出我的所有健康记录并导出为CSV",
user_id=user_id
)
存储后端与性能优化
agno记忆系统采用插件化存储接口设计,支持多种存储后端以适应不同场景需求。开发者可根据数据规模和访问模式选择最优存储方案,或通过db模块扩展自定义存储适配器。
存储方案对比
| 存储类型 | 适用场景 | 性能特点 | 代码示例 |
|---|---|---|---|
| PostgreSQL | 长期结构化记忆 | 支持事务,适合复杂查询 | PostgresDb |
| Redis | 短期会话缓存 | 毫秒级响应,支持TTL | RedisDb |
| SQLite | 本地开发测试 | 零配置,文件存储 | SqliteDb |
性能调优策略
- 读写分离:短期记忆使用Redis集群,长期记忆使用PostgreSQL主从架构
- 记忆分片:按用户ID哈希分片存储,避免单点热点
- 预加载机制:会话启动时批量加载高频访问记忆,减少运行时IO
- 压缩编码:对长文本记忆采用LZ4压缩,降低存储成本
最佳实践与常见问题
记忆设计三原则
- 相关性过滤:仅存储影响交互决策的关键信息,避免记忆膨胀。例如在02_agentic_memory.py中,仅保留用户当前有效的爱好信息。
- 时效性标记:为记忆添加时间戳,实现"近期记忆优先"的检索策略。
- 多模态支持:通过multimodal模块扩展记忆类型,支持存储图像描述、语音转写等非文本信息。
典型问题解决方案
Q: 如何处理用户记忆冲突(如用户前后陈述矛盾)?
A: 启用enable_agentic_memory=True后,智能体可通过自然语言指令解决冲突:
# 用户纠正记忆内容
agent.print_response(
"我之前说喜欢徒步是错误的,实际喜欢骑行",
user_id=user_id
)
# 系统自动更新记忆,标记旧记忆为"失效"状态
Q: 如何实现记忆的访问权限控制?
A: 通过权限控制中间件实现记忆访问的细粒度控制:
memory.set_acl(
user_id=user_id,
resource="health_records",
permissions=["read:own", "write:own"]
)
总结与展望
agno的记忆系统通过分层设计和灵活配置,为多智能体应用提供了强大的记忆管理能力。短期记忆确保会话连贯性,长期记忆实现知识沉淀,而多智能体共享机制则为团队协作奠定基础。随着LLM能力的提升,未来记忆系统将向情景记忆(Episodic Memory)和程序记忆(Procedural Memory)方向扩展,支持智能体积累经验并复用解决问题的策略。
开发者可通过getting_started教程快速上手,或参考memory模块的完整示例代码,构建具备高级记忆能力的智能体应用。agno的记忆系统不仅是技术实现的集合,更是构建可信AI交互的基础——让智能体不仅能"思考",更能"记住"并"成长"。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



