技术热点落地:Mastra + Observational Memory — AI Agent 长程记忆成本降低 90%(2026-04-19)
适用场景与目标
为什么关注这个组合
2026 年 4 月,Google 发布 Gemma 4(Apache 2.0)、Alibaba 发布 Qwen3.6-Plus(1M 上下文),开源模型能力持续跃升。与此同时,AI Agent 的记忆系统成为工程落地的核心瓶颈——传统方案依赖向量数据库 + RAG pipeline,部署复杂、查询延迟高、向量检索质量不稳定。
Mastra(Apache 2.0,TypeScript 原生 Agent 框架)新推出的 Observational Memory 提供了一条完全不同的路径:无需向量数据库,纯文本压缩,在 LongMemEval 基准上以 GPT-5-mini 达到 94.87% 准确率,比传统方案高 3 个百分点以上,Token 消耗降低 4-10 倍。
目标读者
- 正在用 CrewAI、LangGraph 构建 AI Agent 的团队
- 遇到 RAG 冷启动、向量检索不准问题的工程师
- 希望降低 LLM Token 成本的前/后端开发者
- 已有 TypeScript 技术栈(Next.js / Node.js)的 AI 应用团队
适用业务场景
| 场景 | 传统方案痛点 | Mastra OM 优势 |
|---|---|---|
| 多轮对话 Agent(客服、销售) | 对话历史爆炸,Context 溢出 | 自动压缩,保留关键事实 |
| 个人助理 / PRD 总结 Agent | RAG 查询慢、更新不及时 | 实时观察式记忆,零向量开销 |
| 代码审查 / 文档分析 Agent | 长文件分段 embedding 丢失语义 | 全文保留 → 压缩观察,保持语义连贯 |
| 多 Agent 协作(主 Agent + 子 Agent) | 子 Agent 记忆无法传递给主 Agent | 统一压缩格式,Agent 间可共享观察 |
最小可行方案(MVP)步骤
工具与环境准备
# Node.js >= 18
node --version
# 创建 Mastra 项目(交互式,可跳过示例)
npm create mastra@latest my-agent-app
# 选:TypeScript + No Example(如果已有项目用 mastra init)
cd my-agent-app
npm install
核心依赖:
npm install @mastra/core @mastra/memory
# 可选:本地 Embedding(无需 API Key)
npm install @mastra/fastembed @mastra/libsql
Step 1 — 初始化带 Observational Memory 的 Agent
mkdir -p src/mastra/agents
// src/mastra/agents/my-agent.ts
import { Agent } from '@mastra/core/agent';
import { Memory, ObservationalMemory } from '@mastra/memory';
import { openai } from '@ai-sdk/openai';
const memory = new Memory({
// Observational Memory:无需向量数据库
observationalMemory: {
// 触发压缩的 Token 阈值,默认 30k
thresholdTokens: 30000,
// 观察摘要的生成模型
model: openai('gpt-5-mini'),
// 是否在压缩时同步(阻塞),生产环境可改为异步 worker
sync: true,
},
// 同时保留短期工作记忆
workingMemory: {
enabled: true,
template: `# User Profile
- Name: {{name}}
- Role: {{role}}
- Last discussed topic: {{topic}}
- Communication style: {{style}}
`,
},
});
export const myAgent = new Agent({
name: 'my-agent',
model: openai('gpt-5-mini'),
memory,
instructions: `你是一个专业的技术助理,使用 Observational Memory 记住用户的偏好和历史讨论。`,
});
Step 2 — 接入 FastEmbed 本地 Embedding(零 API 成本)
如果需要语义检索功能(semanticRecall),可以用 FastEmbed 本地生成向量:
import { fastembed } from '@mastra/fastembed';
const memory = new Memory({
observationalMemory: { /* 同上 */ },
// FastEmbed 本地运行,无需 OpenAI API Key
embedder: fastembed({ model: 'BAAI/bge-small-en-v1.5' }),
semanticRecall: {
topK: 3, // 召回 Top-3 最相关历史片段
messageRange: 2, // 每个片段前后各取 2 条消息
},
lastMessages: 20, // 最近 N 条消息常驻 Context
});
Step 3 — 运行对话测试
// src/index.ts
import { mastra } from './mastra';
async function main() {
const agent = mastra.getAgent('my-agent');
// 第一次对话
const r1 = await agent.stream('我叫张三,是后端工程师,正在学习 AI Agent。');
console.log('Agent:', r1.toString());
// 第二次对话(带记忆)
const r2 = await agent.stream('我叫什么名字?');
console.log('Agent:', r2.toString());
// 期望输出:识别出用户叫"张三"
}
main().catch(console.error);
启动:
npx mastra dev
# 访问 http://localhost:3000 查看交互式界面
关键实现细节
Observational Memory 工作原理
传统 RAG 的局限:
用户消息 → Embedding → 向量数据库查询 → 召回 → 加入 Context → LLM
↑
需要独立存储、额外 API 费用、查询质量不稳定
Mastra OM 的工作方式:
用户消息 → [Message Block](随对话增长)
↓ 当 Message Block 达到 30k Tokens
[Observer Agent](另一个 LLM 调用)压缩为"观察"
↓
[Observation Block](压缩后约 1/5 大小)
↓
新消息继续加入 Message Block → 循环
关键优势:纯文本格式,兼容 Anthropic / OpenAI 的 Prompt Caching,直接节省压缩后的 Context 费用。
自定义压缩提示词(关键调参)
const memory = new Memory({
observationalMemory: {
thresholdTokens: 30000,
model: openai('gpt-5-mini'),
// 自定义 Observer 的系统提示词,决定"保留什么"
observerPrompt: `
你是一个记忆压缩助手。请将用户与助手的对话历史压缩为"观察陈述"。
规则:
1. 保留具体事实(人名、日期、技术栈、项目名)
2. 保留用户明确表达的偏好(语言风格、回复长度)
3. 丢弃模糊的客套话和重复的确认信息
4. 输出为第一人称叙述,如:"用户对 XX 技术感兴趣,曾遇到 YY 问题"
`,
},
});
多 Agent 共享记忆
// 共享同一个 Memory 实例即可跨 Agent 传递上下文
const sharedMemory = new Memory({ observationalMemory: { /* ... */ } });
const agentA = new Agent({ name: 'planner', memory: sharedMemory, ... });
const agentB = new Agent({ name: 'executor', memory: sharedMemory, ... });
集成 Langfuse 观测(可选)
npm install @mastra/langfuse
import { langfuse } from '@mastra/langfuse';
const memory = new Memory({
observationalMemory: { /* ... */ },
telemetry: langfuse({
secretKey: process.env.LANGFUSE_SECRET_KEY,
publicKey: process.env.LANGFUSE_PUBLIC_KEY,
}),
});
常见坑与规避清单
坑 1:Observer 压缩同步阻塞
问题:默认 sync: true,当 30k 阈值触发时,用户请求会等待 Observer 压缩完成,实测延迟增加 2-5 秒。
规避:
// 生产环境改用异步 worker
observationalMemory: {
thresholdTokens: 30000,
model: openai('gpt-5-mini'),
sync: false, // 后台压缩,不阻塞主请求
// 或者提高阈值减少触发频率
thresholdTokens: 50000,
}
坑 2:workingMemory 模板变量不注入
问题:workingMemory 模板里的 {{name}} 不会被自动填充,需要显式传入或由 Agent 自己更新。
规避:在 Agent instructions 里明确要求 Agent 收到姓名时更新 workingMemory:
instructions: `
你是一个专业助理。
每当用户提供姓名、职位、偏好等信息时,主动更新你的 workingMemory。
格式:用 Memory.updateWorkingMemory tool 调用。
`
坑 3:与第三方向量 DB(Chroma/Pinecone)混用的语义漂移
问题:同时开启 observationalMemory 和 semanticRecall(向量检索)时,两者记忆内容可能重复,导致 Context 膨胀。
规避:选择其一:
- 需要长期事实记忆 → OM(推荐)
- 需要精确相似文档召回 → 向量检索
- 两者都用时,明确分区:OM 存”用户偏好”,向量存”文档知识库”
坑 4:本地 FastEmbed 模型下载慢
问题:首次运行 fastembed 会从 HuggingFace 下载模型,可能超时或占用首次响应时间。
规避:
# 预先下载模型
npx fastembed-embedder download BAAI/bge-small-en-v1.5
或直接用 OpenAI Embedding(API 费用约 $0.0001/1k Token,比向量 DB 托管便宜)。
坑 5:TypeScript 版本不兼容
问题:Mastra 依赖较新的 TypeScript 特性(Template Literal Types、Decorator metadata)。
规避:确保 tsconfig.json 开启:
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler"
}
}
成本 / 性能 / 维护权衡
成本对比(每月 10 万对话请求,单对话平均 2000 Tokens)
| 方案 | 存储成本 | Token 成本 | 延迟 | 准确率(LongMemEval) |
|---|---|---|---|---|
| 全量 Context(32k) | $0 | $6.40/天 | 低 | — |
| 传统 RAG(Chroma + OpenAI Embedding) | $20/月(Chroma 云) + Embedding API | $3.20/天 | 高(~200ms 查询) | ~91% |
| Mastra OM | $0(SQLite 本地) | $0.80/天(仅 Observer 调用) | 低(同步 ~100ms) | 94.87% |
Mastra OM 成本约为传统 RAG 的 1/4,且无需维护向量数据库集群。
性能实测参考
来自 Mastra 官方 Benchmark(2026-02):
- 文本压缩率:3-6x(对话 → 观察陈述)
- Tool 输出压缩率:5-40x(长 tool 输出 → 摘要)
- LongMemEval:94.87%(GPT-5-mini + OM)vs. 91%(之前 SOTA)
- Prompt Caching 兼容:Anthropic/OpenAI 均支持压缩后的 Observation Block 缓存
维护考量
| 维度 | 评估 |
|---|---|
| 依赖更新频率 | Mastra 0.x 阶段,API 变更较频繁(建议锁版本 ~0.12.0) |
| 自托管 vs. 云 | 完全自托管,无厂商绑定 |
| 监控接入 | 支持 Langfuse、OpenTelemetry |
| 退出成本 | Apache 2.0,无供应商锁定,迁移成本低 |
一周内可执行行动清单
Day 1-2:环境搭建与最小跑通
-
npm create mastra@latest my-first-agent初始化项目 - 安装
@mastra/core @mastra/memory,跑通 Quickstart 示例 - 用
npx mastra dev验证本地运行
Day 3:接入 Observational Memory
- 将 Quickstart Agent 改造为使用
observationalMemory - 发送 30+ 轮对话,触发压缩,观察压缩后的观察陈述内容
- 对比有 OM 和无 OM 的 Token 消耗(用 LangSmith 或
max_tokens日志)
Day 4:集成 workingMemory
- 配置
workingMemory模板,要求 Agent 记住用户姓名和偏好 - 验证跨对话(重启后)记忆是否保持
Day 5:可选语义召回(如果你真的需要向量检索)
- 评估是否需要
semanticRecall(大多数场景 OM 足够) - 如需要:
npm install @mastra/fastembed,配置本地 embedding - 注意区分 OM(事实记忆)和向量检索(文档知识)的职责边界
Day 6:接入监控与生产准备
- 接入 Langfuse(或自托管的 Helicone)记录 Token 消耗
- 配置
sync: false避免压缩阻塞主请求 - 将
tsconfig.json的experimentalDecorators打开
Day 7:替换现有 Agent(或启动新项目)
- 评估:当前 CrewAI / LangGraph Agent 是否需要迁移(建议新项目先用 Mastra)
- 如迁移:重点迁移 tool definitions,OM 配置保持一致
- 写内部文档:团队 OM 使用规范(Observer Prompt 模板、阈值设置)
参考资源
- Mastra 官方文档:https://mastra.ai/docs
- Observational Memory 原理:https://mastra.ai/blog/observational-memory
- GitHub:https://github.com/mastra-ai/mastra
- 基准数据(LongMemEval):https://github.com/mastra-ai/mastra-observational-memory-workshop