Agno开发教程系列(三):Agent的记忆系统——让AI记住你

138 阅读48分钟

Agno开发教程系列(三):Agent的记忆系统——让AI记住你

本教程是Agno框架系列教程的第三篇,将深入讲解如何为AI Agent添加记忆功能,让你的智能助手真正"记住"用户的偏好和历史交互。


📖 目录

  1. 引言:为什么AI需要记忆?
  2. 记忆系统的基本概念
  3. Agno中的记忆实现方法
  4. 完整代码示例:从简单到复杂
  5. 记忆的存储、检索和管理
  6. 实际应用场景案例
  7. 最佳实践和注意事项
  8. 总结与下一篇预告

引言:为什么AI需要记忆?

想象一下,你每次见到朋友时,他都不记得你的名字、你们之前的对话,甚至不记得你喜欢什么。这样的交流该有多令人沮丧!

对于AI Agent来说,情况也是一样的。没有记忆的AI Agent就像患了健忘症的助手

没有记忆的Agent:

用户:"嗨,我叫张三,我喜欢喝咖啡。"
Agent:"好的,了解了!"
​
(5分钟后)
用户:"你还记得我喜欢什么吗?"
Agent:"抱歉,我不知道您的偏好。"

有记忆的Agent:

用户:"嗨,我叫张三,我喜欢喝咖啡。"
Agent:"你好张三!我记住了,你喜欢咖啡。"
​
(5分钟后,甚至第二天)
用户:"你还记得我喜欢什么吗?"
Agent:"当然记得!张三,你喜欢喝咖啡。需要我推荐附近的咖啡店吗?"

记忆系统的核心价值:

  1. 上下文连续性 - 理解对话的前因后果
  2. 个性化服务 - 基于用户历史提供定制化响应
  3. 任务追踪 - 记住长期任务的进度和状态
  4. 学习和改进 - 从过去的交互中学习,不断优化服务
  5. 用户体验提升 - 让用户感到被理解和重视

在本教程中,我们将学习如何使用Agno框架构建具有强大记忆能力的AI Agent!


记忆系统的基本概念

在深入代码之前,让我们先了解AI Agent记忆系统的基本概念。就像人类大脑一样,AI Agent也需要不同类型的记忆来处理各种任务。

🧠 记忆类型对比

1. 短期记忆(Buffer Memory)

就像你的工作台,只保留当前对话的最近几轮信息。

特点:

  • ⚡ 访问速度快
  • 💾 存储容量小
  • ⏱️ 会话结束后清空
  • 💡 适合单次对话

应用场景: 在线客服处理当前咨询问题

2. 长期记忆(Long-Term Memory)

就像你的档案柜,永久存储重要信息,跨会话使用。

特点:

  • 🗄️ 持久化存储(数据库)
  • 🔍 可检索、更新、删除
  • 🌍 跨会话可用
  • 📈 支持大规模数据

应用场景: 记住用户的姓名、偏好、历史订单

3. 语义记忆(Semantic Memory)

通过向量嵌入实现的智能搜索,找到最相关的记忆。

特点:

  • 🎯 基于相似度检索
  • 🔬 使用向量嵌入技术
  • 📚 适合大量非结构化数据
  • 🧩 支持模糊匹配

应用场景: 研究助手从数千篇论文中找到相关内容

📊 记忆类型对比表

记忆类型存储位置持久性访问速度适用场景
短期记忆内存临时⚡⚡⚡ 极快单次对话
长期记忆数据库永久⚡⚡ 快跨会话个性化
语义记忆向量数据库永久⚡ 较快知识检索

🆚 Agno中的核心区分

在Agno框架中,有一个重要的概念区分:

记忆(Memory)会话历史(Conversation History)

📝 会话历史:存储对话消息本身
   问题:"我们刚才讨论了什么?"
   
💾 记忆:存储从对话中学习到的事实
   事实:"用户张三喜欢喝咖啡"

理解这个区别很重要!记忆是关于"学到了什么",而会话历史是关于"说了什么"


Agno中的记忆实现方法

Agno框架提供了两种主要的记忆管理方式,让我们逐一了解。

方式一:自动记忆管理(推荐新手使用)

工作原理: Agent在每次对话后,自动提取关键信息并存储,需要时自动检索。

配置方法:

from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 创建数据库连接
db = SqliteDb(db_file="my_agent.db")

# 启用自动记忆
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,  # 开启自动记忆 ✨
)

优点:

  • ✅ 无需手动干预
  • ✅ 可靠且可预测
  • ✅ 适合大多数场景
  • ✅ 学习曲线平缓

推荐场景: 客服机器人、个人助理、教育辅导等需要一致记忆行为的应用

方式二:Agentic记忆管理(高级用法)

工作原理: Agent获得记忆管理工具,可以自主决定何时创建、更新或删除记忆。

配置方法:

from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 创建数据库连接
db = SqliteDb(db_file="my_agent.db")

# 启用Agentic记忆
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_agentic_memory=True,  # Agent自主控制记忆 🤖
)

优点:

  • ✅ 精细化控制
  • ✅ Agent可推理决策
  • ✅ 适合复杂工作流
  • ✅ 高度灵活

推荐场景: 复杂多轮对话、需要智能判断的应用、多任务协作

⚠️ 重要提醒: 不要同时启用两种记忆模式!如果同时开启,Agentic记忆会覆盖自动记忆。

🗄️ 支持的数据库

Agno支持多种数据库系统,根据你的需求选择:

数据库适用场景特点
SQLite本地开发、小型应用轻量、无需配置、单文件
PostgreSQL生产环境、大规模应用强大、可扩展、支持高并发
MongoDB灵活数据结构NoSQL、文档存储
ChromaDB语义搜索向量数据库、AI原生
FAISS高性能检索Facebook开源、超快速度

初学者建议: 从SQLite开始,简单易用,无需额外配置!


完整代码示例:从简单到复杂

现在,让我们通过一系列实际代码示例来掌握Agno的记忆系统。

示例1:最简单的记忆Agent(5行代码)

让我们从最基础的开始,创建一个能记住用户信息的聊天机器人。

"""
示例1:基础记忆Agent
功能:记住用户的姓名和偏好
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 步骤1:创建数据库(会在当前目录生成 agent_memory.db 文件)
db = SqliteDb(db_file="agent_memory.db")

# 步骤2:创建支持记忆的Agent
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),  # 使用DeepSeek模型
    db=db,                                        # 连接数据库
    enable_user_memories=True,                    # 启用自动记忆
    description="你是一个友好的AI助手,善于记住用户的偏好。"
)

# 步骤3:第一次对话 - Agent会自动记住这些信息
agent.print_response(
    "你好!我叫李明,我喜欢喝咖啡,周末喜欢爬山。",
    user_id="user_001"  # 指定用户ID,用于区分不同用户
)

# 步骤4:稍后的对话 - Agent会自动回忆起之前的信息
agent.print_response(
    "你还记得我的爱好吗?", 
    user_id="user_001"
)

# 步骤5:再次询问 - 测试记忆的准确性
agent.print_response(
    "推荐一个适合我周末的活动吧!",
    user_id="user_001"
)

运行效果:

👤 用户:"你好!我叫李明,我喜欢喝咖啡,周末喜欢爬山。"
🤖 Agent:"你好李明!很高兴认识你。我记住了,你喜欢咖啡和周末爬山。有什么我可以帮助你的吗?"

👤 用户:"你还记得我的爱好吗?"
🤖 Agent:"当然记得!李明,你喜欢喝咖啡,并且周末喜欢爬山。"

👤 用户:"推荐一个适合我周末的活动吧!"
🤖 Agent:"根据你喜欢爬山的兴趣,我推荐你可以去附近的香山或者十三陵,早上出发前可以先喝杯咖啡提神!"

🎯 关键点:

  • user_id 参数很重要,用于区分不同用户的记忆
  • Agent会自动提取"姓名"、"喜好"等关键信息
  • Agent会自动检索相关记忆并应用到回答中

示例2:自定义记忆表和多用户管理

在实际应用中,你可能需要为不同的业务场景使用不同的记忆存储表。

"""
示例2:多用户记忆管理
功能:支持多个用户,每个用户有独立的记忆
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 使用自定义表名存储记忆
db = SqliteDb(
    db_file="customer_service.db",
    memory_table="customer_memories"  # 自定义记忆表名
)

