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:销售归因查询¶
- 用户「华东区上周客单价为什么降了」
- Agent 检索客单价定义、相关维度
- 生成 SQL 查询上周与上周环比,按品类拆解
- 执行返回数据,自动画环比柱状图 + 品类拆解图
- 洞察:「客单价环比 -8%,新品类促销是主因,剔除后 -1%」
流程2:多轮追问细化¶
- 用户追问「那这个新品类具体哪个 SKU 贡献最大」
- Agent 复用上下文(已限定华东、上周、该品类)
- 生成下钻 SQL,返回 SKU 排名表与洞察
部署与优化建议¶
- 部署架构:NL2SQL 服务无状态;查询经只读 ClickHouse 副本;元数据缓存到 Redis。
- 性能优化:高频查询结果缓存(带数据更新失效);元数据预加载。
- 成本控制:常见查询模式匹配缓存,命中不调 LLM。
常见问题与解决方案¶
- NL2SQL 生成错误字段 → 元数据约束 + 执行前 EXPLAIN 校验 + 失败重试澄清。
- 慢查询拖垮系统 → 查询超时限制 + 复杂查询降级采样估算。
- 越权访问 → SQL 自动注入行级过滤(门店 WHERE 条件),审计日志。
扩展方向¶
- 主动洞察:定时扫描异常指标主动推送告警。
- 预测分析:结合时序模型做趋势预测。
- 自然语言建表:业务人员描述指标,自动生成 dbt 模型。