图:Dmitriy.trofymenko / Wikimedia Commons / CC BY-SA 4.0
“我问它下周三的会议室订好没有,它回我说‘好的,已经帮你把报销单里的金额改成三百二’。我什么时候让它改报销单了?”
这是行政小林在群里发的,后面跟了三个问号。坐她斜对面的老徐过了一会儿回:“改报销单那个,是我刚让它做的。”
办公室这套本地 Agent 是我部署的,能查日程、订会议室、帮忙整理报销表。当初图省事,网页入口没做登录,所有人打开同一个地址就能用。问题就出在这儿:后台用来记上下文的会话只有一个,谁来都往里写。老徐刚说完改报销单,小林紧接着问会议室,Agent 把两个人的话当成同一个人的连续对话,回答里就串了。
更让我后背发凉的是另一件事。我把那天的会话记录导出来看,里面有老徐报销单的金额、小林订的客户会面,还有财务同事问过的一条工资相关的问题。理论上,任何人打开页面往上翻,都能看到别人问过什么。
小林问:“那以后是不是每个人都要装一个?”
不用,入口还是一个,但会话要按人分开。我改了三件事。
图:Michał Frąckowiak / Wikimedia Commons / CC BY-SA 2.0
第一件,进入口先认人。接上办公室已有的内网账号,打开页面先登录,后台按账号建会话。每个人只能看到自己的历史,Agent 取上下文时也只取当前账号的会话。
第二件,会话设过期时间。同一个账号闲置超过三十分钟,自动开新会话,旧会话归档。这样一个人上午问的事,下午不会莫名其妙被带进来;有人临时用了别人电脑没退出,影响范围也有限。
第三件,工具调用带上身份。改报销单、订会议室这些写操作,执行前检查发起人账号,只能动自己名下的单子。以前 Agent 拿到“改金额”的指令,谁的单子都能改;现在会先比对单子归属,不一致就拒绝并提示。
图:CBI Diffusion / Wikimedia Commons / CC BY-SA 4.0
验收分三块。串话测试:我和小林、老徐三个人同时开页面,交替提问,各问十五轮,内容故意互相相似,比如都问会议室、都问报销。改之前同样的测试,四十五轮里有十一轮回答带进了别人的信息;改完,零轮串话。越权测试:用小林的账号让 Agent 改老徐的报销单,五次尝试五次被拒,并提示“该单据不属于当前账号”。过期测试:闲置三十一分钟后提问,确认是新会话,不带之前内容。另外,旧的那份混在一起的会话记录,我导出备份后从页面上清掉了,只留给自己排查用。
回头想,这是部署时最容易省掉的一步:几个人的小办公室,总觉得大家都熟,没必要登录。可 Agent 不只是聊天,它记上下文、能动数据,入口不分人,迟早出事。
你们办公室的 Agent 是一人一个,还是共用入口?会话是怎么隔离的?欢迎在评论区交流。
会话隔离和越权测试的用例清单,我整理在 evafang.com ,有需要可以参考。