【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统
基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。
功能特点
- Markdown解析:自动解析Markdown文档结构
- PPT模板分析:分析PPT模板的布局和风格
- 智能布局决策:匹配内容与合适的PPT布局
- 自动生成PPT:根据解析结果生成最终的PPT文件
演示Demo
通过多模态+Agent实现的PPT辅助编辑助手演示视频
部署方法
项目地址:https://github.com/BJSS-China/ppt_assistant
方式一:使用Docker部署
cd docker# 编辑.env文件
cp .env.example .env# 执行部署脚本
./deploy.sh build
# 执行启动脚本
./deploy.sh start
备注:
- 需要提前安装好docker和docker-compose
方式二:使用本地环境部署(适用于开发调试)
1. 安装依赖
# 创建虚拟环境
conda create -n ppt_gen python=3.12
conda activate ppt_gen# 安装依赖
pip install -r requirements.txt# 初始化子模块
git submodule update --init# 安装ppt_manager
cd libs/ppt_manager
pip install -e .
2. 安装LibreOffice
Mac用户可以通过brew安装LibreOffice
brew install --cask libreoffice
安装之后创建soffice的命令脚本
# 创建软链接
sudo tee /usr/local/bin/soffice <<EOF
#!/bin/bash
/Applications/LibreOffice.app/Contents/MacOS/soffice "\$@"
EOF# 赋予执行权限
sudo chmod +x /usr/local/bin/soffice
验证安装
soffice --version
3. 安装poppler
Mac用户可以通过brew安装poppler
brew install poppler
Linux用户可以通过apt安装poppler
sudo apt-get install poppler-utils
Windows用户需要手动下载安装
下载地址:https://poppler.freedesktop.org/
4. 运行
4.1 复制配置文件
cp .env.example .env
4.2 启动redis服务
docker-compose -f docker/docker-compose-dev.yml up -d
4.3 启动后端FastAPI服务
uvicorn apps.api.main:app --reload --host 0.0.0.0 --port 8000
4.4 启动celery服务
celery -A apps.api.celery_app worker --loglevel=info --concurrency=2 --pool=solo -Q celery,template_analysis,ppt_generation
4.5 启动前端Vue服务
cd apps/web
npm install --legacy-peer-deps
npm run dev
使用方法
- 访问前端页面
- docker部署:http://localhost
- 本地部署:http://localhost:5173
-
访问管理后台:点击前端页面右上角管理后台按钮,进入管理后台页面(admin/admin123)
-
配置API_KEY:点击管理后台,分别配置LLM、VLLM、deepthink的API Key
备注:
- 模型配置中的文本模型(LLM)和深度思考(deepthink),本质都是文本大模型。
- 前者一般承担比较轻量级的任务,后者一般承担上下文比较长的分析任务,为了节省token消耗,区分使用,但都需要配置。
-
上传PPT模板:在管理后台,上传PPT模板文件,稍等分析完毕后,即可在管理后台看到分析结果
-
在前端页面,输入Markdown文档,点击生成PPT按钮
-
下载PPT:待提示PPT生成完毕后,点击PPT文件,即可下载PPT文件
常见问题
- 问题1: PPT生成过程中,提示"内容规划失败,无法获取内容规划结果".
问题原因:这种情况是大模型返回的内容存在异常,比如:未按照要求返回。具体可以通过mlflow调试页面查看返回内容。
- 问题2: PPT生成过程中,生成的PPT文件内容不全,存在部分内容缺失。
问题原因:这种情况是因为大模型在进行内容规划时,对部分内容进行了删减所致。该问题解决方式同问题1。
- 问题3: 开启多模态能力检测,PPT生成时间变得很长。
问题原因:由于目前PPT的视觉检测,主要是依赖于soffice的PPT转图片,这一过程速度慢且无法优化干预,所以暂时没有好的解决方案。
备注:各个模型在不同任务上的表现,可以参考模型对比
项目结构
ppt-assisstant/
├── apps/ # 应用层
│ ├── api/ # FastAPI接口服务
│ │ ├── routers/ # 接口路由
│ │ │ ├── agent.py # Agent能力接口
│ │ │ └── file.py # 文件处理接口
│ │ ├── models/ # 接口数据模型
│ │ ├── dependencies/ # 接口依赖项
│ │ └── main.py # FastAPI入口
│ │
│ └── web/ # 前端工程
│ ├── public/ # 静态资源
│ ├── src/ # 前端源码
│ └── package.json # 前端依赖
│
├── core/ # 核心业务
│ ├── agents/ # LangGraph Agent实现
│ │ ├── markdown_agent.py # Markdown解析
│ │ ├── ppt_analysis_agent.py # PPT分析
│ │ ├── content_planning_agent.py # 内容规划
│ │ ├── slide_generator_agent.py # 幻灯片生成
│ │ ├── ppt_finalizer_agent.py # PPT清理与保存
│ │ └── base_agent.py # 基础Agent
│ │
│ ├── workflows/ # 工作流配置
│ │ ├── ppt_gen.yaml # 主工作流配置
│ │ └── utils.py # 工作流工具
│ │
│ └── engine/ # 执行引擎
│ ├── state.py # 状态管理
│ └── workflow.py # 工作流引擎
│
├── libs/ # 第三方库
│ ├── ppt_manager/ # PPT操作库(git子模块)
│ └── ... # 其他子模块
│
├── workspace/ # 运行时文件
│ ├── sessions/ # 会话数据
│ │ └── {session_id}/ # 按会话隔离
│ ├── cache/ # 缓存文件
│ ├── logs/ # 系统日志
│ ├── mlflow/ # mlflow调试日志
│ ├── outputs/ # 输出文件
│ ├── data/ # 数据文件
│ └── temp/ # 临时文件
│
├── config/ # 配置中心
│ ├── prompts/ # 提示词
│ ├── settings.py # 应用配置
│ └── model_config.yaml # 模型配置
│
├── docs/ # 文档中心
│ ├── arch/ # 架构设计
│ ├── report/ # 报告
│ ├── prd/ # 需求文档
│ └── api/ # API文档
│
├── tests/ # 测试体系
│ ├── test_files/ # 测试文件
│ └── test_utils.py # 测试工具
│
├── Dockerfile # 容器化构建
├── docker-compose.yml # 服务编排
└── requirements.txt # Python依赖
实现原理
PPT分析agent(ppt_analysis_agent):
主要负责对PPT模板文件进行逐页的图像生成和调用多模态大模型分析布局,生成详细的PPT特征信息,以Json数据格式保存。
Markdown解析Agent(markdown_agent):
主要负责对PPT的底稿内容进行分析解析,得到title(标题)、content(内容)、内容之间的关系等信息,以Json数据格式保存。
PPT内容规划Agent(Content_plannning_agent):
主要负责基于ppt_analysis_agent提供的PPT特征信息和markdown_agent提供的底稿内容,进行PPT每一页幻灯片的规划,包括:幻灯片的顺序、幻灯片的标题、幻灯片的内容、内容计划展现的形式。
PPT生成Agent(slide_generator_agent):
主要职责:
1.基于Content_plannning_agent提供的规划内容和PPT文件的Dom内容结构,通过大模型分析每一页PPT需要修改的Dom节点内容,生成相应的操作指令提供给slide_generator_agent
2.执行操作指令,修改PPT中对应的幻灯片
3.将修改的幻灯片生成图片后,利用多模态大模型进行排版、内容、样式的检查,进而提供修改指令,直到满足要求或者达到最大修改次数阈值。
PPT归档Agent(PPTFinalizerAgent):
主要负责基于Content_plannning_agent规划的内容和顺序,调整PPT中幻灯片的顺序,去除多余的幻灯片,最后保存PPT文件。
📄 许可证
本项目采用 Apache License 2.0 开源许可证。
商业使用说明
- ✅ 开源免费使用:您可以自由使用、修改和分发本软件
- ✅ 商业用途友好:允许在商业项目中使用,无需支付许可费
- ✅ 专利保护:提供明确的专利许可条款
- ⚠️ 版权声明要求:使用时必须保留原始版权声明
🙏 致谢
本项目核心思想来源于PPTAgent提出的多模态大语言模型+Agent框架。我们诚挚感谢该项目提供的创新思路,这为本工程的设计和实现奠定了关键基础。
相关文章:

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...