前几个月翻到一篇 Google Developer Experts 系列的文章,讲跨区域 agent 架构。看着看着我愣住了——不是学到了新东西那种愣,是发现自己之前画 MCP 的图一直画错了的那种。我一直把它画成“能力扩展”,它其实是“数据出口”。这两个画法差得不是一点半点。
先看我第一版的图。我猜大多数人心里的那张也长这样:
agent ──► MCP 服务器(可插拔,随便接)
│
├── GitHub
├── 数据库
└── 某个第三方 API
能跑,画出来也顺。但这张图有个地方漏风漏得离谱:箭头只画了“agent 拿到新能力”这一个方向,反方向没画——你的数据顺着同一个箭头出去了。
打个比方:MCP 像给你家每个房间装快递柜。方便,真方便。但快递柜是双向的——不光东西能进来,屋里任何东西也能被寄出去。你装柜子的时候满脑子想的是“收快递”,“寄出去”这条路压根没盘算过。
老的治理假设是怎么塌的
数据治理团队以前的假设是:单体应用,区域数据库,数据出不去就是出不去,物理锁死。这个假设在 agent 的工具调用循环面前直接作废——每一次工具调用都是一条新的出口路径,而且出口可能开在另一个司法管辖区。
画张前后对照,差别一眼就出来:
以前: 应用 ──► 区域内数据库 (出口 = 0)
现在: agent ─┬─► MCP-A(欧洲)
├─► MCP-B(美国)
└─► MCP-C(不知道在哪) (出口 = N,且动态)
MCP 天然可插拔、与位置无关——这两条本来是卖点,放到主权合规的语境里,全成了麻烦。
我最想拍桌子的一条:prompt 不是安全控制
那篇文章里有句话我特别想单独拎出来放大:在系统提示里写“只允许使用某区域的工具”——这不是安全控制。
为什么不是?一个软的理由,一个硬的。软的:提示可以被注入内容覆盖,prompt injection 都讲烂了,不展开。硬的:模型会出错。它是概率生成的东西,你指望一段自然语言把它约束得每次都乖乖听话,那是在赌概率,不是在做工程。
安全控制的定义是什么?违反了就会被拦下来的东西。IAM 违反了会拒绝,网络边界违反了会丢包,prompt 违反了……什么都不会发生,模型照样把载荷发出去。“应该”写在提示里和“必须”写进策略层,是两个世界的操作。
所以正确的画法,是把 MCP 工具调用画成一条需要策略强制执行的边界,跟网络出口、IAM 同等对待:
agent ──► [策略决策点] ──► MCP 服务器
│
├─ 查:调用者是谁(IAM / OIDC)
├─ 查:目标 MCP 在哪个区域
├─ 查:载荷里有没有敏感数据
└─ 判:允许 / 拒绝 / 转人工
中间那个决策点可以是 Envoy sidecar,也可以是自己写的 Cloud Run 代理,读请求上的分类标签,查一个内部工具注册表——注册表里记着每个 MCP 服务器的部署区域、能碰哪类数据、在不在 VPC Service Controls 边界里——再用 OPA/Rego 那套规则去评。允许、拒绝、转人工,三选一。
画到这里咔哒一下扣上了。你把工具调用画成出口之后,原来那一堆散落的做法——按数据类别组织边界而不是按项目、用 IAM 条件卡住服务账号能调哪些工具身份、用组织策略禁止资源在指定区域外创建——全都自动归位了,它们就是这张图里各个格子的具体实现。我之前东一块西一块地看,以为是零散的最佳实践清单,其实人家是一张图。这个感觉太爽了。
“出口”这个比喻在哪里漏风
照例老实标一下。出口这个比喻会让人以为数据是整包出去的,判断也是整包做的。但文章里指了一个更阴的情况:模型可能在单次调用里混合多个驻留域的数据——欧洲用户的字段和美国用户的字段被揉进同一个 prompt,再一起塞给某个工具。这时候包级别的分类不够用,标签得传播到字段级。
而且还有一步更靠前:分类应该在数据摄取时就做,打上 residency、pii 之类的标签,而不是等到工具边界那一下才临时判断。到了边界再分类已经晚了——上下文已经合并了。最好是从根上避免跨区域的上下文被合并进同一个工具调用载荷。
丑话说在前面:这套东西很重
我画完这张图,第一反应不是“学到了”,是“这也太贵了”。中间加一层决策点,延迟上去了;注册表要维护;审计日志从第一天就得导到区域合适的 BigQuery;还得跑漂移检测器,定期验证注册表里声明的区域和实际部署位置对不对得上——因为声明和现实会漂,一漂,这套控制整个就变成摆设。作者自己也认这个延迟和运维的账。
他的适用判断我认同:跨司法管辖区的数据、第三方 MCP 工具、监管严到能罚款的场景,值得上。工具集小、静态、全第一方的,一个静态允许列表就够了,别为了架构美感给自己上刑。
跑个题……这个“声明会漂移、所以要定期验证”的思路,跟 agent 那个圈里“反馈”那一格是同构的——都是不信任一次性设定、要求持续校准。算了,这个下期单独画。
画开完了。自检一下:你现在能不能跟团队里管数据合规的人讲明白,“我们在 prompt 里限制了工具区域”这句话为什么不算安全控制?讲到一半卡住的话,多半卡在“违反了会发生什么”——答案是什么都不发生,所以它不是控制。
一个箭头朝哪边画的问题,背后是一整套治理假设的塌方。这玩意儿真的太酷了。下期候选:embedding 的相似到底相似在哪、还是“为什么 agent 会把简单事干出十步”——你挑。
