长期记忆(Agent Memory)

更新时间:
复制 MD 格式

上下文服务(Context0)提供完全兼容 Mem0 API 的长期记忆(Agent Memory)服务,让 AI Agent 跨会话记住用户偏好与业务事实,已有 Agent 零改造迁移。本文介绍长期记忆的能力边界、三层记忆数据模型、记忆作用域与生命周期,以及记忆写入、检索、装配、管理与晋升的 API 概览。

功能简介

AI Agent 每次会话结束后会「失忆」,上一轮对话中确认过的技术选型、用户偏好与业务约定无法延续到下一轮。长期记忆让 Agent 跨会话记住用户偏好与业务事实:对话写入后,Context0 自动蒸馏出结构化事实与实体画像,后续会话按需召回。

Mem0 API 兼容性

已使用 Mem0 的项目可以直接切换到 Context0,不需要改代码。Context0 完全兼容 Mem0 v1 全部 7 个端点(/v1/memories 的增删改查、搜索与清空)。唯一差异:DELETE /v1/memories 对应 DELETE /v1/memories/clear。

Context0 还提供 V3 增强端点,兼容 Mem0 v1.1 SDK:

V3 端点

说明

POST /v3/memories/add

带去重的记忆写入,返回 memory_id 与 created 标记

POST /v3/memories/search

信封响应 {"results": [...]},filters map 传参

POST /v3/memories

请求体过滤 + 分页信封响应

核心概念

三层记忆模型

对话写入后,Context0 自动完成三层蒸馏。可以类比为:L2 是录音笔(完整录下全部内容),L1 是笔记本(提取关键信息),L0 是人物档案(一页纸了解一个人)。

1787185829071-e6753e37-2235-4b0f-add1-c27530abc4ae

三层蒸馏的数据流向如下:

对话写入 ──► L2 原始对话 ──LLM 抽取──► L1 原子事实 ──实体识别──► L0 实体画像
           (不可变,溯源)         (单条事实,带时效)        (结构化实体卡)

层级

是什么

特性

示例

L2 原始对话

完整对话本体

不可变,永久保留,用于溯源与审计

用户和 Agent 逐字逐句的消息

L1 原子事实

LLM 从对话中提取的事实

带置信度与时间窗(valid_at),支撑快速召回

“用户偏好 TypeScript”、“目标内存 < 50MB”

L0 实体画像

结构化档案卡(约 150 token)

可聚合、可演化,支持关系图谱

{type: person, name: 小李, preferences: [文艺, 手工]}

Token 经济性:一个用户累计 1000 句对话(约 30K token),经两次蒸馏后压缩至约 0.75K token 的 L0 画像,信息密度远高于散落的原始对话。

记忆作用域

每条记忆都归属一个作用域,作用域决定记忆的可见范围与生命周期:

作用域

范围

生命周期

典型用途

session

单个会话

随会话结束而归档

当前任务上下文、临时偏好

user

同一终端用户

长期保留,跨会话可召回

技术栈偏好、个人习惯、历史决策

workspace

整个工作空间

长期保留,工作空间内所有成员可见

团队约定、项目规范、共享知识

说明

session 作用域的记忆在会话结束后仍被保留在 L2 层,但只有 user 和 workspace 级别的 L1 事实才会出现在跨会话召回结果中。

记忆生命周期

记忆生命周期示意图

一条记忆从写入到演化,经历以下阶段:

写入 → 异步蒸馏(L2→L1→L0) → 检索召回 → 热度衰减/失效标记 → Dream 夜间演化

阶段

说明

写入

通过 ingest 或 /v1/memories 写入对话,P99 < 200ms 即时返回

异步蒸馏

后台 LLM 从 L2 提取 L1 原子事实,再聚合为 L0 实体画像

检索召回

向量 kNN + BM25 词法两路融合,RRF 排序后取 top-k

热度衰减

长期未被召回的记忆自然降权,置顶记忆不受衰减影响

Dream 演化

夜间自动执行:衰减过时偏好、检测矛盾记忆、归纳实体画像

准备工作

调用本文示例前,请确认以下准备项已就绪:

准备项

说明

Context0 服务

已开通实例,或使用团队已部署的服务

API Key

数据面 API 使用 User Key;管理操作使用 Owner Key

连接地址

数据面端口 :4040,管理面端口 :8080

下文示例统一使用以下环境变量,请将占位符替换为您自己的地址与 Key:

