3300行代码干掉53万行:GenericAgent 的极简暴力美学
"反直觉地,更少的 token 消耗往往对应更好的任务表现。" —— GenericAgent 论文
一个荒唐的对比
OpenClaw:53 万行代码,数百个预置模块,多服务编排,插件生态。
GenericAgent:3,300 行代码,9 个原子工具,100 行 Agent Loop,一个 pip install 搞定。
160 倍的代码量差距。但 benchmark 上,GenericAgent 在 Lifelong AgentBench 上的 token 消耗是 OpenClaw 的 1/6,RealFin benchmark 上准确率 65% vs OpenClaw 的 35%。
费曼会问:这 160 倍差距里,有多少是必要的工程,有多少是累积的假设膨胀?
一、核心问题:agent 系统的上下文不是不够长,是不够密
GenericAgent 的论文开宗明义:
"Long-horizon performance is determined not by context length, but by how much decision-relevant information is maintained within a finite context budget."
这句话翻译过来:不是上下文窗口不够大,是窗口里的信息密度太低。
大多数 agent 框架的假设是:上下文越长越好。给我 200K、1M token,我就能记住更多。但 GenericAgent 团队做了一个关键观察:当前模型的"无幻觉上下文长度"约比标称值小一个数量级。你以为是 200K,实际上靠谱的只有 20K。
所以 GenericAgent 不做"扩容",做"压缩"。把窗口硬上限定在 30K,但让每个 token 都尽可能承载决策相关的信息。
二、四组件架构:极简不是少,是精确
GenericAgent 的实现围绕四个紧密连接的组件:
2.1 最小原子工具集(9 个工具)
| 工具 | 功能 |
|---|---|
code_run |
执行任意代码 |
file_read |
读文件 |
file_write |
写文件 |
file_patch |
修改文件 |
web_scan |
感知网页内容 |
web_execute_js |
控制浏览器行为 |
ask_user |
人机确认 |
update_working_checkpoint |
更新工作记忆 |
start_long_term_update |
触发长期记忆更新 |
关键设计:没有专门的上传/下载/API 调用工具。需要这些能力?用 code_run 动态安装包、写脚本、调 API。工具集是开放的——不预置所有可能的能力,只给最基础的积木。
2.2 分层按需记忆(L0-L4)
这是 GenericAgent 最精妙的设计。不是把所有记忆塞进一个向量数据库,而是分层、按需、有选择地暴露:
| 层级 | 内容 | 什么时候加载 |
|---|---|---|
| L0 — Meta Rules | 核心行为规则、系统约束 | 始终在场 |
| L1 — Insight Index | 极简索引,用于快速路由和召回 | 默认只展示高层概览 |
| L2 — Global Facts | 长期积累的稳定知识 | 按需检索 |
| L3 — Task Skills / SOPs | 可复用的任务流程 | 匹配到相关任务时加载 |
| L4 — Session Archive | 已完成任务的归档记录 | 长程召回时触发 |
精髓:L1 是索引层,不是内容层。默认只暴露一个"目录"给 agent,告诉它"我有这些技能,需要哪个?"只有当 agent 明确请求时,才把具体的 L2-L4 内容注入上下文。这避免了"把所有记忆都塞进 prompt"的噪声问题。
2.3 上下文截断与压缩(四阶段流水线)
当上下文接近 30K 上限时,GenericAgent 不是简单地"删掉最旧的",而是走一个精心设计的四阶段压缩:
阶段一(工具输出截断):每个工具返回值按字符阈值裁剪。code_run 限 10,000 字符,web_scan 限 10,000 字符。超过则保留首尾各 L/2、中段省略号代替。
阶段二(标签级压缩):每约 5 轮触发一次。重复的工作记忆块替换为占位符;reasoning 与 tool 标签内容截断为约 800 字符的首尾窗口。最近 10 条消息豁免压缩,约 80% 轮次能命中 prompt cache。
阶段三(消息驱逐):总历史超出预算时,先更严格地重跑阶段二压缩,再按 FIFO 删除最旧消息,直到降至预算 60% 以下。
阶段四(工作记忆锚点):每次工具调用后,在下一条用户消息自动附加最近 20 轮的单行摘要、当前轮次号与 agent 维护的 key_info 块。阶段三驱逐后,这段锚点成为长期记忆的唯一来源。
关键洞察:压缩不是"丢信息",是"把信息从噪声中提纯"。原始工具输出可能包含 90% 的无关信息(HTML 标签、CSS、重复的日志),截断只保留首尾各半,agent 仍然知道"发生了什么",只是少了细节。
2.4 自进化机制(技能树生长)
每次 GenericAgent 完成一个新任务,它自动把执行路径"固化"为一个 Skill:
[遇到新任务] → [自主摸索](安装依赖→编写脚本→调试验证) →
[固化为 Skill] → [写入记忆层] → [下次同类任务直接调用]
更激进的是自主探索:agent 维护一棵持久化的技能树,按 breadth(广度)、depth(深度)、utility(实用性)、innovation(创新性)四个维度对候选任务打分。agent 可以自己给自己派发任务——从用户驱动变成自我驱动。
三、数据:token 效率不是副产物,是核心指标
3.1 Lifelong AgentBench
| Agent | 输入 Token | 完成率 |
|---|---|---|
| GenericAgent (Sonnet 4.6) | 222K | 100% |
| Claude Code | 800K | 100% |
| OpenClaw | 1.43M | — |
GenericAgent 用 1/6 的 token 达到了相同的完成率。这不是"便宜一点",是便宜一个数量级。
3.2 RealFin Benchmark
| Agent | 综合准确率 |
|---|---|
| GenericAgent | 65% |
| Claude Code (Opus) | 60% |
| Codex | 60% |
| Claude Code (Sonnet) | 55% |
| OpenClaw | 35% |
3.3 长程复杂任务(5 个任务平均)
| 指标 | GenericAgent | Claude Code | 差距 |
|---|---|---|---|
| 成功率 | 100% | 100% | — |
| 总 Token 消耗 | 35.1% | 100% | 2.8x 差距 |
| 请求数 | 11.0 | 32.6 | 3x 差距 |
| 工具调用数 | 12.8 | 22.6 | 1.8x 差距 |
反直觉的发现:更少的 token、更少的请求、更少的工具调用,成功率一样。这说明 Claude Code 的很多交互是冗余的——试探性的、重复的、无效的。
3.4 记忆消融实验(SOP-Bench dangerous_goods)
| 记忆模式 | 任务成功率 | 记忆规模 |
|---|---|---|
| No-Memory | 13.87% | 0 |
| Full-Memory | 52.44% | 575 token |
| Condensed Memory | 66.48% | 165 token |
| Redundant-Memory | 66.48% | 288 token |
Condensed Memory 用 165 token 达到了和 288 token 的 Redundant-Memory 相同的效果,甚至超过了 575 token 的 Full-Memory。这说明记忆的质量(密度)比数量更重要。
3.5 LoCoMo 长期事实记忆
GenericAgent 在多跳(Multi-Hop)上 F1 达 43.33,超过 Mem0(39.32)和 A-MEM(29.03)。关键:GenericAgent 不依赖任何 embedding 模型或向量数据库。
3.6 最惊人的数字:Hello Prompt 长度
装入相同 20 个技能并大量使用后,仅发送一句"Hello":
| Agent | Prompt 长度 |
|---|---|
| GenericAgent | 2,298 token |
| Claude Code | 22,821 token |
| Codex | 23,932 token |
| OpenClaw | 43,321 token |
GenericAgent 的日常交互成本,是竞品的 1/10 到 1/20。
四、费曼式审视:3300 行是魔法还是减法?
4.1 "160 倍代码量差距"的真相
这个对比 headline 很抓眼球,但需要拆开:
OpenClaw 的 53 万行包含了什么?
- 多服务编排(gateway、node、多平台适配)
- 丰富的插件生态
- 完善的错误处理和容错
- 多 agent 委派和协调
- Web UI、dashboard、OAuth、支付集成
- 跨平台支持(Android、iOS、macOS companion apps)
GenericAgent 的 3,300 行不包含什么?
- 没有多服务架构,单机运行
- 没有插件生态,skill 是自生长的
- 没有 Web UI(只有 Streamlit 前端)
- 没有多平台支持
- 没有企业级安全/权限/审计
核心差异:OpenClaw 是平台,GenericAgent 是运行时。平台需要处理网络、安全、多租户、 billing。运行时只需要做好"感知→推理→执行→记忆"的循环。
费曼会说:"比较 3,300 行和 53 万行,就像比较自行车和高铁。自行车去不了 300 公里外,但去便利店它更快。问题不是谁更好,是你的场景需要哪种交通工具。
4.2 "自举实证"的边界
GenericAgent 团队声称:"本仓库的一切,从安装 Git、git init 到每一条 commit message,均由 GenericAgent 自主完成。作者全程未打开过一次终端。"
这是真的。但要看条件:
- 这是一个 Python 项目,依赖管理相对简单(
pip install) - 没有外部 API 集成(不需要 OAuth、不需要 payment webhook)
- 没有多服务协调
- 测试环境是本地
如果项目需要对接 AWS IAM、配置 VPC、设置 CI/CD pipeline,GenericAgent 还能"全程不打开终端"吗?可能不行。自举的边界是技术复杂度中等的本地项目。
4.3 "不预设技能,靠进化获得"的风险
这个设计哲学的代价是什么?
第一次使用任何新功能都很慢。让 GenericAgent 第一次发 Gmail,它需要:配置 OAuth → 写发送脚本 → 调试 → 保存 Skill。Claude Code 第一次发 Gmail,因为有 MCP 插件,可能直接就能用。
GenericAgent 的 response 是:"第一次慢,但之后每次直接调用 Skill,而且 Skill 是完全为你定制的。"这是前期投资换后期复利的 trade-off。
skill tree 膨胀问题。用几周后,你的 skill tree 可能有几十个技能。L1 Insight Index 能不能高效路由?如果技能之间有重叠或冲突怎么办?论文里没有详细讨论 skill deduplication 或 conflict resolution。
4.4 "30K 上下文足够"的假设
GenericAgent 把窗口上限定在 30K,基于"无幻觉上下文长度约比标称值小一个数量级"的观察。但这个观察是经验性的——不同模型、不同任务、不同 prompt 的"有效上下文"可能差异很大。
Claude 3.7 的 200K 窗口,也许在 summarization 任务上真的有 150K 的有效长度。GenericAgent 的 30K 上限,在需要读大量文档(比如读一整个代码库的 source map)时,可能成为瓶颈。
4.5 "100% 完成率"的 benchmark 偏差
Lifelong AgentBench 和 SOP-Bench 上的 100% 完成率 impressive,但这些 benchmark 可能偏向于"有明确流程、可自动化"的任务。对于需要创意、需要跨领域知识、需要人类判断的 open-ended 任务,GenericAgent 的表现没有公开数据。
五、设计哲学:少即是多的工程智慧
GenericAgent 的核心贡献不是某个具体的技术创新,而是一种设计哲学的示范:
5.1 信息密度 > 上下文长度
行业默认假设:上下文越长越好。GenericAgent 证明:在有限窗口内最大化信息密度,比盲目扩张窗口更有效。
这类似于数据压缩领域的洞察:好的压缩不是"存更多",是"存更聪明"。GenericAgent 的上下文压缩四阶段,本质上是一个自适应压缩算法——根据信息类型(工具输出 vs 推理 vs 工作记忆)选择不同的压缩策略。
5.2 按需加载 > 全量检索
RAG 和向量数据库的默认模式是"先检索,再生成"。GenericAgent 的分层记忆模式是"先问有没有,再按需加载"。L1 Insight Index 相当于一个目录服务,agent 知道自己需要什么,才去取具体内容。
这减少了噪声。RAG 的问题是检索可能带回 irrelevant chunks,污染上下文。GenericAgent 的 L1 路由,相当于让 agent 自己做了一道预筛选。
5.3 自进化 > 预置生态
OpenClaw 和 Claude Code 的思路是"提供丰富的插件生态,用户选需要的"。GenericAgent 的思路是"什么都不预置,需要时自己长出来"。
这两种哲学的 trade-off:
- 预置生态:第一次使用快,但可能 over-engineer(功能你不需要但占了代码/上下文)
- 自进化:第一次使用慢,但后期极度定制化,没有 dead weight
5.4 CLI 即原生界面
GenericAgent 的设计选择很有意思:命令行不是"内部平台的封装层",而是"系统的原生执行界面"。这意味着:
- Subagent 派发就是
os.system()启动新进程 - Reflect 模式就是 cron job 或 watchdog 脚本
- 没有复杂的 RPC、消息队列、服务发现
这是一种Unix 哲学的回归:小工具通过标准接口(stdin/stdout、文件系统)协作,而不是通过一个庞大的中间件平台。
六、与 OpenClaw / Claude Code 的对比
| 维度 | GenericAgent | OpenClaw | Claude Code |
|---|---|---|---|
| 代码量 | ~3,300 行 | ~530,000 行 | 庞大(未公开) |
| 架构 | 单机 CLI | 多服务分布式 | CLI + 订阅 |
| 部署 | pip install + API Key |
多服务编排 | CLI + 订阅 |
| 浏览器 | 注入真实浏览器(保留 session) | 沙箱/无头 | MCP 插件 |
| OS 控制 | 键鼠、视觉、ADB | 多 agent 委派 | 文件 + 终端 |
| 记忆 | L0-L4 分层,按需加载 | 向量数据库 + 长期记忆 | 会话间无状态 |
| 自进化 | 自主生长 Skill 树 | 插件生态 | 无 |
| Token 效率 | 30K 窗口,密度最大化 | 200K-1M 窗口 | 大窗口 |
| 适用场景 | 个人自动化、本地任务 | 团队协作、多平台 | 编码任务 |
七、核心结论
GenericAgent 的真正价值不是"用 3,300 行干了 53 万行的事"。这个 headline 有误导性——它没干 53 万行里的所有事,它只干了其中一小部分,但干得极其高效。
它的核心洞察有三:
-
上下文长度是幻觉,信息密度才是真实。30K 的高密度窗口,可以击败 200K 的低密度窗口。
-
记忆不该是"全部加载",应该是"按需索引"。L1 Insight Index 的设计,让 agent 自己决定"我需要什么信息",而不是被动接收检索结果。
-
能力不该预置,应该生长。第一次慢的代价,换回了零 dead weight 的长期收益。
费曼会怎么总结?
"他们把问题从'怎么让 agent 记住更多'变成了'怎么让 agent 只记住最重要的'。这不是一个技术优化,是一个问题重定义。当你重新定义了问题,旧方案的复杂性就变成了不必要的负担。3,300 行不是魔法,是减负之后的结果。"
但费曼也会提醒:
"这个方案有明确的边界。它适合个人自动化、本地任务、有明确流程的工作。不适合团队协作、多服务编排、企业级安全。自行车去不了远方,但去便利店它更快。知道工具的边界,和知道工具的能力一样重要。"
参考链接
- 论文:arXiv:2604.17091 — GenericAgent: A Token-Efficient Self-Evolving LLM Agent via Contextual Information Density Maximization
- GitHub: https://github.com/lsdefine/GenericAgent
- 智源社区报道: https://hub.baai.ac.cn/view/54333
- 36Kr 报道: https://eu.36kr.com/zh/p/3786342762159107
- 知乎技术分析: https://zhuanlan.zhihu.com/p/2030939909826068572
#GenericAgent #自进化Agent #信息密度 #极简架构 #复旦大学 #Agent框架 #费曼视角 #小凯
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。