TencentDB Agent Memory v2.0 深度实战:把 AI Agent 的「失忆症」从根上治好——从四层记忆架构到 Team Memory 团队协作全链路拆解
选题来源:GitHub Trending 2026-08 | TencentCloud/TencentDB-Agent-Memory 19.8k Stars
一、背景:Agent 失忆症,一个被严重低估的工程问题
做 AI Agent 开发的人都踩过这个坑:你花了半小时给 Agent 讲清楚项目背景、编码规范、部署流程,下次开新会话,一切归零——Agent 又变成了一张白纸。
这不是模型不够聪明。这是架构设计上的「记忆缺失」。
行业里解决这个问题的方案主要有三种:
方案一:全量上下文回灌。 把历史对话全部塞进 context window。优点是信息完整,缺点是 Token 成本爆炸,注意力被历史日志淹没,模型在第 30 轮对话后开始说胡话。
方案二:向量数据库召回。 把对话摘要成 embedding 存进向量库,下次按语义相似度召回。优点是成本低,缺点是向量召回丢失了层次关系——你不知道这条记忆属于哪个项目、哪个用户、哪个任务阶段。
方案三:只维护用户画像(Persona)。 保留长期偏好,但太抽象,无法支撑具体任务中的证据追溯。
这三种方案本质上都在做「信息压缩」,但没有一种方案回答了「压缩后还能不能回查」这个问题。摘要一旦生成,原始证据就被丢弃了。Agent 只能相信摘要的正确性,无法验证——这在生产环境里是灾难性的。
2026年5月,腾讯云数据库团队开源了 TencentDB Agent Memory,提出了一套「分层记忆 + 上下文卸载 + 可降级检索」的完整方案。上线一周即突破 4000 Stars。2026年8月6日发布的 v2.0.0(最新为 v2.0.1-beta.2)带来了 Team Memory 团队记忆功能,将记忆能力从个人场景扩展到团队协作层面。
二、核心问题:记忆系统到底要解决什么
在拆架构之前,先把问题定义清楚。Agent 记忆系统实际上要同时解决两类问题:
问题 A:跨会话经验沉淀。 用户不想每次都重新解释项目背景、编码规范、排障 SOP。Agent 需要在多轮会话中积累对用户和项目的理解。
问题 B:单次长任务上下文爆炸。 一个复杂的研发任务里,Agent 会产生大量的搜索结果、文件内容、测试日志、错误堆栈。如果全部留在 context window 里,模型会被噪音淹没;如果直接摘要丢弃,又会丢失后续排障需要的证据。
现有大多数记忆方案要么只解决 A(向量召回),要么只解决 B(摘要压缩),几乎没有方案同时处理两者。
TencentDB Agent Memory 的核心设计哲学是:
压缩可以发生,但压缩结果必须可逆;抽象可以存在,但抽象必须带着索引。
三、四层记忆架构(L0-L3):把「记住」拆成四种不同职责
项目把长期记忆拆成 L0、L1、L2、L3 四层。这四层不是简单的缓存层级,而是四种不同的信息表达方式,每层承担不同的语义职责。
3.1 架构全景图
┌─────────────────────────────────────────────────────────┐
│ Agent 上下文 │
│ (persona.md + scene nav + relevant L1 + tool guide) │
├─────────────────────────────────────────────────────────┤
│ L3 Persona │ 长期稳定画像 · 用户偏好 · 工作方式 │
│ L2 Scenario │ 场景块 · 项目上下文 · 流程经验 │
│ L1 Atom │ 结构化事实 · 明确指令 · 可检索片段 │
│ L0 Conversation│ 原始对话 · 完整消息 · 工具证据 │
├─────────────────────────────────────────────────────────┤
│ SQLite + FTS5 + sqlite-vec (本地优先) │
│ 或 Tencent Cloud VectorDB │
└─────────────────────────────────────────────────────────┘
3.2 L0:证据底座
L0 层记录原始对话消息,包括 user/assistant 的完整内容,也可以写入 JSONL 格式的工具调用结果和 SQL 记录。
核心设计原则:L0 不做判断,先把干净的原始材料留下来。
// L0 原始消息存储示例
{
"message_id": "msg_8a3f2c1d",
"role": "user",
"content": "帮我把这个 API 的错误处理重构一下,要求:\n1. 使用 Result 模式\n2. 错误码统一枚举\n3. 日志使用结构化 JSON",
"timestamp": "2026-08-15T14:23:11Z",
"session_id": "sess_proj_api_refactor",
"metadata": {
"tool_calls": [],
"attachments": []
}
}
L0 存在的意义是让上层抽取和总结有了兜底:如果 L1、L2、L3 的判断不够可信,Agent 可以沿着 source_message_ids 回查到原始消息核对。
3.3 L1:事实抽取层
L1 层是语义核心。它把对话中的明确偏好、指令、历史事件抽成结构化记忆:
{
"atom_id": "atom_f7e2b9a1",
"content": "用户偏好使用 pnpm 管理前端依赖,避免使用 npm",
"type": "instruction",
"priority": 80,
"scene_name": "前端工程规范",
"source_message_ids": ["msg_8a3f2c1d"],
"created_at": "2026-08-15T14:25:00Z",
"confidence": 0.95
}
最关键的设计点是 source_message_ids。它意味着一条事实不是凭空生成的,而是能追溯到具体对话来源。这解决了「摘要不可逆」的核心问题。
L1 的抽取由 LLM 完成,prompt 大致如下:
你是一个记忆抽取器。从以下对话中提取结构化事实:
- 明确的用户偏好和指令
- 项目的技术约束和编码规范
- 重要的历史决策和变更记录
每条事实需要包含:
1. content: 事实的具体描述
2. type: instruction | preference | constraint | decision
3. priority: 优先级 0-100
4. scene_name: 所属场景
注意:只提取明确的、可验证的信息,不要过度推断。
3.4 L2:场景组织层
单条 L1 事实适合检索,但不适合人和 Agent 长期阅读。L2 层把相关的事实整理成 Markdown 场景块:
# 场景:订单服务重构项目
## 项目背景
- 2026-08-10 启动,目标将单体订单服务拆分为微服务
- 技术栈:Go 1.26 + gRPC + PostgreSQL 19
## 编码规范
- 错误处理统一使用 Result 模式(见 atom_f7e2b9a1)
- 日志格式必须为结构化 JSON
- 所有公开接口必须有完整的 API 文档注释
## 排障 SOP
1. 先查 /var/log/order-service/error.log
2. 错误码 5xx 优先检查数据库连接池
3. gRPC 超时问题查看 conn_pool.go 的 MaxConnAge
3.5 L3:稳定画像层
L3 层生成 persona.md,沉淀用户长期稳定的偏好、背景和工作方式:
# 用户画像
## 基本信息
- 角色:后端工程师,主攻 Go 和 Python
- 偏好:结构化日志、性能优先、最小依赖原则
## 编码习惯
- 错误处理:倾向 Result 模式而非异常
- 测试:要求单测覆盖率 ≥ 80%
- 代码风格:喜欢小函数、明确命名、高可读性
## 协作方式
- 遇到问题先查文档,再问 AI
- 重视可回溯的决策记录
- 不喜欢一次性给出完整方案,倾向分步骤推进
## 已知项目
- 订单服务重构(进行中)
- 数据分析平台(规划中)
3.6 渐进式披露:四层如何协同
四层叠在一起后,Agent 获取上下文的方式是渐进式披露(Progressive Disclosure):
- 默认状态:Agent 只看到 L3 Persona + L2 场景导航 + 当前任务相关的 L1
- 需要证据时:沿着 source_message_ids 向下查到 L0 原文
- 需要细节时:进入 L2 场景块,阅读完整上下文
这种分层注入策略有一个很实际的收益:更容易命中模型厂商的 prompt cache。高频变化的信息(当前任务 L1)放在用户 prompt 附近,低频稳定的信息(L3 Persona、场景导航)放在可缓存区域,既减少重复开销,也降低上下文组织的抖动。
四、检索路径:三种策略,可降级 fallback
记忆系统的检索不是单点依赖。TencentDB Agent Memory 提供了三种检索策略:
| 策略 | 依赖能力 | 适用场景 |
|---|---|---|
| keyword | FTS5 + BM25 | 关键词明确,或未配置 embedding |
| embedding | 向量相似度 | 语义接近但表达不完全一致 |
| hybrid | FTS + 向量 + RRF | 默认综合策略,兼顾精确和语义召回 |
4.1 降级设计:没有降级的记忆系统在生产环境等于裸奔
# 检索时的降级逻辑(伪代码)
def retrieve_memories(query: str, user_id: str, session_id: str):
memories = []
# 尝试混合检索(默认)
try:
if embedding_configured:
memories = hybrid_search(query, user_id, top_k=10)
else:
# embedding 未配置,降级到 FTS
memories = fts5_search(query, user_id, top_k=10)
except EmbeddingServiceError:
# embedding 服务挂了,继续降级
memories = fts5_search(query, user_id, top_k=10)
return memories
当 Agent 进入公司内网、受代理限制、或模型服务波动时,失败路径比演示环境复杂得多。没有降级能力的 Memory 系统,在生产环境里随时可能成为单点故障。
4.2 检索注入位置:放哪里比放多少更重要
<!-- 系统 prompt 结构 -->
<system_prompt>
[Agent 角色定义]
<!-- L3 Persona:稳定上下文,适合 prompt cache -->
{persona_md}
<!-- L2 场景导航:低频变化 -->
{scene_navigation}
<!-- 工具指南:告诉 Agent 何时查记忆 -->
{memory_tool_guide}
</system_prompt>
<!-- 用户 prompt:动态上下文,高频变化 -->
<user_prompt>
{current_task}
<!-- L1 相关记忆:每次不同 -->
<relevant-memories>
- [instruction] 用户偏好使用 pnpm 管理前端依赖
- [constraint] 错误码枚举必须包含 TIMEOUT = 408
</relevant-memories>
</user_prompt>
五、上下文卸载:长任务真正的 Token 黑洞是工具结果
跨会话记忆解决的是「下次别让我重复说」。但单次长任务里,更常见的问题是工具结果把上下文撑爆。
Agent 做研发任务时经常会遇到:
- 搜索代码返回上百个候选结果
- 测试失败输出几千行日志
- 读取大文件后整段内容进入 context
- 多轮工具调用后,历史记录越来越像滚雪球
TencentDB Agent Memory 的短期记忆方案选择上下文卸载(Context Offload):把完整结果挪到外部文件,只把任务状态和必要摘要留给模型。
5.1 卸载链路设计
完整工具结果 → 写入 refs/*.md
工具调用摘要 → 写入 offload JSONL
任务状态结构 → 更新 Mermaid MMD 图
上下文注入 → 只放 Mermaid 任务地图
需要细节时 → 按 node_id/ref 回查原文
最终注入给 Agent 的可能不是一堆日志,而是一张任务地图:
graph TD
A[开始:API 错误处理重构] --> B[分析现有代码结构]
B --> C[确定重构范围:5个模块]
C --> D[逐模块重构]
D --> E[模块1: auth_handler.go ✅]
D --> F[模块2: order_handler.go 🔄]
D --> G[模块3: payment_handler.go ⏳]
E --> H[编写单元测试]
H --> I[集成测试]
style E fill:#90EE90
style F fill:#FFFACD
style G fill:#F0F0F0
5.2 Hook 生命周期
# 伪代码:after_tool_call hook
async def after_tool_call(tool_pair: ToolPair, context: AgentContext):
# 1. 完整结果写入 refs/
ref_path = write_to_refs(tool_pair.raw_output)
# 2. L1 总结工具调用
summary = await summarize_tool_call(tool_pair)
# 3. L1.5 判断任务边界
should_new_task = await detect_task_boundary(tool_pair, context)
if should_new_task:
create_new_mermaid_map(context.session_id)
else:
append_to_active_mmd(tool_pair, ref_path)
# 4. L3 根据 token 压力压缩历史上下文
if context.token_pressure > THRESHOLD:
compress_history(context)
这个设计把「上下文窗口」从原始记录容器改造成任务状态面板。
5.3 L1.5 任务边界检测
L1.5 边界检测器的职责是判断当前工具调用应该复用活跃的 Mermaid 图,还是开启新任务图:
帮我修这个 bug → 任务 A
顺便看下测试为什么慢 → 任务 A(相关)
再把刚才那个实现整理成文档 → 任务 B(新任务)
这说明上下文治理不只是「少放点内容」,还需要识别任务阶段、任务归属和状态迁移。
六、v2.0 Team Memory:从「个人记忆」到「团队协作」
2026年8月6日发布的 v2.0.0 是项目的重要里程碑,核心升级是 Team Memory(团队记忆)。
6.1 为什么需要 Team Memory
在团队使用 Agent 的场景里,有一个微妙但重要的需求:团队成员共享的记忆,是否应该和私人记忆分开管理?
如果所有记忆都存在个人空间,新成员加入项目时 Agent 对项目一无所知;如果记忆全公司共享,个人偏好又会混入团队上下文。Team Memory 的答案是:分层管理,按角色和任务装配。
6.2 四类可复用资产
v2.0.0 将记忆抽象为四类可复用资产:
1. Chat Memory(对话记忆)
跨会话保留对话中的偏好、决策和交互历史。用户级别的长期认知积累,支持多 Agent 共享。
2. Skill(技能)
从跑通的任务里提炼可复用的 SOP,包括版本、资源文件、触发边界、执行步骤和验证规则。新增强制归档功能,确保关键 Skill 不遗漏。
# Skill: Go API 重构 SOP
## 触发条件
用户要求对 Go 服务进行错误处理重构或接口规范化
## 执行步骤
1. 分析现有代码结构,确定重构范围
2. 使用 Result 模式替换直接返回 error
3. 统一错误码枚举(见项目规范)
4. 结构化日志(JSON 格式)
5. 编写单元测试(覆盖率 ≥ 80%)
## 验证规则
- [ ] 所有接口返回 Result 类型
- [ ] 错误码枚举包含 TIMEOUT = 408
- [ ] 日志为有效 JSON 格式
- [ ] 单测通过,覆盖率不下降
3. LLM-Wiki(知识库)
把团队文档变成结构化页面 + 链接图谱。v2.0.0 优化了 Wiki 生成,新增页面并发构建和单页失败自动重试。
4. Code-Graph(代码图谱)
项目代码的结构化知识,支持按项目聚类、按角色装配给不同的 Agent 使用。
6.3 多 Agent 接入支持
v2.0.0 新增了对多种 Agent 客户端的接入支持:
| 客户端 | 接入方式 | 支持的功能 |
|---|---|---|
| CodeBuddy | MCP | 全套四类资产 |
| OpenClaw | MCP | 全套四类资产 |
| Claude Code | MCP | 全套四类资产 |
| Codex CLI | Memory Proxy | Chat Memory + Skill |
| WorkBuddy | Memory Proxy | Chat Memory + Skill |
| DeepSeek Harness (dsh) | Memory Proxy | 全套四类资产 + aux 请求短路 |
6.4 冷启动开箱即用
- 创建团队/用户即自动生成默认 Agent,无需手工配置
- 客户端接入地址一键复制,自动解析宿主机地址
- 默认 Skill 预置,新用户可直接使用标准研发流程
七、生产级代码实战
7.1 Python SDK 接入
from memory_core import MemoryClient
client = MemoryClient(
base_url="http://localhost:8080",
user_id="dev_alice",
team_id="backend_team"
)
# === L1 写入:保存用户偏好 ===
await client.atoms.create(
content="用户偏好使用 pnpm 管理前端依赖,避免使用 npm",
atom_type="instruction",
priority=80,
scene_name="前端工程规范"
)
# === 检索:混合召回 ===
memories = await client.retrieve(
query="前端依赖管理工具",
strategy="hybrid", # FTS + 向量 + RRF
top_k=5
)
for m in memories:
print(f"[{m.type}] {m.content}")
# === 读取 persona ===
persona = await client.persona.get()
print(persona.markdown)
# === 写入 skill ===
await client.skills.create(
name="Go API 重构 SOP",
content=skill_markdown_content,
trigger_conditions=["Go 服务", "错误处理", "重构"],
verification_rules=[
"所有接口返回 Result 类型",
"错误码枚举包含 TIMEOUT = 408"
]
)
# === 团队知识库导入(v2.0 并发优化)===
from memory_knowledge import WikiBuilder
builder = WikiBuilder(client)
await builder.import_documents(
paths=["/docs/api-spec.md", "/docs/deploy-guide.md"],
concurrency=10,
on_failure="retry" # 单页失败自动重试
)
7.2 OpenClaw 接入配置
# openclaw.yaml
plugins:
- name: tencentdb-agent-memory
config:
memory:
enabled: true
proxy_url: "http://localhost:8080"
user_id: "${OPENCLAW_USER_ID}"
team_id: "${TEAM_ID}"
layers:
persona: true
scene: true
atoms: true
conversation: false # 按需加载
retrieval:
strategy: "hybrid"
top_k: 8
min_priority: 50
offload:
token_threshold: 8000
ref_retention: "task_related"
7.3 短期上下文卸载实战
from memory_panel import TaskMap
task_map = TaskMap(session_id="sess_api_refactor_2026")
# 记录工具调用
task_map.record(
tool="search_code",
input="error handling patterns golang",
output_ref="refs/search_001.md",
summary="找到 12 个相关文件"
)
task_map.record(
tool="read_file",
input="order-service/handler.go",
output_ref="refs/file_order_handler_go.md",
summary="文件共 320 行,包含 8 个 handler 函数"
)
# 生成 Mermaid 任务图
mmd = task_map.to_mermaid()
print(mmd)
# 检查 token 压力,自动压缩
if task_map.token_pressure() > 8000:
task_map.compress_history(compression_ratio=0.5)
task_map.fold_old_nodes(threshold=10)
# 按需回查原文
detail = task_map.get_ref_content("refs/search_001.md")
7.4 Team Memory 多用户协作
from memory_proxy import TeamMemory
team = TeamMemory(
proxy_url="http://localhost:8080",
team_id="backend_team"
)
# 管理员:装配团队记忆给新 Agent
await team.equip_agent(
agent_id="agent_newbie_001",
assets=["chat_memory", "skill:go-api-refactor", "wiki:deployment"],
scopes=["proj_order_service"]
)
# 普通成员:访问私人记忆 + 团队公共资产
user_assets = await team.list_available_assets(
user_id="dev_bob",
include_shared=True
)
# [chat_memory:personal, skill:go-api-refactor, wiki:api-spec]
八、工程权衡与生产落地建议
8.1 核心模块收益与风险
| 模块 | 工程收益 | 可能的坑 |
|---|---|---|
| L0-L3 分层结构 | 压缩后可追溯,Pipeline 可观测 | 链路长,调试门槛高 |
| LLM 抽取 L1/L2/L3 | 语义质量比纯规则强 | 模型稳定性影响记忆质量 |
| JSONL + DB 双写 | 原始证据、索引、检索一致性 | 一致性边界需要设计清楚 |
| Offload + Mermaid | 节省 Token,任务态势清晰 | Hook 依赖强,patch 生命周期失效影响链路 |
| 多宿主抽象 | OpenClaw、Hermes 等多场景可复用 | 适配层、权限、生命周期管理更复杂 |
8.2 成本控制建议
CONFIG = {
# L1 抽取:不需要每次都抽,按 token 消耗触发
"extract_on_token_threshold": 4000,
"extract_min_interval_seconds": 300,
# Persona 更新:低频,稳定优先
"persona_update_on_tasks": 10,
"persona_min_interval_hours": 24,
# 召回:按场景调整 top_k
"retrieval_top_k": {
"quick_task": 3,
"complex_refactor": 10,
"research": 15
},
# 向量服务:异步写入,不阻塞主流程
"embedding_async": True,
"embedding_batch_size": 50
}
8.3 记忆生命周期管理
EXPIRY_POLICY = {
"instruction": { # 明确指令:长期保留
"ttl_days": 365,
"archive_on_inactive_days": 90
},
"preference": { # 用户偏好:中等保留
"ttl_days": 180,
"archive_on_inactive_days": 60
},
"task_context": { # 任务上下文:短期
"ttl_days": 30,
"archive_on_inactive_days": 14
},
"tool_result_ref": { # 工具结果引用:极短期
"ttl_days": 7,
"cleanup_on_session_end": True
}
}
九、结语:Agent Memory 的边界,决定 Agent 能不能长期协作
TencentDB Agent Memory v2.0 最有价值的地方,不是用了 SQLite、向量库、Mermaid 或 LLM 抽取这些技术——它们单独看都不新。它真正值得讨论的是架构取舍的完整度:
- ✅ 原始证据要保留
- ✅ 结构事实要抽取
- ✅ 场景上下文要组织
- ✅ 长期画像要稳定
- ✅ 短期日志要卸载
- ✅ 压缩结果要能回查
- ✅ 失败路径要能降级
这套设计把 Agent Memory 从「记住几段历史」推进到「管理工作现场」。它既处理跨会话经验沉淀,也处理单次任务的上下文爆炸;既强调高层抽象,也保留低层证据;既考虑召回质量,也考虑缓存、降级和工程稳定性。
真正落到实际 Agent 开发中,还需要回答更细的问题:哪些信息应该进入用户级长期记忆,哪些应该进入项目级共享记忆,哪些只应该停留在单次任务的短期地图里。这个边界一旦清晰,Agent 才有可能从一次性问答工具,变成懂项目、懂团队习惯、还能自己翻工作笔记的协作者。
v2.0 的 Team Memory 迈出了重要一步——它让多 Agent 协作场景下的记忆复用成为可能。随着 Agent 在软件开发中的渗透率持续提升,记忆系统的边界管理能力,将直接决定 Agent 能否真正成为可靠的长期协作者。
相关资源
- GitHub:https://github.com/TencentCloud/TencentDB-Agent-Memory
- 最新版本:v2.0.1-beta.2(2026-08-15)
- 协议:MIT
本文首发于程序员茄子,如需转载,请保留出处。