export API_KEY="<YOUR_API_KEY>"       # 数据面用 User Key
export HOST="http://<your-endpoint>"  # 数据面地址(端口 4040)
export OWNER_KEY="<YOUR_OWNER_KEY>"   # 管理操作用 Owner Key
export OPS_HOST="http://<your-endpoint>:8080"  # 管理面端口

开通实例、获取连接地址与签发 API Key 的步骤,请参见快速入门。Admin Key、Owner Key、User Key 三级权限体系的完整说明,请参见权限与访问控制的API Key 三级体系章节。

API 概览

本节给出长期记忆相关端点的调用概览,帮助您判断哪个能力对应哪个接口。

写入记忆

方式一:ingest 接口(推荐)

POST /v1/context/ingest 是上下文管道的入口,写入对话的同时自动触发记忆抽取、去重和来源索引。

curl -X POST "$HOST/v1/context/ingest" \
  -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
  -d '{
    "session_id": "sess_001",
    "user_id": "user_001",
    "messages": [
      {"role": "user", "content": "项目偏好 TypeScript,ORM 选 Prisma"},
      {"role": "assistant", "content": "好的,已记下技术栈选型"}
    ]
  }'

参数

必填

说明

session_id

是

会话 ID,相同 ID 的消息归入同一会话

user_id

否

终端用户标识;User Key 自动绑定自身

messages

是

消息数组,每条含 role(user、assistant、system、tool)与 content

说明

ingest 写入后,后台异步执行记忆抽取。新记忆需数秒后才可通过搜索检索到。

方式二:Mem0 兼容接口

POST /v1/memories 直接从一段对话提取记忆,响应中包含提取结果。

curl -X POST "$HOST/v1/memories" \
  -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "user", "content": "鉴权方案选 NextAuth"}
    ],
    "user_id": "user_001",
    "metadata": {"source": "manual"}
  }'

响应示例:

{
  "results": [
    {
      "id": "mem_124",
      "memory": "鉴权方案选 NextAuth",
      "subject": "鉴权",
      "validity": "durable",
      "event": "ADD"
    }
  ]
}

在对话中使用记忆

通过 assemble 自动注入(推荐)

POST /v1/context/assemble 是 Agent 集成的核心端点——按查询召回相关记忆与知识,在 Token 预算内精选,输出结构化 prompt_blocks,直接拼入 LLM 的 system prompt。

curl -X POST "$HOST/v1/context/assemble" \
  -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
  -d '{
    "session_id": "sess_002",
    "user_id": "user_001",
    "query": "如何部署应用?",
    "token_budget": 4000,
    "include_memories": true,
    "recall": {"top_k": 8}
  }'

参数

必填

说明

session_id

与 user_id 至少填一项

会话 ID

user_id

与 session_id 至少填一项

终端用户标识

query

否

召回查询;为空时触发零查询冷启动

token_budget

否

输出 token 预算 [1,32000],默认 32000,永不超预算

include_memories

否

布尔值,是否包含记忆召回

include_knowledge

否

布尔值,是否包含知识库召回

knowledge_base_ids

否

指定召回的知识库 ID 列表

recall.top_k

否

召回条数 [1,50]

说明

调用 assemble 后,Context0 自动完成召回与预算分配。Agent 将 prompt_blocks 注入 LLM 即可。

响应中 prompt_blocks 包含按优先级排列的上下文块:

{
  "code": 0,
  "data": {
    "prompt_blocks": [
      {
        "role": "system",
        "tag": "user_profile",
        "content": "用户偏好 TypeScript + Prisma,鉴权选 NextAuth",
        "tokens": 30,
        "sources": []
      },
      {
        "role": "system",
        "tag": "knowledge",
        "content": "部署流程:1. 准备 .env ...",
        "tokens": 120,
        "sources": ["runbook.pdf"]
      }
    ]
  }
}

通过 Mem0 兼容接口手动注入

如果不使用 assemble,您也可以手动调用 /v1/memories/search 检索相关记忆,将结果拼接到 system prompt 中:

# 1. 搜索相关记忆
curl -X POST "$HOST/v1/memories/search" \
  -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
  -d '{"query": "技术栈偏好", "user_id": "user_001", "limit": 5}'

# 2. 将返回的记忆内容拼入 system prompt,发送给 LLM

管理记忆

记忆的查看、修改、置顶、失效标记与统计由以下端点提供:

操作

端点

说明

列表

GET /v1/memories

分页列出记忆,支持 user_id、doc_type 过滤

详情

GET /v1/memories/{id}

获取单条记忆

更新

PUT /v1/memories/{id}

更新内容,生成新版本

删除

DELETE /v1/memories/{id}

删除单条

置顶

