1. 在读MemOS源码之前,把“缓存层”的三个适用范围先对齐
把Agent框架的源码笔记写到第4篇,我越来越觉得KV Cache是个容易被看轻的模块。很多同学一听到“Cache”就默认它是性能优化层,是锦上添花的东西,读代码时也习惯跳过。但如果你把MemOS这套东西当作一个长在Agent运行时里的记忆底座,会发现KV Cache保存的并不是“可丢弃的临时结果”,而是一堆必须在多轮对话、多次工具调用之间被反复读写的执行状态。换句话讲,它更像是Agent的短期工作记忆,而不只是一个高速暂存区。
1.1 MemOS里的KV Cache不是大模型推理时的KV Cache
这里必须先做个术语对齐。在LLM推理链路里,KV Cache是指Transformer解码时保存的Key-Value张量,用来避免每一步都重新计算历史token的注意力投影,通常存在于显存或CPU内存里,由推理框架管理。但MemOS源码笔记里讨论的KV Cache,不是那一层。它处在Agent框架的记忆子系统里,用来承接会话状态、工具调用结果、抽取完成的结构化记忆片段。
之所以容易混淆,是因为很多工程同学刚接触Agent框架时,会默认把“KV Cache”当成OpenAI、vLLM那套东西。我在看源码的时候也踩过这个认知惯性,一开始老想去代码里找“batch size”“head dim”之类的配置,结果当然找不到。后来我把视角切回到Agent开发本身,发现这个KV Cache解决的问题很朴素:当一个Agent在运行中需要多次读取某段上下文、某个工具返回结果或者某个中间处理产物时,如果每次都从原始事件流里完整回放,代价会非常大;KV Cache的作用是给这些高频访问对象提供一条捷径。
1.2 为什么Agent记忆系统需要Cache,而不是每次现算
我们拆解一个最常见的Agent执行链路:大模型接收用户问题,判断要调用工具,工具返回一批结构化数据,Agent把这些数据写回上下文,再决定下一步动作。这个过程中,工具返回结果往往不会只被读一次。意图识别阶段可能读一遍,参数抽取阶段可能读一遍,最后生成答复时还要再对照一遍。如果不做缓存,每次读取都要把原始结果重新加载、反序列化、再抽特征,Agent的响应延迟会明显上升。
更麻烦的是跨会话场景。Agent在一段长时间任务里可能积累几十条工具调用记录,如果每一轮都要把这些记录重新注入上下文模型,不仅token成本不可控,还很容易把真正关键的信息淹没。MemOS给我的启发是:它把这一类读取频率高、处理成本高、语义相对固定的对象,统一收敛到一个带键值语义的缓存层里,让上层代码不关心“这次读取到底走了计算还是走了缓存”。
1.3 在源码阅读路径上,KV Cache应该摆在记忆分层中的哪个位置
从记忆分层的角度看,一个完整的Agent记忆系统通常分三层:底层是长期存储,存放跨会话的向量化记忆或事实型知识,一般用向量数据库或者关系库;中间层是工作记忆,承载当前任务上下文,生命周期和会话绑定;最顶层才是当前屏幕上的消息上下文,直接和模型交互。MemOS的KV Cache正好落在中间层,它不像长期存储那样追求海量容量,也不像屏幕消息那样只保留最近几轮,核心目标是在会话存活期内提供高吞吐的键值访问。
我自己的源码阅读习惯是,碰到一个模块,不要急着逐行往下读,先把模块和自己的对话场景绑定起来。KV Cache的场景边界就是:谁能访问它、数据生命周期多长、读多还是写多、失效了如何兜底。把这几个问题带着去翻代码,理解效率会高很多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 这个缓存的记录头比普通缓存多了什么——字段设计透露出的约束
如果只看接口签名,