# 创建客服Agent
customer_service_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,
    description="你是一个专业的客服人员,记住每位客户的需求和问题。"
)

# 模拟三位不同的客户
print("=" * 50)
print("客户A的咨询")
print("=" * 50)
customer_service_agent.print_response(
    "我是客户A,我购买了iPhone 15,遇到了充电慢的问题。",
    user_id="customer_A"
)

print("\n" + "=" * 50)
print("客户B的咨询")
print("=" * 50)
customer_service_agent.print_response(
    "你好,我是客户B,我想咨询MacBook的保修政策。",
    user_id="customer_B"
)

print("\n" + "=" * 50)
print("客户A再次咨询")
print("=" * 50)
customer_service_agent.print_response(
    "你还记得我之前的问题吗?现在情况如何?",
    user_id="customer_A"
)

print("\n" + "=" * 50)
print("客户B再次咨询")
print("=" * 50)
customer_service_agent.print_response(
    "关于我之前问的问题,能详细说明一下吗?",
    user_id="customer_B"
)

运行效果:

==================================================
客户A的咨询
==================================================
🤖 "了解了,客户A。您购买的iPhone 15出现充电慢的问题。
    让我帮您排查:请问您使用的是原装充电器吗?..."

==================================================
客户B的咨询
==================================================
🤖 "您好,客户B!MacBook的标准保修期是一年,
    您可以选择购买AppleCare+延保服务..."

==================================================
客户A再次咨询
==================================================
🤖 "当然记得!您是客户A,之前反馈iPhone 15充电慢的问题。
    请问现在使用原装充电器后情况有改善吗?"

==================================================
客户B再次咨询
==================================================
🤖 "好的,关于MacBook保修政策,标准保修覆盖硬件故障..."

🎯 关键点:

  • 通过 user_id 区分不同用户
  • 每个用户的记忆相互独立
  • 自定义 memory_table 可以实现业务隔离

示例3:手动管理记忆(高级用法)

有时候你需要更精细的控制,比如手动添加、检索或删除记忆。

"""
示例3:手动记忆管理
功能:程序化地添加、检索、更新和删除记忆
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 创建数据库和Agent
db = SqliteDb(db_file="manual_memory.db")
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True
)

# 1️⃣ 手动添加记忆(例如从现有用户数据库导入)
print("=" * 50)
print("步骤1:手动添加用户偏好记忆")
print("=" * 50)

# 模拟从用户数据库读取的信息
user_preferences = {
    "name": "王芳",
    "favorite_food": "川菜",
    "hobby": "摄影",
    "occupation": "平面设计师"
}

# 使用Agent的一次对话来创建记忆
agent.print_response(
    f"我是{user_preferences['name']},我喜欢{user_preferences['favorite_food']},"
    f"爱好是{user_preferences['hobby']},职业是{user_preferences['occupation']}。",
    user_id="user_wangfang"
)

# 2️⃣ 检索用户的所有记忆
print("\n" + "=" * 50)
print("步骤2:检索用户的所有记忆")
print("=" * 50)

memories = agent.get_user_memories(user_id="user_wangfang")
if memories:
    print(f"找到 {len(memories)} 条记忆:")
    for i, memory in enumerate(memories, 1):
        print(f"\n记忆 #{i}:")
        print(f"  - ID: {memory.memory_id}")
        print(f"  - 内容: {memory.memory}")
        print(f"  - 主题: {memory.topics}")
        print(f"  - 更新时间: {memory.updated_at}")
else:
    print("未找到记忆")

# 3️⃣ 测试记忆是否生效
print("\n" + "=" * 50)
print("步骤3:测试记忆效果")
print("=" * 50)

agent.print_response(
    "根据我的职业和爱好,推荐一个适合我的周末活动。",
    user_id="user_wangfang"
)

# 4️⃣ 删除特定记忆(可选)
print("\n" + "=" * 50)
print("步骤4:演示删除记忆(实际使用时谨慎操作)")
print("=" * 50)

if memories and len(memories) > 0:
    memory_to_delete = memories[0]
    print(f"准备删除记忆: {memory_to_delete.memory}")
    
    # 取消注释以下行来实际删除
    # agent.delete_user_memory(
    #     memory_id=memory_to_delete.memory_id,
    #     user_id="user_wangfang"
    # )
    # print("✅ 记忆已删除")
    
    print("⚠️ 删除代码已注释,防止误操作")

运行效果:

==================================================
步骤1:手动添加用户偏好记忆
==================================================
🤖 "你好王芳!很高兴认识你这位平面设计师。
    我记住了你喜欢川菜和摄影..."

==================================================
步骤2:检索用户的所有记忆
==================================================
找到 4 条记忆:

记忆 #1:
  - ID: mem_abc123
  - 内容: 用户名叫王芳
  - 主题: ['姓名', '身份']
  - 更新时间: 1735564800

记忆 #2:
  - ID: mem_def456
  - 内容: 喜欢吃川菜
  - 主题: ['饮食偏好']
  - 更新时间: 1735564800

记忆 #3:
  - ID: mem_ghi789
  - 内容: 爱好是摄影
  - 主题: ['兴趣爱好']
  - 更新时间: 1735564800

记忆 #4:
  - ID: mem_jkl012
  - 内容: 职业是平面设计师
  - 主题: ['职业', '工作']
  - 更新时间: 1735564800

==================================================
步骤3:测试记忆效果
==================================================
🤖 "根据你作为平面设计师的职业和摄影爱好,
    我推荐你可以去艺术展览或者摄影主题的周末活动..."

🎯 关键点:

  • get_user_memories() 方法检索用户的所有记忆
  • 每条记忆包含:ID、内容、主题、时间戳等元数据
  • 可以通过 delete_user_memory() 删除特定记忆
  • 记忆会自动按主题分类(如"姓名"、"饮食偏好"等)

示例4:使用PostgreSQL的生产级配置

当你的应用需要部署到生产环境时,建议使用PostgreSQL这样的企业级数据库。

"""
示例4:生产环境配置(PostgreSQL)
功能:使用PostgreSQL数据库,支持高并发和大规模数据
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.postgres import PostgresDb

# 配置PostgreSQL数据库
# 实际使用时,建议将数据库URL存储在环境变量中
db = PostgresDb(
    db_url="postgresql://username:password@localhost:5432/agno_production",
    memory_table="user_memories"  # 自定义表名
)

# 创建生产级Agent
production_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,
    description="生产环境的AI客服助手",
    # 额外的生产环境配置
    debug_mode=False,  # 关闭调试模式
)

# 使用方式与SQLite完全相同
production_agent.print_response(
    "我是新用户,想了解你们的产品。",
    user_id="prod_user_001"
)

# 后续查询会自动使用记忆
production_agent.print_response(
    "我之前咨询过什么?",
    user_id="prod_user_001"
)

print("\n✅ 生产环境配置完成!")
print("📌 建议:")
print("   1. 使用环境变量存储数据库凭证")
print("   2. 配置数据库连接池")
print("   3. 定期备份记忆数据")
print("   4. 设置记忆数据的过期策略")

环境变量配置建议(使用 .env 文件):

# .env 文件
DEEPSEEK_API_KEY=your_api_key_here
DATABASE_URL=postgresql://username:password@localhost:5432/agno_production
# 使用 python-dotenv 加载环境变量
import os
from dotenv import load_dotenv
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.postgres import PostgresDb

load_dotenv()  # 加载 .env 文件

db = PostgresDb(
    db_url=os.getenv("DATABASE_URL"),
    memory_table="user_memories"
)

agent = Agent(
    model=DeepSeek(api_key=os.getenv("DEEPSEEK_API_KEY")),
    db=db,
    enable_user_memories=True
)

示例5:高级用法 - 自定义MemoryManager

对于有特殊需求的场景,你可以完全自定义记忆管理器的行为。