POST /v1/memories/{id}/pin

高优先级,不参与热度衰减

取消置顶

POST /v1/memories/{id}/unpin

恢复正常衰减

标记失效

POST /v3/memories/{id}/invalidate

召回时直接排除,而非降权

反馈

POST /v3/memories/{id}/feedback

赞或踩,影响热度与 Dream 评估

编辑实体卡

POST /v3/entity_cards/{id}/edit

修改 L0 画像的 role、preferences、attributes

溯源

GET /v1/memories/{id}/source-texts

查看产生该事实的原始对话

版本历史

GET /v1/memories/{id}/history

查看历次修改

统计

GET /v1/memories/stats

记忆数量统计

清空

DELETE /v1/memories/clear

批量删除,不可逆

  • 置顶记忆示例:

    curl -X POST "$HOST/v1/memories/mem_123/pin" -H "X-API-Key: $API_KEY"
  • 标记失效示例:

    curl -X POST "$HOST/v3/memories/mem_123/invalidate" -H "X-API-Key: $API_KEY"
  • 编辑 L0 实体卡示例:

    curl -X POST "$HOST/v3/entity_cards/card_1_2_alice/edit" \
      -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
      -d '{
        "role": "资深后端工程师",
        "preferences": ["Java", "Spring Boot"],
        "attributes": {"domain": "分布式数据库"}
      }'
重要
  • DELETE /v1/memories/clear 不可逆,confirm 必须为 true。

  • 已失效的记忆不接受 feedback 或 update,返回 400。

  • PUT /v1/memories/{id} 请求体需包含 data 或 metadata 至少一项。

Dashboard 操作入口

除 API 外,您也可以在 Dashboard 中完成记忆的浏览、编辑与检索:

  • 在 Dashboard 的记忆页面选择实体页签,可浏览所有 L0 实体卡并编辑 role、preferences、attributes 等字段。

  • 在 Dashboard 的记忆页面选择搜索页签,输入查询文本后结果按相似度排序,支持时间范围筛选和反馈(赞或踩)。

高级功能

自定义蒸馏规则

蒸馏规则控制「从对话中提取什么、怎么提取」。您可以定义让 Context0 重点关注的内容类型。优先级链:ingest 请求的 custom_instructions > member 级规则 > workspace 默认规则 > 内置默认。

说明

蒸馏规则的完整配置说明请参见使用指南的自定义蒸馏规则章节。

  • API参考

    • 设置成员级规则(数据面,User Key):

      curl -X PUT "$HOST/v1/memories/distill-prompt" \
        -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
        -d '{
          "custom_prompt": "重点提取技术栈选型和架构决策,忽略闲聊内容",
          "enabled": true
        }'
    • 设置 workspace 级规则(管理面,Owner Key):

      curl -X PUT "$OPS_HOST/ops/distill-prompt" \
        -H "X-API-Key: $OWNER_KEY" -H "Content-Type: application/json" \
        -d '{
          "custom_prompt": "提取技术决策、项目约定和团队规范",
          "enabled": true
        }'
  • Dashboard操作

    在 Dashboard 的记忆页面选择蒸馏规则页签,可选择成员、编辑提示词、查看生效状态。

Dream 夜间演化

Dream 是 Context0 的后台演化引擎,定期自动执行以下任务:

  • 偏好衰减:长期未被召回的偏好自动降权。

  • 矛盾检测:发现同一主题的冲突记忆并标记。

  • 实体归纳:从 L1 事实聚合生成或更新 L0 实体画像。

手动触发 Dream(Owner Key)示例:

curl -X POST "$HOST/v1/dream/run" \
  -H "X-API-Key: $OWNER_KEY" -H "Content-Type: application/json" \
  -d '{}'
说明

Dream 异步执行,返回 run_id。同一 workspace 同时只允许一个 Dream 作业运行。通过 GET /v1/dream/status 查看运行状态。

记忆晋升知识库

记忆晋升将同一主题下的高价值记忆(L1 事实)聚合为一篇知识库文档。生成的文档经人工审核后入库,之后像普通文档一样被检索和引用。端到端的场景化实践请参见让您的 Agent 越用越懂您的业务。

如时使用

  • 某个主题的记忆反复出现,且对团队其他成员也有价值(如技术选型、排障经验)。

  • 个人对话中沉淀出的领域知识,值得升级为团队共享文档。

  • Agent 积累了足够多同主题事实,手动整理成本高。

说明

记忆晋升审核通过时,目标知识库下拉列表只显示您拥有「编辑者」权限的知识库。

操作示例

API参考

