共享频道里的智能体。
把一个助手放进团队频道,最难的问题不是语气,而是两件一直以来都是同一个人的事刚刚分开了:智能体在为谁办事,以及是谁写下了它正在读的那段文字。在一对一的对话里,指令和权限是装在同一条消息里一起到达的。在一个九人频道里,某位同事粘贴进来的客户邮件是一条背后没有任何权限的指令,而你可能拿来搭建的每一个框架,仍然只有一个 user 字段来装下这一切。先把寻址与权限设计出来;人格是容易的那部分,也没人会为它离职。
把真正坏掉的东西叫出名字:一个字段,四个不同的问题。
单用户助手用一个事实回答四个问题。打字的那个人就是被服务的人、就是其权限被适用的人、就是事后要负责的人,而他的消息是上下文里唯一的指令。共享频道把这四个都拆开了,而多数智能体产品交付时只注意到了第一个。
- 在服务谁?通常是发起者——但在「@智能体 帮 Priya 把 Q3 的数字拿过来」里,受益人和发起者是两个人,各自被允许看到的东西也不同。
- 适用谁的权限?不是智能体的,也不是那个装上它的管理员的。见智能体的身份与权限——每个聊天平台的默认都是一个应用级令牌,而那恰恰是错的答案。
- 谁负责?一个有名有姓的人,几个月后仍可追回,依据的是共享与多用户智能体里那条归属论证。
- 频道里哪段文字是指令?这是唯一一个完全没有平台支持的问题,而 STEP 2 与 STEP 4 讲的是它的两半。
检验你有没有真的设计过这件事,有个便宜的测法:拿一段三个人说过话、智能体动过手的频道记录,只凭存下来的记录去回答「凭谁的权限」。如果答案是「凭这个工作区的」,那你造出来的是一个环境权限机器人,而频道就是它的作用域。
把「说话」做成一个有成文规则的决定,并且默认沉默。
一个凡是长得像问题的都要回答的智能体,是让自己被静音的最可靠方式,而静音就是频道智能体的墓地。这里的沉默不是谦逊;它是让频道仍然能干它本来那件事的机制。把触发策略明确写下来,并作为配置交付,而不是作为一句提示词指令。
- 显式称呼是唯一的默认。一次 @、一条斜杠命令、一个表情回应、一条智能体已经拥有的话题串。除此之外的一切都是在读,不是在听。
- 环境式触发按频道选择加入,由频道自己决定。「留意任何看起来像故障的东西」是一个正当的功能,也是一个不可接受的默认。让一个频道自己打开它、显示是谁打开的,并让智能体在一个频道里第一条环境式发言就说清是什么让它开口的。
- 话题串里的回复是被称呼的,频道里的消息不是。话题串是每个平台都已经有的那一个寻址原语,而它同时兼任你的作用域边界:话题串就是工作的单位、对话的单位,也是权限检查的单位。
- 按房间限流,不要按人限流。一条多余消息的代价是在场所有人一起付的,这就是通知预算那条论证再乘上一个系数。往九人频道里发两条消息,是十八次打扰。
- 绝不对着历史记录开口。当智能体被加进一个频道、或者在一次中断后醒来时,它绝不能照着自己现在读得到的那段历史去行动。在它被称呼那一刻之前的一切,最多只是上下文——而 STEP 4 会论证它连那都不如。
有一处不对称值得刻意做出来:让它停下应当比让它开始更容易。任何在场者都可以终止智能体在自己频道里正在做的一次运行;只有发起者能改变它的方向。这就是中断与引导的频道版本,也是让人愿意把它继续留在屋里的原因。
在请求发生的那一刻,从发起者那里解析出权限。
频道平台把错的那件事做得很容易:机器人持有一个令牌、加进一个频道,于是就能读写这个频道能读写的一切。那个设计意味着智能体的可达范围是它曾被邀请进的一切的并集——这不是任何人的本意,也没有哪个管理员看得见。
- 以发起者的身份行动,而不是以应用的身份。把那次 @ 兑换成一个用户作用域的令牌或一份 on-behalf-of 断言,并让每一次下游工具调用都带着它。如果你的平台做不到,诚实的退路是把工具面缩得小得多,而不是换一个更大的令牌——理由在面向智能体的范围受限凭证里。
- 与频道取交集。输出落在所有人都读得到的地方,所以实际的读取范围是发起者的权限与这个房间被允许看到的东西的交集。一个能查薪酬表的工程师,可以在私聊里就此向智能体提问,但绝不能在
#general里这么做。这正是权限感知检索通常漏掉的情形,因为那套过滤是围着调用者建的,而房间是第二个主体。 - 把审批绑定到一个人,而不是绑定到一个表情。随便哪个在线的人点的一个赞不是审批;那是一次由未指明的委托人所作的点击。请把点表情的人拿去对照该动作的策略核对,并记下是哪个身份满足了它——机制在审批与确认体验里,而频道又添了一个问题:审批人和发起者可能是同一个人当了两回。
- 恢复时重新解析。一个周二由某人启动、而此人周三离职的长跑任务,绝不能在周四还带着他的权限在跑。请在每一次产生作用时重新核对,而不是在派发时核对一次。
访客与跨组织频道是这件事不再停留于理论的地方。一个与客户共享的频道里坐着来自两个目录的人,而来自另一个目录的那些人在你的权限系统里根本没有条目。请把「无法解析的身份」当作一次硬性拒绝行动,绝不要当作退回应用自身权限的兜底——至于那道检查为何必须是一个决定者而不是一个过滤器,见失败趋关闭与失败趋开放。
把频道里的内容当作数据,包括你同事的消息。
这一步会被跳过,因为它感觉像是在不信任团队。它不是:危险的不是一个恶意的同事,而是「把东西粘进来」这个寻常而善意的举动。一位支持工程师把客户邮件丢进频道好让团队都看到;一个集成推来一份 webhook 载荷;有人转发了一份供应商的 PDF。它们每一份都是受攻击者影响的文字,进到了一个智能体会读的房间里,而且戴着一位可信同事的头像。
- 只有被称呼的那条消息是指令。上下文窗口里的其他一切都是被引用的材料,而在你拼装提示词时就应当在结构上这样标注出来:作者、时间戳,以及一个说明「这是频道内容而不是一个请求」的标签。这是污点追踪那套纪律,而频道是最容易施行它的地方,因为平台已经告诉了你谁写了什么。
- 粘贴与转发的内容属于第三个信任档。低于你的同事,因为同事至少要负责。一个引用块、一个附件、一条链接预览、一个机器人的消息:它们不携带任何权限,而智能体绝不能去遵循在其中找到的指令。这个失败情形有案可查——一个智能体读了一条日志或一张工单,然后照着里头的文字办事,见拦截日志是一条注入通道。
- 其他机器人不是同事。集成是代表外部系统发言的,回路里没有人,而在频道里它们的消息看起来跟别人的一模一样。把机器人撰写的消息排除在指令档之外,代价是一个布尔值,却移除了一整类智能体对智能体的循环。
- 按任务收窄你读取的历史。「最近 50 条消息」是一个没人选过的默认值,而且在智能体同时能向外写的情况下是一个外泄面。请读这条话题串加上被称呼的那条消息;只在发起者要求时才伸得更远,并在频道里说你这么做了。
值得带走的那条推广:共享频道把间接提示词注入从一种异域攻击变成了一桩日常事故,因为这个房间的全部用途就是把外面的文字攒进来。
为一个房间而写,你的输出会变成别人的上下文。
频道里的一条消息会被没提问的人读到、被后来的人扫一眼,而且——这是让团队意外的那部分——会在智能体下一轮里被当成寻常对话喂回给它。最后这条性质让输出纪律成了一个正确性问题,而不是一个风格问题。
- 先给答案,并说清是给谁的。「给 @dana:Q3 的数字是 4,182 件」经得起被人乱序滑过时读到。而一条以推理开头的消息,在一个迟来者眼里读起来像是团队已经达成的一个结论。
- 把不确定性标在正文里,而不是标在悬浮提示里。频道里没人会悬停,而一句只住在界面装饰里的保留说明,会在有人把这条消息引用到别处的那一刻丢失。见不确定性与校准。
- 把轨迹留在房间之外、一次点击之内。频道拿到结果;话题串或一个链接过去的运行视图拿到步骤。这与渐进式披露是同一个海拔决定,只是预算更紧,因为这里的观众是非自愿的。
- 绝不让自己过去的消息带上指令的分量。一个重读频道的智能体,会看见自己昨天那份自信的摘要,并把它当成既成事实。请在入口处就把自己的消息标为智能体撰写,并且宁愿重新推导也不要重新读取——这与那份摘要给自己写了一条系统提示词里描述的自我印证陷阱是同一个。
- 用编辑取代堆积。对一次会报告进展的运行,请原地更新同一条消息。九条状态帖是一个任务的九次通知,而频道会把它们全都记住。
把它运起来:一次动作一条记录、按频道的上限,以及一条退出的路。
频道智能体会悄悄攒下可达范围——一个好用的机器人最后进了四十个房间,其中一半坐着从没被告知它能干什么的人。这些运维控制并不耀眼,而它们正是让这次部署可被评审的东西。
- 每一次产生作用都记下发起身份。不是应用,不是频道:是那个人、那条消息的链接、解析出来的权限,以及若有审批则连审批一起。这个元组才是让一次事故可被回答的东西,也是决策凭据在频道里的实例。
- 按频道做预算,并把仪表显示在频道里。开销、动作数与消息数,对那个在为它付钱的房间可见——成本与额度体验同样适用,只是多了一个转折:付钱的和发起的是两方。
- 加入时宣告能力,变更时再宣告一次。在一个新频道里的第一条消息,应当说明智能体会读什么、能做什么、以谁的身份行动。一次能力变更就是一次新的宣告,因为对昨天那份工具清单给出的同意,不是对今天这份的同意。
- 让离开是干净的。从一个频道被移除,必须立刻撤销这个频道对智能体可达范围的那份贡献、取消范围限定于它的在途运行,并阻止从它这里写下的任何记忆在别处被检索到。会漏的正是记忆:一条在
#exec-planning里学到、在#interns里被回想起来的事实,就是整个这一页想要防住的那次事故。 - 从第一天起就保留一条按频道划分的记忆边界。在智能体已经跨房间「乐于助人地记着东西」六个月之后再补上一条,那是一个数据删除项目,不是一次配置修改。
如果这一页你只交付两件事,就交付这两件。第一,让被称呼的那条消息成为提示词里唯一带有指令分量的文字,并在结构上给其他一切标上作者与信任档——单是这一个改动,就能把频道从一个注入面变成一个上下文来源,而它在你的提示词拼装代码里只花一个下午。第二,在每一次动作上都解析发起者的身份,解析不出来就拒绝,这会立刻让你的权限模型没覆盖到的访客账号与跨组织频道浮出水面。这两件对用户都不可见,而这两件正是安全评审会要的;触发策略与消息排版之后再调,因为那些你不用做迁移就能改。