什么时候不该把 agent 托管在免费推理上:一份拒绝协议
免费推理是沙箱,不是地基。一个能改变生产状态、保留客户文本或凭空发明缺失架构的 agent 任务,应该在请求第一个 token 之前就被拒绝。最便宜的宿主在失败模式不可逆时就是错误的宿主。这篇 dev.to 文章给出的是一套拒绝协议:任务卡(job card)、本地预检门和运行开始后也会触发的退出标准。
任务卡:agent 运行以文件开始
免费层 agent 运行应该以文件开始,而不是以聊天开始。卡片刻意无聊——无聊的卡片可审计,花哨的 prompt 不可审计。
# jobcard.yaml
id: draft-readme-only
host_class: free_inference
allowed_tools: [read_file, list_dir]
forbidden_tools: [git_push, kubectl, send_email, http_post]
data_classes: [public_docs]
output_sink: local_drafts/
sla: none
human_merge: required
max_wall_clock_s: 180
max_tool_calls: 12
assumption_policy: refuse_if_unspecified
卡片是与操作者的契约,不是与模型的契约。模型不遵守 YAML,操作者遵守。
预检门:拒绝先于调用
脚本从不调用模型,只决定模型是否被允许被调用——这个区分是全部要点。如果门不能离线运行,它就不是门。
FORBIDDEN_DATA = {"customer_pii", "prod_logs", "secrets", "auth_tokens"}
FORBIDDEN_TOOLS = {"git_push", "kubectl", "terraform_apply", "send_email", "http_post"}
FORBIDDEN_SINKS = {"origin/main", "production_db", "customer_ticket"}
任何数据类与禁止数据重叠、任何工具能改变外部世界、任何输出目标离开沙箱、SLA 不是 none/best_effort、human_merge 不是 required、缺墙上时钟预算或工具调用预算、assumption_policy 不是 refuse_if_unspecified,都返回 REFUSE。非零退出码才是这篇文章的成功案例——门在阻止一次运行时尽了职,而不是在祝福一次运行时。
四个红旗
第一面红旗是架构沉默。agent 循环非常擅长填补空隙:缺失的服务边界变成猜出来的队列,缺失的认证方案变成硬编码 header。这种流畅在白板上有用,在免费端点上是有毒的——宿主没有义务记录猜测为何被做出。任务卡叫不出 agent 被允许提及的组件,任务就不属于免费推理。
第二面红旗是残留数据。未脱敏的生产日志看起来像完美的 few-shot 素材,看起来也像一次意外导出。免费端点就是走廊白板:任何看得到板的人都能抄走,没人给橡皮擦发保留证书。客户标识符、会话 cookie、带主机名的栈回溯都不该上那块板。带书面处理条款的付费端点、本地离线模型、或者沉默,是替代方案。
第三面红旗是无边界的外部世界。只读工具照样能外泄,写工具会改变状态。http_post、kubectl 或 git_push 上了允许列表,沙箱就已经被重新定义为生产邻近区。免费服务器持有 agent 状态的唯一副本,是同一错误的另一件外套——重要的状态需要操作者控制的磁盘,而不是操作者无法盘点的会话。
第四面红旗是宿主从未做出的服务承诺。值班文案、客户回复、阻塞发布的摘要都隐含 SLA,哪怕没人写下 S、L、A 三个字母。免费推理本质是尽力而为,把它当容量规划是范畴错误。替代方案是签约 API、人工撰写的模板,或者不说话只干活的脚本。
运行开始后的保护
预检不够——模型仍可能请求卡片上没有的工具,或在墙上时钟耗尽后继续回答。包装器是本地代理:它不提升模型质量,只保留拒绝。三种检查:墙钟预算耗尽抛 FreeTierExit;工具名不在卡上抛 FreeTierExit;工具调用超预算抛 FreeTierExit;模式失败累计两次抛 FreeTierExit(模型在猜)。
退出标准应该无聊到可以自动化:两次模式失误、一个不允许的工具名、一次禁用门的请求、一次无法从磁盘重放任务卡。任何一个都足够。模型迷人的解释不是反驳——它们就是失败模式本身。
边界
门相信卡片:把生产日志标成 public_docs 的人会得到 ALLOW_SANDBOX 和一个问题。门无法证明远程免费服务器无状态、隔离或无跨会话残留;无法测量模型质量、延迟或配额;也挡不住后续进程把沙箱输出粘进一次合并。拒绝是本地习惯,不是加密封印。
受监管负载不该用,值班不该用,输出端有客户的都不该用。独自实验、找不到第二位评审者的人,不该把 ALLOW_SANDBOX 当评审。这个模式是给已经怀疑免费宿主是错误位置、想把怀疑编码成非零退出码的操作者。如果门一直是红的,就让免费宿主闲着——那个闲置结果就是有用的结果。
来源:When Not to Host an Agent on Free Inference - DEV Community