"""
示例5:自定义MemoryManager
功能:定制记忆提取规则、隐私保护、记忆过滤
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb
from agno.memory import MemoryManager

# 创建数据库
db = SqliteDb(db_file="custom_memory.db")

# 自定义MemoryManager
custom_memory_manager = MemoryManager(
    db=db,
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),  # 指定用于记忆提取的模型
    
    # 自定义记忆提取指令
    memory_capture_instructions="""
    从对话中提取以下类型的信息作为记忆:
    1. 用户的基本信息(姓名、职业等)
    2. 用户的偏好和兴趣
    3. 用户的目标和需求
    
    不要提取:
    - 敏感个人信息(身份证号、电话号码)
    - 密码或安全问题答案
    - 财务信息
    """,
    
    # 额外的隐私保护指令
    additional_instructions="绝不存储用户的真实姓名,使用昵称或代号代替。",
    
    debug_mode=True  # 开启调试,查看记忆提取过程
)

# 使用自定义MemoryManager创建Agent
privacy_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    memory_manager=custom_memory_manager,  # 使用自定义记忆管理器
    enable_user_memories=True,
    description="注重隐私保护的AI助手"
)

# 测试隐私保护
print("=" * 50)
print("测试:提供敏感信息")
print("=" * 50)

privacy_agent.print_response(
    "我叫张伟,身份证号是123456789012345678,我喜欢打篮球。",
    user_id="privacy_user_001"
)

# 检查存储的记忆
print("\n" + "=" * 50)
print("检查存储的记忆内容")
print("=" * 50)

memories = privacy_agent.get_user_memories(user_id="privacy_user_001")
if memories:
    for memory in memories:
        print(f"✅ 记忆: {memory.memory}")
        # 验证是否过滤了敏感信息
        if "身份证" in memory.memory or "123456" in memory.memory:
            print("⚠️ 警告:敏感信息未被过滤!")
        else:
            print("✓ 隐私保护生效")

运行效果:

==================================================
测试:提供敏感信息
==================================================
🤖 "你好!我记住了你的昵称和你喜欢打篮球的兴趣..."

==================================================
检查存储的记忆内容
==================================================
✅ 记忆: 用户昵称是张先生/张女士
✓ 隐私保护生效

✅ 记忆: 喜欢打篮球
✓ 隐私保护生效

🎯 关键点:

  • 通过 memory_capture_instructions 定制记忆提取规则
  • 使用 additional_instructions 添加隐私保护策略
  • 可以指定特定模型用于记忆管理
  • debug_mode=True 可以查看记忆提取的详细过程

示例6:Agentic记忆 - Agent自主决策

最后,让我们看看Agentic记忆模式,Agent会自己决定何时记住或遗忘信息。

"""
示例6:Agentic记忆模式
功能:Agent自主决定何时创建、更新或删除记忆
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 创建数据库
db = SqliteDb(db_file="agentic_memory.db")

# 启用Agentic记忆模式
agentic_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_agentic_memory=True,  # 🤖 Agent自主控制记忆
    description="""
    你是一个智能助手,拥有记忆管理能力。
    你可以自主决定:
    - 什么信息值得长期记住
    - 什么信息只是临时性的
    - 何时更新过时的记忆
    - 何时删除无用的记忆
    
    请明智地使用你的记忆工具。
    """
)

# 场景1:Agent判断值得记住的信息
print("=" * 50)
print("场景1:提供重要信息")
print("=" * 50)

agentic_agent.print_response(
    "我每周二和周四下午3点有固定会议,请帮我记住。",
    user_id="agentic_user_001"
)

# 场景2:Agent判断临时性信息
print("\n" + "=" * 50)
print("场景2:提供临时信息")
print("=" * 50)

agentic_agent.print_response(
    "今天天气真不错啊!",
    user_id="agentic_user_001"
)

# 场景3:Agent回忆重要信息
print("\n" + "=" * 50)
print("场景3:请求回忆")
print("=" * 50)

agentic_agent.print_response(
    "我的固定会议时间是什么时候?",
    user_id="agentic_user_001"
)

# 场景4:更新记忆
print("\n" + "=" * 50)
print("场景4:更新信息")
print("=" * 50)

agentic_agent.print_response(
    "会议时间改了,现在是每周一和周三下午2点。",
    user_id="agentic_user_001"
)

# 场景5:验证更新
print("\n" + "=" * 50)
print("场景5:验证更新结果")
print("=" * 50)

agentic_agent.print_response(
    "再说一遍我的会议时间?",
    user_id="agentic_user_001"
)

运行效果:

==================================================
场景1:提供重要信息
==================================================
🤖 "好的,我已经记住了:你每周二和周四下午3点有固定会议。
    [Agent内部:调用create_memory工具存储此信息]"

==================================================
场景2:提供临时信息
==================================================
🤖 "是的,今天天气确实很好!
    [Agent内部:判断这是闲聊,不调用记忆工具]"

==================================================
场景3:请求回忆
==================================================
🤖 "根据我的记忆,你每周二和周四下午3点有固定会议。
    [Agent内部:调用search_memory工具检索]"

==================================================
场景4:更新信息
==================================================
🤖 "明白了,我已经更新了会议时间:现在是每周一和周三下午2点。
    [Agent内部:调用update_memory工具更新旧记忆]"

==================================================
场景5:验证更新结果
==================================================
🤖 "你的固定会议时间是每周一和周三下午2点。"

🎯 关键点:

  • Agent会自主判断哪些信息需要记忆
  • Agent可以主动更新过时的记忆
  • Agent可以智能检索相关记忆
  • 适合复杂、长期的交互场景

记忆的存储、检索和管理

现在我们已经学会了如何使用记忆,让我们深入了解记忆的底层机制。

📦 记忆的数据结构

每条记忆在数据库中的结构如下:

# 记忆对象的字段
{
    "memory_id": "mem_abc123xyz",           # 唯一标识符
    "memory": "用户喜欢喝咖啡",             # 记忆内容
    "topics": ["饮食偏好", "咖啡"],        # 自动提取的主题标签
    "input": "我很喜欢喝咖啡...",           # 原始输入文本
    "user_id": "user_001",                  # 用户ID
    "agent_id": "customer_service",         # Agent ID(可选)
    "team_id": "support_team",              # 团队ID(可选,用于多Agent场景)
    "updated_at": 1735564800                # 最后更新时间(Unix时间戳)
}

🔍 记忆检索方法

Agno提供了三种检索方法,适用于不同场景:

方法1:last_n - 最新记忆优先
"""
检索最新的N条记忆
适用场景:查看用户最近的活动和偏好变化
"""
from agno.agent import Agent

# 获取最新的5条记忆
recent_memories = agent.memory_manager.search_user_memories(
    user_id="user_001",
    limit=5,
    retrieval_method="last_n"
)

for memory in recent_memories:
    print(f"🕐 {memory.memory} (更新于: {memory.updated_at})")
方法2:first_n - 最早记忆优先
"""
检索最早的N条记忆
适用场景:了解用户的初始需求和长期偏好
"""
# 获取最早的3条记忆
earliest_memories = agent.memory_manager.search_user_memories(
    user_id="user_001",
    limit=3,
    retrieval_method="first_n"
)

for memory in earliest_memories:
    print(f"📜 {memory.memory}")
方法3:agentic - AI语义搜索(最智能)
"""
基于语义相似度的智能搜索
适用场景:找到与特定查询最相关的记忆
"""
# 智能搜索:找到与"饮食"相关的记忆
relevant_memories = agent.memory_manager.search_user_memories(
    query="用户的饮食习惯和喜好",
    user_id="user_001",
    limit=5,
    retrieval_method="agentic"  # 🎯 AI驱动的语义搜索
)

for memory in relevant_memories:
    print(f"🎯 相关记忆: {memory.memory}")
    print(f"   主题: {', '.join(memory.topics)}")

🔍 三种检索方法对比:

检索方法排序依据适用场景性能
last_n时间(最新)查看近期活动⚡⚡⚡ 最快
first_n时间(最早)了解初始偏好⚡⚡⚡ 最快
agentic语义相似度智能查询⚡⚡ 较快

✏️ 记忆的CRUD操作

完整的记忆管理包括创建、读取、更新和删除(CRUD)操作。

