如何使用AI和MCP对数据库Raw Data直接进行自然语言驱动的数据分析
如何使用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 内部自动流程
- DuckDB MCP:拉最近 30 天订单 + 退款数据(按 channel 聚合)
- LLM Python:计算
- 退款率 = 有退款订单数 / 总订单数
- AOV(客单价)= 总成交额 / 订单数
- 可选:与历史均值对比、显著性检验
- LLM 输出解释:
- “app 渠道退款率显著高于 web,且高价订单退款集中在某些 SKU,可能与商品描述/质量/发货相关。”
示例 B:设备传感器(时间序列 / 走势分析)
表结构
machine_readings(machine_id, ts, temperature, vibration, power)failures(machine_id, failure_ts, failure_type)
自然语言提问
找出故障前 2 小时内出现“温度连续上升 + 振动连续两次跳变但功率不变”的事件,统计这种模式后 24 小时内的故障概率,并判断是否是强预警信号。
Cursor 内部自动流程
- DuckDB MCP:筛选 failure 前窗口内的传感器序列
- LLM Python:
- 特征化(连续上升、跳变次数、阈值)
- 统计模式出现次数
- 计算 24h 故障率 vs 对照组
- 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 内部自动流程
- DuckDB MCP:按用户/会话聚合事件路径
- LLM Python:计算每一步转化率与最大 drop-off
- LLM 输出解释:
- “mobile 在 ‘加入购物车 → 支付’ 跌幅最大,集中在加载慢/支付方式缺失/表单过长。”