第 10 章 · Memory 对话历史
本章目标:理解 Mastra Memory 的线程(thread)与资源(resource)模型,为 Agent 配置持久化对话记忆。
10.1 无状态的困境
默认情况下 Agent 是无状态的——每次 generate 都是全新会话:
typescript
// 没有记忆的表现
await agent.generate('我叫小明');
await agent.generate('我叫什么名字?'); // ❌ "抱歉,你还没有告诉我你的名字"Memory 模块解决此问题:它把对话历史按线程存进 Storage,每次请求自动把相关历史注入上下文。
10.2 两个核心概念:Thread 与 Resource
| 概念 | 含义 | 类比 |
|---|---|---|
| Resource | 一个用户/主体的长期身份 | 用户账号 |
| Thread | 一段连续对话的容器 | 一个聊天窗口 |
text
Resource: user-alice
├── Thread: 客服咨询-周一 (独立历史)
└── Thread: 技术支持-周三 (独立历史)同一个 resource 可以有多个并行 thread;thread 内消息严格按时间排列。跨 thread 的长期偏好属于 resource 级别知识,由后续章节的工作记忆与观察记忆处理。
10.3 配置并使用 Memory
bash
npm install @mastra/libsql # 存储适配器typescript
// src/mastra/index.ts —— 创建 Memory 并挂到 Agent
import { Mastra } from '@mastra/core';
import { Memory } from '@mastra/memory';
import { LibSQLStore } from '@mastra/libsql';
import { supportAgent } from './agents/support-agent';
// 存储对话历史的持久化后端
const store = new LibSQLStore({ url: process.env.LIBSQL_URL ?? 'file:memory.db' });
export const mastra = new Mastra({
agents: { supportAgent },
storage: store,
});typescript
// src/mastra/agents/support-agent.ts —— Agent 声明启用 memory
import { Agent } from '@mastra/core/agent';
export const supportAgent = new Agent({
id: 'support',
name: 'Support Agent',
instructions: '你是客服助手,记住用户在本会话中提供过的信息。',
model: 'openai/gpt-5-mini',
// defaultOptions 中开启 memory 并限制注入的历史条数
memory: {
options: {
lastMessages: 20, // 注入最近 20 条消息作为上下文
},
},
});typescript
// 调用时传入 thread/resource 标识 → 自动加载与保存历史
await supportAgent.generate('我叫小明,订单号 A1024', {
memory: {
thread: 'support-monday', // 会话线程 ID
resource: 'user-xiaoming', // 用户资源 ID
},
});
// 新的一次调用,同 thread → 记得之前的内容
const res = await supportAgent.generate('我的订单号是多少?', {
memory: { thread: 'support-monday', resource: 'user-xiaoming' },
});
console.log(res.text); // ✅ "您的订单号是 A1024"10.4 lastMessages 与上下文预算
lastMessages: N 控制随每次请求注入的历史条数,是最重要的成本旋钮:
| 取值 | 效果 | 风险 |
|---|---|---|
| 过小(如 2) | 省 token,但容易"失忆" | 忘记早前约定 |
| 过大(如 500) | 记得全,但 token 成本线性膨胀 | 长对话费用失控 |
实践建议:从 20 起步,结合第 11 章的观察记忆补足"更早但重要"的信息。
thread 设计建议
按"业务场景 + 时间段"开新 thread(如 support-2026w34),避免单个 thread 无限增长;用户级偏好放 resource 维度管理。
本章小结
- 默认 Agent 无状态;Memory 通过 Storage 持久化历史并在请求时自动注入;
- Resource = 用户身份,Thread = 单段对话,一个 resource 可含多个 thread;
- 调用时传
{ memory: { thread, resource } }即自动读写历史; lastMessages是记忆长度与成本的平衡旋钮,从 20 起步按需调整。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. Mastra Memory 中 thread 和 resource 分别对应?
2. 让两次 generate 共享对话历史的必要条件是?
3. lastMessages: 20 的含义是?
4. 客服系统里,同一个用户"上午的退货咨询"和"下午的技术支持"应该?
🛠️ 动手实践
- 为 supportAgent 配置 Memory 后连续三轮对话验证"记住订单号"效果,再换一个 thread 验证隔离性。
- 把 lastMessages 从 20 改成 2,测试第 3 轮提问时哪些信息丢失了。
- 在 Studio 的 Storage/Threads 视图中找到刚才的对话记录,观察消息存储结构。