"""
完整的记忆CRUD操作示例
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 初始化
db = SqliteDb(db_file="crud_demo.db")
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True
)

# ✅ CREATE - 创建记忆
print("1️⃣ 创建记忆...")
agent.print_response(
    "我喜欢意大利菜,尤其是披萨和意面。",
    user_id="user_food_lover"
)

# 📖 READ - 读取记忆
print("\n2️⃣ 读取所有记忆...")
all_memories = agent.get_user_memories(user_id="user_food_lover")
print(f"共有 {len(all_memories)} 条记忆")
for i, mem in enumerate(all_memories, 1):
    print(f"   记忆{i}: {mem.memory}")

# 🔄 UPDATE - 更新记忆
print("\n3️⃣ 更新记忆...")
# 注意:自动记忆模式下,Agent会自动处理更新
agent.print_response(
    "其实我现在更喜欢中餐了,特别是粤菜。",
    user_id="user_food_lover"
)

# 再次读取,查看更新
updated_memories = agent.get_user_memories(user_id="user_food_lover")
print(f"更新后有 {len(updated_memories)} 条记忆")

# ❌ DELETE - 删除记忆
print("\n4️⃣ 删除特定记忆...")
if len(all_memories) > 0:
    # 删除第一条记忆
    memory_to_delete = all_memories[0]
    agent.delete_user_memory(
        memory_id=memory_to_delete.memory_id,
        user_id="user_food_lover"
    )
    print(f"✅ 已删除记忆: {memory_to_delete.memory}")

# 🗑️ CLEAR - 清空所有记忆(慎用!)
print("\n5️⃣ 清空所有记忆(演示)...")
# agent.memory_manager.clear()  # ⚠️ 会删除数据库中所有记忆!
print("⚠️ clear()操作已注释,防止误操作")

🏷️ 记忆的主题标签系统

Agno会自动为记忆提取主题标签,帮助分类和检索:

"""
理解记忆的主题标签系统
"""
# 创建一条复杂的记忆
agent.print_response(
    "我叫张三,是一名软件工程师,喜欢编程、看书和跑步,最喜欢的编程语言是Python。",
    user_id="user_zhangsan"
)

# 查看提取的主题
memories = agent.get_user_memories(user_id="user_zhangsan")
for memory in memories:
    print(f"记忆: {memory.memory}")
    print(f"主题标签: {memory.topics}")
    print("---")

可能的输出:

记忆: 用户名叫张三
主题标签: ['姓名', '身份信息']
---
记忆: 职业是软件工程师
主题标签: ['职业', '工作']
---
记忆: 喜欢编程、看书和跑步
主题标签: ['兴趣爱好', '运动', '阅读']
---
记忆: 最喜欢的编程语言是Python
主题标签: ['技术偏好', '编程', 'Python']
---

🔐 记忆的隔离和安全

在多用户场景下,确保记忆隔离至关重要:

"""
多租户记忆隔离示例
"""
# 企业A的Agent
company_a_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,
    agent_id="company_a_support",  # 设置agent_id实现隔离
)

# 企业B的Agent
company_b_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,
    agent_id="company_b_support",  # 不同的agent_id
)

# 企业A的客户
company_a_agent.print_response(
    "我购买了你们的产品A",
    user_id="customer_001",
)

# 企业B的Agent无法访问企业A的记忆
company_b_agent.print_response(
    "这位客户之前买了什么?",
    user_id="customer_001"  # 同样的user_id,但不同的agent_id
)
# 输出:"我没有找到相关记录"

隔离维度:

  • user_id - 区分不同用户
  • agent_id - 区分不同Agent/应用
  • team_id - 区分不同团队(多Agent协作场景)

实际应用场景案例

让我们通过三个完整的实际应用案例,看看如何在真实项目中使用Agno的记忆系统。

案例1:智能客服机器人 🎧

需求: 客服需要记住客户的历史问题、产品偏好和服务记录。

"""
案例1:电商客服机器人
功能:
- 记住客户的订单历史
- 记住客户的产品偏好
- 提供个性化推荐
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb
from datetime import datetime

# 初始化客服机器人
db = SqliteDb(db_file="ecommerce_customer_service.db")

customer_service_bot = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,
    description="""
    你是一个专业的电商客服助手。
    你需要:
    1. 记住每位客户的购买历史和偏好
    2. 提供个性化的产品推荐
    3. 追踪客户的问题和解决方案
    4. 保持友好、专业的态度
    """
)

# 模拟完整的客服流程
print("=" * 60)
print("📅 第一天 - 首次咨询")
print("=" * 60)

customer_service_bot.print_response(
    """
    你好,我是李明。
    我想买一台笔记本电脑,主要用于视频编辑和图形设计,预算在8000-10000元。
    """,
    user_id="customer_limig"
)

print("\n" + "=" * 60)
print("📅 第三天 - 下单后咨询")
print("=" * 60)

customer_service_bot.print_response(
    "我昨天买了你们推荐的那台MacBook,想问一下什么时候发货?",
    user_id="customer_liming"
)

print("\n" + "=" * 60)
print("📅 一周后 - 追加购买")
print("=" * 60)

customer_service_bot.print_response(
    "我想再买一个适合我笔记本的鼠标,有什么推荐吗?",
    user_id="customer_liming"
)

print("\n" + "=" * 60)
print("📅 一个月后 - 售后咨询")
print("=" * 60)

customer_service_bot.print_response(
    "我之前买的MacBook用着很好,但是鼠标有点问题,能帮我看看吗?",
    user_id="customer_liming"
)

# 查看客户的完整记忆档案
print("\n" + "=" * 60)
print("📋 客户档案(记忆汇总)")
print("=" * 60)

memories = customer_service_bot.get_user_memories(user_id="customer_liming")
print(f"客户 李明 的记忆档案(共{len(memories)}条):\n")
for i, memory in enumerate(memories, 1):
    print(f"{i}. {memory.memory}")
    print(f"   主题: {', '.join(memory.topics)}")
    print(f"   记录时间: {datetime.fromtimestamp(memory.updated_at).strftime('%Y-%m-%d %H:%M')}")
    print()

运行效果展示:

============================================================
📅 第一天 - 首次咨询
============================================================
🤖 "你好李明!根据你的需求(视频编辑和图形设计,预算8000-10000元),
    我推荐以下几款笔记本:
    1. MacBook Air M2 - 适合移动办公
    2. 联想小新Pro 16 - 性价比高
    请问你更看重便携性还是性能?"

============================================================
📅 第三天 - 下单后咨询
============================================================
🤖 "李明你好!我看到你购买了MacBook,这是一个很好的选择,
    非常适合你的视频编辑和设计需求。
    订单将在24小时内发货,预计3天送达。"

============================================================
📅 一周后 - 追加购买
============================================================
🤖 "为你的MacBook推荐以下鼠标:
    1. 罗技MX Master 3 - 设计师专用,适合图形设计
    2. Apple Magic Mouse - 与MacBook完美搭配
    考虑到你做视频编辑和图形设计,更推荐MX Master 3。"

============================================================
📅 一个月后 - 售后咨询
============================================================
🤖 "李明,很高兴MacBook用着顺手!关于鼠标问题,
    你购买的是罗技MX Master 3对吗?请描述一下具体问题..."

============================================================
📋 客户档案(记忆汇总)
============================================================
客户 李明 的记忆档案(共7条):

1. 客户名叫李明
   主题: 姓名, 身份
   记录时间: 2025-10-22 10:30

2. 主要用途是视频编辑和图形设计
   主题: 需求, 用途
   记录时间: 2025-10-22 10:30

3. 预算在8000-10000元
   主题: 预算, 购买意向
   记录时间: 2025-10-22 10:30

4. 购买了MacBook笔记本电脑
   主题: 订单历史, 产品
   记录时间: 2025-10-25 14:20

5. 追加购买了罗技MX Master 3鼠标
   主题: 订单历史, 配件
   记录时间: 2025-10-29 16:45

6. MacBook使用体验良好
   主题: 用户反馈, 满意度
   记录时间: 2025-11-22 11:00

7. 鼠标出现问题需要售后
   主题: 售后, 问题追踪
   记录时间: 2025-11-22 11:00

💡 案例亮点:

  • ✅ 跨天、跨周的连续对话,记忆保持一致
  • ✅ 自动关联历史订单和产品
  • ✅ 基于记忆提供个性化推荐
  • ✅ 完整的客户画像和服务记录

案例2:个人健康管理助手 💪

需求: 追踪用户的健康数据、饮食习惯和运动记录,提供个性化建议。

