Agent 工程实践 精选
构建有状态的AI Agent:Letta(MemGPT)深度实践指南
深入学习如何使用 Letta(原 MemGPT)构建具有长期记忆的有状态 AI Agent,解决 LLM 的上下文窗口限制问题。
AgentList Team · 2025年2月22日
LettaMemGPTAI Agent长期记忆
LLM 的上下文窗口限制是构建长期运行的 AI Agent 的主要挑战。Letta(原 MemGPT)提供了一种优雅的解决方案。
Letta 核心概念
Letta 采用了一种虚拟上下文管理架构:
- 主上下文 (Main Context): LLM 可见的上下文窗口
- 外部上下文 (External Context): 存储在持久化存储中的信息
- 核心记忆 (Core Memory): 关于用户的基本信息
- 递归记忆 (Recall Memory): 对话历史摘要
快速开始
安装
pip install letta
创建 Agent
from letta import create_client
client = create_client()
agent = client.create_agent(
name="my_assistant",
system="你是一个有帮助的AI助手"
)
# 发送消息
response = client.send_message(
agent_id=agent.id,
message="你好,我是小明"
)
记忆管理机制
Letta 的核心创新是自动化的记忆管理:
- 自动摘要: 当上下文窗口满时,自动生成摘要
- 记忆检索: 根据对话内容检索相关记忆
- 记忆更新: 动态更新用户画像和偏好
实战案例:个人助理 Agent
from letta import LocalClient
client = LocalClient()
# 创建具有长期记忆的助理
agent = client.create_agent(
name="personal_assistant",
system="""
你是一个个人助理,需要记住:
1. 用户的基本信息和偏好
2. 重要的日程和任务
3. 过往对话的关键信息
"""
)
# Agent 会自动记住用户偏好
client.send_message(
agent_id=agent.id,
message="我喜欢简洁的回答,不需要太多客套话"
)
# 后续对话会应用这个偏好
client.send_message(
agent_id=agent.id,
message="今天天气怎么样?"
)
与其他框架对比
| 特性 | Letta | LangChain Memory | Mem0 |
|---|---|---|---|
| 自动记忆管理 | 是 | 部分 | 是 |
| 透明记忆访问 | 是 | 否 | 是 |
| 白盒架构 | 是 | 否 | 部分 |
最佳实践
- 合理设计系统提示: 指导 Agent 如何管理记忆
- 定期清理: 避免记忆过度膨胀
- 监控性能: 注意 token 使用和响应时间
总结
Letta 为构建具有长期记忆的 AI Agent 提供了优雅的解决方案,是开发复杂 Agent 系统的重要工具。
Letta 的设计哲学:虚拟化操作系统
Letta 把 LLM 当作"CPU",把上下文窗口当作"内存"。这个类比决定了它的架构:
- 主上下文 (Main Context) = 物理内存:LLM 当前能看到的上下文
- 外部上下文 (External Context) = 硬盘:长期存储的记忆、文档、知识
- 核心记忆 (Core Memory) = 寄存器:高频访问的关键信息(用户偏好等)
- 递归记忆 (Recall Memory) = 磁盘缓存:对话历史的索引摘要
Agent 在每次推理时,自主决定哪些信息应该被加载到主上下文、哪些应该被写回外部上下文。这种"自管理"架构让 Letta 能处理跨 session、跨用户的长期任务。
记忆的"真实性"问题
很多人误以为 Letta 的记忆就是"完美记住所有事",实际上:
- 记忆是模型重建的:基于摘要和检索,不是原始 log
- 会遗忘细节:超过阈值的细节会被压缩或丢弃
- 可能编造:模型可能基于历史模式生成不存在的"记忆"
- 检索不是 100% 准确:向量检索可能召回不相关的"记忆"
因此关键业务场景必须在 prompt 里加 "如果不确定,请询问用户" 的兜底逻辑。
与传统 RAG 的关键差异
Letta 和传统 RAG 的对比:
| 维度 | 传统 RAG | Letta |
|---|---|---|
| 数据来源 | 静态文档库 | 动态对话 + 用户行为 |
| 更新方式 | 离线重建 | 实时增删 |
| 检索目标 | 相关文档 | 相关记忆 |
| 上下文管理 | 固定 prompt | 自主管理 |
| 适合场景 | 知识问答 | 个人助理 |
简单判断:如果你的核心需求是"基于文档回答问题",RAG 更合适;如果是"长期陪伴用户的个人助理",Letta 更合适。
记忆工程的常见反模式
新手最容易犯的几个错误:
- 让 Agent 记住一切——记忆库无限膨胀,检索效率急剧下降
- 不做记忆优先级——所有记忆平等存储,关键信息被淹没
- 不区分长期/短期——把临时上下文写进核心记忆,污染用户画像
- 没有"遗忘机制"——过期信息不清理,检索质量下降
正确做法是有意识地设计记忆生命周期:
- 短期记忆(< 24h):自动清理
- 中期记忆(用户偏好):永久保留
- 长期记忆(关键事件):明确标注,定期回顾
监控与可观测性
Letta Agent 上线后必须监控的关键指标:
- 记忆命中率:用户 query 触发记忆检索的成功率
- 记忆膨胀速度:每周新增记忆条目数;超过阈值告警
- 核心记忆大小:超过 token 预算需要清理
- 跨 session 一致性:同一用户不同 session 的回答是否一致
可以用 Langfuse 这类平台接 trace,看到每次推理时记忆的读写情况。
与 Mem0 的取舍
两个常被对比的项目:
选择建议:
两者并不冲突,可以并存(Mem0 增强 Letta 的记忆共享能力)。
真实落地挑战
Letta 项目落地的常见困难:
- 调试困难:记忆检索是黑盒,调试时不知道 Agent 为什么"记住"或"遗忘"
- 成本控制:每次记忆读写都触发 LLM 调用,长期使用成本累积
- 隐私问题:用户偏好是隐私数据,需要加密存储和访问控制
- 冷启动:新用户没有历史记忆,Agent 表现像"陌生人"
- 多 Agent 一致性:多个 Agent 共享同一用户画像时容易冲突
选型决策表
| 场景 | 推荐方案 |
|---|---|
| 个人助理 / 陪伴型 AI | Letta |
| 客户支持(长期客户关系) | Letta + 自定义工具 |
| 知识库问答 | RAG + 短记忆 |
| 任务型 Agent(无状态) | 不需要记忆框架 |
| 多 Agent 共享记忆 | Mem0 + 任意框架 |
不要为了"用 Letta 而用 Letta"。如果你的 Agent 不需要长期记忆,简单 RAG + 短 session 内存就够了。