☰
从看板追问到 ChatBI:筛选条件可以继承,权限不能顺手改掉
2026/10/28 19:39:03 网站建设 项目流程

用户在华东区的退款率卡片下面问:“那上周呢?”这句话省掉了指标、区域和时间基准。一个好用的对话入口应该继承必要条件,否则用户每问一次都得重讲背景。可一旦把整个页面状态原封不动交给模型,权限标识、过期时间和临时筛选也可能被一起改写。

10 月 22 日 ClickHouse 与 Langfuse 的 Agent 追踪实践强调了模型调用和工具调用的可观测性。落到看板追问,我认为最值得追踪的并非完整聊天文本,而是这一次究竟继承了什么、修改了什么,以及谁作出了授权决定。

把上下文拆成可改与不可改两部分

指标版本、区域、业务时区和时间窗口属于问题语义;租户和授权范围属于服务端身份。前者可以在规则内修改,后者应从可信会话重新取值,不能接受模型回传的“新权限”。浏览器里的access=all字符串并不能证明用户真的拥有全表权限。

图中 ACCESS 仅表示服务端身份范围,界面里的下拉样式不构成扩大权限的授权;具体指标与日期以本文契约为准。

下面用字典展示这个边界。它只模拟上下文合并,不是一个具备认证能力的 Web 服务。

from copy import deepcopy base = {'metric': 'refund_amount_rate:v2', 'region': 'east', 'window': '2026-10-12/2026-10-19', 'zone': 'Asia/Shanghai'} identity = {'tenant': 'demo-a', 'allowed_regions': ['east']} def follow_up(context, patch, server_identity): allowed = {'window', 'region'} if set(patch) - allowed: raise ValueError('unsupported context change') merged = deepcopy(context) merged.update(patch) if merged['region'] not in server_identity['allowed_regions']: raise PermissionError('region outside authorization') return merged result = follow_up(base, {'window': '2026-10-05/2026-10-12'}, identity) assert result['metric'] == base['metric'] assert base['window'] != result['window'] try: follow_up(base, {'region': 'west'}, identity) except PermissionError: print('outside region denied') else: raise AssertionError('authorization check did not run') print(result)

这里故意只允许改区域和时间窗口。真实服务还要解析日期、验证指标是否仍可用、将权限约束落实到查询层;字典检查不等于行级安全策略。缓存也应包含授权范围版本,否则旧结果可能跨权限复用。

在答案旁边留下可解释的继承关系

结果卡可以显示“沿用:退款金额率 v2、华东、上海时区;变更:时间窗口”。如果用户说“换成整体看看”,系统应区分“在我的授权范围内汇总”和“全公司汇总”,不能默默扩大范围。

模型可以帮助理解省略句,但实际执行要靠明确的参数。追踪记录最好带上原卡片的数据版本、解析后的时间边界、权限决策与最终查询标识;不必为此把所有敏感数据都写进日志。本文没有接入浏览器、身份服务或真实模型,只验证了这一步合并的可变范围。

延伸阅读

  • ClickHouse 与 Langfuse 的 Agent 追踪实践
  • Anthropic 对非预期模型动作的调查

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询