在上一篇文章中,我们介绍了如何使用 DeepSeek R1 + LangChain 来生成报告。今天,我们将更进一步,探讨如何结合数据分析和可视化,让 AI 帮我们生成一份包含图表的专业数据分析报告 PPT。
本文源码已上传至:GitHub
LangChain Agent 简介
在深入代码实现之前,我们先来了解一下 LangChain Agent 的核心概念和工作原理。
什么是 LangChain Agent?
LangChain Agent 是一个智能代理系统,它能够:
- 理解用户的自然语言指令
- 规划完成任务所需的步骤
- 调用适当的工具来执行这些步骤
- 整合各个步骤的结果
简单来说,Agent 就像是一个智能助手,它知道如何组合使用各种工具来完成复杂任务。
Agent 的工作流程
- 输入解析:Agent 接收用户的自然语言指令
- 任务规划:分析需要完成的任务,并制定执行计划
- 工具选择:从可用的工具集中选择合适的工具
- 执行操作:按照计划调用工具,执行具体操作
- 结果整合:将各个步骤的结果组合成最终输出
Agent 的核心组件
- LLM(大语言模型)
- 负责理解用户指令
- 生成执行计划
- 决策下一步行动
- Tools(工具)
- 具体功能的实现
- 通过装饰器注册
- 提供标准化接口
- Memory(记忆)
- 存储对话历史
- 维护状态信息
- 支持上下文理解
- Agent类型
- ZERO_SHOT:直接根据工具描述选择工具
- REACT:使用思维链进行推理
- PLAN_AND_EXECUTE:先规划再执行
- 等等
主要功能概述
我们将实现以下核心功能:
- 数据可视化:支持生成多种类型的图表(柱状图、折线图、饼图、散点图)
- 文件处理:支持读取多种格式的数据文件(CSV、Excel、Word、网页)
- PPT 生成:支持多种幻灯片布局(标题页、纯文本页、图文混排页)
- AI 驱动:使用 LangChain 框架实现智能化的内容生成和排版
整体流程图如下:

核心代码实现
1. 图表生成器
首先,我们实现了一个灵活的图表生成器类:
class ChartGenerator:
@staticmethod
def create_chart(data: pd.DataFrame, chart_type: str, x_column: str, y_column: str,
title: str, output_path: str) -> str:
"""生成各种类型的图表"""
plt.figure(figsize=(10, 6))
if chart_type == "bar":
sns.barplot(data=data, x=x_column, y=y_column)
elif chart_type == "line":
sns.lineplot(data=data, x=x_column, y=y_column)
elif chart_type == "pie":
plt.pie(data[y_column], labels=data[x_column], autopct='%1.1f%%')
elif chart_type == "scatter":
sns.scatterplot(data=data, x=x_column, y=y_column)
这个类使用 matplotlib 和 seaborn 库来生成各种类型的数据可视化图表。特别注意:
- 支持中文显示配置
- 自动化图表样式设置
- 灵活的图表类型选择
2. 文件加载工具
为了处理不同格式的输入文件,我们实现了统一的文件加载接口:
@tool
def file_loader(file_path: str) -> str:
"""文件加载工具"""
file_ext = file_path.split('.')[-1].lower()
if file_ext == 'csv':
loader = CSVLoader(file_path)
elif file_ext in ['xls', 'xlsx']:
loader = UnstructuredExcelLoader(file_path)
elif file_ext in ['doc', 'docx']:
loader = Docx2txtLoader(file_path)
elif file_path.startswith("http"):
loader = WebBaseLoader(file_path)
这个工具的优点是:
- 支持多种文件格式
- 统一的接口设计
- 异常处理机制
- 可扩展性强
3. PPT 生成工具
PPT 生成是本项目的核心功能:
@tool
def generate_and_save_ppt(ppt_content: List[dict], output_filename: Optional[str] = "generated_ppt.pptx") -> str:
"""生成PPT的工具"""
prs = Presentation()
for slide_info in ppt_content:
slide_type = slide_info["slide_type"]
if slide_type == "title":
# 标题页处理
elif slide_type == "text_only":
# 纯文本页处理
elif slide_type == "text_and_image":
# 图文混排页处理
关键特性:
- 支持多种幻灯片布局
- 灵活的内容配置
- 自动化的图片插入
- 统一的样式管理
系统集成
使用 LangChain 框架将所有组件整合成一个完整的系统:
def create_ppt_agent(llm):
"""创建PPT生成Agent"""
tools = [generate_chart, generate_and_save_ppt, file_loader]
agent = initialize_agent(
tools,
llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
return agent
实际应用示例
这里我们还是使用第七课的数据做一个 PPT:
agent = create_ppt_agent(llm)
result = agent.run({
"input": """
使用 /root/work/llm-notebook/data/07/sales_data.csv 文件创建一个销售分析PPT,包括以下内容:
1. 按月份绘制销售额的折线图
2. 分析销售额最高的日期
3. 按产品类别绘制销售额的柱状图
4. 异常值检测
5. 趋势分析
6. 商业建议
7. 数据的关键特征
8. 主要统计指标
9. 潜在的数据模式
等等
内容请使用金字塔原理组织。
"""
})
执行过程:
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3mThought: 首先,我需要加载数据文件以了解数据结构和内容,为后续处理步骤做准备。
Action:
{ “action”: “file_loader”, “action_input”: { “file_path”: “/root/work/llm-notebook/data/07/sales_data.csv” } }
[0m
Observation: [38;5;200m[1;3mDate: 2024-09-01
Product Name: Product A
Quantity: 15
Unit Price: 45.00
......
Unit Price: 110.00
Sales Amount: 4950.00[0m
Thought:[32;1m[1;3m根据数据内容,我将按以下步骤创建销售分析PPT:
1. 生成按月份绘制销售额的折线图
2. 分析销售额最高的日期并生成相关图表
3. 生成按产品类别绘制销售额的柱状图
4. 进行异常值检测并生成相关图表
5. 进行趋势分析并生成相关图表
6. 根据分析结果提出商业建议
7. 概述数据的关键特征
8. 提供主要统计指标
9. 描述潜在的数据模式
首先,我将生成按月份绘制销售额的折线图。
Action:
{ “action”: “generate_chart”, “action_input”: { “data_path”: “/root/work/llm-notebook/data/07/sales_data.csv”, “chart_type”: “line”, “x_column”: “Date”, “y_column”: “Sales Amount”, “title”: “Monthly Sales Amount”, “output_path”: “monthly_sales.png” } }
Observation: [36;1m[1;3mmonthly_sales.png[0m
......
{
"slide_type": "text_only",
"title": "潜在的数据模式",
"content": [
"1. 销售额在周末和节假日通常较高。",
"2. 某些产品类别在特定时间段内表现更好。",
"3. 销售额与促销活动呈正相关。",
"4. 某些日期的销售额异常高,需要进一步调查。"
]
}
],
"output_filename": "sales_analysis.pptx"
}
}
```[0m
Observation: [33;1m[1;3msales_analysis.pptx[0m
Thought:[32;1m[1;3mI know what to respond
Action:
{ “action”: “Final Answer”, “action_input”: “销售分析PPT已成功生成,文件路径为:sales_analysis.pptx。” }
[1m> Finished chain.[0m
PPT已生成: 销售分析PPT已成功生成,文件路径为:sales_analysis.pptx。
生成的 PPT 内容如下:


总结:
本文介绍的自动化 PPT 生成系统具有以下特点:
- 对比市面上的 PPT 自动生成工具,我们支持全自动的数据处理和可视化
- 智能化的内容生成和排版
- 灵活的配置和扩展能力
- 专业的展示效果
当然我们这里仅仅实现了一个 Demo,有很多复杂的配置我们为了让大家能够看清主脉络并没有实现,有兴趣的同学可以继续完善一下,来帮助自己工作,我们也希望能够看到有更多的业务能够被大模型赋能。