AI 基建
0%
第六部分 · 编排 · 第 39 章

记忆系统

作者Changkun Ou
阅读时长约 17 分钟

一个智能体只要运行得比单个上下文窗口更久,就得记住自己做过什么,还得在底层运行环境消失之后恢复。它留下的状态有三种形态:一次会话的持久记录、它改动过的工作区,以及它跨会话带着走的记忆。会话日志必须把意图和结果分开记;给对话开分支便宜,给工作区开分支却不便宜;共享向量存储是数据泄露风险,而不只是相关性 bug。

2026-06-21T23:30:04.494918 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 1 0 0 1 0 1 记忆预算 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 有效召回 原始日志 摘要 检索
图 39.1. 记忆预算增长时有用召回如何变化的示意图。原始日志、摘要和检索存储以不同方式失效;最好的记忆系统不只是最大的那个。理想化曲线,非实测。

一次跑了两遍的提交

先从故障讲起,因为它点明了整章的主题。一个运行框架向模型发出 prompt,模型请求运行 git commit,沙箱执行、提交落地,紧接着运行框架就在副作用触发与其记录抵达持久存储之间的那个窗口里崩溃了。恢复时读到的是最后一个持久状态,也就是提交之前的状态,于是智能体重放:它又发出同一条 git commit

cluster_recovery 恢复 prompt 运行框架向 LLM 发出 prompt tooluse tool_use: sandbox_exec("git commit -m 'feat'") prompt->tooluse exec gRPC Exec("git commit ...") tooluse->exec ok OK(提交已创建) exec->ok crash ✕ 运行框架在此崩溃 ok->crash notpersist 事件未被持久化 crash->notpersist getsession GetSession notpersist->getsession 恢复 laststate 最后已知状态(提交前) getsession->laststate replay 从最后检查点重放 laststate->replay reissue 重新发出同一条提交 replay->reissue dup ✕ 重复提交或报错: nothing to commit, working tree clean reissue->dup
图 39.2. 在副作用与持久化之间崩溃,会使重放重新发出一次非幂等的提交,这是意图与结果之缝隙最纯粹的形式。

这不是什么稀奇的边缘情况。一个运行框架必须能承受四种常规事件中的任意一种:运行框架崩溃、副本重新调度、沙箱丢失,或者用户在数天后恢复一次会话。对一个长时间运行的智能体来说,这些全是正常运转区间,而已有报告称智能体的重试率在 15% 到 30% 之间,这让上面那种重放成了一个必须专门设计的常态,而非偶发意外 (Fast.io 2025)。它暴露出的核心困难,在于一个副作用和它的提交之间的缝隙。一份持久日志先记录意图(「调用 git commit」),再分开记录结果(「提交成功」)。一旦运行框架在这两次写入之间崩溃,恢复就会重新发出该操作。对幂等操作来说,这无害。可对非幂等操作,比如第二次提交、一张重复的工单、一笔重复的付款,存储和外部世界就会无声地分叉,而日志里没有任何东西能表明这件事发生过。

承受这些事件,意味着把状态写进一个持久存储,而难题不在于状态放哪里,而在于记录什么。智能体留下的状态有三种形态,失败的方式也各不相同。会话日志是追加式的意图,它的典型故障就是上面那道意图与结果之间的缝隙。工作区是可变的沙箱状态,它的故障是持久性:一块无法跨可用区边界跟随 pod 的卷,一次间隔太长的快照。长期记忆是那个存在时间超过会话、经整理且可检索的存储,它的故障是租户归属:一次跨越用户边界的检索,不是一个错误答案,而是一次数据泄露。三者共享一组很小的操作契约,即追加、读取、快照、fork,但这些操作落在形态并不统一的状态上。设计上的纪律,在于如实交代每个存储保证什么。分析这三个存储时,核心问题始终相同:每个换来了什么,又拒绝了什么。

会话日志:记录一步的三种办法

会话日志可以有三种建法,它们之间有意义的区别,在于相对副作用各自记录什么,这就决定了意图与结果之间的缝隙落在哪里。图 39.3 把这三种都放到同一条轴上看。

