1. 理解Harness Engineering的本质
在AI编程领域,我们常常面临一个核心挑战:如何让大型语言模型(LLM)从单纯的"回答者"转变为能够在真实开发环境中稳定工作的"执行者"。这就是Harness Engineering要解决的根本问题。
传统AI交互模式中,模型就像一个知识丰富的顾问,它能给出建议,但无法真正"动手"完成工作。而现代AI编程助手如Claude Code,通过Harness Engineering实现了质的飞跃——它不再只是回答问题,而是能够自主规划、执行代码修改、运行测试,并在整个过程中保持状态和上下文。
1.1 从Context到Harness的演进
Context Engineering(上下文工程)解决了"模型看到了什么"的问题,而Harness Engineering则更进一步,解决了:
- 模型能做什么(能力边界)
- 怎么做(执行路径)
- 做到哪一步停(终止条件)
- 失败后怎么恢复(容错机制)
- 结果如何验证(质量保障)
这种转变类似于软件开发中从函数调用到完整应用程序的演进。一个函数只需要关心输入输出,而一个应用程序必须管理状态、处理异常、维护持久化数据等。
2. Claude Code的Harness架构解析
2.1 工作空间构建:模型的操作环境
Claude Code不会直接将用户问题抛给模型,而是精心构建了一个完整的工作空间:
python复制def build_workspace(repo_path):
# 加载项目特定规则
project_rules = load_project_rules(repo_path)
# 组装系统提示词
system_prompt = assemble_system_prompt(
session_guidance,
environment_info,
language_prefs,
output_style,
mcp_instructions,
scratchpad,
tool_result_rules
)
# 添加上下文信息
workspace_context = {
'cwd': os.getcwd(),
'os': platform.system(),
'shell': os.environ.get('SHELL', ''),
'constraints': ['子agent必须用绝对路径']
}
return {
'system_prompt': system_prompt,
'user_context': user_query,
'workspace_context': workspace_context,
'project_rules': project_rules
}
这种工作空间构建方式确保了模型操作时拥有完整的上下文,包括:
- 会话指导原则
- 环境特定信息
- 项目规范(来自CLAUDE.md等文件)
- 执行约束条件
2.2 能力装配与权限管理
Claude Code的工具管理系统是其Harness的核心组件之一:
-
工具池(Tool Pool)管理:
- 内建工具(文件操作、代码分析等)
- MCP(Model Control Plane)注册的工具
- 动态加载的插件工具
-
权限过滤层:
python复制def filter_tools(tool_pool, deny_rules, user_permissions):
available_tools = []
for tool in tool_pool:
if (tool.name not in deny_rules and
tool.required_permission in user_permissions):
available_tools.append(tool)
return stable_sort_tools(available_tools) # 保持prompt稳定性
- 运行时权限检查:
- 预执行分类器(如bash命令安全评估)
- 权限钩子(可自定义的审批逻辑)
- 竞争性审批机制(本地UI vs 远程bridge)
这种设计确保了模型既拥有足够的操作能力,又不会越权执行危险操作,在灵活性和安全性之间取得了平衡。
3. Agent Loop:执行引擎的核心
3.1 多轮执行状态机
Claude Code的queryLoop()实现了复杂的执行状态管理:
python复制class AgentLoop:
def __init__(self):
self.state = {
'messages': [],
'turn_count': 0,
'budget_remaining': INITIAL_BUDGET,
'compact_state': None
}
def query_loop(self, initial_query):
while self.should_continue():
# 决定下一步动作
action = self.decide_next_action()
if action == 'CONTINUE_TALKING':
self.handle_continuation()
elif action == 'USE_TOOL':
tool_result = self.execute_tool()
self.process_result(tool_result)
elif action == 'REQUEST_INPUT':
self.await_human_input()
# 状态维护
self.update_turn_count()
self.check_budget()
self.consider_continuation_nudge()
这个循环实现了几个关键特性:
- 动态预算管理(token/时间/成本)
- 自动continuation提示(防止agent过早终止)
- 工具执行与结果处理的标准化流程
3.2 长期运行支持
对于长时间运行的任务,Claude Code实现了完整的持久化机制:
-
会话快照:
- 完整上下文状态(包括折叠的上下文)
- 文件修改历史
- 成本消耗记录
- 屏幕录制数据(CLI操作)
-
恢复机制:
bash复制/claude resume --session-id abc123 --restore-context --resume-recording
- 上下文压缩:
- 智能摘要(保留关键信息)
- 微压缩(去除冗余token)
- 按需重新水化(rehydrate)
这使得Claude Code可以处理持续数小时甚至数天的开发任务,而不会丢失状态或上下文。
4. 验证与质量保障体系
4.1 独立验证代理
Claude Code的验证不是简单的输出检查,而是一个完整的子体系:
python复制class VerificationAgent:
def __init__(self, main_agent_work):
self.work_to_verify = main_agent_work
self.verdict = None
def run_verification(self):
# 1. 构建验证环境
env = self.setup_sandbox()
# 2. 执行对抗性测试
test_results = self.run_adversarial_tests()
# 3. 静态分析
static_analysis = self.run_linters()
# 4. 生成最终裁决
if all(t.passed for t in test_results):
self.verdict = 'PASS'
elif any(t.critical_failure for t in test_results):
self.verdict = 'FAIL'
else:
self.verdict = 'PARTIAL'
return self.generate_verdict_report()
这种设计确保了:
- 验证的独立性(不受主agent影响)
- 全面的质量检查(动态测试+静态分析)
- 明确的通过标准(PASS/FAIL/PARTIAL)
4.2 结果后处理
每轮交互结束后的stop hooks执行关键的后处理:
python复制def run_stop_hooks(message_history, system_prompt, context):
# 1. 敏感信息过滤
redacted_message = apply_redaction(message_history)
# 2. 知识提取与存储
extracted_knowledge = extract_learnings(redacted_message)
store_to_knowledge_base(extracted_knowledge)
# 3. 成本分析与优化建议
cost_report = analyze_cost(context)
# 4. 准备下一轮上下文
new_context = prepare_next_turn_context(
redacted_message,
cost_report
)
return new_context
这种后处理流水线确保了每轮交互都能为下一轮提供优化后的起点,形成持续改进的循环。
5. 多智能体协作架构
5.1 角色专业化设计
Claude Code不是单一智能体,而是由多个专业agent组成的系统:
| Agent类型 | 权限范围 | 内存限制 | 典型用例 |
|---|---|---|---|
| 主开发Agent | 完整读写权限 | 64K tokens | 代码重构、功能实现 |
| 探索Agent | 只读权限 | 32K tokens | 代码搜索、文档查询 |
| 验证Agent | 沙盒环境权限 | 16K tokens | 测试执行、质量验证 |
| 运维Agent | 受限系统权限 | 8K tokens | 部署、日志分析 |
这种分工使得每个agent都可以针对特定任务进行优化,同时通过权限限制降低风险。
5.2 子智能体编排
当处理复杂任务时,Claude Code会动态创建和管理子agent:
python复制def run_sub_agent(agent_type, task_description, parent_context):
# 1. 创建隔离上下文
child_context = create_isolated_context(
parent_context,
memory_limit=AGENT_MEMORY_LIMITS[agent_type],
tool_whitelist=AGENT_TOOL_PERMISSIONS[agent_type]
)
# 2. 初始化专用transcript
transcript = AgentTranscript(
agent_type=agent_type,
root_task=task_description
)
# 3. 执行子任务
result = execute_agent_workflow(
agent_type,
child_context,
transcript
)
# 4. 结果整合
return integrate_results(
parent_context,
child_context,
result
)
这种架构提供了以下优势:
- 更好的资源隔离
- 更精细的权限控制
- 专业化的任务处理
- 可追溯的执行记录
6. 实战中的Harness设计原则
基于Claude Code的实现,我们可以总结出几个关键的Harness设计原则:
6.1 渐进式能力暴露
不要一次性向模型暴露所有能力,而是根据任务需求逐步授权:
- 初始阶段:只读权限+信息查询工具
- 确认意图后:受限的写权限
- 验证可信度后:提升权限级别
- 关键操作:必须经过人工确认
6.2 状态管理的四个维度
有效的Harness需要管理四种核心状态:
-
会话状态:
- 对话历史
- 上下文引用
- 临时变量
-
环境状态:
- 工作目录
- 打开的文件
- 运行时配置
-
任务状态:
- 已完成步骤
- 待办事项
- 检查点
-
系统状态:
- 资源使用情况
- 权限级别
- 成本消耗
6.3 恢复机制的实现模式
可靠的恢复机制需要考虑多种场景:
-
会话恢复:
- 重新加载上下文快照
- 重建内存状态
- 续接文件修改
-
错误恢复:
- 自动回滚失败操作
- 保留错误上下文
- 提供修复建议
-
上下文恢复:
- 按需重新水化压缩内容
- 重建工具调用链
- 恢复验证状态
6.4 验证金字塔
仿照测试金字塔,AI行动的验证也应该分层:
code复制 [人工审核]
/|\
|
[自动化验证]
/ | \
/ | \
[单元] [集成] [E2E]
- 底层:自动化检查(语法、风格、简单逻辑)
- 中层:集成验证(API合约、组件交互)
- 高层:端到端场景验证
- 关键操作:最终人工确认
7. 从Claude Code看Harness Engineering的未来
Claude Code的实现展示了Harness Engineering的几个重要发展方向:
-
可编程的AI运行时:
- 将模型能力封装为可调用的服务
- 支持状态管理和持久化
- 提供标准的生命周期钩子
-
混合智能系统:
- AI负责创造性工作
- 传统程序处理确定性任务
- 人类进行高阶监督
-
自适应能力边界:
- 根据上下文动态调整权限
- 学习用户偏好自动优化约束
- 实时风险评估调整行为
-
分布式agent协作:
- 专业agent的微服务化
- 跨agent的通信协议
- 分布式事务管理
在实际工程实践中,Harness的设计需要权衡三个关键因素:能力(Capability)、控制(Control)和复杂性(Complexity)。Claude Code的成功在于它找到了这三者的平衡点——提供足够的操作能力,同时通过精心设计的约束系统保持行为的可靠性和安全性。
