Harness Engineering(三):Parametric vs. Externalized — 那条移动的边界

May 22, 2026

Harness Engineering(三):Parametric vs. Externalized

在上一篇文章中,我们深入分析了两篇关于 Harness Engineering 的奠基性论文(arXiv:2604.08224 和 arXiv:2604.14228)。其中论文一提出的核心框架——「Externalization(外化)」——揭示了当代 AI Agent 系统最根本的设计问题:一个认知负担应该放在模型权重里,还是应该外化到基础设施中?这不是二选一的哲学问题,而是一个需要在四个工程维度上持续做判断的系统分界问题。

理解「外化」:从 Norman 的认知人工物说起

Externalization 框架的理论锚点是 Donald Norman 在 1991 年提出的「认知人工物(Cognitive Artifacts)」概念。核心洞见是:外部辅助工具不是在增强不变的内部能力,而是在改变任务本身的结构。一张购物清单不是扩充生物记忆,而是把一个困难的回忆问题变成了简单的识别问题。一张地图不是让导航「更强」,而是把隐藏的空间关系转化为可见的结构。

论文将这个逻辑应用于 LLM Agent 设计:

graph TB subgraph Human["人类认知外化史"] H1["口语: 思想→可共享符号"] --> H2["文字: 记忆→持久物质记录"] H2 --> H3["印刷: 知识→社会级复制"] H3 --> H4["数字计算: 脑力→可编程机器"] end subgraph LLM["LLM Agent 外化弧"] L1["Memory: 状态外化
recall → recognition"] --> L2["Skills: 专业知识外化
generation → composition"] L2 --> L3["Protocols: 交互结构外化
ad-hoc → structured"] L3 --> L4["Harness: 统一运行环境
不是第四种外化,是协调层"] end Human -.->|"同构映射"| LLM style Human fill:#1a1a2e,stroke:#e94560,color:#eee style LLM fill:#1a1a2e,stroke:#0f3460,color:#eee

论文的核心主张:可靠 Agent 能力越来越不来自模型本身,而来自系统性重构任务需求——让内部能力(参数化)和外部基础设施(外化)联合覆盖完整的能力谱系。你在 Hermes 的 config.yaml 里调整 compression_threshold,本质上就是在管理「外化 infrastructure 占多少上下文预算」这个系统工程决策。

四维决策框架

论文 §7.3 给出的框架可以用一个组合图来概括:

graph TD Q["认知负担 X
放哪里?"] --> D1["维度1: 更新频率"] Q --> D2["维度2: 复用半径"] Q --> D3["维度3: 治理需求"] Q --> D4["维度4: 延迟/上下文成本"] D1 -->|"高频变更
(天~周)"| EXT["🎯 外化"] D1 -->|"低频稳定
(年+)"| PARAM["🧠 参数化"] D2 -->|"跨 agent/跨 session 复用"| EXT D2 -->|"一次性/特异的"| PARAM D3 -->|"需要审计/回滚/合规"| EXT D3 -->|"纯风格/概率性约束"| PARAM D4 -->|"低延迟容忍+简单语义"| PARAM D4 -->|"高延迟容忍+复杂结构"| EXT EXT --> DECISION["决策: 外化到
memory/skill/protocol/harness"] PARAM --> DECISION2["决策: 留在模型权重
或 in-context reasoning"] DECISION --> CHECK{"最小充分性检验:
是否真正减少了模型
的认知负担?"} CHECK -->|"是"| DEPLOY["部署 + 治理层同步设计"] CHECK -->|"否"| REVERT["回退: 该模块只增加了
复杂性而没有减少负担"] style EXT fill:#0f3460,stroke:#e94560,color:#eee style PARAM fill:#1a1a2e,stroke:#533483,color:#eee style CHECK fill:#16213e,stroke:#e94560,color:#eee

维度 1: 更新频率与时效性衰减

论文原文: "Fast-changing knowledge and procedures are strong candidates for externalization. APIs, organization structures, and live environment state decay too quickly to maintain reliably in model weights."

这个维度最直观。判断公式:

知识类型半衰期归宿原因
API 签名/端点天~周外化(MCP schema / tool defs)continual fine-tuning 会导致灾难性遗忘且跟不上频率
组织架构/权限策略外化(config / policy files)需要审计追溯 + 即时生效
代码库结构/项目规则天~周外化(CLAUDE.md / AGENTS.md)每次 prompt 都不同,不可能 bake into weights
编程语言语法参数化深层语法知识已 baked in,受益于深层表征整合
常识推理/语言理解极慢参数化受益于快速检索和深层表征整合

关键警示: 论文明确指出,不能靠「多 fine-tune 几次」来解决时效性问题——continual fine-tuning 会导致 catastrophic forgetting,而且跟不上一周甚至几天的更新频率。这就是为什么 Hermes skill 系统存在的根本原因:改 skill 文件即刻生效,不需要重训模型。

维度 2: 复用半径与跨 Agent 可移植性

论文原文: "If a capability is repeatedly needed across tasks, users, or agents, externalization improves portability and composition. ... One-off or highly idiosyncratic behavior may not justify the overhead."

这是最实用的工程决策维度。量化公式:

外化价值 = (复用频次 × 跨 agent 数量 × 维护成本) / 外化开销
外化开销 = spec 制定 + discovery 机制 + execution binding + context 占用

实例分析:

场景复用频次跨 agent 数外化?理由
Hermes 通用 skill(如 hermes-agent)每 session 都加载所有 agent 实例✅ 必须外化一次编写持续受益,progressive disclosure 控制上下文开销
一次性查询("查 API 文档修一行代码")11❌ 不外化外化开销 > 收益,直接 prompt 描述即可
特定项目 CI/CD 流程中等(每次发版)低(一个项目)⚠️ 边界案例外化到 .github/workflows/ 但不需要 skill 级别
triton-agent 的 Ascend NPU 算子知识多个 NPU 应用✅ 必须外化硬件特定 + 高频迭代 + 跨应用复用

Paper 2(Claude Code 源码分析)验证了这一点:CLAUDE.md 的四层 hierarchy(Managed → User → Project → Directory)正是按复用半径分层的——每一层覆盖的 agent/user 范围不同,外化深度也不同。

维度 3: 可审计性与治理——最被低估的维度

论文原文: "Alignment fine-tuning provides probabilistic behavioral shaping, but externalized constraints provide deterministic enforcement at the interface level."

论文区分了两种「安全」:

Probabilistic(参数化 / RLHF)Deterministic(外化 / 声明式规则)
机制RLHF/DPO 塑造概率分布声明式规则在运行时强制执行
可靠性概率性的,可能被 jailbreak确定性的,结构上不可绕过
可审计性黑盒,无法追溯单个行为白盒,每个决策有明确规则来源
适用场景风格、语气、泛化安全性数据访问控制、操作边界、合规约束

Paper 2 的具体验证: Claude Code 的七种 permission 模式、deny-first 规则引擎、ML 分类器、hook pipeline——全部是外化治理层。而且 Anthropic 发现了一个关键事实:用户批准了 93% 的权限提示——这意味着审批疲劳使人类不可靠,安全必须独立于人类警觉。

工程规则:

  • 如果某个行为约束是「绝对不能做」(如删除生产数据库)→ 必须外化为声明式 deny 规则,不能只靠 RLHF
  • 如果某个行为约束是「最好别这样」(如代码风格偏好)→ 参数化 + 外化(lint rules)组合

维度 4: 延迟、简单性与上下文成本——外化的代价

论文原文: "For ultra-fast, low-variance, or purely semantic tasks, allowing the model to rely on its internal parametric knowledge remains substantially simpler and often more reliable."

这是外化的代价面。外化不是在「加功能」——每个外化模块都会消耗计算和认知资源。论文识别了三种具体 failure mode:

  1. Memory over-retrieval: 检索过多边际相关的记忆,淹没上下文
  2. Skill verbosity: 技能文件过长或过多,挤占 token budget
  3. Tool sprawl: 工具数量膨胀,把 action selection 变成不必要的消歧义问题
上下文预算分配 = 系统 prompt + memory 检索 + skill 加载 + protocol schema + 对话历史 + 推理空间

外化成本 = skill token 开销 + retrieval 延迟 + parsing 开销 + routing 判断
参数化成本 = 0(已经 baked in,forward pass 不变)

决策启发式:

  • 纯语义判断(情绪分类、意图识别)→ 参数化即可
  • 需要精确 schema 的 API 调用 → 必须外化 protocol schema,否则幻觉
  • 简单 shell 命令(ls/cat/grep)→ tool description 够用,不需要 skill
  • 复杂多步骤工作流(CI/CD、数据库迁移)→ 必须外化,靠 prompt 每次重建不可靠

边界是动态的:The Expanding Frontier

论文最深刻的洞察是:参数化与外化的边界不是静态的,它在双向移动。

graph LR subgraph IN["向内收缩(模型变强)"] I1["更好的结构化输出
→ 少需要格式验证"] I2["更大的上下文窗口
→ 更简单的 memory 架构"] I3["更强的 intrinsic tool-use
→ 少需要 intent-capture"] end subgraph OUT["向外扩展(基础设施成熟)"] O1["Planning → 持久化 plan objects
(目前 ephemeral)"] O2["Evaluation → runtime verification
(目前 in CoT)"] O3["Orchestration → harness 自身
可被 agent 检查/修改"] end IN -->|"回撤外化"| BOUNDARY["移动的边界"] OUT -->|"新增外化"| BOUNDARY style BOUNDARY fill:#e94560,stroke:#fff,color:#fff,stroke-width:3px style IN fill:#0f3460,stroke:#533483,color:#eee style OUT fill:#1a1a2e,stroke:#533483,color:#eee

向内收缩: 当模型自身能力提升时,一些原本需要外化的负担可以回撤到参数化。比如当模型的上下文窗口从 128K 扩展到 1M 时,memory 架构可以从精细的分层检索退化为更简单的整体加载。

向外扩展: 三个当前仍在模型内的认知工作最可能被外化:

当前在模型内外化后形态现状
Planning(任务分解)持久化 plan objects,可检查/修订/跨 agent 共享BabyAGI 已实验,InfiAgent 推进中
Evaluation(输出评判)runtime verification 组件,独立于生成Self-refine loops 初现
Orchestration logicharness 配置成为 agent 可修改的对象最递归的形式——让 agent 改自己的 harness

Paper 2 提供了量化锚点: Claude Code 的 98.4% 代码是 operational harness,仅 1.6% 是决策逻辑。这说明当前最优分界点已经极度偏向外化——几乎所有东西都在 harness 里,模型只是被调用的推理引擎。

两个关键风险与治理

graph TD subgraph RISK["外化的两种积累性成本"] R1["认知开销 Cognitive Overhead
外化模块本身也成为负担"] R2["安全风险 Security Risk
外化 artifacts 成为攻击面"] end R1 --> R1A["Memory over-retrieval
淹没上下文"] R1 --> R1B["Skill verbosity
挤占 token budget"] R1 --> R1C["Tool sprawl
action selection 变消歧义"] R2 --> R2A["Memory poisoning
静默扭曲未来推理"] R2 --> R2B["Malicious skill injection
嵌入对抗性流程"] R2 --> R2C["Protocol spoofing
伪造 tool manifests"] R1A --> MIT1["缓解: Minimal sufficiency
只外化真正减少负担的"] R1B --> MIT2["缓解: Lazy loading
任务需要时才加载详细指导"] R1C --> MIT3["缓解: Budget-aware routing
上下文分配作为显式优化变量"] R2A --> GOV["治理层同步设计"] R2B --> GOV R2C --> GOV GOV --> GOV1["强制审查门"] GOV --> GOV2["来源追踪"] GOV --> GOV3["确定性回滚"] GOV --> GOV4["回归测试"] style RISK fill:#1a1a2e,stroke:#e94560,color:#eee style GOV fill:#0f3460,stroke:#533483,color:#eee

外化的悖论: 你增加模块来减轻模型的认知负担,但模块本身也在增加认知负担。过度外化时,"the model spends more effort discovering, parsing, and coordinating modules than solving the task itself"。

论文提出的三项缓解策略:

  1. Minimal sufficiency: 不是最大化外化,而是最小化足够——只外化真正减少负担的部分
  2. Lazy loading / progressive disclosure: 技能详细指导只在任务结构需要时才加载
  3. Budget-aware routing: 把上下文分配当作显式优化变量,按任务阶段动态调整 memory/skill/protocol 的占比

安全风险的教训对实际运维者尤其重要:你从社区安装的每个 Hermes skill / MCP server 都是潜在的攻击面。这就是为什么 skill 来源验证和 tap 信任机制如此关键——Paper 2 指出 Claude Code 的多个 CVE 恰恰利用了 pre-trust 阶段的 hook 和 MCP 服务器初始化。

工程实践指南

基于两个论文的框架,总结了五条操作规则:

graph TD R1["Rule 1: 四问决策"] --> R2["Rule 2: 最小充分性"] R2 --> R3["Rule 3: 区分描述性 vs 规范性"] R3 --> R4["Rule 4: 边界是动态变量"] R4 --> R5["Rule 5: 治理层同步设计"] subgraph R1D["每纳入一个认知负担,问自己四个问题"] Q1["多久变一次?< 月 → 外化"] Q2["多少 agent/任务用?> 3 → 外化"] Q3["失败后果需要追溯吗?→ 外化"] Q4["延迟/上下文成本能承受吗?否 → 参数化"] end R1 -.-> R1D style R1 fill:#e94560,stroke:#fff,color:#fff style R2 fill:#e94560,stroke:#fff,color:#fff style R3 fill:#e94560,stroke:#fff,color:#fff style R4 fill:#e94560,stroke:#fff,color:#fff style R5 fill:#e94560,stroke:#fff,color:#fff

Rule 1: 四问决策法

每当你考虑「这个能力要不要外化成一个 skill / config / protocol」,依次问四个问题。四个维度都指向同一个方向时决策明确;方向冲突时(比如高频变更 + 低延迟),就需要工程权衡。

Rule 2: 最小充分性

不是最大化外化。一个好的 harness 简化模型的决策问题,而非创造第二个需要模型去理解的复杂系统。新加一个模块前,先问:它真的减少了认知负担吗,还是只是多了一层抽象?

Rule 3: 区分描述性外化与规范性外化

  • 描述性(memory/context): 帮助模型知道「现在是什么状态」
  • 规范性(skills/policies): 告诉模型「应该怎么做」
  • 两者共享上下文预算,混合时注意竞争——planning 阶段需要更多 memory,execution 阶段需要更多 skill

Rule 4: 边界是动态变量

模型升级后审计:哪些外化组件可以回撤到参数化?新能力出现后审计:哪些参数化负担应该外化?这就是为什么每次 Hermes 版本升级后,都应该重新审视 config.yaml 里的 compression_threshold 和 skill 加载策略。

Rule 5: 治理层与外化层同步设计

引入一个新 skill 的同时,就设计它的验证机制、回滚策略和版本管理。这是 Hermes skill curator + config backup cron job 存在的深层工程原因——不是运维便利,是架构必需。

实践对照:你的系统已经在外化什么?

你的系统外化了什么对应维度
Hermes config.yaml运行时策略、模型选择、压缩阈值更新频率(高频变更)+ 可审计性
Hermes skills/程序性专业知识复用半径(跨 session)
Hermes memory跨 session 持久化状态更新频率 + 上下文限制
~/.hermes/.envAPI keys, secrets治理需求(不可进 prompt)
triton-agentNPU 算子优化知识更新频率(硬件特定)+ 复用

你的每一个配置文件本质上都是在做「这个 burden 放在哪里最合适」的系统工程决策——即使你之前没有用 Externalization 这个术语。

总结

论文的核心论点用一句话概括:

Agent 能力的真正分界线不是模型大小,而是「什么留在权重里、什么外化到基础设施中」。决定一个认知负担放在哪里,不看它重不重要,而看四个维度:更新频率、复用半径、治理需求、延迟/上下文成本。边界在双向移动——模型变强时回撤外化,基础设施成熟时新增外化。工程上不是追求最大化外化,而是追求最小充分性:只外化真正减少认知负担的部分。

Harness Engineering 的核心不再是「给模型加更多工具」,而是设计一个认知环境——其中 memory 让 recall 变成 recognition、skill 让生成变成组合、protocol 让自由交互变成结构化契约、permission 让行为约束从概率性变成确定性。