Skip to content

第 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. 客服系统里,同一个用户"上午的退货咨询"和"下午的技术支持"应该?

🛠️ 动手实践

  1. 为 supportAgent 配置 Memory 后连续三轮对话验证"记住订单号"效果,再换一个 thread 验证隔离性。
  2. 把 lastMessages 从 20 改成 2,测试第 3 轮提问时哪些信息丢失了。
  3. 在 Studio 的 Storage/Threads 视图中找到刚才的对话记录,观察消息存储结构。

下一章:第 11 章 · Observational Memory 观察记忆