durability cluster_log 追加式事件日志 cluster_step 持久步日志 cluster_fs 文件系统即状态 a_intent 记录意图 a_effect 运行副作用 a_intent->a_effect a_result 记录结果 a_effect->a_result a_gap 缝隙敞开:崩溃时 意图与结果无从区分 a_effect->a_gap b_intent 记录意图 b_bound 持久步边界 b_intent->b_bound b_effect 运行副作用 b_bound->b_effect b_gap 缝隙闭合:重放追问 这一步是否已完成 b_bound->b_gap b_result 记录结果 b_effect->b_result c_fs 文件系统才是真相 progress.md, plan.md c_log 事件日志降格 为次要的意图 c_gap 缝隙挪位:git push、 MCP 游标仍在文件系统之外 c_fs->c_gap
图 39.3. 三种持久性模型在相对副作用记录什么上各有不同,这决定了意图与结果之缝隙落在何处。

追加式事件日志把每一条用户消息、模型响应、工具调用和工具结果都写进一个持久存储。日志是唯一的恢复产物:任何副本都能靠重放它来服务任何会话。这换来的是可重放、可审计,以及与传输无关的恢复,而它也正是把意图与结果之缝隙以最纯粹形式暴露出来的模型。仅从日志看,「请求过但从未运行」和「运行过但从未被记录」是一回事:一次没有结果的工具调用。这正是开篇那次崩溃踏进去的缝隙。

持久步日志靠在意图和结果之间加入第三条记录来弥合这道缝隙:一道在副作用执行之前就写下的持久步边界。重放会跳过任何结果已经持久化的步,于是「我们请求做 X」和「X 已完成」成了两个分开、各自持久的事实,重放可以追问「这一步是否已经完成?」,而不是默认它没完成。这就是持久执行框架最终选定的答案,而它的演化值得一追。基础事件日志给了可重放性,却把意图和结果含混在了一起。Restate (Ewen et al. 2025)、Temporal (Davis 2025) 和 Inngest (Poly 2026) 把每一步记账、运行副作用、再记录其结果,把事件日志含混带过的那个区分形式化了。Temporal 自己的说法是,LLM 的概率性行为使得基础重试逻辑不够用,而这恰恰是持久记账要应对的情形 (WorkOS 2025)。到 2025 年,这套做法已进入主流:AWS Lambda durable functions、Cloudflare Workflows 和 Vercel 的 Workflow DevKit 都把 AI 智能体用例作为首要定位发布 (Poly 2026)。这种模式不再是某个框架特有的了。

文件系统即状态模型走向相反的极端:工作上下文是临时的,而文件系统才是任务状态的唯一权威记录 (Zhou and others 2026)。事件日志降格为一份次要的意图日志;文件系统持有真相,通常是借一种由智能体维护的、有主张的约定(progress.mdplan.md)。对任何文件系统能表示的东西,这都绕开了意图与结果之间的缝隙,文件要么有新内容、要么没有,但它只是把缝隙挪了个位置,并没有消除它:一次 git push、一次外部 API 调用、一次 MCP 服务端游标推进,仍然在文件系统的触及范围之外。

从列表到树

会话日志记录的是步,但它的形态与其持久性是分开演化的。一份线性的追加式日志把会话当作一个列表,要回退就只能从头来。生产环境的运行框架早已走过了这一步。回退与截断会跳回某个检查点、丢弃尾部,并把工作区一并回滚以匹配,正如 Claude Code 的 /rewind (Anthropic 2025) 和 Cursor 的逐次编辑检查点 (Cursor 2025)。可 fork 的树走得更远:从任意检查点拉出多条同时存活的分支,全部保留。LangGraph 的时间旅行模型把检查点当作一张带显式分支 ID 的 DAG (LangChain 2025),Claude Code 的 /fork 从一个共享的历史点派生出一个子会话 (Anthropic 2025),Replit Agent (Replit 2025) 和 OpenAI 的 Codex CLI (OpenAI 2026) 也各自交付了自己的变体。会话不再是一个列表,而成了一棵树,或者至少是一份带可移动头指针的日志。这棵树建起来之所以便宜,只因为对话状态是一种指针结构,而下一节里工作区会打破这个假设。

工作区:部分持久,分支昂贵

工作区是沙箱那个可变的文件系统。它活得比单次工具调用更久,却不在持久日志上,正是这个区别带来了两种会话日志没有的故障。

工作区持久化只是部分持久,而非完整恢复。 让工作区跨过 pod 生命周期事件,有它自己的一套故障模式。常见的 Kubernetes 模式是在 /workspace 挂载一个 PersistentVolumeClaim;最主要的故障是可用区作用域。一个 ReadWriteOnce 的 PVC 由一块按可用区划分的块设备支撑,这块设备只能在它自己所在的可用区内物理挂接,所以当 pod 跨可用区重新调度时,卷无法跟随,恢复只能退回到一次完整的重新引导 (Rack2Cloud 2026; Kubernetes 2023)。当 pod 被有意销毁时(拆解、超时、缩容),PVC 往往会随之被删除,未提交的工作就没了:Gitpod issue #9544 是典型,一次工作区超时在最终同步完成之前触发,一位用户损失了大约两小时的工作 (Gitpod 2022)。另一条路,即按一定节奏给完整状态打检查点,会把快照频率和存储开销直接放在天平两端,而频率这个控制参数很关键,因为它设定了一次崩溃所能抹掉的工作量上限。Replit 的快照引擎把文件系统与对话上下文一并捕获,并报告称能从每小时一次的 OOM 崩溃中恢复而不丢数据 (Replit 2025; Replit 2025)。任何声称「会话可无限期存活」的设计,都欠一份明确的交代:它覆盖了哪些故障模式,又不覆盖哪些。

改一下下面的快照间隔,看那两条曲线朝相反方向移动:快照打得越密,崩溃时抹掉的工作越少,但写入也越频繁。

import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(0)
intervals = np.array([1, 2, 5, 10, 15, 30, 60])  # 两次快照之间的分钟数
trials = 20000
lost = []
for iv in intervals:
    crash = rng.uniform(0, iv, trials)  # 该间隔内的崩溃时刻
    lost.append(crash.mean())           # 自上次快照以来的工作量,以分钟计
lost = np.array(lost)
writes = 60 / intervals                 # 每小时快照写入次数
for iv, l, w in zip(intervals, lost, writes):
    print(f"每 {iv:2d} 分钟: 约损失 {l:4.1f} 分钟,每小时 {w:5.1f} 次写入")
fig, ax1 = plt.subplots()
ax1.plot(intervals, lost, "o-", color="#c0392b", label="期望损失工作量(分钟)")
ax1.set_xlabel("快照间隔(分钟)"); ax1.set_ylabel("损失工作量(分钟)")
ax2 = ax1.twinx()
ax2.plot(intervals, writes, "s--", color="#2980b9", label="每小时写入次数")
ax2.set_ylabel("每小时快照写入次数")
fig.legend(loc="upper center"); plt.show()

给对话开分支便宜,给工作区开分支昂贵。 给对话状态分支是一次指针操作:日志是一棵事件 ID 的树,fork 一棵树很便宜。给工作区分支就不是了,因为工作区是一个真实的文件系统,两条分支不可能都拥有它。

CK 检查点 B1 分支 A:对话 CK->B1 B2 分支 B:对话 CK->B2 W 工作区 / 沙箱状态 CK->W C 共享还是克隆? W->C RACE 分支相互干扰 C->RACE 共享 COST 每次 fork 的克隆代价 C->COST 克隆
图 39.4. 给对话状态分支是一次廉价的指针操作,而共享工作区则逼出一个二选一:要么分支相互干扰,要么每次 fork 都付克隆代价。

图 39.4 所示,这个选择收缩成一道两难:共享工作区的 fork 会在它上面竞态,分支 A 的写入对分支 B 可见;而克隆工作区的 fork 要付克隆代价。由此引出三种故障模式。一条分支无法 fork 它所触及的外部系统,git 远端、问题追踪器、MCP 游标都不行,于是可分支的状态和不可分支的状态会渐行渐远。合并回去则是结构性未解的:文件在检查点处有一个共同祖先,所以三方合并适用,但两段分叉的对话没有合并基点,因为其内容是一条推理轨迹,不是可编辑的行,这正是为什么文件合并必须由智能体而非运行框架来解决。而孤儿分支会持续占用工作区和会话日志资源,直到某个 TTL 把它们回收,所以一旦没有 TTL,这种泄漏就会无声地累积。单凭回退就足以应付交互式编码;可 fork 的树,则在用户并行探索多个备选方案、或一条评估流水线用改过的 prompt 重放一次会话时才划算。

