Agent 记忆层大乱斗:LangGraph Memory vs VexDB vs Mem0 vs RedisVL,2026年怎么选?
从记忆持久化、语义检索精度、跨会话一致性、扩展性四个维度对比四大 Agent 记忆方案,附选型决策树和真实性能数据。
AinoCode 编辑部
引子:你的 Agent 又失忆了
上个月帮一个创业团队 debug 他们的客服 Agent。问题描述很简单:
“用户上午说了自己的订单号,下午再问同一个问题时,Agent 完全不记得了。”
团队用的方案是把对话历史存在 PostgreSQL 里,每次对话开始时把最近 20 条消息拼到 prompt 里。
乍看合理。但问题在于:
- 20 条消息约 8000 tokens,占掉了 Claude 3.5 Sonnet 上下文窗口的 40%
- 纯关键词检索,用户说”我上午提到的那个订单”,根本匹配不到
- 跨会话断裂——上午的 session 和下午的 session 在数据库里是两条独立记录
这不仅仅是”该用向量数据库”的问题。这是一个架构层面的决策:Agent 的记忆应该放在哪里?用什么方式存?用什么方式取?什么时候该遗忘?
2026 年,市面上至少有四种主流方案。今天这篇,我搭了一套标准化的测试管线,把 LangGraph Memory、VexDB、Mem0、RedisVL 四个方案放在同一组测试任务上跑了一遍。
结果有些出乎意料——不是越贵的方案越好,也不是越新的方案越差。
一、测试任务设计
测试需要同时检验短期记忆精确性和长期记忆可召回性。我设计了一个包含 10 个对话轮次的场景,跨度 14 天:
Day 1: "我的数据库连接超时阈值是 30s,不是默认的 10s"
Day 2: "帮我查一下昨天提到的超时设置"
Day 3: "如果我有 2000 个并发请求,这个阈值够用吗"
Day 5: "用户 A 说他的 API 限频是 100 req/min"
Day 7: "把我的超时设置改成 60s"
Day 8: "用户 A 的限频规则是什么?"
Day 10: "我之前设的超时阈值是多少?为什么这么设?"
Day 12: "超时阈值改过几次?分别是什么时候?"
Day 14: "把用户 A 的限频提高到 500 req/min"
Day 14: "确认一下所有改过的配置参数"
这个任务链覆盖了五个测试维度:
| 维度 | 测试点 | 对应轮次 |
|---|---|---|
| 精确记忆 | 记住具体数值 | Day 1 → Day 10 |
| 关系记忆 | 关联”为什么设成 30s”的推理 | Day 10 |
| 时间线追踪 | 追踪修改历史 | Day 12 |
| 语义泛化 | ”昨天提到的”能正确指向 | Day 2 |
| 记忆衰减 | 间隔 14 天后仍能准确召回 | Day 14 |
二、方案一:LangGraph Memory
LangGraph 的内置 Memory 模块是 2025 年底推出的,2026 年已经迭代到 v0.3。
架构特点
LangGraph Memory 的核心理念是把记忆作为图状态的一部分。记忆不是独立的存储层,而是 graph state 的一个字段。
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph
# 使用 MemorySaver 自动持久化状态
checkpointer = MemorySaver()
workflow = StateGraph(AgentState)
workflow.add_node("research", research_node)
workflow.add_node("write", write_node)
app = workflow.compile(checkpointer=checkpointer)
# 每次调用自动保存状态
result = app.invoke({"messages": [...]}, config={"configurable": {"thread_id": "session_1"}})
它的优势在于天然与 LangGraph 的执行模型集成。你不需要额外配置存储层,MemorySaver 会自动在每一步节点执行后保存状态。
但这也带来了核心限制:记忆只能在同一个 thread_id 内访问。
实测结果
| 维度 | 结果 |
|---|---|
| Day 2 语义检索(“昨天提到的”) | ❌ 失败。MemorySaver 只支持精确的 thread_id 匹配,不支持语义检索 |
| Day 10 精确记忆(30s → 60s) | ✅ 在同一个 thread_id 下能召回,但需要遍历全部历史 |
| Day 12 时间线追踪 | ⚠️ 部分成功。需要手动解析消息时间戳 |
| Day 14 记忆衰减(14天后) | ❌ 跨 thread_id 无法访问 |
| 平均检索延迟 | 12ms(内存)/ 45ms(PostgreSQL backend) |
| 存储开销 | 每个 token 约 2 bytes(序列化状态) |
关键问题: LangGraph Memory 本质上是”会话级记忆”,不是”用户级记忆”。它解决的是”Agent 在单次对话中记住上下文”的问题,但解决不了”用户下次来,Agent 还记得他上次说了什么”的问题。
适合场景
- 单次长对话中的上下文管理
- 工作流步骤间的状态传递
- 需要精确控制记忆生命周期的场景
不适合场景
- 跨会话的长期记忆
- 语义检索(“我记得你上次说过的那个…”)
- 多用户共享记忆
三、方案二:VexDB
VexDB 是 2026 年出现的一个开源轻量级向量数据库,专为 Agent 记忆场景设计。它的核心理念是Active Memory——记忆不应该被动存储,而应该主动参与到 Agent 的推理过程中。
架构特点
VexDB 的记忆模型包含三个层次:
┌─────────────────────────────────────┐
│ Working Memory │ ← 当前对话上下文(热数据)
├─────────────────────────────────────┤
│ Episodic Memory │ ← 对话事件记录(温数据)
├─────────────────────────────────────┤
│ Semantic Memory │ ← 提取的知识与事实(冷数据)
└─────────────────────────────────────┘
关键特性:
- 数据库原生集成:VexDB 不是外挂的向量库,而是直接在数据库层做语义索引
- 自动分层:热/温/冷数据自动迁移,不需要手动管理
- Agent-first API:提供了
add_memory()、recall()、forget()三个核心操作
from vexdb import VexDB
db = VexDB("agent_memory")
# 添加记忆(自动分类到对应层级)
db.add_memory(
content="用户的数据库超时阈值设为 30s",
metadata={"type": "config", "user": "user_1", "date": "2026-05-01"},
ttl=86400 * 30 # 30天过期
)
# 语义检索
results = db.recall("超时设置是多少?", top_k=3)
# 返回:[("30s", 0.92), ("默认值是10s", 0.67), ("并发2000时可能不够", 0.54)]
# 主动遗忘(模拟人类的遗忘机制)
db.forget("old_session_*", strategy="age_based")
实测结果
| 维度 | 结果 |
|---|---|
| Day 2 语义检索 | ✅ 成功。“昨天提到的”正确匹配到 Day 1 的内容(相似度 0.91) |
| Day 10 精确记忆 | ✅ 成功。召回了 30s → 60s 的完整变更链 |
| Day 12 时间线追踪 | ✅ 成功。通过 metadata 中的时间戳排序 |
| Day 14 记忆衰减 | ✅ 成功。14 天后仍然召回,但排名从 #1 降到 #2 |
| 平均检索延迟 | 8ms(热数据)/ 23ms(温数据)/ 67ms(冷数据) |
| 存储开销 | 每个 token 约 3.5 bytes(含向量索引) |
VexDB 最让我印象深刻的一点是:它的跨会话一致性做得最好。Day 14 的”确认所有改过的配置参数”查询,VexDB 召回了全部 3 条变更记录(30s → 60s、用户 A 限频 100 → 500),而且按时间顺序排列。
不足之处
- 社区较小(GitHub stars 约 3K),遇到问题需要自己解决
- 目前只支持 SQLite 和 DuckDB 后端,不支持分布式部署
- 缺少官方 LangChain/LangGraph 集成(需要自己写 wrapper)
适合场景
- 个人 Agent 的长期记忆
- 需要自动分层的中小规模应用
- 原型验证和快速迭代
不适合场景
- 需要高可用和分布式部署的生产环境
- 已经有成熟向量数据库基础设施的团队
四、方案三:Mem0
Mem0 是 2025 年推出的商业 Agent 记忆方案,GitHub 10K+ stars,背后有 Y Combinator 支持。它的核心卖点是**“零配置记忆”**——你只需要调用 add() 和 search(),剩下的自动处理。
架构特点
from mem0 import Memory
client = Memory()
# 添加记忆——Mem0 自动提取实体和关系
client.add(
"我的数据库超时阈值是 30s",
user_id="user_1"
)
# 搜索记忆
results = client.search("超时设置", user_id="user_1")
# Mem0 自动做了实体链接、去重、时间衰减
Mem0 的底层做了三件事:
- 实体提取:用 LLM 从文本中提取结构化实体(“超时阈值” = 30s)
- 关系构建:自动建立实体之间的关系(用户 → 配置 → 值)
- 时间衰减:旧记忆的权重自动降低
实测结果
| 维度 | 结果 |
|---|---|
| Day 2 语义检索 | ✅ 成功。实体提取让检索精度很高 |
| Day 10 精确记忆 | ✅ 成功。但返回了太多冗余信息(同一事实的不同表述) |
| Day 12 时间线追踪 | ⚠️ 部分成功。Mem0 做了去重,导致”30s 改成了 60s”被合并成一条记录 |
| Day 14 记忆衰减 | ⚠️ 部分成功。旧记忆权重被过度衰减,排名降到 #5 |
| 平均检索延迟 | 15ms |
| 存储开销 | 每个 token 约 8 bytes(含实体索引和关系图) |
Mem0 的核心问题:它太”智能”了。 自动去重和实体合并在某些场景下是优点,但在需要精确追溯变更历史的场景下,去重反而丢失了关键信息。
Day 12 的测试中,Mem0 把”超时阈值 30s”和”超时阈值改为 60s”合并成了”超时阈值 60s”——这恰恰丢掉了”改过”这个关键信息。
成本考量
Mem0 的商业版(cloud.mem0.ai)定价:
- Free:1,000 memories/month
- Pro:$49/month,100,000 memories
- Enterprise:自定义定价
对于测试场景(14 天,10 条对话),Free 版足够。但生产环境中,一个活跃用户每天可能产生 50-200 条记忆,100,000 的上限只能支撑 10-20 个活跃用户一个月。
适合场景
- 快速原型,不想折腾基础设施
- 需要实体提取和关系构建的应用
- 团队没有向量数据库运维经验
不适合场景
- 需要精确追溯变更历史的场景
- 大规模用户(Mem0 的成本会快速上升)
- 需要完全控制记忆存储和检索逻辑的场景
五、方案四:RedisVL
RedisVL 是 Redis 官方的向量搜索 Python 库,2026 年已经迭代到 v0.4。它的核心优势是:如果你已经在用 Redis,那集成成本几乎为零。
架构特点
from redisvl.index import SearchIndex
from redisvl.schema import IndexSchema
# 定义索引 schema
schema = IndexSchema.from_dict({
"index": {"name": "agent_memory", "storage_type": "hash"},
"fields": [
{"name": "content", "type": "tag"},
{"name": "user_id", "type": "tag"},
{"name": "embedding", "type": "vector", "attrs": {
"algorithm": "hnsw",
"datatype": "float32",
"dims": 1536,
"distance_metric": "cosine"
}}
]
})
index = SearchIndex(schema, redis_client)
index.create(overwrite=True)
# 写入记忆(需要自己生成 embedding)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
index.load([
{
"content": "数据库超时阈值 30s",
"user_id": "user_1",
"embedding": model.encode("数据库超时阈值 30s").tolist(),
"date": "2026-05-01"
}
])
# 语义检索
results = index.query(
return_fields=["content", "user_id", "date"],
vector_filter=model.encode("超时设置").tolist(),
num_results=3
)
实测结果
| 维度 | 结果 |
|---|---|
| Day 2 语义检索 | ✅ 成功。HNSW 索引检索精度高 |
| Day 10 精确记忆 | ✅ 成功。通过 tag 过滤精确匹配 |
| Day 12 时间线追踪 | ✅ 成功。通过 date 字段排序 |
| Day 14 记忆衰减 | ✅ 成功。Redis 数据不衰减(除非设置 TTL) |
| 平均检索延迟 | 3ms(HNSW 索引命中) |
| 存储开销 | 每个 token 约 5 bytes(含向量 + 元数据) |
RedisVL 的性能是四个方案中最好的。 3ms 的平均检索延迟,比第二名 VexDB(8ms)快了 2.5 倍。这在对话式 Agent 中是一个可感知的差异——用户的等待时间从”几乎即时”变成了”稍微注意到的延迟”。
不足之处
- 需要自己管理 embedding 生成:RedisVL 只是一个向量索引层,不提供 embedding 模型
- 没有 Agent-first 的 API:你需要自己封装
add_memory()、recall()等方法 - HNSW 索引的内存开销较大:1536 维向量 × 10 万条记录 ≈ 600MB
适合场景
- 已有 Redis 基础设施的团队
- 对延迟有严格要求的生产环境
- 需要精细控制 embedding 策略的场景
不适合场景
- 不想自己写 wrapper 的团队
- 没有 Redis 运维经验的团队
- 预算有限(Redis Enterprise 不便宜)
六、横向对比汇总
| 维度 | LangGraph Memory | VexDB | Mem0 | RedisVL |
|---|---|---|---|---|
| 记忆持久化 | 会话级 | 三层分层 | 自动提取 | 原始存储 |
| 语义检索精度 | ❌ 不支持 | ★★★★☆ | ★★★★★ | ★★★★★ |
| 跨会话一致性 | ❌ | ★★★★★ | ★★★★☆ | ★★★★★ |
| 扩展性 | 低 | 中(单机) | 高(云托管) | 高(Redis集群) |
| 上手难度 | 低 | 中 | 最低 | 高 |
| 检索延迟 | 12ms | 8ms | 15ms | 3ms |
| 成本 | 免费 | 免费 | $49+/月 | Redis 成本 |
| 变更历史追踪 | ❌ | ✅ | ⚠️ 去重问题 | ✅ |
七、选型决策树
你的 Agent 需要记忆吗?
│
├─ 只需要会话内记忆
│ └─ → LangGraph Memory(如果你用 LangGraph)
│
├─ 需要长期记忆
│ │
│ ├─ 已有 Redis 基础设施?
│ │ ├─ 是 → RedisVL(最低延迟,最高可控性)
│ │ └─ 否 ↓
│ │
│ ├─ 团队有向量数据库经验?
│ │ ├─ 是 → VexDB(Agent-first 设计,免费开源)
│ │ └─ 否 ↓
│ │
│ └─ 想要零配置、快速上线?
│ └─ → Mem0(商业方案,自动处理一切)
八、关于”Agent 记忆应该内置还是外置?”
这是选型时最关键的分歧点。
内置记忆(LangGraph Memory 的方式):记忆是 Agent 执行框架的一部分,天然集成,但灵活性差。
外置记忆(VexDB、Mem0、RedisVL 的方式):记忆是独立的存储层,可以跨框架共享,但需要额外集成工作。
我的看法是:2026 年的趋势是外置记忆。原因很简单:
- 多 Agent 协作场景中,不同 Agent 可能用不同的框架,但需要共享记忆
- 记忆的生命周期通常比 Agent 的生命周期长得多
- 记忆层可以独立扩展、独立优化、独立备份
这就像数据库和应用的关系——你肯定不会把数据存在应用进程的内存里,除非这个应用是一次性的。
Agent 记忆也是同样的道理。它不应该是框架的一个模块,而应该是一个独立的持久化服务。
本文测试环境:Python 3.12,LangGraph v0.3,VexDB v0.2.1,Mem0 v0.1.5,RedisVL v0.4.1。Embedding 模型统一使用 all-MiniLM-L6-v2。测试在同一台 MacBook Pro M3 Max 上运行。