Harness Engineering:AI Agent 时代的基础设施
当 AI 从”玩具”走向”工具”,我们需要什么样的工程体系来驾驭它?
什么是 Harness Engineering?
Harness Engineering(驾驭工程)是一个新兴的软件工程领域,专注于构建和管理 AI Agent 的生产级基础设施。
就像传统软件工程需要数据库、消息队列、API 网关一样,AI Agent 的大规模应用也需要专门的”驾驭层”来管理:
- 会话管理:如何保持对话上下文?如何处理长短期记忆?
- 工具编排:Agent 能调用哪些工具?权限如何控制?
- 安全边界:什么操作需要人工审批?如何防止越权?
- 可观测性:Agent 做了什么决策?为什么这么做?
- 成本控制:如何优化 Token 使用?如何设置预算?
为什么需要 Harness?
裸奔的 Agent 很危险
想象一下,你给一个 LLM 完整的文件系统访问权、网络请求能力、甚至执行 shell 命令的权限——这就像一个刚拿到驾照的新手直接开 F1 赛车。
没有 Harness 的 Agent 常见问题:
- 无限循环:Agent 陷入自我调用的死循环
- 权限失控:不小心删除了生产数据
- 成本爆炸:一次错误调用消耗数千 Token
- 黑盒决策:出问题了不知道 Agent 为什么这么做
- 状态丢失:会话中断后无法恢复
Harness 提供的安全网
一个好的 Harness 工程体系提供:
┌─────────────────────────────────────────┐
│ 用户请求 │
└─────────────────┬───────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Harness Layer (驾驭层) │
│ ┌─────────────────────────────────┐ │
│ │ 1. 身份认证 & 授权 │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ 2. 会话状态管理 │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ 3. 工具白名单 & 权限控制 │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ 4. 审批流程 (危险操作) │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ 5. 审计日志 & 可观测性 │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ 6. 成本追踪 & 预算控制 │ │
│ └─────────────────────────────────┘ │
└─────────────────┬───────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ LLM Agent │
└─────────────────────────────────────────┘
Harness Engineering 的核心组件
1. 会话管理 (Session Management)
每个 Agent 交互都应该有明确的会话边界:
# 会话状态示例
{
"session_id": "sess_abc123",
"user_id": "user_456",
"created_at": "2026-04-08T10:00:00Z",
"context_messages": [...], # 对话历史
"memory_snippets": [...], # 长期记忆
"tool_calls": [...], # 已调用的工具
"pending_approvals": [...] # 待审批的操作
}
关键点:
- 持久化:会话状态需要持久存储,支持断点续传
- 隔离:不同用户的会话必须严格隔离
- 生命周期:自动清理过期会话,归档重要对话
2. 工具编排 (Tool Orchestration)
Agent 的能力边界由工具定义:
# 工具配置示例
tools:
- id: file_read
description: 读取文件内容
permission: allow
rate_limit: 100/hour
- id: file_write
description: 写入文件
permission: require_approval # 需要审批
approval_threshold: high
- id: shell_exec
description: 执行 shell 命令
permission: deny # 默认禁止
allowlist: ["git status", "npm test"]
- id: web_search
description: 搜索网络
permission: allow
rate_limit: 50/hour
最佳实践:
- 最小权限原则:默认禁止,显式允许
- 分级审批:读操作自动通过,写操作需确认,删除操作需人工审批
- 速率限制:防止滥用和意外循环调用
3. 可观测性 (Observability)
Agent 的每个决策都应该可追溯:
{
"trace_id": "trace_xyz789",
"timestamp": "2026-04-08T10:05:32Z",
"session_id": "sess_abc123",
"event_type": "tool_call",
"tool_id": "file_write",
"input": {"path": "/tmp/test.txt", "content": "..."},
"llm_reasoning": "用户要求创建测试文件...",
"approval_status": "pending",
"approver": null,
"output": null,
"cost_tokens": 1250
}
关键指标:
- 延迟:从用户请求到响应的时间
- Token 消耗:每次调用的成本
- 工具调用成功率:多少操作成功完成
- 审批通过率:多少操作需要人工介入
- 错误分布:哪些错误最常见
4. 安全边界 (Safety Boundaries)
明确什么能做、什么不能做:
# 安全策略示例
SAFETY_POLICIES = {
"filesystem": {
"allowed_paths": ["/home/user/workspace"],
"forbidden_paths": ["/etc", "/root", "/proc"],
"max_file_size": "10MB",
"forbidden_operations": ["rm -rf", "chmod 777"]
},
"network": {
"allowed_domains": ["api.github.com", "pypi.org"],
"forbidden_domains": ["internal-corp-network.local"],
"max_request_size": "1MB"
},
"execution": {
"timeout_seconds": 300,
"memory_limit": "512MB",
"forbidden_commands": ["sudo", "rm", "dd"]
}
}
实际案例:OpenClaw 的 Harness 设计
以 OpenClaw 为例,它的 Harness 层包括:
会话隔离
- 每个用户有独立的
sessionKey - 子 Agent 运行在隔离的会话中 (
runtime: "isolated") - 会话状态持久化到文件系统
工具权限
// 工具调用需要显式授权
{
"toolsAllow": ["read", "write", "exec", "web_search"],
"elevated": false // 需要 /approve 才能执行危险命令
}
审批流程
- 危险操作(如
rm、外部 API 写入)触发审批卡片 - 用户可以在聊天界面直接 approve/reject
- 审批记录计入审计日志
记忆系统
- 短期记忆:会话内的对话历史
- 长期记忆:
MEMORY.md+memory/*.md文件 - 技能系统:
SKILL.md定义专用能力
构建自己的 Harness:起步建议
第一阶段:基础安全
- 会话隔离:确保每个用户的状态不互相干扰
- 工具白名单:只允许必要的工具
- 基础日志:记录所有工具调用
第二阶段:可观测性
- 完整审计:记录输入、输出、决策理由
- 成本追踪:统计 Token 使用和费用
- 错误处理:优雅处理 LLM 失败和超时
第三阶段:自动化
- 智能审批:基于风险等级自动决定是否需要人工审批
- 自愈机制:检测到异常时自动回滚或暂停
- 性能优化:缓存、批处理、流式响应
常见陷阱
❌ 过度信任 LLM
# 错误:直接执行 LLM 生成的命令
command = llm.generate_command(user_request)
exec(command) # 危险!
# 正确:解析意图,映射到安全工具
intent = llm.parse_intent(user_request)
if intent.type == "file_read":
safe_read_file(intent.path) # 受限的 API
❌ 忽略状态管理
# 错误:无状态调用,每次都是新对话 response = llm.chat(user_message) # 正确:维护会话上下文 session = get_session(session_id) session.messages.append(user_message) response = llm.chat(session.messages) session.messages.append(response) save_session(session)
❌ 没有成本意识
# 错误:无限制调用
while not satisfied:
response = llm.chat(prompt) # 可能无限循环
# 正确:设置预算和重试限制
budget = TokenBudget(max_tokens=10000)
for attempt in range(3):
if budget.exceeded:
break
response = llm.chat(prompt, max_tokens=budget.remaining)
budget.consume(response.tokens)
未来展望
Harness Engineering 还在早期阶段,但已经可以看到一些趋势:
- 标准化:类似 A2A (Agent-to-Agent) 协议的涌现
- 专用工具:专为 Agent 设计的监控、调试、测试工具
- 合规框架:企业级的审计、合规、数据治理要求
- 多 Agent 编排:管理多个 Agent 的协作和冲突解决
结语
Harness Engineering 的本质是承认 LLM 的不确定性,并在此基础上构建可靠的工程体系。
它不是要限制 AI 的能力,而是让 AI 的能力在安全的边界内最大化发挥。就像 F1 赛车的护栏不是为了限制速度,而是让车手可以安全地开到极限。
当你在构建 AI 应用时,不要只关注”Agent 能做什么”,更要关注”如何安全地让它做”。Harness Engineering 就是答案。
参考资源:
- OpenClaw 文档 – 开源 AI Harness 实现
- A2A Protocol – Agent 间通信标准
- LangChain – Agent 编排框架
- Cline/Roo-Code – VS Code AI 扩展的 Harness 设计