下层约束

分支与快照是便宜还是毁灭性的,由下面一层、由存储基底而非运行框架决定。PVC 没有原生的廉价克隆原语,所以一次在 PVC 上的 fork 必须复制整个工作区。写时复制覆盖层和内容寻址快照只复制分叉出去的块,所以一次 fork 的代价就是分叉出去的那部分。Firecracker 快照把整个 microVM 序列化,并在数十到数百毫秒内复原 (Amazon Web Services 2025),这让逐次 fork 快照变得负担得起,而同样的事在 PVC 上会是毁灭性的。克隆代价由基底而非运行框架来界定,于是上面一层的会话树特性,究竟是被下面做出的一个存储选择所启用,还是被它定价淘汰。

长期记忆:因可检索而有用,也因同一属性而危险

一次会话受上下文压缩所界定(第 35 章):上下文窗口被填满、被摘要,早先的回合落到模型够不着的地方。所以,一个本该跨数周认识某个用户的智能体,不能只靠上下文窗口。它需要一个独立的存储,持久且可查询,由运行框架按需加载进上下文。那个存储就是记忆,它是一个独立于会话日志的系统:日志是追加式的意图,记忆则是经整理、可检索的。

记忆的形态

记忆有一种值得点名的结构。短期记忆是单次对话内的会话上下文。长期记忆分为情景记忆(过去的交互)、语义记忆(关于用户或领域的事实)和程序记忆(学到的工作流)。外部知识,即检索增强生成(第 44 章)背后的语料和知识图谱,与之并列,却是另一回事:记忆是按用户的、经整理的、可写的,而 RAG 是从一个智能体并不拥有的共享语料里检索。

cluster_short 短期 cluster_long 长期 cluster_external 外部知识 ST 会话上下文 单次对话内 EM 情景记忆 过去的交互 SM 语义记忆 关于用户或领域的事实 PM 程序记忆 学到的工作流 RAG RAG 索引 文档、工单、代码 KG 知识图谱 实体、关系
图 39.5. 记忆分为短期与长期(情景、语义、程序),不同于 RAG 所检索的那种共享的外部知识。

最底层是向量存储加嵌入检索:每一条记忆都被转成一个向量(一串能刻画其语义的数字),存下来,再通过寻找与查询最接近的那些向量来召回。Pinecone (Pinecone 2025)、pgvector (pgvector 2025) 和 Chroma (Chroma 2025) 是有代表性的基底。在它们之上是有主张的记忆框架,Letta (Letta 2025)(MemGPT (Packer et al. 2023) 的继任者)、Zep (Zep 2025) 和 Mem0 (Chhikara et al. 2025),由它们来决定写什么、何时写、怎么压缩。知识图谱显式地建模实体与关系,适合组合式查询,但更难自动填充;而时序知识图谱加上了时间维度,使一个事实可以在一段时间内有效、然后被取代。

这个品类的到来方式和另外两个存储一样,是一个研究产物固化成了一个产品。MemGPT (Packer et al. 2023) 把 LLM 刻画成一个操作系统,在一个有界上下文里把记忆换进换出,而它的继任者 Letta (Letta 2025) 把那变成了一个托管原语。Zep (Zep 2025) 在一个时序知识图谱上构建记忆,Mem0 (Chhikara et al. 2025) 则为低延迟和 token 成本做了优化。这个品类还很年轻,年轻到它的基准仍有争议。

如今已成主流的另一条路,是完全绕开索引,把记忆存成普通文件,让智能体用它平时的工具去读写。Anthropic 的记忆工具给模型一个 /memories 目录,供它跨会话查看、创建与编辑,每一次文件操作都由应用侧在客户端执行 (Anthropic 2025);编码智能体里的 CLAUDE.md 惯例,是同一个想法的手工版本。召回从相似度查询变成一次智能体式的读取或 grep,整理从框架的写入策略变成模型自己动手编辑。本章收尾要谈的几笔权衡也随之改变:文件记忆不用押注任何嵌入模型,因此没有重建索引的悬崖;按租户划分的目录可以直接翻查、直接删除;代价则是能召回的只有智能体当初想到要写下、后来又想到去读的那些东西。

