跳转至

12 个 Agent 工程设计底层逻辑:脚手架 vs 承重墙

📊 Level ⭐⭐⭐⭐ | 10.0KB

原文归档:原文归档

Bilgin Ibryam 提炼 Claude Code 12 个设计模式的中文深度解读,增加"什么时候过度设计"判断框架和完整 Python 代码实现。云朵君/数据STUDIO。

一句话

12 模式四类(记忆/编排/权限/兜底),1-11 是脚手架(拆了还站),12 是承重墙(拆了塌),核心原则:把确定性逻辑从 LLM 推理中剥离。

核心隐喻

  • 模式 1-11 = 脚手架:帮 Agent 更好地工作,拆了房子还能站
  • 模式 12 = 承重墙:系统级兜底,不依赖 Agent 记性,拆了直接塌

四类架构问题

类别 模式 核心问题
记忆与上下文 1-5 Agent 应该记住什么,记在哪,记多久
工作流与编排 6-8 怎么不让上下文变成垃圾场
工具与权限 9-11 Agent 能做什么操作,怎么保证不捅娄子
自动化兜底 12 不该让模型记住的事

记忆不可能三角

容量 × 速度 × 相关性,只能三选二: - 容量大 + 速度快 = 上下文窗口塞爆 - 速度快 + 相关性高 = 只能记最近几轮 - 容量大 + 相关性高 = 检索慢

模式 3 深讲:分层记忆

三层:索引常驻(~200 行硬限制)→ 热层按需加载 → 冷层搜索

Claude Code 实现:MEMORY.md(索引)→ memory/(分类文件)→ 磁盘(完整历史)

关键:索引一膨胀 → 分层失效 → 退化回全量塞 prompt

模式 7 深讲:上下文隔离子智能体

主 Agent 的核心能力不是"拆 sub-agent",是信息编辑——从 100 页调研里挑出相关的 3 段传给执行 Agent。

模式 10 深讲:命令风险分类

三级风险判定(低/中/高),分级逻辑必须落在确定性代码里,不能靠 prompt。

模式 12 深讲:确定性生命周期钩子

四个挂载点:PreToolUse / PostToolUse / SessionStart / Stop

三个关键设计:(1) 不调 LLM (2) 与 prompt 解耦 (3) 失败即阻断

什么时候过度设计

模式 过度设计信号
1 持久化指令 文件超 500 行没拆分 → 升级到模式 2
2 作用域上下文 单项目 3 个文件以内 → 一个 CLAUDE.md 够
4 记忆整合 项目跑不到两周 → 手动清理就行
5 渐进压缩 短会话 10 轮以内 → 压缩反而丢信息
6 探索-规划-执行 改一行配置 → 直接改比走三轮快
8 分支-合并并行 子任务有依赖 → 并行制造合并冲突
9 渐进式工具扩展 工具少于 5 个 → 直接全开放
11 单用途工具 工具少于 3 个 → 合并更简单

踩坑记录

  • MEMORY.md 索引文件三个月从 80 行涨到 190 行,再涨触发分层失效
  • Agent 跑 find -exec sed 路径没加引号撞上空格目录名
  • 真正的坑不是"怎么存更多"是"怎么删旧的"

深度分析

记忆不可能三角:不是三个开关,是一条约束面

容量、速度、相关性三个诉求并非独立的设计选项,而是同一枚硬币的三面——任何记忆方案都落在"三选二"这条约束面上,没有免费午餐。模式 1-5 的五个模式,本质是这条约束面上的五个不同取点:持久化指令(模式 1)牺牲速度换容量与相关性,作用域上下文(模式 2)用空间换相关性,渐进压缩(模式 5)用精度换容量。分层记忆(模式 3)之所以最受重视,不是因为它打破了三角,而是它把三角的取舍内嵌到了分层结构里——索引层赌相关性(常驻但硬限 200 行),热层赌速度(按需加载),冷层赌容量(全文搜索)。记忆的价值从来不在"存了多少",而在"在正确的时刻把正确的东西加载进正确的上下文"。

分层记忆 vs 上下文隔离:两种对抗"上下文膨胀"的策略

