很多高频使用 AI 编程的开发者,工作流里往往不止一把铲子:上午用 Claude Code 处理复杂业务模块的重构,下午切到 Codex 或者终端里的 pi 编写配套的集成脚本,本地调试时偶尔还会唤起 OpenCode。这种轮换本该最大化发挥各家模型的长处,但实际体验中最折磨人的往往不是能力差异,而是割裂的记忆。
上午在 Claude 终端里反复调通了一个涉及分布式事务的重试策略,并严厉警告过绝不能修改某个历史兼容字段;下午换到 Codex 打开同一个项目,它给出的第一个建议恰恰就是把那个旧字段删掉。重开一个会话窗口,AI 就把此前的排错经验与设计约束忘得一干二净。为了让新工具明白上下文,开发者不得不把几十屏的历史日志复制粘贴进输入框,既浪费大量的提示词配额,又会因为文本过长导致模型忽略真正的核心约束。
大模型的记忆不应是由模型厂商封装的黑盒提示词,而应是独立于模型、由用户掌握的确定性本地索引。
换个终端窗口,前三天推导全部归零
这种反复失忆的根源在于状态与算力的结构性错配。在底层架构上,任何大语言模型本质上都是无状态的确定性计算函数,只负责针对单次请求输入生成概率分布。而真实的软件工程却是一个跨越数周乃至数月的高阶有状态系统,充满了各种隐蔽的架构妥协与业务边界。
为了弥补这一鸿沟,目前业界最常见的两条路径都走向了工程妥协。第一种是无节制地膨胀单次请求的上下文窗口,试图把整个开发历史作为背景塞进每次推理。这种粗放的做法不仅让调用延迟与成本剧烈上升,还会触发注意力稀释,导致关键规则直接淹没在大段文本里。第二种则是商业工具各自构建的云端记忆,由平台在后台生成一些模糊的偏好摘要。但这种黑盒记忆被深深锁死在特定厂商的生态中,一旦跨出该产品的界面,过去的经验便全部归零。
计算与状态强行绑定的后果,是开发者永远在重复交代背景。如同现代分布式系统普遍走向存算分离一样,Coding Agent 的工作记忆同样需要从计算模型中彻底剥离出来,成为一种独立、持久且归开发者所有的本地基础设施。

把各家孤立的会话日志拉平
针对多工具切换时的记忆断层,开源项目 funes 给出了一条极其轻量的工程解法。该工具采用单一 Rust 二进制文件构建,无需复杂的运行环境依赖,可以直接常驻在开发者的日常终端中。
它最巧妙的设计在于不要求改变现有的工作习惯,而是就地复用开发者机器上既有的会话痕迹。无论你在日常中使用 Claude Code、Codex、pi 还是其他常用编码工具,这些客户端在每次交互后都会在本地磁盘留下详细的执行追踪日志。系统通过后台扫描,将这些格式各异的转储文件统一解析为标准化的轮次与语块结构,并为每一段记录打上会话标识、角色、工具名称以及精确到秒的时间戳。
在这个过程中,系统坚持保存未经提炼的原始会话文本,而非依赖大模型二次生成的摘要。工程实践反复证明,AI 提炼历史经验时往往会漏掉关键的报错堆栈或边界行号,甚至将过往的误判当成确定性事实保存下来。唯有保留带有完整出处元数据的原文语块,才能确保每次回忆都有据可查。
在底层存储选型上,系统采用了专为列式存储和向量计算设计的 Lance 格式。由于代码交互记录天然具备追加写特征,增量写入只需在单次会话轮次结束时追加新块,耗时仅几毫秒,彻底消除了针对全量历史重新计算和重复嵌入的沉重开销。

存算分离让记忆跨工具漫游
为了在几万条零散的历史交互中精准命中所需信息,检索链路采用了本地轻量向量与传统词频倒排的混合召回方案。面对模糊的架构思路,语义向量负责拉取相似背景;面对精确的类名、方法签名与错误码,稀疏索引则能瞬间完成定点捕获。
两路召回结果经过倒数排名融合算法合并后,由本地运行的交叉编码器进行深度交互重排。重排阶段特别引入了时间衰减系数,确保最近确立的架构决策拥有更高的优先级,并自动拼接命中语块的前后上下文,还原完整的技术推理链路。
在与 Agent 的交互边界上,整个系统仅仅暴露出两个极简工具:一个用于语义模糊召回的查询接口,以及一个根据唯一编号读取完整上下文的读取接口。实际测试表明,哪怕是轻量级的小尺寸本地模型,在面对涉及历史架构决策的问题时,无需用户显式提醒,也能自发地调用查询工具调取过往事实。
最重要的是,这种架构彻底打破了工具壁垒。所有的索引文件与结构化数据均保存在本地磁盘,若需要在多台开发终端与远程工作环境之间保持上下文同步,只需通过简单的同步指令将本地存储关联至受控的私有数据集仓库。无论上午使用哪款云端大模型,下午切回本地离线推理,工程记忆都能作为一个完整独立的技术资产跨工具持续沉淀。
