Memory:让对话有连续性
问题场景
如果每次请求都是独立的,Agent 不会记得用户偏好、之前的学习目标或正在进行的任务。Memory 的作用是把消息、工具结果和长期信息放到可查询的存储里。
Mastra 文档把 memory 分成消息历史、working memory、semantic recall、memory processors 等能力。入门阶段先抓住两个标识:
resource:谁拥有这段记忆,通常是用户 ID。thread:哪一次对话或任务,通常是会话 ID。
资源和线程
mermaid
flowchart TD
U[resource: user-001] --> T1[thread: mastra-course]
U --> T2[thread: job-interview]
T1 --> M1[消息、工具结果、学习偏好]
T2 --> M2[另一组上下文]同一个用户可以有多个 thread。不要把不同用户塞进同一个 thread,也不要用随机 thread 导致历史永远接不上。
深入学习
本页先讲最小可用的消息历史。长期用户画像、语义召回和 memory processors 见 Memory 深入。
Mastra 映射
官方 Memory 快速开始使用 @mastra/memory 和存储 provider。教学项目使用 LibSQL 作为本地存储:
ts
import { Mastra } from '@mastra/core'
import { LibSQLStore } from '@mastra/libsql'
export const mastra = new Mastra({
storage: new LibSQLStore({
id: 'study-agent-storage',
url: 'file:./mastra.db',
}),
})Agent 里启用 Memory:
ts
import { Memory } from '@mastra/memory'
memory: new Memory({
options: {
lastMessages: 20,
},
})调用时传入 memory 参数:
ts
await agent.generate('记住我想学习 Mastra Agent。', {
memory: {
resource: 'user-001',
thread: 'mastra-course',
},
})Vibe coding 提示词
text
请帮我给 studyAgent 加入 Mastra Memory。
要求:
- 使用 @mastra/memory。
- Mastra 实例使用 @mastra/libsql 的 LibSQLStore。
- 存储地址用 file:./mastra.db。
- 文档里说明 resource 和 thread 的区别。
- 不要把用户 ID 写死在 Agent 定义里,调用时传入。验证方式
先运行离线记忆 Demo:
bash
npm run demo:03你应该看到第一次输入保存偏好,第二次输入能读出偏好。
真实 Mastra 验证时,在 Studio 中用同一 thread 连续提问,观察右侧 memory 信息是否有变化。
常见错误
| 错误 | 表现 | 处理 |
|---|---|---|
| 每次生成随机 thread | Agent 记不住 | 对同一任务使用稳定 thread |
| 不区分 resource | 用户间记忆混淆 | resource 使用用户或租户 ID |
| 不配置持久化 storage | 重启后丢失 | 本地用 LibSQL,生产换 PostgreSQL 等 |
| 把隐私信息写进 prompt | 泄露风险 | 存储前做最小化和权限控制 |