AI数据分析Agent从零搭建:3层架构+核心代码+3个必须踩的坑

0 阅读4分钟

大家好,我是船长。在数据分析这行干了近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如何理解你的业务问题"**这个核心逻辑。

觉得有用的话,点个赞,有问题评论区聊。