AI AinoCode AI 工具与基础设施
AI教程 9 分钟

Agent 记忆层大乱斗:LangGraph Memory vs VexDB vs Mem0 vs RedisVL,2026年怎么选?

从记忆持久化、语义检索精度、跨会话一致性、扩展性四个维度对比四大 Agent 记忆方案,附选型决策树和真实性能数据。

AinoCode 编辑部

Agent记忆方案对比

引子:你的 Agent 又失忆了

上个月帮一个创业团队 debug 他们的客服 Agent。问题描述很简单:

“用户上午说了自己的订单号,下午再问同一个问题时,Agent 完全不记得了。”

团队用的方案是把对话历史存在 PostgreSQL 里,每次对话开始时把最近 20 条消息拼到 prompt 里。

乍看合理。但问题在于:

  1. 20 条消息约 8000 tokens,占掉了 Claude 3.5 Sonnet 上下文窗口的 40%
  2. 纯关键词检索,用户说”我上午提到的那个订单”,根本匹配不到
  3. 跨会话断裂——上午的 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               │  ← 提取的知识与事实(冷数据)
└─────────────────────────────────────┘

关键特性:

  1. 数据库原生集成:VexDB 不是外挂的向量库,而是直接在数据库层做语义索引
  2. 自动分层:热/温/冷数据自动迁移,不需要手动管理
  3. 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 的底层做了三件事:

  1. 实体提取:用 LLM 从文本中提取结构化实体(“超时阈值” = 30s)
  2. 关系构建:自动建立实体之间的关系(用户 → 配置 → 值)
  3. 时间衰减:旧记忆的权重自动降低

实测结果

维度结果
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 MemoryVexDBMem0RedisVL
记忆持久化会话级三层分层自动提取原始存储
语义检索精度❌ 不支持★★★★☆★★★★★★★★★★
跨会话一致性★★★★★★★★★☆★★★★★
扩展性中(单机)高(云托管)高(Redis集群)
上手难度最低
检索延迟12ms8ms15ms3ms
成本免费免费$49+/月Redis 成本
变更历史追踪⚠️ 去重问题

七、选型决策树

你的 Agent 需要记忆吗?

├─ 只需要会话内记忆
│   └─ → LangGraph Memory(如果你用 LangGraph)

├─ 需要长期记忆
│   │
│   ├─ 已有 Redis 基础设施?
│   │   ├─ 是 → RedisVL(最低延迟,最高可控性)
│   │   └─ 否 ↓
│   │
│   ├─ 团队有向量数据库经验?
│   │   ├─ 是 → VexDB(Agent-first 设计,免费开源)
│   │   └─ 否 ↓
│   │
│   └─ 想要零配置、快速上线?
│       └─ → Mem0(商业方案,自动处理一切)

八、关于”Agent 记忆应该内置还是外置?”

这是选型时最关键的分歧点。

内置记忆(LangGraph Memory 的方式):记忆是 Agent 执行框架的一部分,天然集成,但灵活性差。

外置记忆(VexDB、Mem0、RedisVL 的方式):记忆是独立的存储层,可以跨框架共享,但需要额外集成工作。

我的看法是:2026 年的趋势是外置记忆。原因很简单:

  1. 多 Agent 协作场景中,不同 Agent 可能用不同的框架,但需要共享记忆
  2. 记忆的生命周期通常比 Agent 的生命周期长得多
  3. 记忆层可以独立扩展、独立优化、独立备份

这就像数据库和应用的关系——你肯定不会把数据存在应用进程的内存里,除非这个应用是一次性的。

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 上运行。