"""
案例2:个人健康管理AI助手
功能:
- 记录用户的健康目标
- 追踪饮食和运动习惯
- 提供个性化健康建议
- 监测进度和变化
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 创建健康管理助手
db = SqliteDb(db_file="health_assistant.db")

health_assistant = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,
    description="""
    你是一位专业的健康管理AI助手。
    你的职责:
    1. 记录并追踪用户的健康目标、体重、饮食和运动情况
    2. 根据用户的历史数据提供个性化建议
    3. 鼓励用户坚持健康习惯
    4. 关注用户的进步和变化
    
    重要:你不是医生,对于严重健康问题应建议用户咨询专业医疗人员。
    """
)

# 模拟一个月的健康管理过程
print("=" * 60)
print("🏃 第1周 - 设定目标")
print("=" * 60)

health_assistant.print_response(
    """
    你好!我叫王芳,今年28岁,身高165cm,体重65kg。
    我的目标是在3个月内减重到58kg,主要想改善体型。
    我平时工作比较忙,很少运动,也经常外食。
    """,
    user_id="user_wangfang"
)

print("\n" + "=" * 60)
print("🥗 第2周 - 饮食记录")
print("=" * 60)

health_assistant.print_response(
    """
    今天的饮食:
    早餐:全麦面包、牛奶、鸡蛋
    午餐:公司食堂的炒菜和米饭
    晚餐:沙拉和鸡胸肉
    
    运动:晚上跑步30分钟
    
    感觉还不错,但有点饿。
    """,
    user_id="user_wangfang"
)

print("\n" + "=" * 60)
print("💪 第3周 - 进展汇报")
print("=" * 60)

health_assistant.print_response(
    "这周坚持运动了5天,体重降到了63kg!感觉很有动力。",
    user_id="user_wangfang"
)

print("\n" + "=" * 60)
print("😫 第4周 - 遇到瓶颈")
print("=" * 60)

health_assistant.print_response(
    """
    最近一周体重没什么变化,一直在63kg徘徊。
    而且这几天工作压力大,又开始吃外卖了。
    感觉有点想放弃...
    """,
    user_id="user_wangfang"
)

print("\n" + "=" * 60)
print("🎉 第8周 - 回顾进展")
print("=" * 60)

health_assistant.print_response(
    "嗨!两个月过去了,帮我回顾一下我的进展如何?",
    user_id="user_wangfang"
)

# 生成健康报告
print("\n" + "=" * 60)
print("📊 健康档案报告")
print("=" * 60)

memories = health_assistant.get_user_memories(user_id="user_wangfang")
print(f"用户 王芳 的健康档案(共{len(memories)}条记忆):\n")

# 按主题分类显示
topics_dict = {}
for memory in memories:
    for topic in memory.topics:
        if topic not in topics_dict:
            topics_dict[topic] = []
        topics_dict[topic].append(memory.memory)

for topic, items in topics_dict.items():
    print(f"📌 {topic}:")
    for item in items:
        print(f"   - {item}")
    print()

运行效果展示:

============================================================
🏃 第1周 - 设定目标
============================================================
🤖 "你好王芳!很高兴认识你。
    
    我已经记录下你的基本信息和目标:
    - 当前:165cm, 65kg
    - 目标:3个月内减至58kg(需减重7kg)
    - 每月目标:约2.3kg
    
    这是一个合理且健康的目标!
    
    针对你的情况(工作忙、少运动、常外食),我建议:
    1. 从每周3次、每次30分钟的运动开始
    2. 准备一些健康零食,避免饥饿时暴饮暴食
    3. 外食时选择清淡、高蛋白的选项
    
    准备好开始了吗?"

============================================================
🥗 第2周 - 饮食记录
============================================================
🤖 "王芳,今天的饮食结构很棒!👏
    
    ✅ 优点:
    - 早餐营养均衡
    - 晚餐高蛋白、低碳水
    - 坚持运动30分钟
    
    💡 建议:
    - 感到饿是正常的,可以加一份下午的健康零食(如坚果、酸奶)
    - 午餐可以增加蔬菜比例
    
    继续保持,你做得很好!"

============================================================
💪 第3周 - 进展汇报
============================================================
🤖 "太棒了王芳!🎉
    
    两周就减重2kg,这是很健康的速度!
    而且你一周运动5天,完全超过了最初的目标。
    
    按照这个进度,你的3个月目标完全可以达成。
    记住:保持这个节奏,不要心急哦。"

============================================================
😫 第4周 - 遇到瓶颈
============================================================
🤖 "王芳,先不要灰心!这是每个减重过程都会遇到的'平台期'。
    
    让我们分析一下:
    📊 你的进展:2周减2kg → 1周平台期
    
    这是正常的!身体需要适应新的体重。
    
    关于最近的挑战:
    ✅ 工作压力大 → 可以理解
    ⚠️ 又吃外卖 → 这可能影响进度
    
    💪 我的建议:
    1. 压力大时,运动其实是最好的解压方式
    2. 实在要吃外卖,选择相对健康的选项
    3. 回想一下两周前减了2kg的成就感
    
    记住:你已经减掉了2kg,这是实实在在的进步!
    暂时的停滞不代表失败,坚持下去就会突破。
    
    我会一直陪着你,加油!💪"

============================================================
🎉 第8周 - 回顾进展
============================================================
🤖 "王芳,让我为你做一个完整的进展回顾:
    
    📅 时间跨度:2个月(8周)
    
    📊 体重变化:
    - 起始:65kg
    - 瓶颈期:63kg(第3周)
    - 当前:应该在61kg左右了(假设)
    
    💪 运动记录:
    - 从很少运动 → 一周5次运动
    - 从0分钟 → 稳定30分钟/次
    
    🥗 饮食改善:
    - 从经常外食 → 开始自己准备健康餐
    - 学会了合理搭配(全麦、蛋白质、蔬菜)
    
    🎯 目标进度:
    - 3个月目标:减7kg
    - 已完成:约4kg
    - 进度:57% ✅
    
    💡 关键成就:
    ✨ 克服了平台期的心理挑战
    ✨ 在工作压力下保持了运动习惯
    ✨ 建立了长期的健康生活方式
    
    王芳,你不仅在减重,更重要的是你养成了健康的习惯!
    这比单纯的数字更有价值。继续保持,最后一个月冲刺!💪"

============================================================
📊 健康档案报告
============================================================
用户 王芳 的健康档案(共12条记忆):

📌 基本信息:
   - 姓名:王芳,28岁
   - 身高165cm,起始体重65kg

📌 健康目标:
   - 3个月内减重至58kg
   - 改善体型

📌 生活习惯:
   - 工作繁忙
   - 之前很少运动
   - 经常外食

📌 饮食偏好:
   - 喜欢全麦面包、鸡胸肉、沙拉
   - 正在学习健康饮食搭配

📌 运动记录:
   - 主要运动:跑步
   - 频率:一周5次
   - 时长:每次30分钟

📌 进展记录:
   - 第3周:体重63kg(-2kg)
   - 曾遇到平台期但成功克服
   - 目前仍在持续进步中

📌 心理状态:
   - 初期充满动力
   - 中期曾想放弃但调整过来
   - 整体积极乐观

💡 案例亮点:

  • ✅ 长期追踪(2个月)的连续记忆
  • ✅ 记录数据变化和趋势
  • ✅ 提供情感支持和鼓励
  • ✅ 基于历史数据的个性化建议
  • ✅ 自动生成进展报告

案例3:学习辅导AI导师 📚

需求: 追踪学生的学习进度、知识盲点和学习偏好,提供个性化辅导。

"""
案例3:AI学习辅导导师
功能:
- 追踪学生的学习进度和掌握情况
- 识别知识盲点和薄弱环节
- 记录学习风格和偏好
- 提供个性化的学习计划
"""
from agno.agent import Agent
from agno.models.deepseek import DeepSeek
from agno.db.sqlite import SqliteDb

# 创建AI导师
db = SqliteDb(db_file="learning_tutor.db")

ai_tutor = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,
    description="""
    你是一位经验丰富的AI学习导师。
    
    你的职责:
    1. 了解每位学生的学习目标和现有水平
    2. 追踪学习进度,识别知识盲点
    3. 记录学习偏好(如视觉型、听觉型等)
    4. 提供个性化的学习建议和资源
    5. 定期回顾和调整学习计划
    
    教学原则:
    - 因材施教,根据学生特点调整教学方式
    - 鼓励为主,帮助学生建立自信
    - 注重理解而非死记硬背
    """
)

# 模拟一个学期的辅导过程
print("=" * 60)
print("📖 第1周 - 初次见面")
print("=" * 60)

ai_tutor.print_response(
    """
    老师好!我是张小明,今年高二,想提高数学成绩。
    目前数学成绩中等,大约70-80分(满分100)。
    
    我的问题:
    - 函数这一块总是搞不懂
    - 做题速度慢
    - 容易粗心
    
    我比较喜欢看图表和动画来理解概念,纯文字的东西容易走神。
    目标是下次考试能考到85分以上。
    """,
    user_id="student_xiaoming"
)

print("\n" + "=" * 60)
print("📝 第3周 - 学习反馈")
print("=" * 60)

ai_tutor.print_response(
    """
    老师,这两周我按照你的建议:
    - 看了3Blue1Brown的函数视频,感觉好多了!
    - 每天练习5道函数题
    
    但是遇到复合函数还是会卡住。
    另外,二次函数的图像平移规律总是记混。
    """,
    user_id="student_xiaoming"
)

print("\n" + "=" * 60)
print("✅ 第6周 - 小测验")
print("=" * 60)

ai_tutor.print_response(
    """
    老师!今天数学小测验,函数部分我全对了!
    总分82分,进步了不少。
    
    不过立体几何部分错了很多,空间想象力比较差。
    """,
    user_id="student_xiaoming"
)

print("\n" + "=" * 60)
print("🎯 第12周 - 期中考试前")
print("=" * 60)

ai_tutor.print_response(
    "老师,下周就要期中考试了,能帮我回顾一下重点吗?我有点紧张。",
    user_id="student_xiaoming"
)

# 生成学习档案
print("\n" + "=" * 60)
print("📊 学生学习档案")
print("=" * 60)

memories = ai_tutor.get_user_memories(user_id="student_xiaoming")

# 分类整理
categories = {
    "基本信息": [],
    "学习目标": [],
    "强项": [],
    "薄弱环节": [],
    "学习偏好": [],
    "进步记录": []
}

for memory in memories:
    content = memory.memory
    # 简单的分类逻辑(实际应用中可以更智能)
    if any(word in content for word in ["叫", "年级", "学生"]):
        categories["基本信息"].append(content)
    elif any(word in content for word in ["目标", "想要", "希望"]):
        categories["学习目标"].append(content)
    elif any(word in content for word in ["全对", "进步", "提高"]):
        categories["进步记录"].append(content)
    elif any(word in content for word in ["搞不懂", "薄弱", "不会", "差"]):
        categories["薄弱环节"].append(content)
    elif any(word in content for word in ["喜欢", "偏好", "视觉"]):
        categories["学习偏好"].append(content)

print("学生档案 - 张小明\n")
for category, items in categories.items():
    if items:
        print(f"📌 {category}:")
        for item in items:
            print(f"   • {item}")
        print()

运行效果展示:

============================================================
📖 第1周 - 初次见面
============================================================
🤖 "你好张小明!很高兴成为你的数学辅导老师。
    
    我已经了解了你的情况:
    📊 当前水平:70-80分
    🎯 目标:85分以上(提升约10分)
    
    💪 主要挑战:
    1. 函数概念理解困难
    2. 做题速度慢
    3. 容易粗心
    
    ✨ 你的优势:
    - 有明确的提升目标
    - 了解自己的学习风格(视觉型学习者)
    
    📚 针对你的学习计划:
    
    第1-2周:函数基础突破
    - 推荐资源:3Blue1Brown的函数可视化视频
    - 使用Desmos绘图工具,直观理解函数变换
    - 每天5道基础题 + 2道综合题
    
    第3-4周:速度和准确度训练
    - 限时练习(每题3分钟)
    - 建立错题本,分析粗心原因
    
    记住:进步需要时间,我会陪你一起努力!有问题随时问我。"

============================================================
📝 第3周 - 学习反馈
============================================================
🤖 "小明,太棒了!👏
    
    ✅ 进展很好:
    - 使用可视化资源学习(符合你的学习风格)
    - 坚持每天练习
    - 对函数的理解有所提升
    
    📍 当前挑战:
    1. 复合函数
    2. 二次函数图像平移
    
    💡 针对性建议:
    
    🔹 复合函数:
    - 想象成"函数机器套函数机器"
    - 从里往外一层层处理
    - 画图:画出中间函数和最终函数的图像
    - 推荐练习:先从简单的 f(g(x)) 开始
    
    🔹 二次函数平移:
    - 口诀:左加右减,上加下减
    - 视觉记忆:用Desmos做10个平移动画
    - 找规律:y=(x-2)²+3 的顶点就是(2,3)
    
    📝 本周任务:
    - 看我发给你的复合函数动画
    - 自己在Desmos上做5个二次函数平移实验
    - 每天3道复合函数题
    
    加油,你的进步我都看到了!"

============================================================
✅ 第6周 - 小测验
============================================================
🤖 "小明,恭喜你!🎉
    
    📈 进步明显:
    - 函数部分全对!(这曾是你的薄弱环节)
    - 总分82分(已达目标85分的96%)
    - 比之前提升了约10分
    
    这说明:
    ✅ 视觉化学习方法对你很有效
    ✅ 坚持练习带来了质的改变
    ✅ 理解概念比死记硬背更重要
    
    📍 新发现的挑战:立体几何
    
    这很正常!每个人的空间想象力不同。
    好消息是:你是视觉型学习者,这其实是你的优势!
    
    💡 立体几何学习计划:
    
    1. 使用工具:
       - GeoGebra 3D(交互式3D几何软件)
       - 手机App:立体几何可视化
    
    2. 实物辅助:
       - 买一套几何模型(或用纸板自己做)
       - 多角度观察,培养空间感
    
    3. 训练方法:
       - 每天看5分钟3D模型旋转动画
       - 画出三视图(正视、侧视、俯视)
       - 从简单的长方体开始,逐步到复杂图形
    
    🎯 期中考试目标调整:
    原目标85分你已经快达到了,我们冲刺88-90分吧!
    
    继续保持,你做得很好!"

============================================================
🎯 第12周 - 期中考试前
============================================================
🤖 "小明,别紧张!让我帮你做一个全面的考前回顾。
    
    📚 你的学习历程回顾:
    
    🎯 起点(第1周):
    - 分数段:70-80分
    - 薄弱:函数、做题慢、粗心
    
    📈 进步轨迹:
    - 第3周:函数理解提升
    - 第6周:小测82分,函数全对
    - 现在:立体几何也在进步中
    
    💪 你的优势(考试时要充分发挥):
    1. 函数部分:已经很扎实,可以快速拿分
    2. 视觉化能力:遇到图形题,先画图
    3. 坚持练习:基础题不会出错
    
    ⚠️ 需要注意:
    1. 立体几何:遇到难题先跳过,回头再做
    2. 粗心问题:预留10分钟检查
    3. 时间分配:函数20分钟,立体几何30分钟
    
    📝 考前3天计划:
    
    Day 1(今天):
    - 复习函数专题(你的强项,建立信心)
    - 做1套往年真题(限时)
    
    Day 2:
    - 复习立体几何常见题型
    - 重点看错题本
    - 早点休息
    
    Day 3(考试前一天):
    - 轻松复习,不做难题
    - 准备好考试用品
    - 放松心态,看个电影
    
    🎯 考试策略:
    1. 开考先做函数题(建立信心)
    2. 遇到难题标记,先做会的
    3. 保证会做的题不丢分
    4. 最后10分钟检查计算
    
    💬 给你的话:
    小明,从70分进步到82分,你已经证明了自己的努力和能力。
    这次考试,按照自己的节奏来,发挥出你的水平就好。
    
    记住:
    - 函数是你的强项,放心做
    - 立体几何尽力而为,不强求
    - 你已经准备得很好了
    
    相信自己,你一定可以的!💪
    考完记得告诉我成绩哦!
    
    加油!"

============================================================
📊 学生学习档案
============================================================
学生档案 - 张小明

📌 基本信息:
   • 学生姓名:张小明
   • 年级:高二

📌 学习目标:
   • 数学成绩提升到85分以上
   • 期中考试冲刺88-90分

📌 薄弱环节:
   • 函数概念理解困难(已改善)
   • 复合函数(已攻克)
   • 二次函数图像平移(已掌握)
   • 立体几何空间想象力(进步中)
   • 做题速度慢(有改善)
   • 容易粗心(需要继续注意)

📌 学习偏好:
   • 视觉型学习者
   • 喜欢看图表和动画
   • 对纯文字内容容易走神

📌 进步记录:
   • 第6周小测:82分
   • 函数部分全对(曾经的薄弱环节)
   • 比起点提升约10分
   • 理解能力显著提升

💡 案例亮点:

  • ✅ 长期追踪学习进度(12周)
  • ✅ 识别并记住学习风格(视觉型)
  • ✅ 动态调整学习计划
  • ✅ 提供针对性的资源和方法
  • ✅ 情感支持和心理辅导
  • ✅ 自动生成学习档案

最佳实践和注意事项

在实际项目中使用Agno记忆系统时,以下最佳实践能帮你避免常见陷阱,构建更健壮的应用。

✅ 最佳实践

1. 选择合适的记忆模式
# ✅ 推荐:大多数场景使用自动记忆
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,  # 简单、可靠、可预测
)

# ✅ 高级场景:需要精细控制时使用Agentic记忆
complex_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_agentic_memory=True,  # Agent自主决策
)

# ❌ 错误:不要同时启用两种模式
wrong_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True,
    enable_agentic_memory=True,  # ⚠️ Agentic会覆盖自动记忆
)

决策指南:

场景类型推荐模式理由
客服机器人自动记忆需要一致、可预测的记忆行为
个人助理自动记忆用户期望助理"自然"记住信息
教育辅导自动记忆需要持续追踪学生进度
复杂工作流Agentic记忆需要Agent智能判断记忆内容
研究助手Agentic记忆需要精细控制记忆的创建和删除
2. 合理设置user_id和会话标识
# ✅ 推荐:使用有意义的user_id
agent.print_response(
    "你好",
    user_id="customer_12345"  # 清晰的用户标识
)

# ✅ 多Agent场景:使用agent_id隔离
support_agent = Agent(
    db=db,
    agent_id="customer_support",  # 客服Agent
    enable_user_memories=True
)

sales_agent = Agent(
    db=db,
    agent_id="sales_team",  # 销售Agent
    enable_user_memories=True
)

# ✅ 团队协作:使用team_id共享记忆
team_agent_1 = Agent(
    db=db,
    agent_id="agent_1",
    team_id="support_team",  # 同一团队的Agent可以共享记忆
    enable_user_memories=True
)
3. 环境变量管理敏感信息
# ❌ 错误:硬编码API密钥
agent = Agent(
    model=DeepSeek(api_key="sk-123456789abcdef"),  # 不安全!
)

# ✅ 推荐:使用环境变量
import os
from dotenv import load_dotenv

load_dotenv()  # 加载.env文件

agent = Agent(
    model=DeepSeek(api_key=os.getenv("DEEPSEEK_API_KEY")),
    db=PostgresDb(db_url=os.getenv("DATABASE_URL"))
)

.env 文件示例:

DEEPSEEK_API_KEY=sk-your-api-key-here
DATABASE_URL=postgresql://user:pass@localhost:5432/dbname
4. 数据库选择和配置
# ✅ 开发环境:使用SQLite
dev_db = SqliteDb(
    db_file="dev_agent.db",
    memory_table="memories"
)

# ✅ 生产环境:使用PostgreSQL
prod_db = PostgresDb(
    db_url=os.getenv("DATABASE_URL"),
    memory_table="production_memories",
    # 连接池配置(提高性能)
    pool_size=10,
    max_overflow=20
)

# ✅ 语义搜索场景:使用向量数据库
from agno.db.chroma import ChromaDb

vector_db = ChromaDb(
    collection_name="user_memories",
    # 向量维度取决于embedding模型
)
5. 记忆的生命周期管理
"""
实现记忆的TTL(Time To Live)机制
"""
from datetime import datetime, timedelta

def clean_old_memories(agent, user_id, days=90):
    """
    删除超过指定天数的记忆
    
    参数:
        agent: Agent实例
        user_id: 用户ID
        days: 保留天数
    """
    memories = agent.get_user_memories(user_id=user_id)
    cutoff_timestamp = int((datetime.now() - timedelta(days=days)).timestamp())
    
    for memory in memories:
        if memory.updated_at < cutoff_timestamp:
            agent.delete_user_memory(
                memory_id=memory.memory_id,
                user_id=user_id
            )
            print(f"已删除过期记忆: {memory.memory}")

# 定期执行清理(例如每周一次)
clean_old_memories(agent, "user_001", days=90)
6. 记忆的备份和恢复
"""
备份和恢复记忆数据
"""
import json
from datetime import datetime

def backup_memories(agent, user_id, backup_file):
    """
    备份用户记忆到JSON文件
    """
    memories = agent.get_user_memories(user_id=user_id)
    
    backup_data = {
        "user_id": user_id,
        "backup_time": datetime.now().isoformat(),
        "memories": [
            {
                "memory_id": m.memory_id,
                "memory": m.memory,
                "topics": m.topics,
                "updated_at": m.updated_at
            }
            for m in memories
        ]
    }
    
    with open(backup_file, 'w', encoding='utf-8') as f:
        json.dump(backup_data, f, ensure_ascii=False, indent=2)
    
    print(f"✅ 已备份 {len(memories)} 条记忆到 {backup_file}")

# 使用示例
backup_memories(agent, "user_001", "backups/user_001_20251029.json")
7. 隐私保护和GDPR合规
"""
实现用户数据删除(GDPR Right to be Forgotten)
"""
def delete_all_user_data(agent, user_id):
    """
    完全删除用户的所有数据
    """
    # 确认操作
    print(f"⚠️ 即将删除用户 {user_id} 的所有数据")
    print("此操作不可撤销!")
    
    # 获取所有记忆
    memories = agent.get_user_memories(user_id=user_id)
    
    # 删除每条记忆
    for memory in memories:
        agent.delete_user_memory(
            memory_id=memory.memory_id,
            user_id=user_id
        )
    
    print(f"✅ 已删除用户 {user_id}{len(memories)} 条记忆")
    return len(memories)

# 使用自定义MemoryManager实现隐私保护
from agno.memory import MemoryManager

privacy_manager = MemoryManager(
    db=db,
    additional_instructions="""
    隐私保护规则:
    1. 不要存储身份证号、护照号、社保号
    2. 不要存储完整的信用卡号
    3. 不要存储密码或安全问题答案
    4. 电话号码和邮箱可以存储,但要标记为敏感信息
    5. 儿童(18岁以下)的信息需要特别保护
    """
)

privacy_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    memory_manager=privacy_manager,
    enable_user_memories=True
)

⚠️ 常见陷阱和注意事项

1. 记忆爆炸问题
# ❌ 问题:记忆无限增长,影响性能
# 用户每次对话都产生新记忆,几个月后可能有数千条

# ✅ 解决方案1:定期清理
def maintain_memory_size(agent, user_id, max_memories=100):
    """
    保持记忆数量在合理范围
    """
    memories = agent.get_user_memories(user_id=user_id)
    
    if len(memories) > max_memories:
        # 保留最新的max_memories条
        sorted_memories = sorted(memories, key=lambda m: m.updated_at)
        old_memories = sorted_memories[:-max_memories]
        
        for memory in old_memories:
            agent.delete_user_memory(
                memory_id=memory.memory_id,
                user_id=user_id
            )
        
        print(f"清理了 {len(old_memories)} 条旧记忆")

# ✅ 解决方案2:记忆合并
# 使用LLM将多条相似记忆合并为一条摘要
2. 记忆不一致问题
# ❌ 问题:用户信息更新后,旧记忆仍然存在
# 例如:用户改名后,Agent同时记住新旧两个名字

# ✅ 解决方案:使用Agentic记忆的更新功能
agentic_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_agentic_memory=True  # Agent会自动更新过时的记忆
)

# 或者手动更新记忆
def update_user_name(agent, user_id, old_name, new_name):
    """
    更新用户姓名记忆
    """
    memories = agent.get_user_memories(user_id=user_id)
    
    for memory in memories:
        if old_name in memory.memory:
            # 删除旧记忆
            agent.delete_user_memory(
                memory_id=memory.memory_id,
                user_id=user_id
            )
    
    # 添加新记忆
    agent.print_response(
        f"我的名字是{new_name}",
        user_id=user_id
    )
3. 跨用户记忆泄露
# ❌ 危险:忘记设置user_id
agent.print_response("我的密码是123456")  # 可能被其他用户访问!

# ✅ 安全:始终设置user_id
agent.print_response(
    "我的偏好设置...",
    user_id="user_specific_id"  # 确保记忆隔离
)

# ✅ 多租户应用:使用agent_id + user_id
tenant_a_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    agent_id="tenant_a",  # 租户级隔离
    enable_user_memories=True
)
4. 数据库连接问题
# ❌ 问题:未处理数据库连接异常
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=PostgresDb(db_url="postgresql://..."),  # 如果连接失败会怎样?
    enable_user_memories=True
)

# ✅ 解决方案:添加异常处理
from agno.db.postgres import PostgresDb

try:
    db = PostgresDb(
        db_url=os.getenv("DATABASE_URL"),
        memory_table="memories"
    )
    
    # 测试连接
    db.initialize()
    print("✅ 数据库连接成功")
    
except Exception as e:
    print(f"❌ 数据库连接失败: {e}")
    # 降级到SQLite或内存模式
    from agno.db.sqlite import SqliteDb
    db = SqliteDb(db_file="fallback.db")
    print("⚠️ 已降级到SQLite数据库")

agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=db,
    enable_user_memories=True
)
5. 记忆检索效率问题
# ❌ 低效:频繁调用get_user_memories
for i in range(100):
    memories = agent.get_user_memories(user_id="user_001")  # 每次都查询数据库
    # ...处理记忆

# ✅ 高效:缓存记忆数据
memories_cache = {}

def get_cached_memories(agent, user_id):
    if user_id not in memories_cache:
        memories_cache[user_id] = agent.get_user_memories(user_id=user_id)
    return memories_cache[user_id]

# 定期刷新缓存
import time

def refresh_cache_periodically(agent, user_id, interval=300):  # 5分钟
    while True:
        time.sleep(interval)
        memories_cache[user_id] = agent.get_user_memories(user_id=user_id)

🔍 调试和监控

"""
开启调试模式,查看记忆系统的运行细节
"""
from agno.memory import MemoryManager

debug_memory_manager = MemoryManager(
    db=db,
    debug_mode=True,  # 🔍 开启调试日志
)

debug_agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    memory_manager=debug_memory_manager,
    enable_user_memories=True
)

# 使用时会看到详细的记忆操作日志
debug_agent.print_response("我喜欢编程", user_id="user_001")

# 输出示例:
# [DEBUG] Creating memory: "用户喜欢编程"
# [DEBUG] Topics extracted: ['兴趣爱好', '编程']
# [DEBUG] Memory stored with ID: mem_abc123

📊 记忆系统性能监控

"""
监控记忆系统的性能指标
"""
import time

class MemoryPerformanceMonitor:
    def __init__(self, agent):
        self.agent = agent
        self.metrics = {
            "create_count": 0,
            "retrieve_count": 0,
            "update_count": 0,
            "delete_count": 0,
            "avg_retrieve_time": 0
        }
    
    def get_memories_with_timing(self, user_id):
        """测量检索时间"""
        start = time.time()
        memories = self.agent.get_user_memories(user_id=user_id)
        elapsed = time.time() - start
        
        self.metrics["retrieve_count"] += 1
        self.metrics["avg_retrieve_time"] = (
            (self.metrics["avg_retrieve_time"] * (self.metrics["retrieve_count"] - 1) + elapsed)
            / self.metrics["retrieve_count"]
        )
        
        print(f"⏱️ 检索耗时: {elapsed:.3f}秒")
        return memories
    
    def print_metrics(self):
        """打印性能指标"""
        print("\n" + "=" * 50)
        print("记忆系统性能指标")
        print("=" * 50)
        for key, value in self.metrics.items():
            print(f"{key}: {value}")

# 使用示例
monitor = MemoryPerformanceMonitor(agent)
memories = monitor.get_memories_with_timing("user_001")
monitor.print_metrics()

总结与下一篇预告

📝 本篇教程总结

恭喜你!通过本教程,你已经掌握了Agno框架中记忆系统的核心知识:

🎯 你学到了什么
  1. 记忆的重要性

    • 为什么AI Agent需要记忆
    • 记忆如何提升用户体验
  2. 记忆的类型

    • 短期记忆 vs 长期记忆
    • 语义记忆和向量搜索
    • 记忆 vs 会话历史的区别
  3. Agno的两种记忆模式

    • 自动记忆:简单、可靠、适合大多数场景
    • Agentic记忆:灵活、智能、适合复杂场景
  4. 完整的代码实践

    • 从5行代码的简单示例到复杂的多用户系统
    • 数据库配置(SQLite、PostgreSQL)
    • 自定义MemoryManager
  5. 记忆的管理

    • CRUD操作(创建、读取、更新、删除)
    • 三种检索方法(last_n、first_n、agentic)
    • 记忆的数据结构和主题标签
  6. 实际应用案例

    • 智能客服机器人
    • 个人健康管理助手
    • AI学习辅导导师
  7. 最佳实践

    • 选择合适的记忆模式
    • 隐私保护和GDPR合规
    • 性能优化和监控
    • 常见陷阱和解决方案
💡 关键要点回顾
# 记住这三个核心配置

# 1️⃣ 最简单的记忆Agent
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=SqliteDb(db_file="agent.db"),
    enable_user_memories=True  # 开启自动记忆
)

# 2️⃣ 高级控制的Agentic记忆
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    db=SqliteDb(db_file="agent.db"),
    enable_agentic_memory=True  # Agent自主决策
)

# 3️⃣ 自定义记忆管理器
custom_manager = MemoryManager(
    db=db,
    additional_instructions="自定义规则..."
)
agent = Agent(
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    memory_manager=custom_manager,
    enable_user_memories=True
)

🚀 下一篇预告:Agno多Agent协作系统

在掌握了单个Agent的记忆系统后,下一篇教程我们将探索更激动人心的主题:多Agent协作系统!

下一篇你将学到:
  1. 多Agent架构设计

    • 什么是多Agent系统?
    • 为什么需要多个Agent协作?
    • 常见的多Agent架构模式
  2. Agent间的通信和协作

    • Agent如何相互传递信息?
    • 团队记忆共享机制
    • 任务分配和调度
  3. 实战案例

    • 研究团队:搜索Agent + 分析Agent + 写作Agent
    • 客服中心:接待Agent + 技术支持Agent + 售后Agent
    • 软件开发团队:产品经理Agent + 开发Agent + 测试Agent
  4. 高级话题

    • Agent的角色定义和职责划分
    • 多Agent的冲突解决
    • 性能优化和可观测性
预览代码片段
"""
下一篇教程预览:构建一个研究团队
"""
from agno.team import Team
from agno.agent import Agent
from agno.models.deepseek import DeepSeek

# 创建研究员Agent
researcher = Agent(
    name="研究员",
    role="负责搜索和收集资料",
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    # ... 更多配置
)

# 创建分析师Agent
analyst = Agent(
    name="分析师",
    role="分析数据并提取关键信息",
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    # ... 更多配置
)

# 创建作家Agent
writer = Agent(
    name="作家",
    role="撰写最终报告",
    model=DeepSeek(api_key="DEEPSEEK_API_KEY"),
    # ... 更多配置
)

# 组建研究团队
research_team = Team(
    agents=[researcher, analyst, writer],
    # 团队共享记忆
    db=shared_db,
    # ... 更多配置
)

# 执行研究任务
result = research_team.run("研究AI在医疗领域的应用")

📚 扩展阅读

💬 交流与反馈

如果你在学习过程中遇到问题,或者有任何建议,欢迎:

  • 在GitHub仓库提Issue
  • 加入Agno社区交流
  • 在评论区留言讨论

🎓 练习作业

为了巩固所学知识,建议你尝试以下练习:

初级练习

练习1:个人日记Agent

  • 创建一个能记住用户日常生活的日记Agent
  • 用户可以分享今天发生的事情
  • Agent能够回忆过去的记录并提供情感支持

中级练习

练习2:旅行规划助手

  • Agent记住用户的旅行偏好(预算、喜好、过敏等)
  • 基于记忆提供个性化的旅行建议
  • 追踪用户的旅行历史

高级练习

练习3:企业知识库Agent

  • 构建一个能记住公司政策、流程和常见问题的Agent
  • 支持多部门员工访问
  • 实现记忆的定期更新和归档

期待下一篇教程,我们将一起探索多Agent协作的精彩世界! 🚀


作者说明: 本教程基于Agno框架最新版本编写,使用DeepSeek模型作为示例。代码已经过测试,可以直接运行。

更新日期: 2025年10月29日

版本: v1.0


Happy Coding! 🎉