越自主,越危险
一个 Agent 可以读文件、写代码、调 API、发邮件。当你给它一个任务,它会自主决定做什么、怎么做、做多少。
这正是 Agent 的价值所在——也是它最大的风险来源。
“越自主\”不等于\”越好用”。 一个没有约束的 Agent 可以:
- 调用你没预期的工具
- 在你不知情的情况下修改数据
- 因为一个 Bug 陷入无限循环,烧光 Token 配额
- 出错后无法回溯,也无法回滚
Harness Engineering(可控执行框架)的核心思想是:在不削减 Agent 能力的前提下,定义它的行为边界。 不是\”不让 Agent 做事\”,而是\”让 Agent 在受控范围内自主行动\”。
本文用实验覆盖五个核心要素,并记录三个反直觉结论。
Harness Engineering 五要素
要素 1 Action Space 动作空间注册表 白名单拦截未授权工具
要素 2 Human Checkpoint 人工检查点 高风险操作前暂停等待审批
要素 3 Execution Boundary 执行边界 最大步数上限防止失控
要素 4 Audit Log 审计日志 所有操作追加写入,不可篡改
要素 5 Rollback 回滚机制 写操作前记录快照,失败可恢复
Demo 1:Action Space——注册表即边界
注册表的设计原则:显式声明允许的操作,其余一律拒绝(白名单而非黑名单)。
ACTION_SPACE: dict[str, dict] = {
\”read_report\”: {
\”risk\”: \”safe\”, \”needs_approval\”: False},
\”write_report\”: {
\”risk\”: \”risky\”, \”needs_approval\”: True},
# \”delete_records\” 不在注册表 → 自动被拦截
}
三个工具:read_report(只读)、write_report(写操作)、delete_records(危险,未注册)。
harness_tools_node 在执行任何工具前先查注册表:
if name not in ACTION_SPACE:
audit(name, \”blocked\”, \”BLOCKED\”, \”not in action space\”)
result_text = (
f\”ERROR: \’{
name}\’ is not in the allowed action space. \”
f\”Allowed tools: {
list(ACTION_SPACE)}.\”
)
测试\”删除 users 表的所有记录\”:
Query: \’Delete all records from the users table.\’
Answer: I\’m sorry, but I am unable to delete all records…
Audit: 16:36:26 blocked BLOCKED delete_records not in action space
delete_records 从未被调用。审计日志写入 BLOCKED。LLM 读到错误字符串后给出了礼貌的拒绝回复。
结论:注册表拦截在工具执行层,与 LLM 的意图无关。 哪怕 LLM 非常想调这个工具,Harness 在工具节点就已经阻断。
Demo 2-4:Human Checkpoint——LangGraph interrupt 检查点
这是 Harness Engineering 的核心机制。interrupt() 是 LangGraph 提供的原生暂停原语:在自定义 tools 节点内调用 interrupt(data),图立即暂停;通过 Command(resume=value) 恢复执行,interrupt() 返回 value。



