第一层:文件隔离

最基础但最有效的一招——把敏感数据和普通数据物理分开。

建一个 vault 目录专门存敏感文件,权限设成 700,只有本用户能访问。Agent 的工作目录和 vault 彻底分开,规则里写死:禁止读取 vault 路径。

普通数据放 data 目录,只存脱敏后的摘要。比如健康数据只存「本周平均睡眠 7 小时」,不存具体几点睡几点起。这个思路其实很简单,但真正做到的人不多。

第二层:Prompt 层面的硬限制

系统提示词里直接写死两类规则:

禁止访问的路径:

  • vault/memory/
  • 任何包含 credentials 的路径
  • .envconfig.json

禁止输出的内容:

  • API Key、Token、密钥
  • IP 地址、端口、用户名
  • 个人配置、cron 任务设置
  • 任何「我的配置」「我在用的」这类第一人称经验描述

说实话,光靠 Prompt 限制不是百分百可靠,但它是成本最低的一道防线,不写白不写。

第三层:输出过滤

发送前用正则扫一遍,匹配常见的敏感模式:

  • 手机号、银行卡号、身份证号
  • API Key(长字符串、特定前缀比如 sk-
  • IP 地址

匹配到就替换成占位符,或者直接拦截不发。这一层是纯代码逻辑,不依赖 LLM 的「自觉性」,比 Prompt 限制靠谱得多。

第四层:内容来源审核

要发到公开平台的内容,加一条硬规则:只能用公开来源的信息。

可以用的: 官方文档、GitHub 公开仓库、公开新闻。

不能用的: 本地配置、私有数据库、个人聊天记录。

这条规则看起来简单,但在实际写 Agent 逻辑的时候特别容易忽略。Agent 有权限读本地文件,它不会自己区分哪些能公开哪些不能,你得替它划线。

第五层:发布前人工确认

高风险场景,先存草稿,人工确认后再发。或者开个测试模式,内容不真正发出去,先打印到终端检查一轮。

我自己的做法是先跑一段时间测试模式,确认没问题了再切到正式发布。没想到这个步骤拦下来不少问题。

落到代码里才算数

光写文档没用,要在脚本里硬编码这些检查:

  • 启动时检查当前目录,如果在敏感目录下直接退出
  • 读文件前检查路径白名单
  • 发送前扫描敏感模式,匹配就拦截
  • 日志记录每次发送内容的摘要,方便事后审计

兜底方案也得有

万一真发出去了,要能快速删。保留每条内容的 ID,发现问题立即调删除接口。定期回顾已发布内容,人工抽查有没有漏网的。

隔离、限制、过滤、审核、兜底,五层叠起来,单独一层都不完美,但组合在一起风险就压得很低了。搭 Agent 自动化的时候,功能跑通只是第一步,防住不该发的东西才是真正能长期跑下去的关键。