Letta:LLM长时记忆解决方案
你可以把它想象成一个为你使用的LLM提供记忆管理系统的工具,实际上很有意义。与其你自己去决定记住什么和忘记什么,Letta会为你处理这一切。

如果你一直在构建AI应用程序,你可能会注意到一些令人沮丧的事情——LLM的记忆力很差。当然,ChatGPT和Claude似乎能记住一切,但这是因为他们的团队已经解决了这个问题。当你自己构建应用时?你就得靠自己了。
通常会发生这种情况:你开始构建你的AI应用,一切都很顺利,直到你意识到你的LLM无法记住当前对话之外的东西。需要它记住上周的事情?祝你好运。
有些人试图自己解决这个问题。他们将对话存储在数据库中,构建检索系统,或尝试以聪明的方式压缩上下文。我经历过这种情况——你最终会花更多时间管理内存而不是实际构建应用的功能。问题很简单:LLM只是处理其上下文窗口中的内容。管理哪些内容进入和离开这个窗口?这取决于你。而且相信我,很快就会变得一团糟。
1、Letta:LLM应用的记忆管理方案
这就是Letta登场的地方(顺便说一下,它之前被称为MemGPT——这个名字来源于他们的研究论文)。你可以把它想象成一个为你使用的LLM提供记忆管理系统的工具,实际上很有意义。与其你自己去决定记住什么和忘记什么,Letta会为你处理这一切。
以下是它的运作方式。Letta使用两种类型的记忆:
- 核心记忆——就像计算机中的RAM,它保留当前所需的重要信息
- 归档记忆——就像硬盘驱动器,它将其他所有内容存储在一个可以按需搜索的向量数据库中
但让Letta真正有趣的是它像代理一样工作。它遵循我们所说的“代理循环”:

- 从其当前状态(它知道和记得的内容)开始
- 将所有这些内容编译成一个上下文窗口(类似于准备思考的内容)
- 将其发送给LLM来决定下一步该做什么
- 根据LLM的决定更新其状态
Letta的酷炫之处在于它能够自行决定哪些内容保留在核心内存中,哪些内容移动到归档内存。你的上下文窗口满了?没问题——Letta会自动决定保留什么并存储什么以备后用。你不需要编写任何代码来:
- 计算标记数
- 决定保留或丢弃什么
- 构建一个找到旧对话的系统
- 设想如何高效地压缩信息
这对于构建需要进行长时间对话或跨不同聊天会话记住事情的应用程序非常有用。你不必管理所有这些,Letta会帮你搞定。
2、Letta内部:记忆是如何组织的

这是Letta实际运作的内部机制。你知道LLM有一个上下文窗口,你可以在其中放入提示并获得响应吗?Letta巧妙地将这个窗口(蓝色框)组织成不同的部分:
- 系统提示——它位于顶部且不会移动。它就像是代理的操作手册,告诉它如何行为以及它可以使用哪些功能(如
core_memory_replace
,当它需要更新记忆时) - 核心记忆——这是它保存与你交谈时学到的重要信息的地方。比如“哦,这位用户是Charles,他刚刚搬到旧金山”。如果这一部分太满,Letta会将较旧的信息移动到归档记忆——类似于将文件从RAM移动到硬盘驱动器
- 摘要——为了避免保存整个对话,Letta会对较旧的聊天进行摘要以节省空间,类似于ChatGPT的做法
- 聊天历史——这只是尚未被总结的最近消息
根据你使用的模型,上下文窗口的大小可能有所不同,但原理是一样的。另外,重要的一点是,Letta的所有操作都是通过函数调用来完成的。需要保存某些东西以备后用?它会调用archival_memory_insert
。需要告诉你某些事情?它会使用send_message
。甚至你得到的响应实际上也是函数调用,而不仅仅是文本输出。这使得一切都非常一致,并且更容易追踪发生了什么。
3、使用Docker进行本地设置
使用单个Docker命令即可轻松地在本地设置Letta:
docker run \
-v ~/.letta/.persist/pgdata:/var/lib/postgresql/data \
-p 8283:8283 \
-e OPENAI_API_KEY="your_openai_api_key" \
letta/letta:latest
此命令:
- 挂载了一个卷用于PostgreSQL数据持久化
- 暴露端口8283用于Letta服务
- 设置OpenAI API密钥以便访问模型
Letta通过环境变量支持多个LLM提供商:
ANTHROPIC_API_KEY
用于Claude模型GEMINI_API_KEY
用于Google的GeminiOLLAMA_BASE_URL
用于本地Ollama模型VLLM_API_BASE
用于vLLM部署
启动后,你可以通过以下几种方式与Letta交互:
- 直接向服务发送HTTP请求
- 官方Python或Node.js SDK
- ADE(代理开发环境)在app.letta.com——一个基于Web的实验平台,用于尝试不同的配置

