数店通 · AI 经营问数 概念封面

想解决的问题

零售店长每天要看的数据并不复杂——销售额、缺货率、动销率、复购率——但传统 BI 需要有人提前配好报表。问一句预算之外的问题,往往要等一轮排期。

这个项目试的是另一条路:把中文问题直接变成一条有权限边界、可追溯的只读查询,并把口径和 SQL 一起摊开给用户看。

处理链路

中文问题
  → 规则解析器 / 可选 LLM 接口 → Pydantic Intent 白名单
  → config/semantics.yml 语义层(指标表达式、维度、权限规则)
  → 后端固定 SQL 模板 + 权限交集 + 绑定参数
  → sqlglot AST 校验(表、字段、函数、SELECT、LIMIT)
  → SQLite query_only 独立连接 + 5 秒执行预算
  → 图表推荐 + 确定性结论 + 口径与数据缺口说明

几个刻意的设计取舍

LLM 不碰 SQL。 模型只接收脱敏后的问题、语义定义和意图 schema,看不到查询明细,不生成最终 SQL,也不撰写经营结论。它输出的意图还要再过一遍 Pydantic 白名单;超时、HTTP 错误、非法 JSON 都会自动降级到规则解析,规则也理解不了时直接返回 422 并记失败审计。

权限在 SQL 层做交集,不是页面上藏起来。 同一个问题,管理员看到 6 家门店,华东区域经理看到 3 家,上海店长只看到上海静安店。查询范围由服务端按数据库里的角色重新计算,前端无权指定。

算不出来就返回 null,不填 0。 分母为 0 或基期缺失时明确留空;问「跟去年同期比」而数据只有 90 天时,系统会直接说明缺少去年同期,而不是编一个下降排名。缺货率的分母也不是「各店百分比的平均」,而是该期间库存 ≤0 的快照数 ÷ 全部快照数。

应用到的验收

项目自带 85 项 pytest,覆盖意图解析、指标口径、权限交集、AST 校验与降级路径;前端生产构建通过;浏览器验收覆盖登录、问数、跨区权限拒绝与审计记录。

当前边界

  • 规则模式只支持固定时间词(昨天 / 今天 / 上周 / 本月 / 最近 30 天)和示例里的固定阈值,不是任意中文都能正确理解,不支持的表达会被明确拒绝。
  • 数据由固定随机种子生成,是截至昨天的 90 天虚构经营数据,不含任何真实个人信息。
  • 复杂归因、多轮追问、任意条件组合不在范围内。问「为什么下降」,系统给的是销售额、订单数、客单价的拆解,并说明无法判断客流与转化的因果。

项目图集

智能问数工作台:店长账号提问"上周各门店缺货率是多少",返回本期缺货率 11.43%,并展开指标口径与只读 SQL
智能问数工作台:店长账号提问"上周各门店缺货率是多少",返回本期缺货率 11.43%,并展开指标口径与只读 SQL