SRE Agent 设计笔记 10:Context Engineering 的实践:知识分层与加载策略
状态:大纲
核心论点
Agent 的知识不是一坨 prompt 塞进去就行。Skills / Facets / Knowledge 是三种不同抽象层次的知识,对应不同的加载策略和变更频率。这个分层不是分类学上的洁癖,是被两个实际力驱动的:context window 预算管理和维护责任分离。从四原语的视角看,Skills 是 Spec 组件,Facets 是 Loop 的方法论,Knowledge 是 Loop 执行时的领域数据。Blog 08(Prompt to Skill)讲了「Skill 是持久化的 Spec」,本篇回答它的 follow-up:除了 Spec 以外,agent 还需要什么,以及这些东西为什么不能也做成 Skill。
大纲
1. 问题:575 行 monolithic skill.md 怎么拆
起点是一个具体的工程问题:oncall triage agent 的 skill.md 有 575 行,每次全量注入 context。里面混着验收标准、输出格式模板、MCP 查询安全规则、调查方法论、case 路由表。全塞进去浪费 context,不塞又怕遗漏。
直觉反应是「拆成小文件」,但拆的维度是什么?按文件大小拆?按使用频率拆?按主题拆?不同的拆法导致不同的架构。
2. 三种知识的本质区别
| Skills | Facets | Knowledge | |
|---|---|---|---|
| 回答的问题 | 怎么工作(meta) | 怎么调查(method) | 调查什么(domain) |
| 四原语映射 | Spec 组件 | Loop 的方法论 | Loop 执行时的领域数据 |
| 举例 | 验收标准、输出格式、查询安全规则 | 信号提取方法、日志分析步骤、Pod 检查流程 | case 库、runbook、debug tree、routing table |
| 变更驱动力 | agent 设计迭代(低频) | 方法论改进(中频) | 每次 case 积累(高频) |
| 维护者 | agent 设计者 | SRE / 方法论 owner | oncall 团队 / 自动积累 |
区分标准不是「内容是什么」,是「什么力量驱动它变化」和「谁负责维护它」。
3. 加载策略与 Context Window Budget
三种知识对应三种加载机制,根本原因是 context window 是稀缺资源:
Skills → Claude Code 原生注册机制
- 自动注入(frontmatter
skills字段):每次都需要且体量小(< 50 行),agent 启动即加载 - 按需加载(
/skill-name):体量大或条件性使用 - 为什么用原生机制:Skills 定义了 Spec(终态),agent 从第一步就需要知道 done 长什么样
具体拆分:
| Skill | 行数 | 加载方式 | 理由 |
|---|---|---|---|
| acceptance-criteria | 30 | 自动注入 | 每次都需要,agent 启动即知终态 |
| query-safety | 17 | 自动注入 | 每次 MCP 查询都需要 |
| output-format | 172 | 按需 | 只在写输出时需要 |
| data-tools | 103 | 按需 | 只在查特定数据源时需要 |
| compound-learning | 78 | 按需 | 只在调查结束后需要 |
auto-inject 的判据:每次都需要 + 体量小(< 50 行)。两个条件同时满足才自动注入,否则按需。
Facets → Agent 通过 Read 按需加载
- 不注册为 Claude Code skills,原因:太碎片、条件性太强
- 按告警类型条件触发(Routing 告警 → 加载 signal_extraction facet,Pod 问题 → 加载 compute_pods facet)
- Agent 自己决定何时加载哪个 facet(声明式:routing table 定义了告警类型和对应 facet 的映射,agent 自行匹配)
Knowledge → Agent 通过 Read 按需加载
- 和 Facets 同样是 Read 加载,但驱动力不同
- Knowledge 随 case 积累持续增长(34 cases、21 runbooks、15 cards……),全量注入不现实
- Agent 通过 routing table 定位到具体 case/runbook/debug-tree,只读需要的部分
4. 为什么 Facets 不做成 Skills
表面答案:facets 按告警类型条件加载,不是每次都需要,做成 Skill 会浪费 context。
更深的答案:Skill 是 Spec(终态定义),Facet 是 Loop 的方法论(过程知识)。 它们在四原语中的位置不同。
Skill 定义了「done 长什么样」(验收标准、输出格式),agent 用它判断自己是否完成了。Facet 定义了「怎么做调查」(信号提取的具体步骤、日志分析的查询模板),agent 用它执行调查过程。如果把 facet 做成 skill,就把方法论混进了终态定义,违反了「约束结果不约束过程」的原则。
边界 case:如果某个 facet 很小且几乎每次都用(比如 signal_extraction),是否应该升级为 Skill?判据不是大小和频率,是它回答的问题类型。如果它定义的是「什么算好的信号提取」(终态),升级为 Skill。如果它提供的是「怎么提取信号」(方法),保持为 Facet。
5. 为什么 Knowledge 不放进 Facets
Knowledge 和 Facets 都是 Read 按需加载,为什么还要分开?
变更频率和维护者不同。 Facets 由 agent 设计者维护,随方法论迭代变化(中频)。Knowledge 由 oncall 团队和 agent 自己积累,每次新 case 都可能新增条目(高频)。把它们混在一起,agent 设计者需要在每次 case 积累时 review 整个目录,维护成本高。
增长模式不同。 Facets 的数量大致稳定(调查方法论就那么几种),Knowledge 持续增长(case 库只会越来越大)。分开后,Knowledge 目录可以无限增长而不影响 Facets 的可读性和可维护性。
6. 从 blog 08 到 blog 10 的关系
Blog 08 的结论是:「Skill 是 prompt engineering 的退出路径,把质量约束持久化到 Spec 里。」
本篇追问:如果所有知识都做成 Skill,会怎样?
答案是 context window 爆炸、终态定义和过程知识混淆、维护责任不清晰。所以需要三层分离:Skill(Spec,少量,总是或按需加载)、Facet(Loop 方法论,中量,条件加载)、Knowledge(领域数据,大量,按需读取)。
这三层的关系类比:
- Skill ≈ K8s 的 CRD spec(声明终态)
- Facet ≈ K8s 的 Controller 逻辑(怎么 reconcile)
- Knowledge ≈ K8s 的 ConfigMap / Secret(运行时数据)
7. 实践中的验证
来自 oncall triage agent 的实际数据:
- 自动注入的 acceptance-criteria + query-safety 合计 47 行,每次都用,零遗漏
- 按需加载的 output-format(172 行)只在写输出阶段加载,节省了前期调查阶段的 context
- Facets 按 routing table 条件加载,平均每次调查只加载 1-2 个(共 5+ 个)
- Knowledge 通过 routing table → debug tree 路径定位,平均读取 2-3 个文件(库中 100+ 个)
如果全量注入:47 + 172 + 103 + 78(Skills)+ ~500(Facets)+ ~2000(Knowledge 摘要)≈ 2900 行。实际按需加载后,平均 context 占用 ~400 行。节省约 85%。
涵盖的 Topic
- Topic 新增:Facets / Skills / Knowledge 三种知识组织(从 daily record 2026-04-15 提取)
源文件引用
/Users/rshao/work/work-harness/agents/sre_oncall_triage_agent/README.md— Section 5(Skills 拆分表)、Section 8(Facets vs Skills vs Knowledge 表)、Directory layout、Knowledge base 统计contexts/daily_records/2026-04-15_2135_oncall-agent-architecture-refactor.md— 575 行拆分决策、auto-inject vs on-demand 判据、Facets/Skills/Knowledge 原始定义、三层持久化设计contexts/thought_review/agentic_control_theory_primitives_20260413.md— Spec/Loop 原语定义(Skills 映射 Spec,Facets 映射 Loop 方法论)contexts/thought_review/agent_ops_competency_model_v1.md— Pillar 3 Context Engineering:prompt architecture、tool schema design、knowledge routing- 本系列 blog 08(从 Prompt 到 Skill)— 前置依赖,本篇是其 follow-up