欢迎光临
我们一直在努力

Agent 系列(17):Harness Engineering——给自主 Agent 装上安全护栏

越自主,越危险

一个 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。

赞(0)
未经允许不得转载:171主机测评 » Agent 系列(17):Harness Engineering——给自主 Agent 装上安全护栏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址