分为触发生成、查看状态、审核三步。

  1. 触发生成

    curl -X POST "$HOST/v1/memory_promotions/generate" \
      -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
      -d '{"topic": "总结本周架构决策", "target_member_id": 1}'

    参数

    类型

    必填

    说明

    topic

    string

    是

    晋升主题或提示词

    target_member_id

    long

    是

    目标成员 ID,从谁的记忆中提炼

    返回 {"code": 0} 表示已提交,生成异步执行。

  2. 查看状态

    # 列表
    curl "$HOST/v1/memory_promotions?page=0&pageSize=10" -H "X-API-Key: $API_KEY"
    
    # 详情
    curl "$HOST/v1/memory_promotions/1" -H "X-API-Key: $API_KEY"

    详情响应的关键字段:

    字段

    说明

    status

    generating / pending_review / approved / rejected / generation_failed

    title

    LLM 生成的文档标题

    content

    Markdown 正文

    source_memory_ids

    被引用的记忆 ID 列表

    target_kb_id

    审核通过后写入的知识库 ID

    target_document_id

    入库后生成的文档 ID

  3. 审核(Owner Key,管理面)

    # 通过
    curl -X POST "$OPS_HOST/ops/promotion/approve" \
      -H "X-API-Key: $OWNER_KEY" -H "Content-Type: application/json" \
      -d '{"promotion_id": 1, "knowledge_base_id": 3}'
    
    # 拒绝
    curl -X POST "$OPS_HOST/ops/promotion/reject" \
      -H "X-API-Key: $OWNER_KEY" -H "Content-Type: application/json" \
      -d '{"promotion_id": 1, "reason": "内容不够准确"}'

Dashboard操作

Tab 2 正文 上的完整操作流程(选择目标成员、生成、审阅疑问项、通过或拒绝)请参见使用指南的记忆晋升章节;

  1. 进入控制台侧边栏记忆蒸馏页面。

  2. 在手动触发晋升面板中选择目标成员,输入晋升主题(如“Python 性能优化”),单击生成。

  3. 等待状态从generating变为pending_review,单击列表行打开详情抽屉。

  4. 审阅生成的文档内容。如有疑问项(doubts),先解决疑问,也可直接编辑标题和正文。

  5. 单击通过 → 选择目标知识库 → 确认通过,或单击拒绝并填写原因。

说明

审核通过时,下拉列表只显示你拥有编辑者权限的知识库。

晋升后效果

  • 原始记忆保留:晋升不会删除或修改来源记忆,source_memory_ids 记录了引用关系。

  • 知识库新增文档:审核通过后,一篇新文档写入目标知识库,后续通过知识库检索路径召回。

  • 状态可追溯:每条晋升记录保留完整审核链(生成、审核、入库),可通过列表接口按 status 过滤查看。

数据安全

长期记忆涉及终端用户的对话内容与偏好画像,Context0 通过以下机制保障数据隔离与可审计:

安全机制

说明

Workspace 级物理隔离

索引按 Workspace 物理切分,跨 Workspace 数据完全不可见

Member 级权限控制

User Key 只能访问自身绑定的 user_id 数据

ES 查询强制隔离

所有 ES 查询强制携带 workspace_id + member_id filter

API Key 三级权限

Admin Key(管理面)/ Owner Key(工作空间所有者)/ User Key(绑定终端用户)

审计日志

记忆读写操作均记录审计日志

重要

生产环境中,请为不同的 Agent 和终端用户分配独立的 user_id,避免记忆混淆。

常见问题

现象

处理方式

写入后搜索不到

蒸馏为异步过程,L1 事实需数秒后可检索。稍等片刻再试。

L0 实体卡未更新

L0 更新频率较低(由 Dream 或实体识别触发),可调用 POST /v3/entity_cards/{id}/edit 手动编辑。

Mem0 SDK连接失败

确认 $HOST 使用数据面端口(:4040),且 $API_KEY 为 User Key 类型。

记忆检索结果不相关

调整 cosine_threshold 提高相似度下限,或使用 V2/V3 搜索同时检索 L2 源文本扩大召回。

assemble 返回空记忆

检查 include_memories 是否为 true,且 session_id 与 user_id 至少提供一项。

清空记忆报400错误

请求 body 中 confirm 必须为 true,且 scope 需为有效值(all / before_date / by_session_ids)。

更新或反馈记忆报400错误

可能原因:①记忆已失效(invalidated),不可修改或反馈;②更新请求未包含 data 或 metadata。

Dream报409错误

同一 workspace 已有运行中的 Dream 作业,等待完成后重试。