注意:虽然Letta可以在本地运行,但ADE界面现在仅限云端(截至版本0.5.0)。这遵循了类似Darwin/MacOS的模式,提供商业界面同时保持核心技术开源。

4、使用Railway部署Letta
使用Railway官方模板是快速部署Letta到Railway的最快方法。
- 点击模板页面上的“立即部署”按钮
- Railway会自动配置环境,包括正确的Dockerfile和设置
- 在环境变量中添加你的
OPENAI_API_KEY
虽然我在这里使用Railway因为它是我首选的无服务器平台,但Letta本质上只是一个Docker镜像。这意味着你可以在任何运行容器的地方部署它:
- 其他无服务器平台(Render、Fly.io等)
- 传统的VPS供应商
- Kubernetes集群
- 你自己的基础设施
选择部署方式取决于你现有的设置和偏好。模板只是一个方便的起点,如果你使用Railway的话。
5、Railway内部PostgreSQL的问题
在Railway上部署Letta时,你会遇到无法访问内部PostgreSQL数据库的问题。Docker镜像没有暴露端口5432(这是云部署的安全实践),但这也意味着你无法访问它。
虽然Railway提供了TCP代理来处理这种情况,但尝试通过它连接会导致错误:
failed: received invalid response to SSL negotiation: H
这可能是由于Railway的代理配置处于HTTP模式。
最初,这似乎是一个重大障碍。Letta的文档建议使用内部数据库,并警告外部数据库设置可能需要迁移工具如alembic
或手动迁移。
然而,在Discord社区咨询后,发现使用外部数据库其实相当简单。你只需:
- 设置你的外部PostgreSQL数据库
- 设置环境变量
LETTA_PG_URI
并包含你的连接字符串
Docker镜像会自动处理所有迁移。无需手动干预。
6、使用Supabase设置外部PostgreSQL
使用Supabase作为Letta的外部数据库需要几个步骤:
a) 在Supabase创建一个新项目
b) 通过在Supabase的SQL编辑器中运行以下SQL命令启用向量支持:
create extension vector;
这是因为Letta使用向量搜索进行内存检索,PostgreSQL需要vector
扩展来支持这种数据类型。
c) 获取链接:
- 项目设置→数据库
- 复制“连接池”下的连接字符串
- 将
[YOUR-PASSWORD]
替换为你的数据库密码
d) 返回Railway,添加环境变量:
LETTA_PG_URI=postgresql://<username>:<password>@<postresql_uri>:5432/postgres
就是这样!启用向量扩展后,Letta会在首次连接时自动处理所有其他设置任务。如果一切顺利,你将在Supabase的表部分看到类似的内容。

5、结束语
关于Letta,有几件重要的事情需要注意:
a) 该项目正在积极开发中,频繁变化:
- Python SDK已从
letta
更改为letta_client
- 他们的Deeplearning.ai课程使用的是旧版SDK
- 内部结构如表模式可能会发生变化(例如,回忆记忆被合并到归档记忆中,如果有误请纠正)
- 核心工具已从8个减少到6个
b) 虽然核心是开源的,但某些组件正在商业化:
- 本地ADE不再支持
- 你需要使用app.letta.com作为开发界面
- 还有Letta Cloud,它负责所有部署和基础设施,但目前还未公开(你可以在https://forms.letta.com/early-access加入等待名单)
c) 生产就绪性考虑:
- MemGPT/Letta大约只有一年的历史
- 代理/上下文/内存管理方法仍然是实验性的
- 虽然前景看好,但目前还没有生产案例(如果有,请告诉我)
- 生产环境中使用时自行承担风险
d) 模型支持各不相同:
- 目前只有OpenAI和Claude支持流式传输
- 其他模型如Gemini禁用了流式传输
- 选择LLM时请记住这一点
我自己也只是最近才开始探索这个框架,所以还不是专家。但我发现他们的Discord服务器非常活跃和支持。如果你遇到问题或有任何疑问,那是获取社区和开发团队帮助的最佳地方。
该项目在解决LLM内存管理挑战方面显示出希望,但在生产环境中使用前要做好准备应对变化,并仔细考虑。密切关注他们的Discord服务器和GitHub以获取最新更新和变化。
原文链接:Setting up Letta (MemGPT) with Supabase
汇智网翻译整理,转载请标明出处
