post cover

技术热点落地: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 总结 AgentRAG 查询慢、更新不及时实时观察式记忆,零向量开销
代码审查 / 文档分析 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)混用的语义漂移

问题:同时开启 observationalMemorysemanticRecall(向量检索)时,两者记忆内容可能重复,导致 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.jsonexperimentalDecorators 打开

Day 7:替换现有 Agent(或启动新项目)

  • 评估:当前 CrewAI / LangGraph Agent 是否需要迁移(建议新项目先用 Mastra)
  • 如迁移:重点迁移 tool definitions,OM 配置保持一致
  • 写内部文档:团队 OM 使用规范(Observer Prompt 模板、阈值设置)

参考资源