Generic Agent 浅析
围绕 Generic Agent 的长期运行架构展开,梳理上下文信息密度、最小工具集、分层记忆、上下文压缩与反思驱动的自我进化机制。
底层原理:上下文信息密度最大化
1. 长期运行 Agent 的两大根本挑战
在真实环境中持续运作的目标驱动型 Agent,必然会遇到以下系统性瓶颈:
- 上下文爆炸(Context Explosion):工具定义、历史轨迹、中间结果层层堆叠。无关信息不仅被浪费,还会主动稀释模型的注意力,引发状态混淆与幻觉。
- 经验停滞循环(Stagnation Loop):缺乏经验蒸馏机制,每次遇到相似任务都在重新探索。耗费大量 Token 却毫无能力增长。
2. 核心反直觉认知:LLM 的三重上下文陷阱
长上下文窗口 $\neq$ 高决策质量。 盲目塞入信息会触发相互强化的恶性循环:
- 位置偏差(Lost-in-the-Middle):模型极易“遗忘”夹在上下文中间的关键信息。
- 注意力稀释(Attention Dilution):无关噪音越多,模型分配给关键证据的注意力就越少。
- 有效窗口收缩:有效利用的上下文远小于名义窗口容量。为了补偿信息丢失而塞入更多内容,反而会加剧前两个陷阱。
3. GA 的第一性原理:上下文信息密度 (Information Density)
GA 摒弃了堆砌上下文的做法,其核心设计约束是:在有限预算内,最大化每一个 Token 对当前决策的贡献。
-
概念公式:
信息密度 = 决策相关信息量 (完备性) / 上下文总长度 (简洁性) -
底层结构性张力:
- 完备性 (Completeness):必须显式包含决策所需信息,防幻觉。
- 简洁性 (Conciseness):必须清除冗余噪音,防注意力稀释。
- 洞察:这两者存在根本矛盾。增加信息提完备性必然削弱简洁性;压缩信息提简洁性必然增加丢失关键细节的风险。这不是单纯的窗口预算问题,即使窗口无限大,这种底层张力依然存在。
4. GA 的系统性解法:四层信息密度优化
GA 通过 4 个核心机制,在信息生命周期的不同阶段进行“瘦身”与提炼:
| 优化机制 | 作用阶段 | 核心策略与目的 |
|---|---|---|
| 1. 最小原子工具集 | 工具定义注入时 | 极端克制:仅保留 9 个工具覆盖五大能力。从源头减少每轮必定重复的“先天开销”。 |
| 2. 分层按需记忆 | 记忆加载时 | 拒绝全量加载:建立索引层到事实/SOP层的分层架构,仅在需要时按需检索相关经验。 |
| 3. 截断与压缩流水线 | 对话进行中 | 主动瘦身:通过四阶段(截断返回值、压缩历史、驱逐消息等),防止活跃上下文在交互中失控膨胀。 |
| 4. 反思驱动自我进化 | 跨任务经验积累 | 打破停滞:将成功的探索轨迹蒸馏为高度结构化的 SOP/代码/技能,用极简的形态优化“未来的上下文”。 |
5. 范式跃迁:从 Prompt 到 Context
- Prompt Engineering(提示工程):优化“一句话怎么说”,适用于单轮简单任务。
- Context Engineering(上下文工程):将平衡“完备性”与“简洁性”视为约束优化问题,系统性地管理一轮对话中所有组件(工具、记忆、历史)的注入、压缩与替换,决定 Agent 的长期表现。
GenericAgent 系统全貌与运行机制
核心设计基调:模型无关(Model-Agnostic)
GA 的底层架构与具体 LLM 模型完全解耦。推理引擎(如 Claude, GPT)可随时插拔替换,不影响执行逻辑、工具接口或记忆架构,系统能力随模型升级而自然进化。
1. 统一 Agent 循环 (Unified Agent Loop)
GA 通过一个标准的 “推理 → 行动 → 观察” 闭环驱动所有复杂任务,避免为不同任务定制不同的执行流。
-
Step 1: 构建执行上下文 每一轮开始时,并非简单转发指令,而是按信息密度最大化原则精准组装:
执行上下文 = 系统提示词 + 始终在线记忆 (索引层) + 工具定义 (仅 9 个) + 任务规格 + 压缩后的历史 + 工作记忆 -
Step 2: LLM 推理与决策 模型基于上下文输出两种结果:直接回复(无需工具)或 发起工具调用(Tool Call)。
-
Step 3: 工具执行与结构化反馈 统一分发器 (Unified Dispatcher) 路由到本地执行器。关键在于返回结构化信号(状态、核心输出、元数据),而非原始长文本,便于模型快速解析。
-
Step 4: 状态更新 结构化反馈追加到对话历史,触发下一轮决策,直至任务完成并沉淀为长期记忆。
2. 两种执行模式 (Execution Modes)
GA 的两套运行模式完全共享同一套基础设施(统一循环与记忆系统),仅在触发方式上有所不同:
- 交互模式 (Interact Mode):用户指令驱动(如“帮我整理文件”)。支持随时请求人类介入(ask_user)。
- 反射模式 (Reflect Mode):无需人工,后台自动触发。
- 看门狗 (Watchdog):基于环境事件(如报错日志、新文件生成)触发。
- 定时任务 (Scheduled):基于时间规则触发。
执行边界约束(确保长期运行的安全可控):
- 轮次上限:防止死循环。
- 故障升级策略:微调重试 → 切换策略/搜索信息 → 暂停请求人类介入。
- 随时可中断:进度会自动保存至工作记忆。
3. 四大核心机制的生命周期矩阵
四个机制并非独立模块,而是贯穿信息生命周期,协同优化上下文信息密度的有机整体:
| 生命周期阶段 | 核心机制 | 作用与目的 |
|---|---|---|
| ① 注入阶段 | 最小原子工具集 | 控制工具定义开销。仅 9 个工具覆盖五大能力。 |
| ② 加载阶段 | 分层记忆架构 | 控制记忆按需加载开销。L1 提供索引,按需读取 L2/L3。 |
| ③ 运行阶段 | 截断与压缩流水线 | 控制历史轮次累积开销。四阶段主动瘦身,防止上下文膨胀。 |
| ④ 沉淀阶段 | 反思驱动自我进化 | 将成功的执行轨迹蒸馏为 SOP/代码,用极简形态优化未来的上下文。 |
4. 实战流转示例 (以“下载数据集”为例)
- 注入记忆:L1 索引注入“下载 SOP”的指针。
- 按需加载:模型调用
file_read精准加载 L3 层的具体 SOP(分层记忆机制)。 - 工具执行:根据 SOP 步骤,调用
code_run执行下载脚本(最小工具集机制)。 - 状态反馈:返回结构化成功信号,历史过长则触发压缩(截断压缩机制)。
- 经验沉淀:若为首次执行,完成后蒸馏为新 SOP 存入记忆(自我进化机制)。
GenericAgent 机制一 —— 最小原子工具集
1. 核心问题:工具膨胀的系统性代价
给 Agent 几十个专用工具(如“瑞士军刀”)看似强大,实则是低效的设计,会带来两层致命代价:
-
提示词层面(Token 损耗):工具定义(Schema)是每轮对话必定重复支付的固定成本。哪怕从不使用的工具,也会持续挤占宝贵的上下文预算。
-
策略层面(决策瘫痪):工具越多,功能重叠和歧义性越大(如
FileReadToolvsGrepToolvsBashTool)。这会显著增加模型的选择困难,导致执行动作不稳定和高频试错。
2. GA 的解法:乐高哲学与 9 大原子工具
GA 摒弃专用工具,采用“乐高积木”哲学:只提供极少量的基础模块,通过序列组合涌现出复杂能力。
入选工具必须满足:原子性(不可再分的单一职责)与 组合泛化性。
五大能力类与 9 个原子工具:
- 状态观测(只读,感知世界):
file_read(读文件)、web_scan(扫网页) - 动作执行(编辑/运行,改变世界):
file_patch(精细修改)、file_write(覆写)、code_run(执行代码)、web_execute_js(网页交互) - 上下文保持(记忆管理):
update_working_checkpoint(短期工作记忆)、start_long_term_update(沉淀长期记忆) - 干预请求(边界控制):
ask_user(请求人类介入)
3. 工具设计的隐藏“心法”(信息密度优化体现)
这 9 个工具并非简单的 API 封装,而是针对“信息密度”和“执行纪律”做了激进的底层优化:
- 万能原语 vs 快捷脚手架:理论上靠
code_run自己写脚本能搞定一切。另外 8 个工具存在的本质是作为专用快捷方式(Harness),用来降低高频动作的决策与编写成本。 - 精准截断(拒绝全文搬运):
web_scan会直接剔除网页广告和隐藏 DOM 并做语义提取,把上万 Token 的网页压缩到一个数量级;file_read强制支持行号和关键词锚定。 - 快速失败机制(Fail-Fast):
file_patch要求必须“唯一匹配”,如果找不到或有多处匹配会立刻报错,绝不静默乱改。 - 强制动作纪律:
code_run每轮只能调一次,强制 Agent 必须“先看结果,再做下一步”,防止盲目连续盲操。
4. 故障升级机制 (Staged Escalation)
当工具执行报错时,GA 遵循严格的“三步走”纠错纪律,防止死循环:
- 局部修正:分析报错,小幅调整参数重试。
- 策略切换:持续失败则强制放弃当前路线,重新搜索信息或换工具(如从改文件变成写脚本去改)。
- 人类介入:穷尽自动化尝试后,调用
ask_user暂停求助。
5. 深层价值:为“自我进化”铺路
当工具足够少、足够基础时,Agent 解决复杂任务的轨迹就会变成一段段通用的标准组合序列。这使得 GA 极度容易将成功的执行经验“压缩”并沉淀为可复用的 SOP,而不是依赖写死的新代码接口。
GenericAgent 机制二 —— 分层记忆架构
1. 核心困境:全量历史追加 (Full-History Append) 的失效
-
上下文侵蚀:传统 Agent 将所有历史交互、中间状态和执行轨迹随时间累积,直接塞入提示词。这不仅导致 Token 爆炸,更会把决策关键信息淹没在低价值噪音中。
-
GA 的破局点:通过分层检索,严格隔离“空闲记忆 (Idle Memory)”与“活跃提示词 (Active Prompt)”。
2. 核心解法:四层记忆架构与按需加载
GA 采用类似“图书馆”的设计,拒绝“默认预加载所有记忆”,采用 按需读取 (On-Demand Loading) 策略:
| 层级 | 定位与类比 | 准入标准与特征 |
|---|---|---|
| L1 索引层 | 目录检索台 (始终在线) | 极度轻量。仅编码知识的“存在性”与导航指针。其描述长度趋近分类结构的 Kolmogorov 复杂度下界,确保索引不会随知识积累而失控膨胀。 |
| L2 事实层 | 百科全书 (按需加载) | 长期稳定的事实。信息必须经过执行验证,且跨任务可复用。 |
| L3 SOP 层 | 操作手册 (按需加载) | 可复用工作流与排错指南。遵循严格的 “No Execution, No Memory” 原则(没有通过工具执行成功的经验,就不能存入)。 |
| L4 归档层 | 历史档案室 (冷存储) | 历史执行轨迹的压缩存档。平时大门紧闭,仅用于事后追溯和审计。 |
- 动态路由链:任务启动时只加载 L1 索引。当模型推理需要特定知识时,依据 L1 提供的指针,主动调用
file_read工具去精准抽取 L2/L3 的内容。
3. 三类记忆的功能隔离 (信息密度的极致控制)
为了防止记忆污染和上下文冗余,GA 在单次任务中严格划分了记忆的可见性:
-
始终在线记忆 (常驻/随身卡片):启动时注入。仅包含 元记忆 (Meta-Memory) 的核心规则(定义记忆的存取规范、排除清单以防污染)和 L1 索引。
-
工作记忆 (短期/草稿纸):每轮持续注入。只携带当前任务的最小必要状态:近期 20 轮单行摘要、轮次编号、key_info 块 (当前目标与进度)。任务结束后绝不自动晋升为长期记忆。
-
长期记忆 (持久/图书馆):即 L2-L4。通过 触发提交 (Triggered Commit) 机制管理(识别 → 验证 → 小幅增量写入),确保只有真正经过验证的跨任务经验才能沉淀。
4. 关键实验洞察
-
精炼胜于全量:消融实验证明,仅保留“行动导向规则”的压缩记忆 (165 tokens),其任务成功率远超全量注入原始 SOP (575 tokens) 或带有冗余背景介绍的记忆。结论:模型最需要的是它尚未掌握的、能直接改变行为的少量精准信息。
-
摆脱对向量库的依赖:GA 仅靠精确的分层文本组织与过滤路由,不需要额外的 Embedding 模型或向量数据库,就在长期的多跳推理和时序推理任务上超越了专门的向量检索引擎(如 Mem0)。
GenericAgent 机制三 —— 上下文截断与压缩
1. 核心战略:投资压缩,而非扩展窗口 (Compression over Expansion)
-
认知反转:盲目依赖 LLM 的超长上下文窗口(如 1M tokens)成本高昂且易引发幻觉。当前模型的“无幻觉有效长度”远小于名义窗口。
-
GA 的选择:主动控制预算在 30k tokens 以内。与其让模型在一堆冗余信息中艰难寻找关键内容,不如主动确保模型看到的每一个字符都物有所值。
2. 预算量化模型:字符域启发式公式
为了保持“模型无关(Model-Agnostic)”,GA 不依赖具体的 Tokenizer,而是直接在字符域计算预算:
-
公式:$B = \alpha \cdot W_{\text{tokens}}$ (其中经验系数 $\alpha \approx 3$)
-
当对话历史字符总长 $C_H > B$ 时,主动触发拦截与压缩。
3. 核心机制:四阶段压缩流水线 (Four-Stage Pipeline)
这套流水线从细到粗,构建了完整的信息生命周期管理:
| 阶段 | 定位与触发时机 | 具体操作与目的 |
|---|---|---|
| Stage 1: 工具级截断 | 控增量 (每次工具返回时) | 采用对称头尾保留策略(因错误日志或关键总结常在首尾)。例外:web_scan 的 HTML 模式采用 DOM 级子树裁剪以防结构破坏。 |
| Stage 2: Tag 级压缩 | 控存量 (每 ~5 轮触发) | 对历史轮次进行“瘦身”(豁免最近 10 条)。 1. 替换过期快照:将旧的 <history> 等标签替换为占位符。2. 截短过程痕迹:将旧的 <thinking>、<tool_result> 截断至约 800 字符。保留首尾结论,丢弃中间推导。 |
| Stage 3: 消息驱逐 | 控总量 (超预算时触发) | 激进瘦身与断舍离。 1. 先对更多历史执行 Stage 2 压缩。 2. 若仍超载,按 FIFO(先进先出)无情移除最早消息,直至降至 $0.6B$(预留缓冲空间)。 (注:坚决不使用 LLM 做历史摘要,避免引入幻觉和额外开销) |
| Stage 4: 锚点注入 | 补偿损失 (每轮用户消息前) | 作为被驱逐后的唯一长程记忆安全网。每轮强制携带: 1. 最近 20 条单行轮次摘要;2. 当前轮次号;3. Agent 主动维护的 key_info 块 (当前目标与进度)。 |
4. 源头与固定开销优化
除了处理历史对话,GA 在信息进入上下文前还做了两道“净化”:
-
浏览器层语义提取 (
web_scan):拒绝塞入原始 HTML。在后台克隆 DOM、计算可见性、移除广告与隐藏元素,直接在源头将 Token 消耗降低一个数量级。 -
Tool Schema 省略:在相邻轮次工具定义无变化时,省略冗长的 JSON Schema 定义,仅用一句话短语替代,直接省下每轮约两三千字符的固定开销。
5. 实验洞察:效率收敛
-
当压缩机制(本章)、记忆层(上章)与进化层协同工作时,GA 在重复执行同类任务时,展现出了明显的效率收敛(操作时间从 102s 降至 66s,Token 消耗减半)。
-
结论:优异的架构不需要每次都重读所有细节,它通过压缩留出空间,让高密度的沉淀经验发挥作用。
GenericAgent 机制四 —— 反思驱动的自我进化
1. 第一性原理:进化的是策略,不是工具 (Strategy, not tools)
-
核心分离:GA 严格分离了“固定的工具层”与“可进化的知识层”。运行时基础设施(9 个原子工具)永远保持不变,而所有任务特定的能力则以 SOP 和脚本的形式在记忆系统中动态增长。
-
信息密度视角:进化的本质,是将过去高成本的试错探索(高熵),压缩为高度确定的执行动作,让下一次执行从极高的信息密度起点出发。
2. 三阶段进化路径 (The 3-Stage Evolution)
经验积累不是一步到位的,而是随着任务复用率的提高自动发生形态降维(压缩):
| 阶段 | 执行形态 | 核心特征与表现 |
|---|---|---|
| Stage 1: 自然语言执行 | 从零探索 | 依赖大量推理、试错分支和上下文重建。Token 消耗巨大(实验中高达 222k)。 |
| Stage 2: SOP 蒸馏 | 流程指导执行 | Agent 主动调用 start_long_term_update,将成功轨迹蒸馏为文本 SOP 存入 L3 记忆。后续执行直接读取 SOP,跳过试错,Token 和调用次数骤降约 80%。 |
| Stage 3: 代码化执行 | 脚本直接执行 | 当 SOP 彻底稳定后,进一步编译为可执行代码 (Python/Shell)。推理开销降至最低,成本收敛到一个极窄的稳定带(如 23k Tokens / 5次调用)。 |
- 关键洞察:即便是同一类任务,SOP 在首次调用时仍有“适配成本”(需要适应具体环境),但只要跑通一次,后续执行成本就会断崖式下跌并保持稳定。缺乏进化机制的传统 Agent(如 OpenClaw)则会陷入“停滞循环”,反复支付高昂的探索成本。
3. 记忆守门机制 (防“垃圾进化”)
为了防止记忆库被一次性调试信息或错误操作污染(Junk Evolution),GA 设立了严格的准入门槛:
-
执行验证 (No Execution, No Memory):只存“实操并成功”的经验,拒存“未经测试的设想”。
-
跨任务可复用性:排除只在当前特定会话或临时目录中有效的碎片信息。
-
故障升级作为安全阀:遇到错误遵循“局部修正 → 策略切换 → 人类介入”纪律,防止将死胡同固化为错误经验。
4. 自主探索 (Autonomous Exploration)
Agent 并非只能被动接单,它可以在系统空闲时(通过看门狗或定时器触发 Reflex Mode),主动为自己“排课”学习新技能。
-
四维评分与课程规划:Agent 通过以下公式评估下一个该学什么技能: $$S(t) = w_b \cdot B(t) + w_d \cdot D(t) + w_u \cdot U(t) + w_i \cdot I(t)$$
- $B(t)$ 广度:填补技能树空白。
- $D(t)$ 深度:深化高频使用的现有技能。
- $U(t)$ 实用性:实际工作中的应用潜力。
- $I(t)$ 创新性:涉及新方法或新技术。
-
反思驱动的自适应权重:如果系统预测高分的技能实际没人用(预测与实际偏离),Agent 会自动反思并下调该维度的权重,无需人工调参。
5. 自我改进日志 (Self-Improvement Log)
独立于 SOP,GA 还会维护一份轻量级全局日志。记录:① 历史错误与修正方案;② 用户显式偏好;③ 经验证的成功模式。这些内容会自动注入系统提示词,全局约束 Agent 的行为习惯。
GenericAgent 机制五 —— 极简架构与涌现能力
1. 核心设计哲学:组合而非扩展 (Composition over Extension)
-
传统框架的困境 (Feature-Built-In):每增加一个高级能力(如定时任务、子 Agent),就硬编码一个专门的管理模块(如事件总线、调度守护进程),导致系统复杂度线性爆炸。
-
GA 的破局 (涌现能力):追求代码极简性(核心逻辑不到 3,300 行)与接口极简性。通过定义极少数的通用底层原语,大幅降低组件的组合成本。高级能力不是“被开发”出来的,而是从基础原语的组合中自然涌现的。
2. 三大底层基石原语
GA 的所有高级功能,都建立在这三个极简机制之上:
-
可调用 CLI 入口点 (Self-Hosted CLI):GA 本身就是一个原生的命令行程序。无需庞杂的插件框架,任何能调用命令行的进程(包括 GA 自己)都能唤起 Agent。
-
基于目录的文件协议 (IPC):通过一套极其简单的文件约定(
input.txt给任务,output.txt流式输出,reply.txt续写对话,stop.txt中断)进行跨进程通信。不依赖 gRPC 或消息队列,彻底解耦。 -
反射模式 (Reflect Mode):一套“轮询循环 + 外部脚本热重载”机制。外部脚本只负责回答“是否要触发任务”,执行则完全走标准流水线。
3. 四大涌现能力解析
无需为以下能力修改核心 Agent Loop(92 行),仅靠上述三大原语的组合即可实现:
| 涌现能力 | 组合配方 | 架构优势与实现细节 |
|---|---|---|
| 子 Agent (SubAgent) | CLI + 文件协议 | 同构进程递归调用。父 Agent 使用 code_run 新起一个 GA 进程即为子 Agent。天然实现内存隔离与上下文隔离。注:极易扩展为 Map-Reduce 并行处理模式。 |
| 看门狗 (Watchdog) | 反射模式 + 文件协议 | 仅需 ~20 行外部脚本,监控文件或日志。触发与执行彻底解耦。 |
| 定时任务 (Scheduled) | 反射模式 + 文件协议 | 仅需 ~100 行轮询 JSON 的脚本。包含冷却检测与最大延迟窗口机制。 |
| 自主空闲学习 | 反射模式 | 仅需 <10 行脚本。每 30 分钟检查系统空闲,触发“自我进化”(联动第 12 章)。 |
附:GenericAgent 第一性原理与四大机制图谱 (全书全局索引)
第一性原理:上下文信息密度最大化
核心约束:在有限预算内,最大化每一个 Token 对当前决策的贡献。平衡“完备性(防幻觉)”与“简洁性(防注意力稀释)”。
| 机制维度 | 核心策略 | 解决的根本问题 |
|---|---|---|
| [工具层] 最小原子工具集 | 仅留 9 个原子工具,剔除 40+ 专用脚手架。利用 code_run 组合泛化。 | 减少每轮必定重复支付的 Schema 固定 Token 成本。 |
| [记忆层] 分层记忆架构 | 摒弃全量追加。L1 存有界索引,L2/L3 存事实与 SOP,靠 file_read 按需精准加载。 | 防止历史库庞大导致的上下文侵蚀与污染。 |
| [压缩层] 截断与压缩流水线 | 字符域预算监控,四阶段主动瘦身(截短、替换过期标签、FIFO驱逐、锚点兜底)。 | 控制单次对话随轮次增加导致的爆炸与失控。 |
| [进化层] 反思驱动自我进化 | 将高熵探索轨迹,经过验证后蒸馏为极简的 L3 SOP 与脚本。进化策略而非工具。 | 打破停滞循环,让下一次相同任务从高信息密度起点起步。 |