@yoheinakajima: babyagi 约有 ~200 次引用,但零篇论文……我刚刚在 arXiv 上发表了第一篇论文"The Log is the Agent: Event-Sourc…"

X AI KOLs Following 论文

摘要

Yohei Nakajima 发表了一篇论文,提出了 ActiveGraph,这是一个运行时系统,其中事件日志是真相来源,代理通过持久可重放状态进行协调,实现了可审计性、分叉和因果谱系。

babyagi 约有 ~200 次引用,但零篇论文……我刚刚在 arXiv 上发表了第一篇论文: "The Log is the Agent: Event-Sourced Reactive Graphs for Auditable, Forkable Agentic Systems" https://arxiv.org/abs/2605.21997 论证了代理通过持久可重放状态进行协调的模式——无需对话循环、工作流或A2A——内建了可审计性、分叉和因果谱系。 快去看看吧,告诉我你的想法!
查看原文
查看缓存全文

缓存时间: 2026/05/22 15:51

日志即智能体:基于事件溯源的响应式图系统,实现可审计、可分叉的智能体系统

BabyAGI 拥有约 200 次引用,但零篇论文……我刚刚在 arXiv 上发表了第一篇论文:

“日志即智能体:基于事件溯源的响应式图系统,实现可审计、可分叉的智能体系统”

https://arxiv.org/abs/2605.21997

核心论点:智能体通过持久化、可重放的状态进行协调——无需对话循环、无需工作流、无需 A2A——内置可审计性、分叉能力和因果溯源。

欢迎查看并告诉我你的想法!


日志即智能体

开源(Apache-2.0):https://github.com/yoheinakajima/activegraph。使用 pip install activegraph 安装,并通过 activegraph quickstart 复现工作示例。文档:https://docs.activegraph.ai 基于事件溯源的响应式图系统,实现可审计、可分叉的智能体系统 来源:https://arxiv.org/html/2605.21997

摘要

大多数智能体框架是围绕语言模型构建的:对话循环优先,然后是工具,再然后是规则,最后附加日志层用于可观测性,状态被持久化为可检索的“记忆”。我们描述了 ActiveGraph,一个颠覆这种安排的运行时。仅追加事件日志是事实的来源;工作图是日志的确定性投影;行为——普通函数、类、基于 LLM 的例程,或附加到类型化边上的逻辑——响应于图中的变化并发出新事件。没有组件指令另一个组件;协调完全通过共享图进行。这一单一设计决策带来了检索与摘要记忆系统无法提供的三个特性:从日志对任何运行进行确定性重放;廉价分叉,可在任意事件处分叉运行而无需重新执行共享前缀;以及端到端溯源,从高级目标追溯到产生每个人工制品的具体模型调用。我们介绍了架构、使重放可靠的确定性契约,以及一个完整的工作尽调示例,其完整因果结构仅从日志即可重建。我们讨论——但不声称演示——为什么此基板特别适合自我改进型智能体,以及它如何扩展 BabyAGI 系列和先前的图记忆研究。

1 引言

构建 LLM 智能体的主导模式是逐步累积。我们从聊天循环开始,因为对话是模型训练所面向的接口。当模型需要对世界采取行动时,我们添加工具。当行为偏移时,我们添加规则和护栏。在生产环境中,我们需要知道发生了什么,因此我们添加日志记录。我们还存储交互的某种压缩形式——摘要、嵌入、向量索引——以便智能体可以在不同轮次之间“记住”。在这种安排中,日志是一个副产品:与真实计算一起写入的审计工件,绝不是其基板。

本文描述了一个基于相反假设构建的运行时。如果日志不是副产品,而是智能体本身呢?具体来说:如果智能体遵循的规则(以及对这些规则的更改)、赋予它的工具及其调用、以及它产生的内容都是同一种东西——单个仅追加日志中的事件——并且智能体的行为不过是当该日志增长时触发并写回新事件的一组反应呢?

ActiveGraph 就是那个运行时。事件日志是事实的来源。行为读取和写入的图是日志的投影,通过保证确定性的重放操作重新计算。行为订阅事件和图模式的模式;当发生匹配更改时,行为触发,可能调用模型或工具,并将结果事实作为新事件发出。没有编排器在线程步骤间传递状态,也没有通常意义上的工作流——只有一组规则式的行为,有时因为一个行为的输出是另一个行为的触发条件而串联起来。

这是 BabyAGI[1] 的直接后代,它将智能体表达为一个在全局任务列表上的 while 循环:执行当前任务,对照目标总结,生成后续任务。ActiveGraph 将同一个循环重新表达为响应式行为在共享图上运作,从而将智能体的瞬时状态转换为持久、可检查、可重放的工件。

贡献。

