在构建面向多个企业客户的AI智能体平台时,用户会话隔离与多租户架构是决定系统能否安全上线的基础能力。如果不同客户的对话上下文、文件缓存和模型调用记录发生串台,不仅会引发数据合规事故,还会让智能体的回答出现明显的身份错乱。本文将从身份注入、存储隔离和弹性扩展三个层面,拆解一套可落地的设计方案。

请求链路中的租户身份注入与会话绑定
多租户架构的第一步,是在每一次用户请求进入系统时就明确“你是谁”。常见的做法是前端在登录后拿到一枚携带租户标识的JWT,后续所有访问AI智能体的接口都在Authorization头中带上它。网关或后端中间件负责校验签名,并将解析出的tenant_id与user_id写入请求上下文(如Go的context或Java的ThreadLocal),这样业务代码无需关心身份来源,只从上下文取值。
会话隔离要求同一个租户下的不同用户也不能互看对话。我们可以在上下文中进一步生成session_id,它通常由租户ID、用户ID和时间戳哈希组成。所有发给大模型的消息历史、临时附件都以此为 key 前缀。如下面这段Go风格的中间件代码,展示了如何在请求入口完成注入:
func TenantMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
claims := parseJWT(token)
ctx := context.WithValue(r.Context(), "tenant_id", claims.TenantID)
ctx = context.WithValue(ctx, "user_id", claims.UserID)
sessionID := fmt.Sprintf("%s_%s_%d", claims.TenantID, claims.UserID, time.Now().UnixNano())
ctx = context.WithValue(ctx, "session_id", sessionID)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
这种方式的优势在于把隔离逻辑收敛到边缘层,业务开发不可能绕过。如果仅靠每个接口手动传参,当接口数量膨胀到上百个时,漏写一处判断就会变成渗透测试的突破口。另外,会话ID带时间戳可天然避免复用旧会话,但也要求前端在长连接场景中定时续期,否则闲置连接会被新会话取代。
存储层的逻辑与物理隔离策略
AI智能体依赖大量外部存储:关系数据库存租户配置,Redis存短期会话状态,向量数据库存知识库嵌入。逻辑隔离指所有租户共用一套实例,但通过tenant_id字段或 key 前缀区分。例如在Redis中,会话数据设计为{tenant_id}:{session_id}:history,清理时可用通配删除。向量库则为每个租户建独立 namespace,查询时强制带 namespace 参数,从索引层面阻断交叉检索。
当租户数据量差异巨大或合规要求“数据不出域”时,物理隔离更稳妥。我们可以按tenant_id哈希把租户映射到不同数据库实例,在ORM层做数据源路由。下面这段Python伪代码演示了简单的路由逻辑:
def get_db(tenant_id):
slot = hash(tenant_id) % len(DB_POOLS)
return DB_POOLS[slot]
def save_session(tenant_id, session_id, data):
db = get_db(tenant_id)
key = f"{tenant_id}:{session_id}:history"
db.redis.set(key, data, ex=3600)
逻辑隔离成本低、易运维,适合初创期几十个租户的场景;物理隔离安全性高,但实例数和备份策略翻倍。实践中常采用混合模式:中小租户共享集群,大客户或金融类租户独占资源。要注意的是,无论哪种方式,备份和日志也必须带租户标签,否则故障恢复时极易把A的数据灌给B。
租户规模增长下的架构演进与成本平衡
当平台从五十个租户涨到五千个,原本单库分表的逻辑隔离会遭遇连接数和热点key瓶颈。此时应引入按租户分库分表的中间件,如ShardingSphere,将tenant_id作为分片键。AI智能体的会话表可按天加租户ID做复合分片,既分散写入压力,又方便过期清理。同时,向量库的 namespace 过多会拖慢元数据加载,可改为每百个租户一个 collection,内部再用租户字段过滤。
成本方面,多租户架构的核心指标是“单租户边际成本”。如果为每个租户都起一套Kubernetes命名空间加独立GPU推理服务,资源利用率极低。更优的方案是推理层保持共享,通过上下文隔离防止串台,仅在数据存储和访问控制上做硬隔离。如下面这张对比表,总结了三种阶段的选型:
| 阶段 | 租户规模 | 隔离方式 | 运维复杂度 |
|---|---|---|---|
| 初期 | 少于100 | 逻辑隔离加前缀 | 低 |
| 成长期 | 数百至数千 | 分库分表加namespace | 中 |
| 成熟期 | 超大规模 | 大客户物理隔离,其余逻辑隔离 | 高 |
架构师在做技术选型时,还应预留租户迁移工具:当小租户成长为需要独占资源的大租户,系统要能一键把它的会话、向量和配置从共享库导出并灌入独立实例。只有把隔离设计为可调节的旋钮,而不是一次性硬编码,AI智能体平台才能在不停服的情况下陪伴业务一起长大。
AI_agentsession_isolationmulti_tenant修改时间:2026-08-14 16:03:38