大家好,我是船长。在数据分析这行干了近10年,最近一年最大的感受就是——AI Agent正在重塑数据人的工作方式。
这篇文章不讲概念,直接给你一套从零搭建AI数据分析Agent的完整方案,包含代码、架构、踩坑记录。
一、什么是AI数据分析Agent
说白了,就是一个能自己读数据、分析数据、生成报告的AI程序。
你给它一个问题:"上个月哪个渠道的转化率最高?"
它会自己:
① 连接数据库,找到对应表
② 写SQL查询数据
③ 用Python做数据分析
④ 生成可视化图表
⑤ 输出结论和洞察
这就是Agent和普通ChatGPT对话的核心区别:Agent能执行动作,不是只生成文字。
二、技术架构(3层结构)
第1层:意图理解层
接收用户的自然语言问题,判断需要什么数据、用什么分析方法。
技术栈:大模型API(DeepSeek/GPT-4/Claude)+ Prompt Engineering
第2层:执行层
根据意图,自动生成SQL或Python代码并执行。
技术栈:SQL生成 + Pandas/NumPy + 安全沙箱执行
第3层:输出层
将分析结果格式化输出:表格、图表、文字洞察。
技术栈:Matplotlib/ECharts + 模板渲染
三、核心代码实现
3.1 意图解析(Prompt模板)
SYSTEM_PROMPT = """
你是一个数据分析Agent。用户会用自然语言提问。
你需要:
1. 判断需要查询哪些表
2. 生成对应的SQL语句
3. 如果需要复杂分析,生成Python代码
可用表结构:
- orders(order_id, user_id, amount, channel, created_at)
- users(user_id, name, register_date, city)
- products(product_id, name, category, price)
输出格式(JSON):
{
"type": "sql" | "python",
"code": "你的SQL或Python代码",
"explanation": "分析思路说明"
}
"""
3.2 SQL执行模块(安全沙箱)
import pandas as pd
import sqlite3
def safe_execute_sql(sql: str, db_path: str) -> pd.DataFrame:
"""安全执行SQL,只允许SELECT语句"""
# 安全检查:只允许SELECT
sql_upper = sql.strip().upper()
if not sql_upper.startswith("SELECT"):
raise ValueError("只允许执行SELECT查询")
# 禁止危险操作
danger_keywords = ["DROP", "DELETE", "INSERT", "UPDATE", "ALTER"]
for kw in danger_keywords:
if kw in sql_upper:
raise ValueError(f"禁止执行{kw}操作")
conn = sqlite3.connect(db_path)
df = pd.read_sql_query(sql, conn)
conn.close()
return df
3.3 Python执行模块(沙箱隔离)
def safe_execute_python(code: str, df: pd.DataFrame) -> dict:
"""在受限环境中执行Python代码"""
# 只允许pandas和numpy
allowed_imports = {"pd": pd, "np": __import__("numpy")}
local_vars = {"df": df, **allowed_imports}
# 限制执行时间
import signal
def timeout_handler(signum, frame):
raise TimeoutError("代码执行超时(30秒)")
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(30)
try:
exec(code, {"__builtins__": {}}, local_vars)
result = local_vars.get("result", None)
return {"success": True, "data": result}
except Exception as e:
return {"success": False, "error": str(e)}
finally:
signal.alarm(0)
3.4 主Agent流程
class DataAnalysisAgent:
def __init__(self, llm_api, db_path):
self.llm = llm_api
self.db_path = db_path
def query(self, question: str) -> dict:
# Step 1: 意图解析
plan = self.llm.chat(SYSTEM_PROMPT + f"\n用户问题:{question}")
plan = json.loads(plan)
# Step 2: 执行
if plan["type"] == "sql":
df = safe_execute_sql(plan["code"], self.db_path)
return {"data": df, "explanation": plan["explanation"]}
elif plan["type"] == "python":
# 先用SQL取基础数据
result = safe_execute_python(plan["code"], df)
return result
return {"error": "无法理解问题"}
四、实战案例
用户问:"上个月每个渠道的GMV和订单数是多少?"
Agent自动生成的SQL:
SELECT
channel,
COUNT(*) as order_count,
ROUND(SUM(amount), 2) as gmv
FROM orders
WHERE created_at >= DATE('now', '-1 month')
GROUP BY channel
ORDER BY gmv DESC
输出的分析结论:
上个月各渠道GMV排名:
1. 微信小程序:¥1,234,567(订单5,432)
2. APP:¥987,654(订单3,210)
3. H5网页:¥456,789(订单1,876)
4. 抖音:¥345,678(订单2,109)
洞察:微信小程序贡献了40%的GMV但只有32%的订单,
客单价最高,建议重点运营。
五、3个必须踩的坑
坑1:SQL注入
永远不要直接把用户输入拼进SQL。用参数化查询或严格的白名单校验。上面代码里我已经做了关键词过滤。
坑2:大模型幻觉
模型可能生成不存在的表名或字段。解决方案:把表结构作为上下文传给模型,并在执行前校验表名是否存在。
坑3:执行超时
用户可能问"把所有用户的购买记录做聚类分析",这种查询可能跑几分钟。必须设置超时限制(建议30秒),超时后返回提示。
六、进阶方向
如果你已经跑通了基础版本,可以考虑:
① 接入RAG:让Agent能查询历史分析报告和业务文档
② 多轮对话:支持追问"那上上个月呢?"
③ 定时任务:每天自动生成数据日报
④ 可视化:自动生成ECharts图表嵌入报告
AI Agent不会替代数据分析师,但会让数据分析的效率提升一个量级。**关键不是学什么框架,而是理解"AI如何理解你的业务问题"**这个核心逻辑。
觉得有用的话,点个赞,有问题评论区聊。