如何使用AI和MCP对数据库Raw Data直接进行自然语言驱动的数据分析

目标:用 自然语言 驱动 SQL → Python 分析 →(可选)向量相似性 → 可解释结论,形成一条安全、可复用、可扩展的数据分析流水线。


一、整体架构

┌──────────────┐
│   LLM (推理) │
└──────┬───────┘
       │ MCP
┌──────▼────────┐
│ SQL / DuckDB  │ ← 原始数据
└──────┬────────┘
       │
┌──────▼────────┐
│ LLM:Python/Pandas │ ← 特征工程、统计、分类/回归
└──────┬────────┘
       │
┌──────▼────────┐
│ Vector DB     │ ← 相似性分析(可选)
└──────┬────────┘
       │
┌──────▼────────┐
│ LLM 统计/解释输出 │
└──────────────┘

职责分工

  • DuckDB MCP:负责取数、过滤、聚合(安全、可控)
  • LLM Python:统计分析、特征工程、显著性检验、简单建模
  • LLM:调度 MCP、解释结果、生成业务结论

二、准备 SQL 数据库(以DuckDB为例)

假设已有数据库:

/data/shop.duckdb

表结构示例:

orders(
  order_id,
  user_id,
  channel,        -- web / app / mini_program
  order_time,
  total_amount,
  status          -- paid / cancelled / refunded
)

refunds(
  refund_id,
  order_id,
  refund_time,
  refund_amount,
  reason
)

三、在 Cursor 中添加 MCP Server(DuckDB)

1️⃣ 安装启动 DuckDB MCP Server

pip install mcp-server-motherduck

使用 MotherDuck & DuckDB MCP Server(本地 DuckDB 同样适用),关键参数是 --db-path--read-only

{
  "mcpServers": {
    "duckdb-shop": {
      "command": "cmd",
      "args": [
        "/c",
        "mcp-server-motherduck",
        "--db-path",
        "/data/shop.duckdb",
        "--read-only"
      ]
    }
  }
}

⚠️ 强烈建议使用 --read-only:防止 AI 自动生成 SQL 时写坏数据。

2️⃣ 验证 DuckDB MCP 是否连通

在 Cursor 新开一个 Chat,直接问:

列出数据库里的表

期望返回:

tables:
- orders
- refunds

🎉 表示 DuckDB MCP 已成功接入。


在 Cursor 中问:

从 duckdb-shop 取 1000 条订单,用 python 计算每个渠道的退款率,并解释差异最大的是哪个渠道

如果你看到:

  • 先查 DuckDB(拉 orders/refunds 或聚合)
  • 再跑 Python(算退款率、样本量、差异)
  • 最后给数字 + 解释

👉 表示 DuckDB MCP已成功


四、你现在能直接做到什么(实战)

示例 A:电商订单分析

表结构

  • orders(order_id, user_id, order_time, channel, total_amount, status)
  • order_items(order_id, sku, qty, price)
  • refunds(order_id, refund_amount, refund_time, reason)

自然语言提问

统计最近 30 天,不同渠道(web/app/小程序)的退款率和平均客单价,并解释哪个渠道的异常最明显。

Cursor 内部自动流程

  1. DuckDB MCP:拉最近 30 天订单 + 退款数据(按 channel 聚合)
  2. LLM Python:计算
    • 退款率 = 有退款订单数 / 总订单数
    • AOV(客单价)= 总成交额 / 订单数
    • 可选:与历史均值对比、显著性检验
  3. LLM 输出解释
    • “app 渠道退款率显著高于 web,且高价订单退款集中在某些 SKU,可能与商品描述/质量/发货相关。”

示例 B:设备传感器(时间序列 / 走势分析)

表结构

  • machine_readings(machine_id, ts, temperature, vibration, power)
  • failures(machine_id, failure_ts, failure_type)

自然语言提问

找出故障前 2 小时内出现“温度连续上升 + 振动连续两次跳变但功率不变”的事件,统计这种模式后 24 小时内的故障概率,并判断是否是强预警信号。

Cursor 内部自动流程

  1. DuckDB MCP:筛选 failure 前窗口内的传感器序列
  2. LLM Python
    • 特征化(连续上升、跳变次数、阈值)
    • 统计模式出现次数
    • 计算 24h 故障率 vs 对照组
  3. LLM 输出解释
    • “该模式出现后 24h 故障率是基线的 3.2 倍,主要对应轴承类故障,建议加入告警规则并按机型分层。”

示例 C:网站转化漏斗(业务分析)

表结构

  • events(user_id, ts, event_name, page, device, referrer)
  • sessions(user_id, session_id, start_ts, device, country)
  • purchases(user_id, ts, amount)

自然语言提问

分析从“进入落地页 → 加入购物车 → 支付成功”的漏斗转化率,按设备(desktop/mobile)分组,并解释 mobile 掉得最厉害的步骤及可能原因。

Cursor 内部自动流程

  1. DuckDB MCP:按用户/会话聚合事件路径
  2. LLM Python:计算每一步转化率与最大 drop-off
  3. LLM 输出解释
    • “mobile 在 ‘加入购物车 → 支付’ 跌幅最大,集中在加载慢/支付方式缺失/表单过长。”