模式 3 与模式 7 表面上都在解决上下文膨胀,路径却截然相反。分层记忆(模式 3)把全部记忆留在同一个上下文窗口内,只按加载优先级分层管理,切换成本低,但代价是单个脆弱窗口——索引一旦膨胀,分层失效,就退化回"全量塞 prompt"的原始状态(这正是踩坑记录里 80→190 行的警报)。上下文隔离(模式 7)则物理上拆开上下文:调研、规划、执行各用独立的 sub-agent 窗口与权限,避免"写代码时 90% 是历史噪音"。隔离的代价是交接开销,且成败取决于主 Agent 的"信息编辑"能力——从 100 页里挑出相关的 3 段,而不是把全文转发过去。两者的共同敌人是同一个:噪音淹没信号。参见 Context Isolation。

命令风险分级与确定性钩子:安全逻辑必须脱离 prompt

模式 10 与模式 12 共享同一条设计信条:确定性逻辑必须落在确定性代码里,不能靠 prompt。风险分级之所以要三级(低/中/高)而不是二元放行/确认,是因为二元只有"有门控"和"没有门控"两种状态——而"确认疲劳"(第 50 次直接点确认)实际等于没有门控。分级要靠 HIGH_RISK_PATTERNS 这样的确定性规则,靠 prompt 分级 = 模型某天把 rm -rf / 判成低风险 = 生产事故。模式 12 的确定性生命周期钩子(PreToolUse/PostToolUse/SessionStart/Stop)把同样的原则推向自动化:不调 LLM、与 prompt 解耦、失败即阻断。二者呼应全文主线——从"更聪明的模型"到"更可靠的系统":模型做判断,系统做执行,把确定性逻辑从 LLM 推理中剥离。

模式图谱的元设计:"什么时候过度设计"本身就是一种模式

回顾 12 个模式,它们覆盖四类不可绕过的架构问题——记忆怎么管、任务怎么拆、权限怎么控、兜底怎么做。而作者自带的"什么时候过度设计"判断表,本身就是最值得提炼的元设计:模式 1-11 是脚手架,其价值是帮 Agent 更好地工作,当它不再为此付费时(改一行配置、工具少于 5 个、短会话 10 轮以内)就该拆掉;模式 12 是承重墙,拆了直接塌。这套"脚手架 vs 承重墙"的二分,给出了落地时的取舍标尺——不是所有模式都要上,而是先判断当前规模下哪个模式在替你扛风险、哪个只是增加复杂度。脚手架能拆就拆,承重墙一根都不能少。

实践启示

  1. 盯住索引膨胀这条生死线:分层记忆(模式 3)的索引有 ~200 行硬限制,一旦膨胀分层就失效、退化成全量塞 prompt。定期清理旧记忆比"存更多"更关键——真正的坑是"怎么删旧的",不是"怎么存新的"。
  2. 长会话主动拆上下文:调研/规划/执行各用独立 sub-agent(模式 7),靠"信息编辑"只传 3 段相关摘要给执行 Agent,而不是转发 100 页原文。主 Agent 的核心能力是裁剪,不是转发。
  3. 权限分级必须落到确定性代码:低风险自动放行、中风险确认、高风险硬拦截(模式 10),用 HIGH_RISK_PATTERNS 这类规则而非 prompt——模型会"理解偏",rm -rf / 必须无条件拦下。
  4. 把一次性校验挂到生命周期钩子上:格式化、风险分级这类确定性动作放到 PreToolUse/PostToolUse/Stop 等钩子(模式 12),不调 LLM、失败即阻断,把 LLM 的推理留给真正需要判断的事。
  5. 动手前先问"是不是过度设计":改一行配置别走探索-规划-执行三轮,工具少于 5 个别分级、单项目 3 个文件以内一个 CLAUDE.md 够用。脚手架能拆就拆,承重墙一根都不能少。
  6. 用"三个月后是参考还是噪音"过滤记忆:写进长期记忆的每条决策,都要问它三个月后对 Agent 的判断是帮助还是干扰——记忆的价值在正确时刻被加载,不在总量。参见 记忆主矛盾 与 Working Set vs Long-Term Memory。

相关实体