数据分析智能体:用 LLM 自动完成探索性分析

FreeGuideOnline 最新 2026-06-23

引言:告别重复劳动,让 LLM 成为你的数据分析搭档

在数据分析的初始阶段,探索性数据分析(EDA) 是每个分析师都无法绕开的环节。你需要反复编写代码来查看数据概览、缺失值分布、变量相关性、异常值检测,并生成一系列可视化图表。这些工作重复性高,耗时且容易遗漏关键视角。

如今,借助大语言模型(LLM)与代码执行环境的结合,我们可以构建一个数据分析智能体——它能理解你的数据集,自动规划探索路径,生成并执行代码,最终交付一份结构化的分析报告。本文将从零开始,带你掌握如何搭建这样一个智能体,用自然语言驱动自动化的探索性分析。


什么是数据分析智能体

数据分析智能体并非一个固定的软件,而是一种由 LLM 驱动、具备工具调用能力的自治程序。它通过以下几个核心能力,将原本手动执行的分析流程自动化:

  • 理解数据结构:读取 CSV、数据库表等,识别列名、数据类型、基本统计量。
  • 生成分析计划:根据数据特征,规划出一套包含描述性统计、缺失分析、相关性分析、可视化等步骤的探索路径。
  • 编写并执行代码:调用 Python 解释器,生成 pandas、matplotlib、seaborn 等库的代码,并实际运行得到结果。
  • 解读与迭代:根据执行反馈(如报错或数据特征)调整后续步骤,最终合成易读的自然语言总结。

这背后依赖于 LLM 的 ReAct(推理与行动) 模式:模型在“思考下一步该做什么”与“调用工具获取新信息”之间交替进行,直到完成整个分析目标。


智能体的核心架构

一个可用的数据分析智能体通常由三个模块构成:

1. 工具层——安全的代码执行环境

LLM 不能直接操作你的本地文件系统或数据库,否则会带来严重的安全风险。最佳实践是使用沙箱化的 Python 解释器(如 Docker 容器、Jupyter Kernel Gateway 或云函数)。智能体通过 API 将代码发送至该环境执行,并返回文本或图像结果。

常用工具封装:

  • execute_python(code: str) -> (output: str, images: list)
  • load_data(source: str) -> dict:将数据加载为内存对象,并返回 schema 信息。

2. 记忆与上下文管理

智能体需要记住之前的执行结果、变量状态以及分析进度。这可以通过对话消息列表实现,其中保存用户的原始问题、系统提示、助手生成的代码和执行输出。 对于大规模数据,只保留数据的元信息和统计摘要,而将原始数据留在执行环境内。

3. 规划与决策核心

这是 LLM 的“大脑”部分。一个精心设计的系统提示(System Prompt)能让模型严格遵循分析流程,并规范输出格式。典型提示会要求模型:

  • 第一步总是用 df.info()df.describe() 熟悉数据。
  • 根据数据类型自动选择可视化方法(如分类变量用柱状图,连续变量用直方图和箱线图)。
  • 检测并报告缺失值、重复行、异常值。
  • 生成相关性热力图时,仅处理数值型列。
  • 最终给出不少于 5 个维度的总结。

手把手构建:基于 LangChain 的数据分析智能体

下面我们使用 LangChain 框架来快速搭建一个原型。环境准备:

pip install langchain langchain-experimental openai pandas matplotlib seaborn

步骤 1:初始化 LLM 与 Python 执行器

from langchain_openai import ChatOpenAI
from langchain_experimental.tools import PythonREPLTool
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub
import os

os.environ["OPENAI_API_KEY"] = "your-api-key"

llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
python_tool = PythonREPLTool()
tools = [python_tool]

PythonREPLTool 提供了一个真实(但无状态持久化)的 Python 环境,适合教学演示。生产环境建议替换为有状态沙箱

步骤 2:设计系统提示词

这里我们自定义一个提示词,强制智能体遵循标准 EDA 流程:

template = """你是一个世界级的数据分析助手。你的任务是对用户提供的数据集执行完整的探索性数据分析。

你可以使用 Python 工具来编写和运行代码。数据集已经以 pandas DataFrame 的形式加载在变量 `df` 中。
在每次执行后,你将收到代码的输出,包括可能生成的图表(以路径形式出现)。

你必须严格按照以下阶段进行分析,每个阶段都要产出有意义的结论:

1. **数据概览**:查看前5行、形状、列类型、统计摘要。
2. **数据质量**:检查缺失值、重复值,并给出处理建议。
3. **单变量分布**:对每个重要变量绘制分布图(直方图、箱线图或计数图)。
4. **多变量关系**:探索变量间的相关性(热力图),并对关键变量对绘制散点图或分组箱线图。
5. **异常与模式**:识别潜在异常点,并挖掘有趣的交互关系。
6. **总结报告**:用中文列出至少5条关键发现和建议的下一步分析方向。

**重要规则:**
- 始终用英文编写 Python 代码,但所有解释和总结用中文。
- 绘图时要设置中文字体以避免乱码,如 plt.rcParams['font.sans-serif'] = ['SimHei']。
- 每一步完成后,立即用文字解读关键数值,不要只丢出图表。
- 如果代码执行出错,仔细分析错误信息,修正后重试,最多重试2次。

问题:{input}
{agent_scratchpad}
"""

