Skip to content

06 — Harness vs 脚手架(Scaffolding)

为什么需要区分这两个概念

"Harness(驭化层)"和"脚手架(Scaffolding)"在 AI Agent 语境下经常被混用,但 arXiv 论文 2603.05344 对它们做出了精确区分——这个区分对实践有重要指导意义。


核心定义

脚手架(Scaffolding)

构建阶段的准备层——在第一个 Prompt 被发送之前存在的一切。

包括:

  • 模型选择和配置
  • 初始系统提示的构建
  • 工具定义(可用工具的列表和描述)
  • 初始上下文的组装(相关文件、规范文档)
  • Agent 工作流的整体编排逻辑

类比:建筑施工中的脚手架——在建筑完成后可以拆除的临时支撑结构。

Harness(驭化层)

运行时的持久编排层——在 Agent 运行的整个生命周期中持续存在。

包括:

  • 工具调用的实际执行
  • 上下文窗口的动态管理
  • 跨对话的状态持久化
  • 安全边界的执行(沙箱、权限控制)
  • 错误恢复和重试逻辑
  • 子 Agent 的生命周期管理
  • 人工干预点(Human-in-the-loop)

类比:建筑的永久结构——它是最终产品的一部分,持续运行。


在代码层面的区分

属于脚手架的代码

python
# scaffolding.py — 构建 Agent 运行环境

def build_agent_context(task: Task, codebase: Codebase) -> AgentContext:
    """构建 Agent 执行任务所需的初始上下文"""
    relevant_files = codebase.find_relevant_files(task.description)
    system_prompt = PromptBuilder()...
    tools = [ReadFileTool(), WriteFileTool(), RunCommandTool(...)]
    return AgentContext(system_prompt=system_prompt, tools=tools)

属于 Harness 的代码

python
# harness.py — Agent 运行时的编排层

class AgentHarness:
    def execute_tool_call(self, tool_name: str, args: dict) -> ToolResult:
        # 安全检查:防止越权操作
        if not self.security_policy.allows(tool_name, args):
            return ToolResult.denied(...)

        # 执行工具
        try:
            result = self.tools[tool_name].execute(args)
            self.audit_log.record(tool_name, args, result)
            return result
        except Exception as e:
            return ToolResult.error(message=str(e), suggestion=...)

为什么这个区分重要

在设计层面

决策属于脚手架属于 Harness
"选哪个模型"
"系统提示写什么"
"允许 Agent 使用哪些工具"
"如何执行文件写入操作"
"上下文窗口满了怎么办"
"工具调用失败如何重试"
"是否需要人工确认"

在演进层面

脚手架演进:随着对任务的理解加深,调整系统提示、工具集合、上下文构建策略。

Harness 演进:随着生产经验积累,强化安全边界、优化状态管理、改善错误恢复机制。


主流工具的 Harness 实现

OpenAI Codex

Codex Harness 架构:
├── App Server(双向 JSON-RPC API)
├── 沙箱执行环境(基于 git worktree 的任务隔离)
├── 状态管理(跨对话任务进度追踪)
└── Human-in-the-loop(敏感操作的确认流程)

Claude Code(Anthropic)

Claude Code Harness 架构:
├── CLAUDE.md(上下文工程层)
├── .claude/hooks/(事件驱动的自定义逻辑)
├── .claude/skills/(可复用工作流)
├── MCP 服务器(工具扩展)
└── 自动压缩(上下文窗口管理)

LangChain / LangGraph

LangChain Harness 中间件栈:
├── LocalContext(隔离的文件系统上下文)
├── LoopDetection(防止无限循环)
├── ReasoningSandwich(强制 COT 推理)
├── ToolCallValidator(工具调用验证)
└── StateCheckpointer(检查点式状态持久化)

"薄 Harness" vs "厚 Harness" 的争论

业界对 Harness 应该多厚存在争论:

Anthropic 立场(薄 Harness)

"Claude Code 是对模型最薄的封装。我们的工作是让模型本身更强,而不是用复杂的 Harness 掩盖模型的不足。"

OpenAI/LangChain 立场(厚 Harness)

"相同模型,不同 Harness,性能差异超过 36 个百分点。Harness 不是补丁,是基础设施。"

实践建议:从薄 Harness 开始,观察真实失败,按需加厚。不要为假想的问题预防性地构建复杂 Harness。


下一步

  • 开始实施:→ ../practice/4-week-roadmap.md
  • 查看完整工具生态:→ ../../ecosystem-tools-comparison.md
  • 深入了解这场争论:→ ../../debate-big-model-vs-harness.md

Released under the MIT License.