核心概念
核心概念包括代理、记忆、工具和 Letta 架构
LLM 的根本限制
大型语言模型在设计上是无状态的。LLM 的知识来自两个来源:
- 模型权重 - 训练后固定
- 上下文窗口 - 推理时提供的临时输入
这意味着 LLM 在交互之间没有持久记忆。每次 API 调用都从头开始,没有能力从过去的经验中学习或在会话之间维护状态。
什么是有状态代理?
有状态代理通过在所有交互中维护持久记忆和身份来克服这一限制。
一个有状态代理具有:
- 持久身份 - 作为唯一实体存在,在会话之间保持连续性
- 主动记忆形成 - 自主决定存储和更新什么信息
- 累积状态 - 通过经验学习,而不仅仅依靠模型权重
- 长期上下文 - 维护超越单次对话窗口的知识
与传统的 LLM 应用程序(您的代码管理状态)不同,有状态代理主动管理自己的记忆,使用内置工具来读取、写入和搜索其持久存储。
为什么有状态很重要
传统的 LLM 应用程序是无状态的 - 每次交互都从头开始。您的应用程序必须:
- 在您自己的数据库中存储所有对话历史
- 每次 API 调用时发送整个上下文
- 自己实现记忆和个性化逻辑
- 手动管理上下文窗口限制
使用 Letta 的有状态代理,所有这些都为您处理好了。 代理维护自己的持久状态,智能管理其上下文窗口,并从每次交互中学习,无需您构建复杂的状态管理层。
有状态 vs 无状态 API
有状态代理与传统 LLM API 之间的区别是根本性的:
传统 API(无状态): 请求之间没有记忆。您的应用程序管理一切。
Letta(有状态): 代理维护自己的持久状态。您只发送新消息。
传统无状态 API
使用无状态 API,请求之间没有状态持久化。客户端必须在每次调用时发送完整的对话历史。
客户端必须在每个请求中发送完整的对话历史:
- 请求 2:
[msg1, response1, msg2] - 请求 3:
[msg1, response1, msg2, response2, msg3]
Letta 有状态 API
Letta 在服务器上维护代理状态并将其持久化到数据库。客户端只发送新消息,服务器处理所有状态管理。
客户端只发送新消息:
- 请求 2:
[msg2] - 请求 3:
[msg3]
关键区别
| 方面 | 传统(无状态) | Letta(有状态) |
|---|---|---|
| 状态管理 | 客户端 | 服务器端 |
| 请求格式 | 发送完整对话历史 | 只发送新消息 |
| 记忆 | 无(临时) | 持久数据库 |
| 上下文限制 | 硬限制,然后失败 | 智能管理 |
| 代理身份 | 无 | 每个代理有唯一 ID |
| 长对话 | 昂贵且脆弱 | 无限扩展 |
| 个性化 | 应用程序必须管理 | 内置记忆块 |
| 多会话 | 需要外部数据库 | 原生支持 |
代码比较
无状态 API(例如 OpenAI):
# 您必须每次发送完整的对话
messages = [
{"role": "user", "content": "Hello, I'm Sarah"},
{"role": "assistant", "content": "Hi Sarah!"},
{"role": "user", "content": "What's my name?"}, # ← 新消息
]
# 发送所有内容
response = openai.chat.completions.create(
model="gpt-4",
messages=messages # ← 需要完整历史
)
# 您必须自己存储和管理消息
messages.append(response.choices[0].message)
有状态 API(Letta):
# 代理已经知道上下文
response = client.agents.messages.create(
agent_id=agent.id,
input="What's my name?" # ← 只发送新消息
)
# 代理从其记忆块中记住 Sarah
# 无需发送先前的消息
代理即服务
Letta 将代理视为持久服务,而不是临时库调用。
在传统框架中,代理是存在于应用程序内存中的对象,当您的应用程序停止时就会消失。在 Letta 中,代理是独立的服务,它们:
- 在您的应用程序未运行时继续存在
- 在数据库中维护状态
- 可以同时从多个应用程序访问
- 在服务器上自主运行
您通过 REST API 与 Letta 代理交互:
POST /agents/{agent_id}/messages
这种架构支持:
- 多用户应用程序 - 每个用户获得自己的持久代理
- 代理间通信 - 代理可以相互发送消息
- 后台处理 - 代理可以在您的应用程序离线时继续工作
- 部署灵活性 - 独立于应用程序扩展代理
默认持久化
在 Letta 中,所有状态都自动持久化:
- 代理记忆(记忆块和归档记忆)
- 消息历史
- 工具配置
- 代理状态和上下文
因为所有内容都持久化:
- 代理可以随时暂停和恢复
- 您可以在不同机器上重新加载代理
- 状态永远不会因应用程序重启而丢失
- 长对话不会降低性能
自我编辑记忆
与被动检索文档的 RAG 系统不同,Letta 代理主动管理自己的记忆。代理使用内置工具来:
- 在学习新信息时编辑其记忆块
- 将事实插入归档记忆以进行长期存储
- 在需要上下文时搜索过去的对话
这使代理能够:
- 随时间学习用户偏好
- 在会话之间保持一致的个性
- 与用户建立长期关系
- 从交互中持续改进
代理 vs 线程
Letta 没有线程或会话的概念。相反,只有具有单一永久消息历史的有状态代理。
为什么没有线程? Letta 基于这样的原则构建:所有交互都应该是持久记忆的一部分,而不是临时会话。这实现了:
- 跨所有对话的持续学习
- 真正的长期记忆和关系
- "开始新线程"时没有上下文丢失
对于多用户应用程序,我们建议为每个用户创建一个代理。每个代理维护关于该特定用户的自己的持久记忆。
如果您需要对话模板或起点,请使用 代理模板 来创建具有预配置状态的新代理。
LLM 操作系统
LLM 操作系统是管理代理执行、状态和记忆的基础设施层。这包括:
- 代理运行时 - 管理工具执行和推理循环
- 记忆层 - 处理上下文窗口管理和持久化
- 有状态层 - 协调数据库、缓存和执行之间的状态
Letta 的架构灵感来自 MemGPT 研究论文,该论文引入了这些概念。
超越模型大小
通往更强大 AI 系统的路径不仅仅是更大的模型或更长的上下文窗口。有状态代理代表了一个根本性的转变:通过累积经验学习、与用户建立持久关系、无需重新训练即可持续改进的代理。
使用有状态代理,您可以构建:
- 个性化助手,随时间适应个人用户
- 学习系统,从反馈和交互中改进
- 长期关系,代理发展关于用户和任务的深度上下文
- 自主服务,独立运行并维护自己的知识
这种架构转变——从无状态函数调用到有状态代理服务——实现了一类传统 LLM API 无法实现的新型 AI 应用。