2026年7月5日 · 深度技术分析
导语
2026 年 5 月,BabyAGI 创始人 Yohei Nakajima 在 arXiv 发表了一篇题为 "The Log is the Agent: Event-Sourced Reactive Graphs for Auditable, Forkable Agentic Systems" 的论文,提出了 ActiveGraph 运行时。其核心主张极具颠覆性:
追加式事件日志不应是调试的副产品,而应是 Agent 本身的底层基质。
在传统架构中,Agent 是"围绕语言模型构建的"——先有一个对话循环,再添加工具、规则、护栏,最后补上一个日志层用于可观测性。ActiveGraph 彻底反转了这一安排:日志是唯一的事实来源,工作图是日志的确定性投影,所有行为都对图的变化做出反应。
这不是一个性能优化,而是一种架构范式的转换。
一、核心思想:日志即本体
1.1 传统架构的问题
传统 Agent 架构的目标、规则、工具调用、输出内容分散在不同系统中:
| 数据类型 | 存储位置 |
|---|---|
| 目标 | Prompt 中 |
| 规则变更 | 代码或配置文件中 |
| 工具调用 | 框架内部状态 |
| 痕迹/转录 | 日志文件中 |
| 持久化输出 | 数据库中 |
这些分散的、不同质的数据使得一个基本问题难以回答:"Agent 在修改规则 R 之前相信什么?" 在传统架构中,这个问题几乎不可能回答。
1.2 ActiveGraph 的反转
ActiveGraph 将所有这些——目标、规则变更、工具调用、产出内容、关系链接——坍缩为一种单一基质:事件。
核心设计原则:
- 日志是唯一的事实来源(source of truth)
- 工作图(working graph)是日志的确定性投影
- 行为(behaviors)对图的变化做出反应,并将新事件写回日志
- 没有任何组件直接指令另一个组件——协调完全通过共享图完成
这意味着:Agent 的瞬时状态被转换为持久、可检查、可重放的人工制品。
二、技术实现:事件溯源与反应式图
2.1 事件格式
每个事件携带以下字段:
{
"id": "evt-uuid",
"type": "object.created",
"payload": { ... },
"actor": "behavior-name",
"caused_by": "evt-parent-uuid",
"timestamp": "2026-05-21T10:00:00Z"
}
所有对象创建时都携带 provenance(出处)块,记录创建它的 behavior 和触发事件——没有任何东西是在没有可追溯来源的情况下被创建的。
2.2 图投影与重放
- 图状态从不被外部代码直接修改,它仅通过向前折叠(folding)事件日志来计算
- Replay(重放) 是核心操作:加载运行、分叉运行或验证运行都调用同一底层重放操作
- 确定性保证:同一日志的两次重放产生确定性的相同状态
2.3 行为(Behaviors)与反应式数据流
Behavior 是一种"反应"。它声明一个订阅:
- 事件类型
- 可选谓词
- 用 Cypher 子集表达的图形状模式
当匹配的变更落在图上时,运行时触发 behavior 主体,提供触发事件、图视图和上下文句柄。
Behavior 主体有四种形式:
- 普通函数
- 类(用于携带配置的 behavior)
- LLM-backed routine(其请求和响应本身也是日志事件)
- Relation-behavior(附加在类型化边上的逻辑)
2.4 确定性契约
因为状态是日志的折叠,replay 只有在 behavior 主体是其输入的确定性函数时才可靠。运行时强制一个契约:
- behavior 不能直接读取随机数、挂钟时间或新鲜 UUID
- 不能在框架的工具和模型原语之外执行 I/O
- 不能依赖跨触发变化的 mutable global state
关于 LLM 的特例:模型调用本身不是确定性的。框架不要求它在首次执行时满足契约——调用实时发出,响应被记录为事件;契约适用于 replay,此时从缓存中提供已记录的响应。
2.5 重放缓存
模型响应通过完整请求的哈希(包括系统消息、用户消息、模型标识符、工具定义、输出模式)进行键控。Replay 时,匹配请求从缓存获取存储的响应,不执行新的模型调用——这意味着分叉运行的共享前缀不产生额外的 API 成本。
2.6 Fork 与结构差异
- Fork:在任意选定事件处分支运行。分叉继承父日志到该点的全部内容,从缓存重放共享前缀,仅为分叉点之后的内容支付实时执行成本
- 结构差异(structural diff):比较两次运行之间哪些对象、关系、补丁发生了变化
三、与传统架构的对比
| 属性 | 传统 Agent 循环 | 记忆层系统 | ActiveGraph |
|---|---|---|---|
| 跨会话持久状态 | 部分支持 | 是 | 是 |
| 溯源:为何此事实在上下文中? | 否 | 部分 | 完全 |
| 确定性状态重建 | 否 | 否 | 是 |
| 从历史重放完整运行 | 否 | 否 | 精确重放 |
| 在任意点分叉运行 | 否 | 否 | 是 |
| 共享前缀的分叉成本 | 重新执行 | 重新执行 | 缓存复用 |
| 两次运行间的结构差异 | 否 | 否 | 是 |
四、适用场景与局限性
4.1 适用场景
论文特别强调该架构适用于:
- 尽职调查、研究、合规、科学工作、金融、法律工作——任何"推理过程与答案同等重要"的场景
- 企业工作流自动化——需要可审计、可解释的结果
- 长周期运行(long-running agents)——需要跨会话的连续性
- 自改进 Agent——当规则变更、prompt 变更、工具变更本身也是日志事件时,它们可以被重放、分叉、比较和回滚
4.2 局限性
论文自身明确指出了以下局限:
- 非实证性论文:不声称提高了任务准确性、速度、成本或用户结果。贡献在于底层基质及其保证
- 确定性契约的负担:开发者必须主动避免未管理的随机性。契约是动态检查的,而非静态强制
- 存储开销:模型和工具响应被记录以使 replay 确定性——存储随运行规模增长
- 协调并未消失,只是转移:反应式图仍可能循环、发散或触发过多工作
- 副作用工具的回放问题:记录工具响应使 replay 确定性,但不会撤销首次执行时对真实世界的改变(如发送邮件、更新 CRM)
- 分布式排序未解决:单一追加日志在单次运行内提供清晰的顺序,但多 Agent 系统并发写入共享图会提出更困难的问题
五、我的观点:Agent 架构的"数据库时刻"
5.1 从"命令式"到"声明式"
ActiveGraph 的核心洞察与数据库领域的"事件溯源"(Event Sourcing)异曲同工。传统数据库是命令式的(直接修改状态),事件溯源是声明式的(只追加事件,状态是事件的投影)。
Agent 架构正在经历类似的转变:
- 命令式:直接调用工具、修改状态、生成输出
- 声明式:记录事件,让行为对事件做出反应,状态自动更新
这种转变的价值不在于单次运行的效率,而在于系统的可理解性、可审计性和可演化性。
5.2 "可分叉"是 Agent 的新超能力
ActiveGraph 的 Fork 能力可能是其最具实践价值的设计:
- A/B 测试不同 prompt:在相同前缀下分叉,测试不同指令的效果,共享前缀不产生额外成本
- 错误诊断:在出错事件前分叉,逐步调试 behavior 的触发条件
- 规则变更的回溯:"如果我在第 42 步走了另一条分支会怎样?"——在传统架构中不可能,在 ActiveGraph 中只是对日志的重新投影
5.3 为什么现在提出这个架构?
Agent 正在从"一次性对话工具"演变为"长期运行的自治系统"。当 Agent 需要运行数天、数周甚至数月时:
- 中断和恢复成为常态
- 审计和合规成为必需
- 可解释性成为信任基础
ActiveGraph 正是为这种场景设计的。它不是"更快的 Agent",而是"更可信的 Agent"。
5.4 生产落地的挑战
论文没有回避挑战:
- 存储规模:百万级事件的日志需要 checkpointing 和 compaction 策略
- 分布式并发:多 Agent 共享图的写入顺序问题尚未解决
- 确定性契约的维护:需要开发者纪律和框架支持
这些挑战意味着 ActiveGraph 的成熟落地还需要时间。但它指明了一个方向:Agent 的可信度将越来越依赖于其底层架构的可审计性,而非单纯的模型能力。
免责声明
本文仅供技术研究和教育目的,内容基于 Yohei Nakajima 的 arXiv 论文、ActiveGraph 官方文档及社区技术解读。本文所有技术分析均以系统架构研究和行业分析为导向。读者应遵守所在国家/地区的法律法规,仅将本文内容用于合法合规的研究和学习用途。
参考资料
- Nakajima, Yohei. (2026). The Log is the Agent: Event-Sourced Reactive Graphs for Auditable, Forkable Agentic Systems. arXiv:2605.21997
- ActiveGraph 官方文档:docs.activegraph.ai
- Antoine Buteau:Agent Logs Should Be the System of Record
浙公网安备 33010602011771号