跳转至

10 - 数据分析助手

项目背景与目标

某零售连锁企业拥有数千万会员、上千门店的销售数据,但数据分析能力集中在总部分析师,区域门店与业务部门的自助分析依赖固定报表,无法即兴提问。业务人员想看「华东区上周客单价环比下降的原因」需提需求排队 3 天才能拿到结果。企业希望构建自然语言数据查询助手,让业务人员用大白话提问即可获得数据、可视化图表与洞察解读,覆盖 NL2SQL、自动可视化、异常洞察三能力,将数据分析响应时间从天级降至秒级。

核心目标: 1. NL2SQL 准确率 ≥ 85%(常见查询) 2. 自动选择合适图表类型可视化 3. 数据洞察自动生成(趋势、异常、归因) 4. 查询响应 < 5 秒,支持追问

预期价值: democratize 数据分析、释放分析师产能、提升决策时效、统一指标口径。

需求分析

用户角色与场景 - 业务人员:查销售、库存、会员、活动效果 - 区域经理:看本区域指标、对比、异常 - 高管:看核心 KPI 与趋势 - 数据分析师:快速验证假设(复杂分析仍用专业工具)

功能需求列表 - 自然语言转 SQL(NL2SQL) - 指标口径管理(统一「客单价」「GMV」定义) - 多轮追问与上下文(「按门店拆」「换成上月」) - 自动可视化(柱/线/饼/地图自动选择) - 数据洞察(趋势描述、异常检测、归因提示) - 查询结果导出与分享 - 权限隔离(行级/列级,门店只能看本区域) - 查询审核(敏感数据访问日志)

非功能需求 - 性能:常见查询 < 5 秒 - 安全:只读查询、SQL 注入防护、权限隔离 - 可用性:99.9% - 准确性:SQL 必须经过执行计划校验

约束条件:不可直连生产库,需经数据仓库(只读副本);不可泄露未授权数据。

技术选型说明

层次 技术选择 选型理由
Agent 框架 LangChain 工具调用与多轮管理
LLM Qwen2.5-72B + SQL 专精 NL2SQL 能力强
元数据 数据字典 + 指标层(dbt) 统一口径
数据库 ClickHouse(OLAP) 亚秒级查询
可视化 ECharts + Plotly 丰富图表
后端 Python FastAPI 异步
部署 K8s 弹性

架构设计

flowchart TD
    U[业务人员提问] --> AGENT[数据分析 Agent]
    AGENT --> META[元数据/指标层]
    META --> DICT[(数据字典 dbt)]
    AGENT --> NL2SQL[NL2SQL 生成]
    NL2SQL --> VAL[SQL 校验/注入防护]
    VAL --> SEC[权限改写 行列级]
    SEC --> OLAP[(ClickHouse)]
    OLAP --> VIZ[自动可视化]
    OLAP --> INS[洞察生成]
    VIZ --> U
    INS --> U
    AGENT --> CTX[多轮上下文]

核心是「元数据驱动 NL2SQL + 安全校验 + 自动可视化与洞察」。元数据层(数据字典 + 指标定义)是准确率关键,LLM 基于元数据生成 SQL,经语法与注入校验后做权限改写(注入行级过滤),执行后自动选图与生成洞察。

关键模块实现思路

模块1:元数据与指标层

  • 思路:用 dbt 维护指标定义(口径、计算公式、维度)与表结构字典;Agent 生成 SQL 前先检索相关表与指标定义,避免 LLM 臆造字段。
  • 关键点:指标口径统一是 democratize 分析的前提,否则「客单价」人各一说。

模块2:NL2SQL 生成与校验

  • 思路:Prompt 注入表结构、指标定义、少量示例(few-shot);LLM 生成 SQL;后处理做语法校验、危险操作拦截(禁 INSERT/DELETE/DROP)、SQL 注入检测;复杂查询用 CoT 拆解。
  • 关键点:生成 SQL 后用 EXPLAIN 校验执行计划合理再执行,避免全表扫描。
  • 示意:
    def nl2sql(question, ctx):
        schema = retrieve_schema(question)  # 相关表+指标
        sql = llm.generate(NL2SQL_PROMPT(schema, question, ctx))
        if not validate(sql) or is_dangerous(sql):
            return fallback_clarify()
        sql = inject_row_filter(sql, user_acl)  # 权限改写
        return sql
    

模块3:自动可视化

  • 思路:根据返回数据特征(时序/分类/地理/占比)自动选择图表类型;时序选折线、分类对比选柱状、占比选饼、地理选地图;支持用户「换种图」切换。

模块4:洞察生成

  • 思路:对查询结果做统计:趋势(上升/下降/平稳)、异常(环比突变)、归因(按维度拆解贡献度);LLM 用自然语言解读,如「客单价环比下降 8%,主要因新品类促销拉低,剔除后仅降 1%」。

核心流程详解

流程1:销售归因查询

  1. 用户「华东区上周客单价为什么降了」
  2. Agent 检索客单价定义、相关维度
  3. 生成 SQL 查询上周与上周环比,按品类拆解
  4. 执行返回数据,自动画环比柱状图 + 品类拆解图
  5. 洞察:「客单价环比 -8%,新品类促销是主因,剔除后 -1%」

流程2:多轮追问细化

  1. 用户追问「那这个新品类具体哪个 SKU 贡献最大」
  2. Agent 复用上下文(已限定华东、上周、该品类)
  3. 生成下钻 SQL,返回 SKU 排名表与洞察

部署与优化建议

  • 部署架构:NL2SQL 服务无状态;查询经只读 ClickHouse 副本;元数据缓存到 Redis。
  • 性能优化:高频查询结果缓存(带数据更新失效);元数据预加载。
  • 成本控制:常见查询模式匹配缓存,命中不调 LLM。

常见问题与解决方案

  • NL2SQL 生成错误字段 → 元数据约束 + 执行前 EXPLAIN 校验 + 失败重试澄清。
  • 慢查询拖垮系统 → 查询超时限制 + 复杂查询降级采样估算。
  • 越权访问 → SQL 自动注入行级过滤(门店 WHERE 条件),审计日志。

扩展方向

  • 主动洞察:定时扫描异常指标主动推送告警。
  • 预测分析:结合时序模型做趋势预测。
  • 自然语言建表:业务人员描述指标,自动生成 dbt 模型。