这是一篇系统论文;其贡献是架构性的,而非关于任务性能的实证主张:

  1. 一个事件源智能体模型,其中图状态是仅追加事件日志的确定性折叠,所有智能体动作都表达为响应图变化并发出事件的行为(§2, §3)。
  2. 一个确定性契约和重放机制,使得任何运行时都可以从其日志中字节级重现,包括一个内容寻址缓存,记录模型和工具响应,使得重放不执行新的模型调用(§4)。
  3. 一个分叉和结构性差异原语,可以在任意事件处对运行进行分支,并在不重新执行共享前缀的情况下回答反事实的“如果我做了 X 会怎样”的问题(§5)。
  4. 一个完整且完全可重现的示例(投资尽职调查包),其中从目标到备忘录的整个因果链都可以从事件日志中恢复,展示溯源作为一等可交付成果(§6)。

我们谨慎说明我们不声称什么。我们不报告 ActiveGraph 在任务准确性上优于任何基线;贡献在于基板及其保证。我们在 §7 中讨论自我改进型智能体,仅作为该架构提供的一种可能性,而非我们评估的结果。

2 动机:围绕模型构建与围绕日志构建

考虑一个智能体的状态实际上包含什么。有目标。有它运行所依据的规则,这些规则可能在运行过程中发生变化。有可用的工具以及哪些工具调用了什么参数的记录。有对话或推理轨迹。还有智能体产生的一切。在传统架构中,这些存在于不同的地方:目标在提示中,规则在代码或系统消息中,工具调用在框架的内部状态中,轨迹在记录中,输出在数据库中,所有这一切的有损投影在按相似性查询的“记忆”存储中。

ActiveGraph 将这些全部压缩到一个基板中。每一个都是一条事件。规则更改是一条事件。工具调用及其响应是事件。产生的主张是一条创建对象的事件,而从该主张到支持证据的链接是另一条创建关系的事件。因为它们都是有序日志中的事件,那些在传统架构中棘手或不可能的问题变得微不足道:*为什么这个事实在智能体的工作集中?智能体在更改规则 R 之前相信什么?如果它在步骤 42 选择了另一个分支会发生什么?*每个问题都是对日志的查询或重新投影。

用人类认知的类比来激励这一点很诱人——我们,也可以说,很少由推理引擎塑造,而是由积累的经历历史及其产生的信念塑造。我们仅顺便提及这个类比,并不以此为基础论证;该架构的论证是机械式的,而非认知性的,并在后续章节中展开。

借用的想法单独来看并不新鲜。事件源和命令查询职责分离是数据系统中的既定模式,而根据变化输入对派生状态进行响应式重新计算是增量数据流和电子表格引擎的核心。这里的贡献在于重新组合:将事件源、响应式基板应用于长期运行的智能体系统这一特定问题,其回报——可审计的溯源、确定性重放,以及包含非确定性模型调用的计算的低成本反事实分叉——既非显而易见,而且我们认为,具有异常的价值。

3 架构

图 1: ActiveGraph 运行时作为循环。仅追加事件日志(底部)是事实的来源。重放将日志折叠成图(类型化对象和关系的投影)。行为订阅图结构模式,响应匹配变化调用模型或工具,并将新事件发回日志。对日志的操作——确定性重放、分叉与差异、以及溯源——源于日志是首要的。

图是日志的投影。

运行时持有一个仅追加的事件序列。图状态——类型化的对象和关系集——永远不会被外部代码直接突变;它是通过向前折叠事件日志来计算的。从存储加载运行、分叉或验证它,都调用相同的底层重放操作,该操作从事件重建图。同一日志的两次重放产生确定性的相同状态。

事件。

每个事件携带一个 id、类型、载荷、产生它的参与者、一个指向触发它的事件的可选caused_by指针,以及时间戳。列表 1 显示了一个真实运行的开始事件:一个包被加载,用户创建了一个目标,一个行为开始响应,并且创建了一个带有provenance块的对象,该块命名了创建它的行为和导致它的事件。

{
  "id": "evt_001",
  "type": "pack.loaded",
  "actor": "runtime",
  "caused_by": null,
  "payload": {
    "name": "diligence",
    "version": "0.1.0",
    "object_types": [
      "company",
      "document",
      "question",
      "claim",
      "..."
    ],
    "behaviors": [
      "diligence.company_planner",
      "diligence.question_generator",
      "..."
    ]
  }
}
{
  "id": "evt_002",
  "type": "goal.created",
  "actor": "user",
  "caused_by": null,
  "payload": {
    "goal": "Diligence:NorthwindRobotics"
  }
}
{
  "id": "evt_003",
  "type": "behavior.started",
  "actor": "runtime",
  "caused_by": "evt_002",
  "payload": {
    "behavior": "diligence.company_planner",
    "event_id": "evt_002"
  }
}
{
  "id": "evt_004",
  "type": "object.created",
  "actor": "diligence.company_planner",
  "caused_by": "evt_002",
  "payload": {
    "object": {
      "id": "company#1",
      "type": "company",
      "data": {
        "name": "NorthwindRobotics"
      },
      "provenance": {
        "created_by": "diligence.company_planner",
        "caused_by_event": "evt_002"
      }
    }
  }
}
{
  "id": "evt_005",
  "type": "behavior.completed",
  "actor": "runtime",
  "caused_by": "evt_002",
  "payload": {
    "behavior": "diligence.company_planner",
    "event_id": "evt_002"
  }
}

