同一套客服助手给几家公司使用,回答流程可以相同,订单和售后政策却不同。最容易发现的是查错账号;更难发现的是它沿用上一次会话里的折扣、从缓存拿出另一家公司的联系人,回答还显得很自然。
若已有客服平台能可靠隔离不同客户,就保留它的租户与权限机制。自己搭建流程时,也可以先用独立部署减少混用风险。共享一套程序的理由应该是减少重复维护,而不是为了省配置,把所有客户放到一个管理员账号下面。
通过 EasyNet 调用业务函数时,可以把经认证的调用身份作为检查入口。提供方再根据可信的账号关系确定当前客户,只允许查询该客户的数据。客户归属不能来自模型自由填写的 company_id,否则一次错误参数就可能跨过隔离范围。
以查订单为例,函数接收订单号,在服务端确认这份订单属于当前获准客户,只返回客服需要的字段。各客户的资料检索也按同一可信范围执行。EasyRemote 接出的是这些已有业务方法,不会自动替底层数据库、向量索引和外部服务配置隔离。
对话历史、提示缓存和生成结果同样要带上客户范围,并在复用前检查。工程团队需要逐个梳理哪些存储会跨请求保留内容;只测试查询接口拒绝越权,不能证明模型上下文里没有上一家公司的资料。
准备两组可以明确区分的测试客户资料,让助手交替处理相似问题,再尝试引用另一方的订单。既核对读取记录,也检查回答和缓存。真正可复用的应该是服务方法,不是客户数据;这条界线落实到每一次读取与输出,团队才敢让同一套流程服务更多人。
- 01
确认调用者
从认证映射到客户,不信任模型自报。
- 02
检查订单归属
只读该客户有权访问的字段。
- 03
隔离回复与缓存
换客户后不能带出上一次的信息。
订单归属检查的最小单元
本地业务检查示例,trusted_tenant必须由认证层提供,不能取自模型参数。
def order_summary(trusted_tenant, order):
if order['tenant'] != trusted_tenant:
raise PermissionError('Order outside caller scope')
return {'id': order['id'], 'status': order['status']}
print(order_summary('client-a', {
'id': 'demo-17', 'tenant': 'client-a', 'status': 'shipped'
}))预期结果:返回demo-17的状态;将可信客户改为client-b会拒绝。
接入时的检查项
- 修改客户参数不能读取另一租户资源。
- 复用进程后回答和缓存不出现测试标记串用。
- 审查记录可按真实客户和请求者分别查询。