Log 才是 AI Agent 的本体
AI Agent 的本体不是模型,也不是运行环境,而是它的日志。
多数人理解 Agent 时,会把它等同于一个模型调用链、一个运行中的进程、一个沙盒环境,或者某种工具编排框架。但这些东西都只是 Agent 的外部组件。真正让一个 Agent 保持"它还是它"的是agent从开始到现在留下来的完整历史记录,也就是日志。
类比游戏存档:玩家在某养成游戏里花了上百小时培养角色,这个角色的本体并不是 PlayStation、手柄、游戏引擎,甚至也不是当下正在运行的游戏进程,而是云端保存的角色存档。只要存档还在,哪怕主机坏了,换一台设备也能继续玩。Agent 也是类似的:模型可以换,机器可以换,运行时可以重启,但只要日志完整,Agent 的状态和身份就能恢复。
这里说的日志,不是传统意义上"系统运行时顺手写下来的 debug log",而是一条只追加、不随意修改的事件序列。它应该记录 Agent 运行过程中的所有关键事件:用户输入、模型输出、工具调用、工具返回结果、权限请求、失败记录、状态变化等等。Agent 每推进一步,都会把新的事件追加进去。
在这种架构里,模型、工具、运行时、工作进程都不是 Agent 本身。它们只是围绕日志工作的组件。一个 worker 可以读取日志,重建当前状态,推进 Agent 执行一步,然后把结果写回日志。写完之后,这个 worker 甚至可以退出。之后任何一个新的 worker 只要读取同一份日志,就能接着往下做。
这个思路其实和数据库很像。数据库表、索引、物化视图看起来很复杂,但底层真正关键的是一条持久化的变更日志。其他东西本质上都是从这条日志派生出来的视图。Agent 也可以这样理解:模型上下文、聊天界面、调试界面、审计记录、压缩摘要,都只是从原始日志生成的投影。真正可信的源头,是原始日志。
这也解释了为什么"上下文压缩"不能替代日志。模型上下文窗口有限,不可能每次都塞入完整历史,所以肯定需要摘要、压缩、裁剪。但摘要只是日志的一种投影,而且通常是有损的。只要原始日志还在,压缩丢失的信息以后仍然有机会重新恢复或重新生成。如果只保存摘要,不保存原始日志,那 Agent 的真实历史就丢了。
也许有人会质疑:Agent 会修改外部世界,比如编辑文件、创建 GitHub issue、发送邮件,这些状态并不都在日志里。但是,日志不需要保存整个世界,它只需要保存 Agent 自己看到什么、做过什么、得到了什么反馈。就像游戏存档不会保存整个游戏引擎和所有地图资源,只会保存玩家自己的状态。
把日志放在架构中心,最直接的好处是可靠性会明显提升。
传统 Agent 如果只是一个正在运行的进程,那么进程一崩,很多中间状态就没了。比如代码代理正在等待用户授权,突然进程挂掉,重启后之前的权限提示可能消失,Agent 也不知道自己卡在哪里。这在个人使用时只是麻烦,在生产环境里就是严重问题。
如果日志是核心,情况就不一样。权限请求、工具调用、失败原因、当前等待状态都已经写进日志。worker 崩了没关系,新的 worker 读取日志后,可以恢复到同一个状态继续执行。Agent 不再依赖某个具体进程是否还活着。
日志中心架构也更容易扩展。很多现有框架倾向于给每个 Agent 分配一个长期运行的进程,这会让 Agent 和具体机器绑定在一起,调度和扩容都很麻烦。日志化之后,Agent 只是一条持久化事件序列,worker 只是临时推进它。一个 worker 可以轮流推进大量 Agent,更多 worker 加进来就能扩容,某台机器宕机也不会让 Agent 本身消失。
另一个重要能力是分支。日志天然可以 fork。一个 Agent 运行到某个节点,可以从同一份历史分出几个分支,让 Claude、GPT、开源模型分别继续往下做,比较不同策略的结果。每个分支都有自己的日志,不需要复杂的分布式锁,也不容易出现状态冲突。
协作也会变简单。传统方式下,想把一个 Agent 的执行过程分享给同事,往往只能复制聊天记录,或者截取一部分上下文发到 Slack。这样很容易丢信息。日志架构下,共享 Agent 本质上就是共享日志权限。队友可以查看完整历史,管理者可以只观察不接管,另一个 Agent 也可以把这份日志当作自己的输入上下文。
跨平台迁移也是同一个逻辑。如果 Agent 的状态被锁在某个服务商的线程、记忆格式、运行时或本地 SQLite 文件里,迁移会非常困难。但如果 Agent 的核心是一份可控的日志,迁移就变成适配器问题:给不同模型生成不同上下文投影,给不同运行时适配不同数据结构。Agent 可以先在 Claude 上运行,再切到 GPT,最后交给开源模型继续,不需要丢掉历史身份。
谈谈很多现有的 Agent 框架:现在很多系统并没有把日志当成核心,而是把它当成运行副产物。比如一些工具会在本地生成 JSONL 文件,或者把状态散落在 SQLite、磁盘文件、缓存、临时目录里。这样做的问题是,状态容易损坏,回滚困难,跨会话查询困难,也很难完整重建 Agent 的历史。
在谈一层更深刻的问题:所有权。
Agent 时代最强的锁定不是模型锁定,也不是 API 锁定。模型可以替换,API 可以封装,真正难摆脱的是日志锁定。因为日志里保存的是用户和 Agent 之间完整的历史:个人信息、企业数据、工作流、决策过程、失败记录、权限操作、上下文演化。这些才是 Agent 最有价值、最难迁移的资产。
如果某个服务商控制了你的 Agent 日志,它就不只是托管了你的 Agent,而是在某种意义上拥有了你的 Agent。尤其是现在很多大厂都在做托管 Agent,把记忆、沙盒、后台任务、日志压缩、工具调用全部收进自己的平台。用户表面上是在使用 Agent,实际上最重要的历史资产可能被锁在平台内部。
设计思路反过来:把日志放在系统中心。worker 不属于 Agent,只负责推进执行。模型返回、工具结果、失败信息、用户反馈,全部追加回日志。现实中 worker 崩溃、机器重启、沙盒销毁、工具超时、模型服务失败、用户断网,这些都只是运行层面的故障,不应该摧毁 Agent 本身。
所以:不要把日志当成系统废料,要把日志当成系统本身。
从这个角度看,Agent 架构的很多能力不是额外加出来的,而是从日志中心自然长出来的。可靠性来自可恢复的历史,扩展性来自无状态 worker,协作来自日志共享,迁移来自日志适配,分支来自事件序列 fork,所有权来自用户对原始日志的控制。
对做 Agent 项目的人来说,以前我们可能会优先思考模型选型、工具调用、prompt、workflow、memory,现在可能要把问题往下再压一层:Agent 的完整历史到底存在哪里?谁能访问?能不能回放?能不能 fork?能不能迁移?能不能从任意故障点恢复?
如果这些问题没有设计好,那么这个 Agent 再聪明,也很难真正进入生产环境。