AI agent Session Store 设计:把上下文、事件和恢复能力放进 append-only session log

HTMLPAGE 团队
17 分钟阅读

AI agent 一旦进入长任务和多进程执行,session 就不能只是聊天记录。本文讲清 append-only session log、event slice、恢复查询、事实记录和失败补偿,帮助你把会话做成真正可恢复的系统基座。

#AI agent #Session Store #Event Log #工程实践

很多团队第一次做 AI agent,会把“session”理解成一段聊天历史。这样在 demo 阶段几乎没有问题,因为一个进程、一个上下文窗口、一次短任务,确实还能靠内存和对话记录撑住。

但只要系统进入真实环境,问题马上变样:任务会跨天、会切换 harness、会调用外部工具、会写文件、会等待回调、会被人工审批打断。到了这个阶段,session 再只是聊天记录,系统就会失去两个关键能力:恢复和解释。

真正的 Session Store,本质上不是“把消息存起来”,而是把一次 run 里发生过的关键事实写成可切片、可回放、可恢复的 append-only event log。建议先结合 AI Agent Session Replay 调试指南AI agent Checkpoint 与断点恢复AI agent Run Ledger 审计模型AI agent Harness 崩溃恢复与 Wake 流程 一起看。

把 session 留在容器里,系统就会长出“宠物”

最危险的设计,不是没有 session store,而是把 session 状态绑在执行容器或单个进程里。因为一旦容器卡住、滚动重启、网络闪断或需要切到别的执行器,你失去的不是一条对话,而是整条任务链的上下文归属。

一个可用的 session store 至少要满足这 4 个条件:

能力为什么必须有
append-only故障复盘时不能靠覆写后的最终状态猜过程
durableharness 挂了以后状态还能被别的进程接着读
sliceable新进程需要按时间、事件类型、checkpoint 取局部上下文
redactable敏感字段需要在日志可用和隐私保护之间取得平衡

如果这 4 个条件缺一个,session 就很容易沦为“平时看着能用,出事时帮不上忙”的半成品。

Session 不是上下文窗口,它是一份可被查询的事实账本

上下文窗口服务的是当前这一轮推理;session store 服务的是整条执行历史。两者的职责不同,不能混在一起。

更稳的做法,是让 session 记录“事实事件”,而不是只记录“模型看过的文本”。一个最小事件集合通常包括:

  • 用户输入与系统决策入口
  • 工具调用请求、返回和错误
  • 状态迁移与审批节点
  • side effect 前后的确认记录
  • checkpoint、wake、retry 和 stop 相关事件

用结构化方式表达会更清楚:

{
  "sessionId": "sess_42",
  "eventId": "evt_203",
  "type": "tool_result",
  "runId": "run_9",
  "tool": "fetchCustomerProfile",
  "timestamp": "2026-05-12T09:43:12Z",
  "payloadRef": "blob://tool-result/evt_203",
  "redactionLevel": "masked"
}

这里最重要的不是字段多,而是让 session 能被不同消费者读取:harness 用它恢复,replay 用它复盘,审计系统用它核对,人工控制台用它解释“为什么现在停在这里”。

失败复盘:进程重启后,系统把已经发出的外部通知又发了一次

一个典型事故是这样的:agent 在第 7 步已经向外部系统发送了通知,但进程在写“完成状态”之前崩溃。重启后的新进程只看到了内存里未完成的任务快照,于是重新执行了一遍发送动作。

这个事故真正缺的不是“更聪明的模型”,而是 session store 里没有一条 durable 的 side effect 事实:通知是否已经发出、发给谁、对应哪个幂等键、是否拿到外部确认。

修复思路通常是三层一起补:

  • side effect 前先写 intention event
  • side effect 成功后写 committed event
  • wake 时优先根据 session 里的 committed 事实决定是否跳过重放

这样新进程不需要猜测“上一个进程做到哪了”,它直接查事实。

设计时最容易被忽略的,是查询接口而不是存储接口

很多团队会先设计 appendEvent(),但真正决定系统可恢复性的,往往是这些查询能力:

  • getEvents(sessionId, afterEventId)
  • getLastCheckpoint(runId)
  • getLastCommittedSideEffect(runId, effectType)
  • getContextSlice(sessionId, fromEventId, toEventId)

如果 session 只能“全量读出”,新进程恢复时不是太慢,就是会把无关噪音重新塞进上下文。可恢复系统依赖的不是“存下来了”,而是“能取出刚好需要的那一段”。

Session Store Checklist

  • session 是否被设计成 append-only event log,而不是可覆写状态对象
  • 关键事件是否包含 runId、event type、timestamp 和 redaction 信息
  • side effect 是否分成 intention 与 committed 两类事实
  • harness 重启后能否按 checkpoint 或 event slice 恢复,而不是全量重读历史
  • replay、审计和人工控制台是否共用同一份 session 事实源
  • 是否能对敏感 payload 做引用存储与脱敏展示
  • 查询接口是否支持 afterEventId、event type 和 side effect lookup

这篇真正想留下的判断

AI agent 的 session store,不该是“更长的聊天记录”,而应该是整个执行系统的事实底座。只要你的任务会跨进程、跨时间或跨环境运行,session 就必须先从“对话存档”升级成“可查询、可恢复、可审计的 event log”。

延伸阅读: