你有没有想过:当Claude Code在Auto模式下自动执行操作时,是谁在判断"这事能不能干"?

不是写死的规则,而是另一个AI——YOLO分类器。它是Claude Code的"安全守门员",专门负责在无人值守时把关。

YOLO是什么?AI审核AI

YOLO(You Only Live Once)分类器是一个独立的AI系统。当主AI(Claude)想执行一个工具调用时,YOLO会独立判断:“这个操作安全吗?”

这就像银行的大额转账:柜员(主AI)想操作,风控系统(YOLO)要审核。两个AI互相独立,避免单点故障。

工作流程:

主AI:我想执行这个Bash命令
YOLO分类器:让我看看...这个命令安全吗?
安全 → 放行,主AI继续执行
危险 → 阻止,转人工确认

分层过滤:四道安全闸门

不是所有操作都需要AI审核。YOLO有四道闸门,层层过滤:

第一道闸门:安全白名单

只读操作天然安全,直接放行:

  • Read:读文件
  • Grep:搜索
  • Glob:文件匹配
  • LSP:代码分析
  • TodoWrite:任务管理

这些操作不可能破坏数据,不需要审核。

第二道闸门:输入过滤

每个工具可以定义toAutoClassifierInput方法,决定哪些字段暴露给YOLO。

如果返回空字符串,说明这个工具调用没有敏感内容,直接放行。

这就像安检:有些东西一眼就能看出没问题,不用过X光机。

第三道闸门:阶段1快速判定

通过前两道闸门的操作,进入YOLO审核。但YOLO不是一上来就深度分析,而是分两个阶段:

阶段1:快速判定

  • 用极小的token预算(64 tokens)
  • 使用简洁的XML格式输出
  • 目标是"快速放行明显安全的操作"

输出格式很简单:

<block>no</block>  ← 放行

或者:

<block>yes</block>
<reason>删除根目录风险太高</reason>

阶段1的指令是"宁可错杀,不可放过"——稍有疑问就标记为阻止。

第四道闸门:阶段2深度推理

阶段1判定为"阻止"的操作,升级到阶段2:

  • 更大的token预算(4096 tokens)
  • 要求输出<thinking>标签进行推理
  • 重新评估,纠正可能的误判

这就像:

  • 阶段1:保安看一眼觉得可疑,先拦下来
  • 阶段2:警官仔细询问,判断是真的有问题还是误会

安全白名单的艺术

YOLO的白名单设计有几个精妙之处:

写操作不在白名单中

文件编辑(EditWrite)不白名单放行。但有个例外:工作目录内的编辑自动放行,目录外的才需要审核

这就像:

  • 在家(工作目录)里随便折腾
  • 出门(目录外)要小心

Swarm协调工具在白名单中

SendMessageTeamCreate等协调工具看似有副作用,但子Agent各自有独立权限检查,所以协调层面安全。

这就像:队长发号施令不危险,执行才危险。

分类器自身在白名单中

避免递归调用:YOLO审核YOLO调用时,不能再触发YOLO。

对话转录:YOLO看到了什么

YOLO不看原始消息,而是看"转录"——经过过滤的摘要。

能看到

  • 用户指令
  • 工具调用(tool_use块)

不能看到

  • 主AI的自由文本输出(防止被注入攻击)
  • 图片等非文本内容

转录格式支持两种:

  1. 文本格式User: xxx\nBash: ls -la
  2. JSONL格式{"user":"xxx"}\n{"Bash":"ls -la"}

JSONL更安全,因为换行符被转义,无法伪造工具调用行。

拒绝追踪:防止死循环

YOLO可能陷入病态循环:

主AI尝试操作A → YOLO拒绝
主AI换个说法尝试操作A → YOLO拒绝
主AI再换种说法... → YOLO拒绝

拒绝追踪用两个计数器解决这个问题:

  • 连续拒绝计数:达到3次,回退到人工模式
  • 总计拒绝计数:达到20次,回退到人工模式

成功操作会重置"连续计数",但不重置"总计数"。这样即使穿插成功,累积的拒绝也会触发回退。

这就像:你连续三次被保安拦下,或者一天被拦了20次,经理就会介入。

模板系统:差异化的安全策略

YOLO的系统提示词不是固定的,而是模板组合:

外部用户模板:面向公开版本,安全策略保守 Anthropic内部模板:面向内部开发,可能更宽松

用户还可以自定义规则:

{
  "autoMode": {
    "allow": ["允许运行npm test"],
    "soft_deny": ["拒绝修改项目目录外的文件"],
    "environment": ["这是React项目"]
  }
}

这些规则注入YOLO的系统提示词,影响AI裁决。

错误处理:失败即阻止

YOLO的设计原则是:任何不确定性都等同于阻止

  • API返回无法解析 → 阻止
  • API超时 → 阻止
  • API返回429/500 → 阻止
  • 用户取消 → 阻止

唯一例外:unavailable: true标志让调用者知道"是分类器宕机了,不是真的危险"。

这就像银行风控系统故障时,默认拒绝所有交易——宁可业务暂停,不可资金损失。

实战:如何用好Auto模式

1. 添加自定义规则

在CLAUDE.md或settings.json中添加:

{
  "autoMode": {
    "allow": [
      "Allow running make clean in build directory",
      "Allow npm install and npm test"
    ]
  }
}

2. 连续被拒怎么办?

如果连续3次被拒,系统会自动回退到人工确认。这时候:

  • 检查CLAUDE.md是否有相关规则
  • 手动放行,观察后续行为
  • 必要时调整autoMode规则

3. 性能优化

YOLO分类有成本:

  • 阶段1:~64 tokens,亚秒级延迟
  • 阶段2:~4096 tokens,需要等待

可以通过toAutoClassifierInput返回空字符串来跳过分类,降低开销。

这对构建AI Agent的启示

YOLO分类器展示了AI安全审核的几个关键模式:

模式1:分层短路过滤

不是所有请求都需要深度审核。设置多层过滤:

  • 白名单(零成本)
  • 输入过滤(低成本)
  • 快速判定(中成本)
  • 深度推理(高成本)

模式2:失败即阻止

安全系统必须有保守的默认行为。任何故障都等同于"阻止操作"。

模式3:连续异常降级

自动化系统可能陷入死循环。监控连续失败/拒绝次数,达到阈值后降级到人工模式。

总结

YOLO分类器是Claude Code Auto模式的安全基石:

  • AI审核AI:独立模型做安全裁决
  • 四道闸门:白名单→输入过滤→阶段1→阶段2
  • 转录机制:只暴露必要信息,防止注入
  • 拒绝追踪:防止死循环
  • 失败即阻止:保守的安全哲学

这就像:

  • 主AI是驾驶员
  • YOLO是副驾的安全员
  • 白名单是"明显安全"的快速通道
  • 阶段1是"看一眼"的初步判断
  • 阶段2是"仔细想"的深度分析
  • 拒绝追踪是"别让司机钻牛角尖"的保护机制

理解YOLO,你就能:

  • 更好地使用Auto模式
  • 通过自定义规则优化体验
  • 在自己的AI Agent中实现类似的安全机制

下篇咱们聊聊Hooks——在关键节点插一脚。