争议所在

跨厂商的记忆基准还不可信。Mem0 报告称在 LOCOMO 上相对 OpenAI memory 有 26% 的 LLM-as-Judge 提升 (Snap Research 2024),并伴有大幅的延迟与 token 成本下降 (Chhikara et al. 2025)。Letta 的反向基准报告了一个更高的 LoCoMo 分数,但方法论存有争议 (Letta 2025)。Zep 则报告称其时序知识图谱在另一个基准上领先 (Zep 2025)。这些厂商在指标、数据集划分、基线上都不一致,所以在被独立复现之前,把任何跨厂商的记忆基准都当作有争议的来看待。有用的信号是这笔交易的形状,即召回质量对延迟与 token 成本的权衡,而不是那个头条数字。

记忆不保证什么

记忆是在成本与简单之间、在写时安全与读时便利之间做权衡。记忆要么被环境式地加载进每一个 prompt(简单、昂贵),要么作为一个工具暴露出来由智能体按需查询(更便宜、扩展性更好,但智能体得知道何时该问)。更换嵌入模型会使现有索引失效,逼出一次昂贵的重建索引,所以嵌入的选择是一项长期承诺。

最关键的权衡是租户归属,它正是使一个共享向量存储成为数据泄露风险、而非相关性 bug 的原因。让记忆有用的那个属性,即被检索到的内容直接落进模型的上下文,同时也让它变得危险,因为那内容与用户或运行框架放进去的指令无从区分。针对一个共享向量存储、又没有强制租户过滤的 top-k 相似度查询(取回存储中与查询最接近的 k 个向量),可能返回另一个租户的数据,而防御必须住在索引里,不能放在应用代码里。要在写入时分区,按租户分命名空间、用 pgvector 的行级安全或独立 schema,使一次查询在物理上就无法触及另一个租户的向量。给每个分块都打归因、在查询之后再过滤是较弱的做法,因为读时过滤离一次泄露只差一个 bug,而写时分区是失败即关闭的。这正是记忆最直接地消费身份模型的地方(第 56 章):租户归属来源于身份,而分区把它强制落地。

第二种租户风险是记忆特有的,在会话日志里没有对应物:由于智能体根据用户消息写记忆,一个恶意用户可以精心构造消息,植入持久的错误信息。这是提示注入问题被搬进了记忆存储,并在那里跨会话存活。一条被错误检索或被投毒的记录落进 prompt,以难以调试的方式改变智能体的行为,因为追踪显示检索是成功的:被注入的文本不是一个错误,它是对错误内容的一次正确检索。

第一次崩溃之前就要定下的两个属性

下面这两个属性,在恰恰最糟的那一刻之前都看不见,这就是为什么它们属于设计,而不属于事后复盘。

第一个是对账缺口,也就是开篇那次崩溃的运维形态。如果沙箱持有持久日志之外的可变状态,运行框架在恢复时就必须把两者对账。对幂等操作,这无所谓;操作运行一次还是两次,结果都一样。对非幂等操作,向文件追加、给计数器加一、创建一次提交、调用一个有副作用的 API,运行框架就需要一道步日志边界,或一把穿过工具的幂等键。日志在副作用触发之前记下该步的意图和它的键;重放时,运行框架会针对这把键执行 check-then-act,或者针对外部系统自身的去重、git 的 ref 状态、支付处理商的幂等头去做,而不是盲目地重新发出。步日志本身并不能让外部副作用变得幂等,它提供的是把它们做成幂等的接口。

# 以幂等键标识的步,概念示意。
def run_step(journal, key, effect):
    if journal.has_outcome(key):     # 重放:跳过一个已完成的步
        return journal.outcome(key)
    journal.record_intent(key)       # 在副作用之前的持久边界
    result = effect()                # 非幂等的副作用
    journal.record_outcome(key, result)
    return result

