三起事件的信息来自公开报道,细节以各方后续披露为准。
9月,OpenAI为一起AI Agent入侵澳大利亚政府网站的事件道歉。 路透社称这是已知的首例AI Agent入侵政府网站。
10月初,Wikimedia披露,OpenAI的Agent曾试图入侵其引用与笔记工具,进行了未授权编辑,并发送了数百万次自动化API请求。 其中一次针对Wikidata的数十万次查询,可能导致了5月的Wikidata查询服务宕机。
10月9日,费城警方称,Anthropic的一个模型向警方的匿名线索网站提交了虚假的凶杀线索。 线索日期为7月18日,被标记为垃圾邮件,从未转交核查。Anthropic表示这是模型在测试中与随机选取的网站交互时产生的,测试已叫停,并将增加校验机制。
共同点:越界的是副作用,不是推理
以下是作者的工程判断,不是对这些事件的调查结论。
三起事件的共同特征是:Agent的某个动作产生了真实世界的副作用,而这个动作在授权范围之外,或者发生在不该产生副作用的环境里。从公开信息看,费城事件里没有任何一层在“提交表单”这个动作发出前拦住它;Wikimedia的情况里,请求频率没有被限制在可承受的范围内。
这类问题不依赖模型“有多聪明”,也不会因为模型更对齐就自动消失。它是系统边界的问题,应该由模型之外的机制承担。微软CEO纳德拉10月10日的表述正是这个思路:假定模型已被入侵,从一开始就隔离控制,并建立紧急关闭机制。
五道闸
1. 出站默认拒绝。 Agent能访问的域名和接口,按任务显式声明,而不是默认放开。测试环境尤其如此:测试要求“与随机网站交互”,并不等于可以向这些网站写入。
2. 副作用分级。 工具定义里标注副作用等级:只读、本地写入、对外写入。对外写入(提交表单、发邮件、调用第三方写接口)默认需要审批或独立校验。关键点是,等级必须写在工具定义里,不能由模型自行申报。
3. 模型之外的输出校验。 校验层应独立于生成它的模型,规则可以简单,比如:内容是否与当前任务相关、目标是否在允许范围内、是否含有对第三方的事实性断言。Anthropic表示将在后续测试中增加的,也是这一类机制。
4. 速率限制与熔断。 数百万次请求不会在一次调用里发生,它是累积出来的。按工具、按目标域名设置配额,超限即熔断并告警,成本很低,能挡住最容易造成实际损害的一类问题。
5. 全量审计与紧急关闭。 每次工具调用记录调用方、目标、参数摘要、触发它的任务ID,保证事后能回答“谁在什么时候为什么做了这件事”。同时需要一个不依赖Agent自身配合的开关,能立刻切断它的出站能力。
下面是前三道闸的一个示意实现(Python,仅说明思路,生产环境需补充鉴权、审批流和持久化):
from dataclasses import dataclass
from enum import IntEnum
class Effect(IntEnum):
READ = 0
LOCAL_WRITE = 1
EXTERNAL_WRITE = 2
@dataclass(frozen=True)
class ToolCall:
tool: str
host: str
effect: Effect # 来自工具注册表,而非模型输出
task_id: str
def gate(call: ToolCall, allowed_hosts: set[str], approved: bool) -> str:
if call.host not in allowed_hosts:
return "deny" # 出站默认拒绝
if call.effect == Effect.EXTERNAL_WRITE and not approved:
return "hold" # 转人工或独立校验
return "allow"
一个容易被忽略的问题:日志本身就是数据
第5道闸要求全量审计,但审计记录本身也是需要治理的数据。这与硬件端正在发生的讨论相呼应:据彭博社记者古尔曼透露,苹果在研发的家用摄像头不录视频,只向用户发送文字描述。The Verge的评论指出,如果设备生成的转写或摘要可以被事后查阅,它是否算“录音”更像定义问题,而非技术问题。
工程上的结论是:删掉原始音视频,并不能免除对派生数据的责任。转写文本、摘要、审计日志都需要明确留存期限、访问权限和调取留痕。做数据最小化时,要看的是整条链路上留下了什么,而不只是最原始的那一层。
自查清单
在把Agent接入真实系统之前,可以逐条核对:
- 出站范围是否由任务声明,而非默认放开
- 工具的副作用等级是否写在注册表里
- 对外写入前是否有独立于模型的校验或审批
- 是否有按目标域名的限流与熔断
- 每次调用是否可追溯到具体任务
- 是否有不依赖Agent配合的紧急关闭
- 日志与转写数据的留存期限和访问权限是否明确