步骤 3:构建 Agent 与执行器

from langchain_core.prompts import PromptTemplate
from langchain.agents import create_react_agent, AgentExecutor

prompt = PromptTemplate.from_template(template)
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)

步骤 4:加载数据并启动分析

假设我们手头有一个电商用户行为数据集 user_behavior.csv。 因为智能体需要 df 变量存在,我们在提示中要求它假设 df 已加载,所以调用前我们需要手动执行加载并告知环境?实际上 PythonREPLTool 每次执行是独立进程,不继承变量。更健壮的方式是让智能体自己第一步加载数据。修改提示词,告知数据文件路径,并在第一步加载。

更新提示词开头:

数据集文件路径为 './user_behavior.csv'。你第一步必须用 pandas 将其读取为 df:df = pd.read_csv('./user_behavior.csv')。

然后调用:

response = agent_executor.invoke({
    "input": "请对数据集 user_behavior.csv 进行全面探索性分析。"
})
print(response["output"])

智能体将自动按照阶段生成代码、执行,并最终返回结构化报告。


运行示例解析

以下是一次真实运行的片段(经过精简):

阶段1输出

数据集包含 100000 行,5 列:user_id, item_id, behavior_type, timestamp, item_category。其中 behavior_type 有4种:pv, buy, cart, fav。时间范围从 2024-01-01 到 2024-01-07。

阶段2输出

缺失值数量:0,重复行:0,数据质量良好。

阶段3输出

behavior_type 分布:pv 占 89.6%,buy 占 2.1%…… (附柱状图)

阶段4输出

绘制了行为类型与商品类目热力图,发现 category_12 的购买转化率显著高于其他类目。

最终总结(智能体生成):

  1. 数据无缺失,可直接进入建模阶段。
  2. 用户行为极度稀疏,购买行为占比仅2.1%,需关注样本不平衡。
  3. 类目12的转化率高出均值3倍,可深入分析其商品特性。
  4. 访问高峰在晚20-22点,建议此时段加大推荐力度。
  5. 下一步可进行用户分群与转化漏斗分析。

整个过程无需手动编写一行分析代码。


高级技巧与最佳实践

1. 有状态沙箱与数据持久化

PythonREPLTool 每次调用都是独立进程,无法使用上一次定义的变量。解决方案:搭建一个 Jupyter 内核网关,或将执行环境包装成类对象,每次执行时在同一个命名空间中累积代码。也可以让智能体把所有关键变量存在一个字典中,并在每次执行前重新运行历史代码——但效率较低。

2. 多模态输出处理

LLM 无法直接“看”到图表。你需要将 matplotlib 图表保存为图片,并将图片 URL 或 base64 返回给模型(需要多模态模型支持),或在最终报告中嵌入图片。简单的做法是将图片保存路径返回,智能体在总结中可以引用路径,由前端界面渲染。

3. 安全防护

限制可执行代码的库白名单,禁用 ossubprocess 等危险模块。对输入数据做脱敏处理。可以设置每次执行超时时间和资源上限,防止死循环或内存溢出。

4. 错误恢复机制

EDA 过程中代码报错常见。智能体应自动捕获错误信息并尝试修正。可以设计重试逻辑:最多重试 3 次,每次重试时明确提示最后一次错误原因。若仍失败,则跳过当前步骤并记录。

5. 定制化分析需求

用户可以修改系统提示,加入特定领域知识。例如:“对于销售数据,请务必分析 RFM 分层”;“对于时序数据,请自动进行平稳性检验”。这让智能体更具针对性。


常见问题排查

问题 可能原因 解决方法
智能体只生成代码不执行 未配置 handle_parsing_errors,或输出格式未被解析为行动 打开 verbose=True 查看详细日志,修正提示词中的格式要求
图形中文乱码 系统缺少中文字体 在提示词中明确要求使用 SimHeiArial Unicode MS
执行超时 数据量过大或死循环 添加 max_execution_time 参数,限制单次执行时间
相关性分析报错 包含非数值列 提示词中规定只对 select_dtypes(include='number') 做相关分析

总结与展望

数据分析智能体将 EDA 工作从“编写代码”转变为“定义目标”。它让分析师能够聚焦于洞察的解读与决策,而非陷入机械化的脚本编写。随着 LLM 推理能力与代码生成精度的提升,以及工具链的成熟,这类智能体将逐渐成为数据团队的标配。

下一步你可以:

  • 将此原型扩展为支持自然语言查询的对话式分析助手。
  • 集成可视化库如 Plotly,生成交互式图表。
  • 与数据仓库连接,实现万亿级数据的安全探索。

现在,就从改造你的第一个 EDA 智能体开始,让重复劳动成为过去式。