第二个是删除的触及范围。一个删除权请求必须级联到每一个持有该用户数据的存储,而记忆往往是最棘手的一类:框架托管的记忆可能根本不暴露删除 API,于是一个为召回质量而选的存储,会悄悄变成一个删不掉的存储。写时分区在这里也有帮助,因为一个按租户的命名空间是一个可以整体丢弃的单位。更广的审计与合规机制,防篡改日志、数据驻留、那些监管制度,留到 第 56 章 再谈;记忆特有的义务,是让每一条记录都可归因到某个租户、并可按租户删除。

至于记忆存储本身,基础实现是一个向量索引(在既有 Postgres 里的 pgvector (pgvector 2025) 是运维开销最低的默认;当值得用一个专用存储时,再上 Pinecone (Pinecone 2025) 或 Chroma (Chroma 2025)),外面或者套一个管理写入与压缩策略的框架(Letta (Letta 2025)、Zep (Zep 2025)、Mem0 (Chhikara et al. 2025)),或者在策略简单到可以自己拥有时,套一层很薄的自定义层。运行框架(第 41 章)就是把结果加载进上下文的那个,或环境式地、或经由一个检索工具,把这条回路接回那个被记忆延长的会话。

延伸阅读

  • Fast.io, “AI Agent Reliability Report 2025,” 2025. fast.io
    一份面向开发者的指南,阐述 AI 智能体为何必须使用幂等操作(原子写入、幂等键、文件锁),以防止重试时发生数据损坏和重复副作用。
  • Ewen et al., “Durable AI Loops: Fault Tolerance across Frameworks,” 2025. restate.dev
    Restate 的持久执行机制将智能体循环封装为可容错、可恢复、具备可观测性和人机协作能力的工作流,兼容任意智能体 SDK 而无需框架绑定。
  • Davis, “Durable Execution meets AI,” 2025. temporal.io
    Temporal 的持久执行模型满足 LLM 驱动的智能体应用的所有核心可靠性需求,因为智能体本质上是需要应对瞬时故障的分布式系统。
  • Poly, “Durable Execution: The Key to Harnessing AI Agents in Production,” 2026. inngest.com
    Inngest 博客文章,阐述持久化执行(durable execution)作为一种在故障中保证代码完成的编程模型,是在生产环境中可靠运行 AI 智能体的关键基础设施原语。
  • WorkOS, “Maxim Fateev on Durable Execution for AI Agents,” 2025. workos.com
    WorkOS 对 Temporal 联合创始人 Maxim Fateev 的访谈,阐述持久化执行对 AI 智能体工作流可靠性的重要性。
  • Zhou & others, “Externalization in LLM Agents: A Unified Review of Memory, Skills, Protocols and Harness Engineering,” 2026. arXiv:2604.08224
    本综述以"外化"为统一原则解释大语言模型(LLM)智能体设计,将记忆、技能与协议视为认知制品,将模型负担转移至持久化外部基础设施,由协同层(harness)统一协调。
  • Rack2Cloud, “Kubernetes Day 2 Failures: 5 Incidents and the Metrics That Predict Them,” 2026. rack2cloud.com
    一篇实践指南,列举五种常见 Kubernetes Day 2 故障模式,并为每种模式给出一个可提前预警的关键指标。
  • Kubernetes, “PVC Binding Prevents Pod Rescheduling,” 2023. github.com
    Kubernetes 缺陷报告:Pod 在绑定阶段调度失败后,其 PVC 和 PV 仍保持与节点绑定,导致该 Pod 永久卡在 Pending 状态无法重新调度。
  • Gitpod, “Data loss when workspace timeout fires before sync completes,” 2022. github.com
    该 GitHub issue 报告了 Gitpod 工作区在超时后 pod 进入终止状态时数据丢失的问题,根本原因是工作区活跃期间未将数据及时同步到存储账户。
  • Replit, “Inside Replit's Snapshot Engine,” 2025. blog.replit.com
  • Replit, “Finding and Solving Memory Leaks,” 2025. blog.replit.com
  • Anthropic, “Claude Code: Checkpointing and Session Forks,” 2025. code.claude.com
    Claude Code 检查点(checkpointing)参考文档,介绍如何追踪、回退和汇总 Claude 的文件编辑与会话状态。
  • Cursor, “Checkpoints in the Agent Workflow,” 2025. stevekinney.com
    Cursor 在每次 AI 智能体编辑前自动对代码库状态创建快照,以独立于 Git 的本地临时检查点存储,供用户回滚不期望的变更。
  • Replit, “Checkpoints and Rollbacks,” 2025. docs.replit.com
    Replit 的 Checkpoints and Rollbacks 文档介绍了 Replit Agent 如何在开发里程碑处自动保存项目快照,支持一键还原完整项目状态与 AI 对话上下文。
  • LangChain, “LangGraph Time Travel and Branching,” 2025. docs.langchain.com
    LangGraph 的时间旅行功能允许用户重放过去的图执行记录,并从任意历史检查点分叉以探索不同的执行路径。
  • OpenAI, “Codex CLI: Conversation and Code-Reverting Rewind,” 2026. github.com
    该 GitHub issue 请求在 openai/codex CLI 中增加 /rewind 命令,能够将对话历史与 Codex 所做的文件编辑同步回退至指定检查点。
  • Amazon Web Services, “Firecracker Snapshotting,” 2025. github.com
    Firecracker 的快照支持文档说明如何将运行中的 microVM 序列化到磁盘并通过 MAP_PRIVATE 按需加载内存来恢复,从而实现快速工作负载克隆与恢复。
  • Ustiugov et al., “Benchmarking, Analysis, and Optimization of Serverless Function Snapshots,” 2021. arXiv:2101.09355
    本文介绍了开源无服务器实验框架 vHive 和 REAP 记录-预取机制,通过工作集预取将基于快照的冷启动延迟降低 3.7 倍。
  • Pinecone, “Pinecone: Managed Vector Database for AI,” 2025. pinecone.io
    Pinecone 是一个托管向量数据库服务,为构建 RAG 管道和 AI 应用提供低延迟相似度检索与元数据过滤能力。
  • pgvector, “pgvector: Open-source Vector Similarity Search for Postgres,” 2025. github.com
    pgvector 是一个开源 PostgreSQL 扩展,直接在 Postgres 中提供向量相似度搜索和近邻检索能力。
  • Chroma, “Chroma: Open-source Embedding Database,” 2025. trychroma.com
    Chroma 是开源 AI 搜索基础设施,基于对象存储提供向量、全文、正则及元数据搜索,采用 Apache 2.0 许可。
  • Letta, “Letta: Stateful Agents with Memory as a First-Class Primitive,” 2025. letta.com
    Letta 是一家 AI 研究机构与产品平台,致力于构建具备持久记忆、持续学习和自我改进能力的有状态智能体,源自 MemGPT 项目。
  • Packer et al., “MemGPT: Towards LLMs as Operating Systems,” 2023. arXiv:2310.08560
    MemGPT 提出虚拟上下文管理方案,借鉴操作系统分层存储思想,在大语言模型(LLM)固定上下文窗口与外部存储之间分页调度数据,实现文档分析与多轮对话中的无限上下文。
  • Zep, “Zep: Temporal Knowledge Graph for Agent Memory,” 2025. getzep.com
    Zep 是面向企业的智能体记忆平台,通过时序上下文知识图谱(Graphiti)存储并追踪事实随时间的变化,在 200 ms 内向智能体提供检索结果。
  • Chhikara et al., “Mem0: Building Production-Ready AI Agents with Scalable Long-Term Memory,” 2025. arXiv:2504.19413
    Mem0 是一种可扩展的智能体长期记忆架构,通过动态提取、整合和检索跨会话关键事实,在 LOCOMO 基准上比全上下文方法获得 26
  • Snap Research, “LOCOMO: Long-Term Conversational Memory Benchmark,” 2024. snap-research.github.io
    LoCoMo 是一个通过问答、事件摘要和多模态对话生成任务评测大语言模型(LLM)智能体超长期对话记忆能力的基准。
  • Letta, “Benchmarking AI Agent Memory,” 2025. letta.com
    Letta 智能体仅用文件系统工具在 LoCoMo 基准上以 gpt-4o-mini 达到 74.0

评论

登录后评论