列表 1: 一个真实运行的开始事件(从捕获的 671 事件日志中节选)。每个对象的provenance记录了行为及导致的事件;没有什么是没有可追溯源头就创建的。

行为。

行为是一种反应。它声明一个订阅——一个事件类型加上可选谓词和一个 Cypher 子集表达的图结构模式——以及一个主体。当匹配的更改到达图时,运行时触发主体,提供触发事件、图的视图和一个上下文句柄。主体可以创建对象和关系,对现有对象应用补丁,调用工具,或调用模型;它所做的一切都被记录为事件。主体有四种形式:普通函数、类(用于携带配置的行为)、基于 LLM 的例程(其请求和响应本身是被记录的事件),以及关系行为——附加到类型化边上的逻辑,使得关联两个对象的行为本身可以携带计算。

为什么是图,而不仅仅是日志。

仅事件源会提供一个日志和一个当前值的平面投影;图通过改变行为可以订阅的内容以及哪些操作廉价来赢得其地位。有三件事特别依赖于它。第一,订阅是图结构模式,而不仅仅是事件类型过滤器:一个行为可以触发于“一个主张指向一个未回答的问题”,这是一个拓扑谓词,平面事件流无法表达,除非消费者自己重建图。第二,关系行为使类型化边成为逻辑的一等载体,因此计算附加到对象之间的关系上,而不仅仅是对象本身——这在键值投影中没有自然位置。第三,§5 的结构性差异是图拓扑的差异(两个运行之间哪些对象、关系和补丁不同),这之所以定义良好,正是因为投影是一个图而不是一个不透明的 blob。日志使状态可重现;图使响应性和比较可表达。两者单独都不足够。表 1 总结了这些属性如何将日志优先设计与传统的智能体循环和记忆层系统区分开来。

表 1: 架构差异之处。ActiveGraph 的列源于将事件日志视为首要的而不是副产品。“部分”表示系统以有限或非保证的形式提供属性。

属性传统循环记忆层ActiveGraph
可审计溯源部分完整
确定性重放保证
廉价分叉通过日志
自文档化因果结构内建

没有工作流——但并非没有协调。

没有顶层脚本对运行的步骤进行排序。§6 中的尽调示例在三个公司中产生了 93 个对象和 76 个关系,没有一行编排代码:一个规划器行为响应目标创建公司;一个问题生成器响应公司发出研究问题;一个研究员响应每个问题;以此类推。控制流是哪些事件匹配哪些订阅的涌现结果。我们小心不过度陈述这一点:协调并未消失,它转移了。在工作流引擎中曾是显式编排的东西,变成了通过共享图及其订阅的隐式协调。主张并非协调消失,而是使其隐式且由数据驱动——而不是将其编码在控制流脚本中——正是使运行统一可重放、可分叉和可检查的原因,因为每个协调决策本身是一个事件,而不是某个外部程序计数器中的位置。

确定性契约。

由于状态是日志的折叠,重放只有在行为主体是其输入的决定性函数时才可靠。因此运行时施加一个契约:行为主体不得直接读取random、墙钟时间或新鲜 UUID(它从事件中获得这些,事件携带记录的时间戳,或从运行时的确定性 id 生成器获取);不得在框架的工具和模型原语之外执行 I/O;不得依赖在不同触发之间变化的可变全局状态。该契约不是静态强制执行的。违反它的行为在第一次运行时正确执行,并在稍后的重放或分叉时被捕获,作为指向第一个无法重现的事件的分歧错误。下一节将解释为什么这就足够了。

明显的例外是最重要的情况:基于 LLM 的行为,正是它使 ActiveGraph 成为智能体而不是工作流引擎。模型调用不是其输入的决定性函数,因此在首次执行时,这样的行为不满足契约。框架并不要求它满足。调用实时发出,其响应被记录为事件;契约适用于重放,其中该记录的响应从缓存中提供(§4),行为因此精确重现。因此,确定性是重新投影已存在日志的一个属性,绝不是声称运行智能体是可重现的。这是一个有意的权衡:智能体

(由于长度限制,翻译截断于此;如有需要可继续提供剩余部分的翻译。)

相似文章

@badlogicgames: 推荐阅读。

X AI KOLs Following

Yohei Nakajima,babyagi 的创造者,在 arXiv 上发表了第一篇学术论文,题为“The Log is the Agent: Event-Sourced Reactive Graphs for Auditable, Forkable Agentic Systems”,提出了通过持久可重放状态进行协调的代理。