Agent 记忆的写入瓶颈:为什么记忆系统最容易被忽视的性能瓶颈在写不在读

大多数 Agent 记忆系统的设计者把注意力放在"如何高效检索"上——向量数据库、混合检索、重排序,各种花活。但实测下来,瓶颈根本不在读,在写。本文从底层原理拆解为什么写入才是记忆系统真正的瓶颈,以及如何应对。

一个反直觉的发现

几乎所有开源的 Agent 记忆方案都在卷检索。

RAG 要优化检索召回率,记忆系统要比较各种 embedding 模型的相似度计算效果,重排序要压延迟。社区里讨论 "Agent 记忆" 时默认的坐标系是:如何从一大堆记忆中快速找到最 relevant 的那几条。

然后我自己搭了个原型,上压力测了一轮。

结果是:检索延迟稳定在 50ms 以内,写入延迟平均 180ms,P99 逼近 400ms。而且写入失败率比检索高了一个数量级。

不是检索不够快,是写入跟不上。

为什么读快写慢?从底层数据流看

记忆系统不是普通的 key-value 存储。一段记忆存入时,会发生这些事:

  1. 语义化处理:原始对话/事件不是结构化的记忆条目。需要经过一个 Writer 模块——通常是 LLM 调用——来提取关键信息、去重、语义压缩。这是一个 LLM 调用,延迟 200-800ms 起步。
  2. 多路编码:处理后的事件被送入 embedding 模型,生成向量表示。embedding 模型再快也要 50-150ms。更关键的是,如果同时做多路编码(摘要 embedding、关键词 embedding、时间 embedding),延迟线性叠加。
  3. 存储层写入:向量索引的写入不是 O(1) 的。以 HNSW 为例,插入一个新向量需要在一个多层的图结构中逐层定位插入位置。层数越高,搜索范围越大。这就是为什么 P99 写入延迟远高于平均值——每次插入都可能在某一层触发一个比较长的 down-hill 搜索。
  4. 一致性协议:如果你的记忆系统需要跨实例同步(比如多 Agent 共享记忆),还要过一遍共识或最终一致性的 write-ahead log。这又是一个 50-100ms 的额外开销。

把这四步叠起来,一条记忆从产生到落盘,消耗的时间窗口足够检索查完 5-8 次。

读操作天生就是轻量级的

对比一下,读一条记忆时发生了什么?

一次向量检索本质上是 K 个向量和查询向量的内积计算。对于 1M 规模的索引,HNSW 的搜索平均只需要遍历几百个节点,纯计算,一个 GPU 调用或者 CPU 的 SIMD 指令就完成了。没有 LLM 调用,没有编码耗时,没有分布式协调。

读和写的量级根本不在一个层次上。这不是算法选择的问题,是工作负载的本质差异:每条写入的完整路径包含至少一次 LLM 调用 + 一次模型编码 + 一次索引结构变更,而每次读取只是一次索引搜索。

当写入成为瓶颈时,系统实际在发生什么

写入慢最隐蔽的后果不是"存得慢",而是阻塞 Agent 主循环

现代 Agent 的工作模式是 event-driven 的:收到一个事件 → 更新记忆 → 根据记忆做决策 → 执行行动 → 产生新事件。记忆更新是同步链路中的一环。写入一旦堵塞,Agent 该"记下来"的信息被延迟了,下一次决策基于的还是过时的记忆状态。

更隐蔽的是写写冲突。多个 Agent 实例并行运行时,两个 Agent 同时处理同一个用户的对话,各自尝试写入一段相关的记忆。如果 Writer 模块没有做 dedup,最终记忆池里会有两条高度相似的重复记忆——检索时反而因为冗余增加了噪声。

怎么治?三层防御

第一层:把写操作从主循环中剥离

不要在 Agent 决策的关键路径上同步写记忆。改成写一份轻量级的 event log(写入延迟 <5ms),然后由一个异步的 Writer 进程消费 event log,批量提取、压缩、去重后落库。

代价是记忆不是"实时"的——有秒级的延迟窗口。但对于大多数场景,记忆的最终一致性就够了。

第二层:优化 Writer,而不是优化索引

Writer 是整个写入链路里最重的环节——一次 LLM 调用可能吃掉 300ms。优化思路:

  • 流式 Writer:LLM 在生成记忆摘要时,不需要等完整生成结果。第一个 token 出来后就开始后续流程的预热。在结构化数据场景下(如事件流),可以用规则代替 LLM——"当用户连续三次询问同一个主题"这种模式直接编码为记忆触发条件,省掉一次推理。
  • 写入去重前置:在 Writer 阶段做 compact dedup,而不是等到存储层才去重。用事件 hash + 时间窗口碰撞检测,O(1) 判断是否是重复写入。

第三层:存储层的写调优

HNSW 的 ef_construction 参数控制插入时的搜索范围。默认值 200 对写入比较友好,如果你把 P99 压到了 400ms,调低到 100—牺牲一点召回率,换写入速度。如果写入量大到索引维护成为瓶颈,换成基于 DiskANN 的存储层,它的批量插入和 compaction 对写入更友好。

最后

记忆系统的设计者的默认假设应该从"检索是瓶颈"翻转为"写入是瓶颈。检索在设计上天然就是快的。"

当你下一次看到一个新的记忆框架宣称自己的检索有多快时,问一句:写入呢?

评论

此博客中的热门博文

我写了半年 prompt,最后发现最好的技巧就三个