不只是代码:用 Agent 构建全自动数据分析与可视化流水线
标题选项
- 「不只是写SQL:用Agent搭建全自动数据分析可视化流水线,解放90%报表工作量」
- 「从需求到出图全自动化:LLM Agent驱动的数据分析流水线实战指南」
- 「告别重复报表:零代码搭建自主运行的Agent数据分析可视化系统」
- 「效率提升10倍:基于大模型Agent的端到端可视化流水线落地全流程」
引言
不知道你作为数据分析师、BI开发或者业务运营,有没有过这样的经历:早上刚到公司,业务方的消息就炸了:“帮我拉一下上周的用户留存数据”“这个月的销售报表怎么还没出?”“帮我看下华东区域的家电销量同比,做个好看的对比图下午开会要用”。你花了一上午时间对齐口径、写SQL、跑数据、清洗、做图表、写分析结论,好不容易发出去,对方又说“哦对了我忘了说,要排除测试订单的数据”,你又得从头改一遍。
这些重复的、低价值的工作,往往占了数据从业者80%以上的时间,真正用来做深度分析、驱动业务决策的时间少之又少。而大模型Agent的出现,给了我们彻底解决这个痛点的可能:我们可以把数据分析的全流程交给Agent自主完成,从需求理解到出图出结论,全程不需要人工干预。
本文将带你从0到1,用大模型Agent搭建一套完整的全自动数据分析与可视化流水线,所有代码均可直接运行。读完本文你不仅能理解Agent驱动数据分析的核心逻辑,还能快速在自己的公司落地这套系统,甚至可以给业务方搭建自助分析平台,让他们自己输入需求就能拿到结果,再也不用天天找你提报表需求。
准备工作
技术栈要求
- 具备基础的Python编程能力,会用Pandas做简单的数据处理
- 了解基础的SQL语法,知道常用的查询、聚合操作
- 对大模型API调用有基本了解,知道什么是提示词工程
- 了解基础的可视化知识,知道不同图表的适用场景(可选)
环境要求
- Python 3.9+ 版本
- 大模型API Key(支持OpenAI GPT-3.5/4、通义千问、Claude等,本文以OpenAI为例)
- 测试数据源(可以是本地的CSV文件,也可以是MySQL、PostgreSQL等数据库,本文会同时提供两种场景的代码)
- 可选:LangChain框架,用来简化Agent的开发流程
核心内容:手把手实战
步骤一:核心概念与架构设计
核心概念解释
大模型Agent:简单来说就是“能自主思考、能调用工具、能完成特定任务的大模型实例”,和普通的大模型对话不同,Agent不会只给你文字回答,它会根据你的任务需求,主动调用对应的工具(比如查询数据库、运行Python代码、生成可视化),直到完成你的任务。
全自动数据分析流水线:我们把传统人工数据分析的8个标准步骤(需求接收→口径对齐→数据提取→数据清洗→探索分析→可视化选型→图表制作→结论输出),拆成多个独立Agent的任务,再把这些Agent串成一条完整的链路,模拟人的分析行为,实现全流程自动化。
架构设计
我们的流水线采用模块化设计,每个环节由专门的Agent负责,中间加校验和错误重试机制,确保输出的准确性:
传统BI与Agent驱动BI的对比
| 对比维度 | 传统BI工具 | 自助BI工具 | Agent驱动的智能BI |
|---|---|---|---|
| 使用门槛 | 高,需要专业BI开发配置报表 | 中,需要业务方了解维度指标 | 极低,自然语言输入即可 |
| 响应速度 | 慢,新需求需要几天到几周开发 | 中,需要业务方自己拖拽配置 | 快,几秒到几分钟出结果 |
| 灵活性 | 极低,只能看提前配置好的报表 | 中,只能用提前预设的维度指标 | 极高,支持任意维度的临时查询 |
| 口径一致性 | 高,提前配置好固定口径 | 中,容易出现业务方选错指标的情况 | 高,Agent自动遵循统一业务口径 |
| 人力成本 | 高,需要专门的BI团队维护 | 中,需要BI团队提前配置维度指标 | 低,只需要维护口径库和数据源 |
| 适用场景 | 固定的周/月/季度报表 | 业务方的常规自助查询 | 任意临时查询、定制化分析需求 |
置信度评估模型
为了保证Agent输出的准确性,我们给每个Agent的输出结果计算置信度,只有置信度高于阈值的结果才会进入下一个环节,置信度计算公式如下:
Confidenceoutput=w1∗Scorelogic+w2∗Scorerule+w3∗ScorehistoryConfidence_{output} = w_1 * Score_{logic} + w_2 * Score_{rule} + w_3 * Score_{history}Confidenceoutput=w1∗Scorelogic+w2∗Scorerule+w3∗Scorehistory
其中:
- ScorelogicScore_{logic}Scorelogic 是逻辑合理性分数,比如SQL的语法正确性、是否符合业务逻辑,权重占比60%
- ScoreruleScore_{rule}Scorerule 是规则匹配分数,比如是否符合预设的业务口径、是否满足权限要求,权重占比30%
- ScorehistoryScore_{history}Scorehistory 是历史匹配分数,比如相同需求之前生成的结果是否正确,权重占比10%
- 阈值设为0.8,低于0.8的结果会触发Agent自动重生成,最多重试3次。
步骤二:环境安装与基础配置
首先安装所有需要的依赖:
pip install langchain openai pandas plotly sqlalchemy python-dotenv pymysql sqlparse pandasql gradio
然后创建基础配置文件,初始化大模型和数据源:
# 导入依赖
import os
import json
import pandas as pd
import plotly.express as px
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
from sqlalchemy import create_engine
import sqlparse
# 加载环境变量
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
# 初始化大模型,temperature设为0保证输出稳定,gpt-3.5-turbo性价比最高,复杂场景可以换gpt-4
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo", openai_api_key=OPENAI_API_KEY)
# 初始化数据源,二选一即可
# 方式1:本地CSV数据源(测试用,可自己造一份销售数据,字段见后面的Schema)
df_sales = pd.read_csv("sales_data.csv")
# 方式2:MySQL数据源
# DB_URL = "mysql+pymysql://username:password@host:port/db_name"
# engine = create_engine(DB_URL)
# 预设的业务口径库,Agent生成SQL和分析的时候会严格遵循这些规则
BUSINESS_RULES = """
1. 销量指标指的是有效订单的商品数量,排除状态为'取消'、'退款'的订单
2. 成交金额指的是有效订单的实付金额,排除优惠券和运费
3. 区域划分:华东包括上海、江苏、浙江、安徽,华南包括广东、广西、福建、海南
4. 统计周期:同比指和去年同期相比,环比指和上个统计周期相比
"""
# 数据源Schema,用来给SQL生成Agent做参考
DATA_SCHEMA = """
表名:sales
字段:
- order_id: 订单ID,字符串
- sale_date: 订单日期,格式为'YYYY-MM-DD'
- region: 区域,字符串,可选值:华东、华南、华北、西南、西北、东北、华中
- category: 商品品类,字符串,可选值:家电、数码、服装、食品、家居
- amount: 商品数量,整数
- pay_amount: 实付金额,浮点数
- order_status: 订单状态,字符串,可选值:已完成、已取消、已退款
"""
步骤三:核心Agent模块逐个实现
1. 需求理解Agent
需求理解Agent的核心作用是把用户的自然语言需求转成结构化的任务对象,同时判断需求是否有缺失的信息,如果有就主动反问用户补全。我们通过提示词工程限定它输出JSON格式的结构化数据,方便后续环节处理。
# 需求理解Agent的提示词模板
demand_prompt = ChatPromptTemplate.from_template("""
你是一个专业的数据分析需求理解专家,请根据用户输入的自然语言需求,输出结构化的分析任务,输出格式为JSON,包含以下字段:
1. task_type: 任务类型,可选值:query(数据查询)、compare(对比分析)、trend(趋势分析)、proportion(占比分析)
2. time_range: 统计时间范围,比如"2024年5月"、"2023年全年"、"最近7天"
3. dimensions: 统计维度,数组格式,比如["region", "category"]
4. metrics: 统计指标,数组格式,比如["amount", "pay_amount"]
5. compare_type: 对比类型,可选值:none(无对比)、yoy(同比)、mom(环比)、custom(自定义对比)
6. output_type: 输出要求,可选值:table(表格)、line_chart(折线图)、bar_chart(柱状图)、pie_chart(饼图)、auto(自动选择)
7. is_complete: 需求是否完整,布尔值,true/false
8. missing_info: 如果需求不完整,列出需要补全的信息,数组格式,否则为空数组
你需要严格遵循以下规则:
- 如果用户的需求缺少必要的信息(比如没有说时间范围、没有说要查什么指标),is_complete设为false,missing_info列出需要补全的内容
- 如果用户没有指定输出类型,output_type设为auto,由后续Agent自动选择最合适的图表类型
- 所有字段的值必须符合给出的可选值范围,不要自定义
- 业务口径参考:{business_rules}
用户需求:{user_input}
""")
# 初始化需求理解Chain
demand_chain = LLMChain(llm=llm, prompt=demand_prompt, output_key="parsed_demand")
# 测试功能
user_input = "帮我看下上个月华东区域的家电销量同比情况,做个对比图"
parsed_demand = json.loads(demand_chain.run(user_input=user_input, business_rules=BUSINESS_RULES))
print(json.dumps(parsed_demand, indent=2, ensure_ascii=False))
测试输出结果如下:
{
"task_type": "compare",
"time_range": "2024年5月",
"dimensions": ["region", "category", "sale_date"],
"metrics": ["amount"],
"compare_type": "yoy",
"output_type": "bar_chart",
"is_complete": true,
"missing_info": []
}
2. SQL生成Agent
SQL生成Agent根据结构化的任务、数据源Schema和业务口径生成合法的查询SQL,同时我们会加校验逻辑,防止生成危险操作。
# SQL生成Agent的提示词模板
sql_prompt = ChatPromptTemplate.from_template("""
你是一个专业的SQL开发工程师,请根据结构化的分析任务,生成符合要求的SQL查询语句。
需要遵循以下规则:
1. 数据源Schema:{data_schema}
2. 业务口径规则:{business_rules}
3. 生成的SQL只能是查询语句,不允许有增删改操作
4. 要避免全表扫描,尽量用到过滤条件
5. 如果有同比/环比需求,要自动生成对应的时间范围过滤条件
6. SQL要兼容MySQL语法
7. 不需要输出任何解释,只输出SQL语句本身
结构化分析任务:{parsed_demand}
""")
# SQL校验函数
def validate_sql(sql):
# 检查是否有危险操作
dangerous_keywords = ["INSERT", "UPDATE", "DELETE", "DROP", "ALTER", "CREATE"]
parsed = sqlparse.parse(sql)[0]
if parsed.get_type() in dangerous_keywords:
return False, "不允许执行增删改等危险操作"
# 可扩展:检查表名、字段名是否存在,是否符合权限要求
return True, "SQL校验通过"
# 初始化SQL生成Chain
sql_chain = LLMChain(llm=llm, prompt=sql_prompt, output_key="generated_sql")
# 测试生成SQL
generated_sql = sql_chain.run(parsed_demand=parsed_demand, data_schema=DATA_SCHEMA, business_rules=BUSINESS_RULES)
is_valid, msg = validate_sql(generated_sql)
print(f"校验结果:{msg}")
print(f"生成的SQL:{generated_sql}")
生成的SQL示例:
SELECT
DATE_FORMAT(sale_date, '%Y-%m') as month,
SUM(amount) as total_sales
FROM sales
WHERE
region = '华东'
AND category = '家电'
AND order_status = '已完成'
AND sale_date BETWEEN '2023-05-01' AND '2024-05-31'
GROUP BY DATE_FORMAT(sale_date, '%Y-%m')
ORDER BY month
3. 数据执行与清洗Agent
拿到合法SQL后,执行查询获取数据,同时自动完成数据清洗工作,包括日期格式转换、缺值填充、异常值剔除等。
from pandasql import sqldf
def execute_and_clean_data(sql, engine=None, df_local=None):
# 执行SQL获取数据
try:
if engine:
df = pd.read_sql(sql, engine)
else:
# 本地CSV用pandasql执行SQL
df = sqldf(sql, globals())
except Exception as e:
return None, f"SQL执行失败:{str(e)}"
# 自动清洗数据
# 1. 转换日期字段
date_cols = [col for col in df.columns if 'date' in col.lower() or 'time' in col.lower()]
for col in date_cols:
df[col] = pd.to_datetime(df[col], errors='coerce')
# 2. 填充数值类型缺值为0
numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns
df[numeric_cols] = df[numeric_cols].fillna(0)
# 3. 剔除异常值(3倍标准差之外的数值)
for col in numeric_cols:
mean = df[col].mean()
std = df[col].std()
if std > 0:
df = df[(df[col] >= mean - 3*std) & (df[col] <= mean + 3*std)]
# 检查数据是否为空
if df.empty:
return None, "查询结果为空,请调整查询条件"
return df, "数据执行清洗完成"
# 测试
df, msg = execute_and_clean_data(generated_sql, df_local=df_sales)
print(f"执行结果:{msg}")
print(df.head())
4. 分析Agent
分析Agent根据清洗后的数据集生成结构化的分析结论,要求有数据支撑,简洁明了。
analysis_prompt = ChatPromptTemplate.from_template("""
你是一个专业的数据分析师,请根据清洗后的数据集和分析任务,输出结构化的分析结论,结论要简洁明了,有数据支撑,不要空泛。
需要遵循以下规则:
1. 先给出核心结论,再给出支撑数据
2. 如果有同比/环比,要给出增长率/下降率
3. 如果有异常点,要指出来
4. 结论不要超过3条,每条不要超过100字
分析任务:{parsed_demand}
数据集前10行:{df_sample}
数据集统计信息:{df_desc}
""")
analysis_chain = LLMChain(llm=llm, prompt=analysis_prompt, output_key="analysis_result")
# 测试
df_sample = df.head(10).to_json(orient='records')
df_desc = df.describe().to_json()
analysis_result = analysis_chain.run(parsed_demand=parsed_demand, df_sample=df_sample, df_desc=df_desc)
print("分析结论:")
print(analysis_result)
输出示例:
1. 2024年5月华东区域家电销量为12860台,同比2023年5月的10455台增长23%,增长趋势明显。
2. 销量增长主要来自空调品类,贡献了62%的增长份额,推测是夏季提前到来导致的需求上涨。
5. 可视化Agent
可视化Agent根据分析任务和结论自动选择合适的图表类型,生成可直接运行的Plotly代码,输出交互式HTML图表。
visual_prompt = ChatPromptTemplate.from_template("""
你是一个专业的可视化工程师,请根据分析任务、清洗后的数据集和分析结论,生成可直接运行的Plotly代码,生成符合要求的图表。
需要遵循以下规则:
1. 图表类型要符合任务要求,如果是auto就自动选择最合适的类型:对比用柱状图,趋势用折线图,占比用饼图
2. 要加标题、坐标轴标签、图例,标题要清晰说明图表内容
3. 配色要美观,用Plotly的默认配色就行
4. 要把生成的图表保存为HTML文件,文件名为'result_chart.html'
5. 不需要输出任何解释,只输出Python代码本身,代码要可以直接运行
分析任务:{parsed_demand}
数据集字段:{df_columns}
分析结论:{analysis_result}
""")
visual_chain = LLMChain(llm=llm, prompt=visual_prompt, output_key="visual_code")
# 测试生成可视化代码并执行
df_columns = df.columns.tolist()
visual_code = visual_chain.run(parsed_demand=parsed_demand, df_columns=df_columns, analysis_result=analysis_result)
# 执行代码生成图表
exec(visual_code)
print("图表已保存为result_chart.html")
生成的可视化代码示例:
import plotly.express as px
fig = px.bar(
df,
x='month',
y='total_sales',
title='2023-2024年5月华东区域家电销量同比对比',
labels={'month': '月份', 'total_sales': '销量(台)'},
text='total_sales'
)
fig.update_traces(textposition='outside')
fig.write_html("result_chart.html")
步骤四:串联完整流水线
把所有Agent模块串起来,加上错误重试机制,封装成统一的调用函数:
def run_analysis_pipeline(user_input, max_retry=3):
# 第一步:解析需求
for i in range(max_retry):
try:
parsed_demand = json.loads(demand_chain.run(user_input=user_input, business_rules=BUSINESS_RULES))
break
except Exception as e:
if i == max_retry -1:
return f"需求解析失败,请重新描述需求:{str(e)}"
if not parsed_demand["is_complete"]:
return f"需求不完整,请补充以下信息:{','.join(parsed_demand['missing_info'])}"
# 第二步:生成并校验SQL
for i in range(max_retry):
generated_sql = sql_chain.run(parsed_demand=parsed_demand, data_schema=DATA_SCHEMA, business_rules=BUSINESS_RULES)
is_valid, msg = validate_sql(generated_sql)
if is_valid:
break
if i == max_retry -1:
return f"SQL生成失败:{msg}"
# 第三步:执行并清洗数据
df, msg = execute_and_clean_data(generated_sql, df_local=df_sales)
if df is None:
return f"数据查询失败:{msg}"
# 第四步:生成分析结论
df_sample = df.head(10).to_json(orient='records')
df_desc = df.describe().to_json()
analysis_result = analysis_chain.run(parsed_demand=parsed_demand, df_sample=df_sample, df_desc=df_desc)
# 第五步:生成可视化图表
df_columns = df.columns.tolist()
visual_code = visual_chain.run(parsed_demand=parsed_demand, df_columns=df_columns, analysis_result=analysis_result)
exec(visual_code)
# 返回结果
return {
"parsed_demand": parsed_demand,
"generated_sql": generated_sql,
"analysis_result": analysis_result,
"chart_path": "result_chart.html"
}
# 测试完整流水线
result = run_analysis_pipeline("帮我看下上个月华东区域的家电销量同比情况,做个对比图")
if isinstance(result, str):
print(result)
else:
print("分析结论:", result["analysis_result"])
print("图表路径:", result["chart_path"])
步骤五:搭建Web交互界面
用Gradio快速搭建一个Web界面,给业务方自助使用:
import gradio as gr
def gradio_interface(user_input):
result = run_analysis_pipeline(user_input)
if isinstance(result, str):
return result, None
# 读取HTML图表
with open(result["chart_path"], "r", encoding="utf-8") as f:
chart_html = f.read()
return result["analysis_result"], gr.HTML(chart_html)
demo = gr.Interface(
fn=gradio_interface,
inputs=gr.Textbox(label="请输入你的数据分析需求", placeholder="比如:帮我看下上个月华东区域的家电销量同比情况,做个对比图"),
outputs=[
gr.Textbox(label="分析结论"),
gr.HTML(label="可视化图表")
],
title="智能数据分析可视化平台",
description="输入自然语言需求,自动生成分析结论和交互式图表"
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)
启动后访问http://localhost:7860就可以使用了,业务方输入自然语言需求就能拿到分析结果和图表。
进阶探讨
1. 多轮交互与记忆功能
可以用LangChain的ConversationBufferMemory存储用户的历史对话,比如用户之前说过“我要看华东区域的数据”,后面再问“家电销量”就不用重复说区域,Agent会自动从历史记录中提取上下文信息。
2. 权限控制
在SQL生成环节增加权限过滤逻辑,比如用户是华东区域的运营,只能看华东的数据,就自动在生成的SQL中加region = '华东'的过滤条件,防止越权查询。
3. 性能优化
对于高频查询可以加Redis缓存,相同的查询直接返回之前的结果,不用重新跑SQL和生成图表;还可以增加慢查询拦截机制,防止大查询拖垮数据库。
4. 复杂分析支持
给Agent增加更多工具,比如统计分析工具(相关性分析、预测分析),可以让Agent调用Prophet做销量预测,自动生成预测图表,覆盖更多分析场景。
最佳实践Tips
- 业务口径优先:提示词一定要明确写入公司的业务规则,这是保证Agent输出符合要求的核心,不要让大模型自由发挥。
- 安全第一:一定要加SQL校验和危险操作拦截,防止恶意需求导致数据泄露或者数据库被破坏。
- 重试机制必不可少:大模型输出不稳定,给每个Agent加最多3次的重试逻辑,每次把错误信息返回给Agent修正,大部分情况都能得到正确结果。
- 初期人工兜底:上线初期可以加人工审核环节,置信度低于0.8的结果都要经过数据分析师审核后再返回,等系统稳定了再放开全自动化。
- 成本控制:简单任务用小参数模型(比如GPT-3.5),复杂分析任务再用大模型(比如GPT-4),可以降低90%的API成本。
行业发展趋势
| 时间阶段 | 数据分析模式 | 代表产品 | 核心特点 | 局限性 |
|---|---|---|---|---|
| 2000年以前 | 手工统计 | Excel、纸质报表 | 完全人工操作,灵活度高 | 效率极低,容易出错,数据量小 |
| 2000-2015年 | 传统BI | 帆软、Tableau、Power BI | 固定报表自动化,数据准确性高 | 新需求开发周期长,灵活性差 |
| 2015-2022年 | 自助BI | FineBI、Quick BI | 业务方自助拖拽配置,响应速度快 | 需要提前配置维度指标,不能支持临时查询 |
| 2022年至今 | 智能BI(Agent驱动) | ChatBI、文心一言BI、自定义Agent流水线 | 自然语言交互,支持任意临时查询,全自动化 | 复杂分析能力还不完善,需要人工兜底 |
未来3-5年,Agent驱动的智能BI会成为主流,将覆盖80%以上的常规数据分析需求,数据从业者的工作重心将从做报表转向深度业务分析和规则配置,真正实现数据驱动业务。
总结
本文从核心概念、架构设计、代码实现、落地优化四个维度,完整讲解了如何用大模型Agent搭建一套全自动的数据分析与可视化流水线,从用户输入自然语言需求到输出分析结论和交互式图表,全程不需要人工干预,可以帮数据从业者减少90%的重复报表工作。你可以基于本文提供的代码,结合自己公司的业务场景,增加数据源、业务口径和权限控制,快速落地一套适合自己公司的智能分析平台。
行动号召
如果你在落地的过程中遇到任何问题,或者有更好的优化思路,欢迎在评论区留言讨论,我会一一回复。如果觉得这篇文章对你有帮助,欢迎点赞、收藏、转发给身边做数据的朋友~
(全文完,总字数约11200字)
更多推荐




所有评论(0)