1 - 介绍
memgpt 现在改名 Letta.
memgpt
项目的愿景:
Towards LLMs as Operating Systems
迈向将 LLMs 作为操作系统
项目目标:
Teach LLMs to manage their own memory for unbounded context!
教会 LLMs 管理自己的内存以实现无界上下文!

概述
-
LLMs 越来越多地被用于永久聊天
-
有限的上下文长度使得永久聊天具有挑战性
-
MemGPT 管理一个虚拟上下文(受操作系统虚拟内存启发),以创建无界的 LLM 上下文
-
使用 MemGPT,我们证明了 LLM 可以被教导管理自己的内存!
摘要
大型语言模型(LLMs)革新了人工智能,但其受限于有限的上下文窗口,这阻碍了它们在长对话和文档分析等任务中的应用。
为了能够在有限的上下文窗口之外使用上下文,我们提出了虚拟上下文管理技术,该技术借鉴了传统操作系统中的分层内存系统,通过在物理内存和磁盘之间进行分页来提供扩展虚拟内存的错觉。
利用这项技术,我们引入了 MemGPT(MemoryGPT),这是一个智能管理不同存储层级的系统,旨在有效地在 LLM 有限的上下文窗口内提供扩展上下文。
我们在两个领域评估了我们的受操作系统启发的设计,在这些领域现代 LLM 有限的上下文窗口严重影响了它们的性能:
-
文档分析,MemGPT 能够分析远超底层 LLM 上下文窗口的大型文档,
-
多会话聊天,MemGPT 能够创建能够通过长期与用户互动而记忆、反思和动态演变的对话代理。我们在 https://memgpt.ai 上发布了我们的实验代码和数据。
Letta
https://github.com/letta-ai/letta
Letta is the platform for building stateful agents: open AI with advanced memory that can learn and self-improve over time.
Letta 是构建有状态代理的平台:具有高级记忆的开放 AI,可以随着时间的推移学习和自我改进。
Letta 中的核心概念
Letta 是由 MemGPT 的创造者开发的,MemGPT 是一篇介绍了"LLM 操作系统"概念以进行内存管理的研究论文。Letta 中设计有状态代理的核心概念遵循 MemGPT LLM OS 原则:
-
内存层级:代理具有自我编辑的内存,分为上下文内存和上下文外内存
-
内存块:代理的上下文内存由持久可编辑的内存块组成
-
代理式上下文工程:代理通过使用工具来编辑、删除或搜索记忆来控制上下文窗口
-
持续自我改进的代理:每个"代理"都是一个单一实体,具有持续的(无限的)消息历史
相关资料
论文
MemGPT: Towards LLMs as Operating Systems
2 - 启动速度
部署
参考:
https://github.com/letta-ai/letta?tab=readme-ov-file#simple-hello-world-example
准备工作
以 python 为例:
pip install letta-client
登录 letta, 获取 api key.
export LETTA_API_KEY="sk-let-NTExNDRjZjxxxxxxx2OA=="
为了访问 letta 的服务器, 需要科学上网. 如果用的是 socks 代码, 则需要安装 pip 包:
pip install "httpx[socks]"
编写 agent
mkdir -p ~/work/code/agents/letta/hellowworld
cd ~/work/code/agents/letta/hellowworld
vi main.py
输入内容:
import os
import time
import psutil
from letta_client import Letta
# 记录程序开始时间
start_time = time.perf_counter()
# Connect to Letta Cloud (get your API key at https://app.letta.com/api-keys)
client = Letta(api_key=os.getenv("LETTA_API_KEY"))
# 如果是自托管,可以改成:
# client = Letta(base_url="http://localhost:8283", embedding="openai/text-embedding-3-small")
agent_state = client.agents.create(
model="openai/gpt-4.1",
memory_blocks=[
{
"label": "human",
"value": "The human's name is Chad. They like vibe coding."
},
{
"label": "persona",
"value": "My name is Sam, a helpful assistant."
}
],
tools=["web_search", "run_code"]
)
# 在创建 agent 完成后,记录时间
elapsed = (time.perf_counter() - start_time) * 1000 # 毫秒
# 获取当前进程内存占用
process = psutil.Process()
mem = process.memory_info().rss / (1024 * 1024) # MB
# 打印启动时间和内存占用
print(f"程序启动时间: {elapsed:.0f} ms, 内存占用: {mem:.2f} MB")
# 打印 agent id
print(agent_state.id)
response = client.agents.messages.create(
agent_id=agent_state.id,
messages=[
{
"role": "user",
"content": "Hey, nice to meet you, my name is Brad."
}
]
)
# 打印响应消息
for message in response.messages:
print(message)
代码在官方 example 基础上增加了启动时间打印和内存使用打印.
运行:
# 开启 http 代理
# proxyon
python main.py
输出为:
程序启动时间: 1058 ms, 内存占用: 52.19 MB
agent-9d98c82e-4d4c-4d9e-a97d-187a30b52756
AssistantMessage(id='message-d567f53e-a4cc-42c2-9a24-4051c58fe305', content='Hey Brad, nice to meet you too! If there’s anything you want to work on or chat about, just let me know.', date=datetime.datetime(2025, 11, 21, 10, 35, 24, tzinfo=TzInfo(UTC)), is_err=None, message_type='assistant_message', name=None, otid='d567f53e-a4cc-42c2-9a24-4051c58fe300', run_id='run-3ae41158-73f2-45e7-be1b-3558254d9163', sender_id=None, seq_id=None, step_id='step-2535b417-86d8-4279-a56f-7e481f96ad72')
多测试几次, 数据为:
- 程序启动时间: 1052 ms, 内存占用: 52.30 MB
- 程序启动时间: 1173 ms, 内存占用: 52.66 MB
- 程序启动时间: 992 ms, 内存占用: 52.03 MB
所以启动时间大概是 1000 ms, 内存占用 52 MB.
注意: 这里启动不够快的主要原因可能是创建 client 时需要和服务器端建立连接, 而服务器端在国外访问速度慢, 如果服务器端在本地部署, 应该可以快很多.
注意2: 这里用快照启动没有意义, 因此 client 建立的连接在快照恢复时会无效, 只能冷启动.