从零实现AI代理的长期记忆

大多数开发人员认为"记忆"只是存储聊天日志。这是一个根本性的误解。

如果你想构建一个能够真正了解你的 AI 代理------一个能够根据你的整个对话历史、目标、健身水平和偏好提供个性化建议的系统------那么你就需要超越简单的聊天日志存储。

1、为什么当前的聊天机器人会失败

每次你刷新页面时,聊天机器人都忘记了你是谁。它必须从头开始了解你。

这会:

  • 烧毁 token(每次重新阅读整个对话)
  • 增加延迟(搜索数据库减慢响应)
  • 提供糟糕的用户体验(机器人重复问相同的问题)
    为了解决这个问题,我们需要分离两种记忆:

1) 非结构化记忆(The Stream)

  • 持续的对话流

  • 允许快速查询(不扫描整个表)

  • 适合:一般聊天、最近上下文
    2) 结构化事实(The Facts)

  • 用户档案:年龄、性别、目标、健身水平

  • 稳定的信息:不经常变化

  • 适合:个性化推荐、设置更新

2、设置数据库

让我们使用 SQLite,因为:

  • 轻量级(与 Python 代理完美集成)

  • 内置(无需外部依赖)

  • 完美适配演示环境
    数据库架构:

    CREATE TABLE IF NOT EXISTS profiles (
    session_id TEXT PRIMARY KEY,
    gender TEXT,
    age INTEGER,
    fitness_level TEXT,
    goals TEXT,
    updated_at TEXT DEFAULT CURRENT_TIMESTAMP
    );

这个表是我们的"真相来源"------它包含不会随每次对话重新计算的稳定事实。

3、记忆提取层

在源代码中,我们实现一个轻量级提取函数:

复制代码
def extract_profile_updates(message: str) -> Optional[dict]:
    """从用户消息中提取个人资料更新。"""
    # 示例 - 提取年龄、健身水平和目标
    import re
    age_match = re.search(r'\b(\d+)\b', message)
    fitness_match = re.search(r'fitness level[:\s]+', message)
    goal_match = re.search(r'goal[:\s]+', message)
    
    if age_match or fitness_match or goal_match:
        return {
            'age': int(age_match.group(1)) if age_match else None,
            'fitness_level': fitness_match.group(1) if fitness_match else None,
            'goals': goal_match.group(1) if goal_match else None
        }
    return None

这个函数在后台运行,确保用户档案保持最新。

4、提示注入层(代理的大脑)

这是真正的魔法发生的地方。我们的代理需要能够访问这些记忆来做出智能决策。

我们使用 系统提示注入来组合查询:

复制代码
# 伪代码示例
context = {
    "stream_summary": get_recent_stream(),      # 非结构化:最近消息
    "user_profile": get_user_profile(),         # 结构化:用户事实
    "goals": get_user_goals()              # 从档案中读取
}

prompt = f"""
根据以下上下文,做出适当的回复:

**流记忆(非结构化):**
{context['stream_summary']}

**用户档案(结构化):**
- 年龄:{context['user_profile']['age'] if 'age' in context['user_profile'] else '未知'}
- 健身水平:{context['user_profile']['fitness_level'] if 'fitness_level' in context['user_profile'] else '未知'}
- 目标:{context['user_profile']['goals'] if 'goals' in context['user_profile'] else '无'}
- 偏好:根据健身水平和历史记录
- 更新时间:{datetime.now().strftime('%Y-%m-%d')}

**要求:**
- 提供个性化建议
- 参考健身目标和水平
- 如果涉及健身计划,调整建议
- 保持对话连贯性
- 不要假设信息,总是从档案中读取

**你的回复风格:**
- 专业且友好
- 如果需要更多上下文,说明你将从流记忆中查找
- 使用用户的名字(如果已知)
"""

这确保我们的代理不会做出奇怪的假设,而是基于真实数据。

5、技术实现细节

源代码可在 Fabio Hiroki 的 GitHub**

这是一个完整的、生产就绪的实现,包含:

  • 双重记忆架构

  • SQLite 数据库集成

  • 提取和提示注入系统

  • Gradio Web 界面
    关键技术:

  • 会话管理(session_id)

  • 异步更新(避免阻塞)

  • 上下文组合(Stream + Facts)

  • 智能提示(避免重复查询)

6、实际应用场景

场景 1:健身指导

用户:"我最近开始去健身房"

代理响应:

  • 检索用户档案 → 年龄:28, 健身水平:初级
  • 检索最近目标 → "每周锻炼 3 次"
  • 生成个性化建议:"根据您的健身水平,建议从每周 2 次开始,关注基础动作"
  • 引用用户档案更新:"记得你是从上次对话开始的"

7、未来展望

下一代 AI 代理不会只是"更聪明的聊天机器人"------它们将具有深度持久记忆,能够理解用户在多个对话中的意图、目标和偏好。

随着 世界模型的发展,我们有更多机会将记忆与推理相结合,创造出真正个性化的 AI 助手。


原文链接:从零实现AI代理的长期记忆 - 汇智网

相关推荐
深蓝AI几秒前
苹果智能入华拆解:八样首批功能、支持的机型、千问在三个入口的位置
人工智能·架构
前端 贾公子6 分钟前
第 1 章:Vibe Coding 与 Agent 的工作方式
人工智能
JAVA_AI人工智能项目实战20 分钟前
轻量级模型训练_RNN文本分类流水线实验代码
人工智能·rnn·分类
code2cat26 分钟前
【随笔】RAG混合检索:让关键词与向量一起找证据
人工智能·rag·混合检索
captain37627 分钟前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
在所不辞兄1 小时前
【零基础学智能仿真-67】力学知识库与检索增强
人工智能·深度学习·神经网络·机器学习·智能仿真
心中有你02141 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
云上先途1 小时前
下一代搜索优化重点优化哪些维度,和旧SEO思路有什么不同?
人工智能
楚山之石1 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
龙亘川1 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化