Skip to content

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 信息是否有变化。

常见错误

错误表现处理
每次生成随机 threadAgent 记不住对同一任务使用稳定 thread
不区分 resource用户间记忆混淆resource 使用用户或租户 ID
不配置持久化 storage重启后丢失本地用 LibSQL,生产换 PostgreSQL 等
把隐私信息写进 prompt泄露风险存储前做最小化和权限控制