尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

大模型+python-pptx:从一句话到可编辑PPT的自动化实现

大模型+python-pptx:从一句话到可编辑PPT的自动化实现 简介面向需要快速制作专业演示文稿的用户这份可运行源码演示了利用大模型生成PPT的完整流程先通过DeepSeek等大模型产出Markdown大纲再借助Kimi、通义千问或Coze一键转为幻灯片。资源压缩包共3个文件主要包括HTML演示页面、在线运行环境配置inscode及Git忽略规则文件整体仅6KB轻量便于直接查看效果。已有237人学习浏览适合刚接触AIGC工具链的开发者、产品经理和职场人士快速上手。通过阅读与运行源码读者可以掌握从需求描述、文本结构化到最终演示文稿转化的关键思路并能够利用社区开源工具复现全流程大幅降低PPT制作门槛。 最近有好几个朋友问我同样的问题能不能让大模型直接把一句话变成一个能用的PPT我做了一版可运行源码今天把完整思路、核心代码和踩过的坑统一说清楚。这个项目做的事情很简单你输入一个主题大模型负责生成PPT大纲和每页要点python-pptx负责把这些内容排版成真正的.pptx文件。生成结果不是一张图片也不是PDF而是可以继续编辑的PowerPoint。对经常要做汇报、课件、方案的人来说这条链路能省掉大量机械排版时间。适合读这篇文章的人有两类一类是刚接触大模型应用开发想知道怎么把LLM的输出接到真实文件里另一类是每天要做PPT但不想再手动调整文本框的人。我不会只贴一张“效果图”而是把能跑起来的源码拆开讲。1. 项目整体设计与实现思路1.1 为什么选择“大模型生成文字python-pptx负责排版”很多人第一反应是让大模型直接生成PPT文件比如让它输出一段HTML再转成PPT或者让多模态模型直接生成图片。我实际试过这些方案要么版式不可控要么生成的是死图片改一个字都得重新跑一遍。最稳妥的方式是把“内容生产”和“版式渲染”拆开大模型只做它擅长的事——生成结构化内容python-pptx做它擅长的事——按规则生成幻灯片。这种拆法还有个额外好处你可以随时换掉内容源。今天用OpenAI兼容接口明天换成国内大模型后天甚至改成从数据库读取内容PPT生成模块完全不用改。这本质上是一种前后端分离的思路只不过“前端”变成了pptx文件。市面上很多在线AI PPT工具都能做到“一句话生成”但如果你想要的是可运行源码重点就不是“在网页上点来点去”而是把生成能力集成到自己的业务流程里。比如批量生成周报PPT、自动把课程大纲变成课件、每天晚上自动更新项目汇报这些都是网页工具很难覆盖的场景。1.2 技术栈与运行环境整个项目的依赖很少普通笔记本就能跑。Python 3.10以上装四个包就够了python-pptx负责生成PPTopenai负责调用兼容OpenAI接口的大模型python-dotenv读取环境变量requests留作备用。不需要GPU也不需要在本地部署大模型只需要一个能访问的API接口和对应的Key。我建议把API Key放到.env文件里不要写死在代码中。运行环境要求不多唯一要注意的是中文字体。Windows一般自带微软雅黑macOS一般有苹方Linux服务器可能需要安装fonts-noto-cjk否则生成的PPT中文会显示成方块。如果你不想用云端API想接本地部署的大模型服务代码同样兼容。只要对方暴露了OpenAI格式的HTTP接口改一改base_url和model名字就能跑通。这也是我选择用openai库而不是某个模型专用SDK的原因。1.3 源码目录结构与运行链路一套可运行源码目录最好一眼能看懂。我没有把代码都塞进一个文件而是拆成五个模块ppt_generator/ ├── config.py # 配置模型名称、温度、输出路径 ├── llm_client.py # 大模型接口调用与JSON解析 ├── prompt_templates.py # 提示词模板 ├── ppt_builder.py # 用python-pptx构建PPT ├── main.py # 命令行入口 └── requirements.txt运行链路是main.py读取主题交给llm_client请求大模型拿到结构化JSON后交给ppt_builder生成PPT最后保存到指定位置。每个模块只干一件事出问题也好排查。比如PPT版式不对只需要改ppt_builder.py内容质量不行只需要改prompt_templates.py。2. 核心模块设计与提示词工程2.1 提示词怎么写才能稳定输出PPT结构这是整个项目最重要的部分。我一开始直接用自然语言让大模型“帮我生成PPT大纲”结果它输出一大段Markdown还要反复解析后来改成要求它输出JSON可靠很多。系统提示词我总结了一套核心要求有四点必须输出JSON不要MarkdownJSON顶层包含title和slides每张slide包含title、bullets、speaker_notesbullets数量控制在3到5条每条不超过20个字。参考提示词如下SYSTEM_PROMPT 你是一个专业的PPT内容策划师。请根据用户提供的主题生成一份结构清晰的PPT内容。 要求 1. 只输出JSON不要输出任何解释性文字。 2. JSON格式如下 { title: PPT主标题, slides: [ { title: 页面标题, bullets: [要点1, 要点2, 要点3], speaker_notes: 这一页演讲备注 } ] } 3. 页数控制在10到15页。 4. 每页bullets不超过5条每条不超过20个字。 5. 内容要逻辑连贯适合演示场景。 为什么用JSON而不是Markdown因为Markdown是给人看的JSON可以直接变成Python字典映射到PPT的文本框。只要模型按这个结构返回后续代码几乎不用做复杂的字符串处理。2.2 大模型返回内容怎么解析才不容易崩即使提示词强调了JSON模型偶尔还是会多输出几句话或者用json代码块包住。所以解析函数要足够宽容。我的做法是先用正则找到第一个{到最后一个}之间的内容再用json.loads解析。如果解析失败就让模型重新生成一次。import json import re def parse_json_response(text: str) - dict: # 提取最外层的JSON对象兼容被代码块包裹的情况 match re.search(r\{.*\}, text, re.DOTALL) if not match: raise ValueError(未找到JSON内容) try: return json.loads(match.group()) except json.JSONDecodeError: # 如果JSON不完整可以在这里记录日志然后重试 raise这里有个坑\{.*\}是贪婪匹配会匹配到最后一个}这正好可以处理嵌套JSON。但如果模型返回了多个独立JSON这种写法会出问题。实际场景很少见如果出现我建议在提示词里进一步限定“只输出一个JSON对象”而不是改正则硬刚。2.3 幻灯片内容映射规则拿到JSON之后不能无脑每一条都放一行文字。我定义了一套映射规则让PPT显得像人做的第一页封面页只放title第二页如果是第0个slide作为目录页或引言页中间页标题放上方bullets居中speaker_notes放进备注栏最后一页可以自动加一页“谢谢观看”。这个映射逻辑放在ppt_builder.py里这样提示词完全不用管版式。比如封面页不需要bullets代码直接从JSON的title字段创建标题不再读slides[0]。如果不做这层映射生成的PPT看起来就是“Word文档搬到PPT”。3. 可运行源码实现与关键代码3.1 大模型接口调用封装我封装了一个LLMClient类统一处理API Key、模型名称、温度、超时等参数。内部使用openai库因为现在很多大模型都提供OpenAI兼容接口从Kimi到千问只要服务商支持换起来都只是改配置的事。import os from openai import OpenAI class LLMClient: def __init__(self): self.client OpenAI( api_keyos.getenv(LLM_API_KEY), base_urlos.getenv(LLM_BASE_URL, https://api.openai.com/v1) ) self.model os.getenv(LLM_MODEL, gpt-4o-mini) self.temperature 0.7 def generate_content(self, topic: str) - str: resp self.client.chat.completions.create( modelself.model, temperatureself.temperature, response_format{type: json_object}, messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: f主题{topic}} ] ) return resp.choices[0].message.content需要注意有些模型服务不支持response_format参数调用会报错。我一般会在try里调用如果报错就移除这个参数重新请求。这样兼容性更好也方便你切换不同的模型服务。3.2 用python-pptx生成PPT的核心代码python-pptx本身不复杂但要生成一份不丑的PPT需要自己控制版式。我习惯用空白版式然后手动添加文本框而不是用默认的“标题和内容”版式因为默认版式的位置和样式不好调整。from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor def create_presentation(data: dict) - Presentation: prs Presentation() prs.slide_width Inches(13.333) prs.slide_height Inches(7.5) # 封面页 slide prs.slides.add_slide(prs.slide_layouts[6]) box slide.shapes.add_textbox(Inches(1), Inches(2.5), Inches(11), Inches(2)) tf box.text_frame tf.text data[title] tf.paragraphs[0].font.size Pt(40) tf.paragraphs[0].font.bold True tf.paragraphs[0].font.name 微软雅黑 # 内容页 for item in data[slides]: slide prs.slides.add_slide(prs.slide_layouts[6]) # 标题 title_box slide.shapes.add_textbox(Inches(0.8), Inches(0.5), Inches(11.7), Inches(1)) title_box.text_frame.text item[title] # 要点 body_box slide.shapes.add_textbox(Inches(1), Inches(1.8), Inches(11), Inches(5)) tf body_box.text_frame for idx, bullet in enumerate(item[bullets]): paragraph tf.paragraphs[0] if idx 0 else tf.add_paragraph() paragraph.text f• {bullet} paragraph.font.size Pt(20) paragraph.space_after Pt(10) return prs这段代码是核心骨架实际项目中还会加入页码、页脚、品牌色。但先跑通这个版本后面再一点一点加。3.3 字体、颜色与版式细节很多人遇到中文乱码问题出在设置字体时只设置了font.name但PowerPoint对中文字体需要额外设置“East Asian Font”。我一般在创建完文本框后调用一个工具函数统一设置def set_font(run, name微软雅黑, size18, boldFalse, colorNone): run.font.name name run.font.size Pt(size) run.font.bold bold # 关键设置东亚字体解决中文显示问题 rPr run._r.get_or_add_rPr() ea rPr.find(qn(a:ea)) if ea is None: ea rPr.makeelement(qn(a:ea), {}) rPr.append(ea) ea.set(typeface, name)这里的qn来自pptx.oxml.ns。不写这段中文字体可能会回退到宋体或者在某些系统上变成方块。颜色方面我建议每份PPT定义一个主色和辅助色不要全篇默认黑色。3.4 一键运行主流程main.py把上面这些模块串起来支持命令行参数。import argparse from llm_client import LLMClient from ppt_builder import create_presentation def main(): parser argparse.ArgumentParser(description大模型生成PPT) parser.add_argument(--topic, requiredTrue, helpPPT主题) parser.add_argument(--output, defaultoutput.pptx, help输出文件路径) args parser.parse_args() client LLMClient() raw client.generate_content(args.topic) data parse_json_response(raw) prs create_presentation(data) prs.save(args.output) print(f已生成{args.output}) if __name__ __main__: main()第一次跑通这个流程大概只需要十分钟。先把“能生成”搞定再谈“好看”。4. 实操演示从一句话到PPT成品4.1 环境准备与运行步骤假设你现在从零开始操作步骤如下创建虚拟环境并激活python -m venv venv source venv/bin/activate # Windows是 venv\Scripts\activate安装依赖pip install python-pptx openai python-dotenv在项目根目录创建.env文件写入LLM_API_KEY你的_key LLM_BASE_URLhttps://api.openai.com/v1 LLM_MODELgpt-4o-mini运行python main.py --topic 大模型应用开发入门 --output demo.pptx如果你用的是其他兼容OpenAI接口的服务把LLM_BASE_URL改成服务商提供的地址即可。系统会自动读取环境变量不需要改代码。4.2 真实案例生成“AI大模型应用开发入门”PPT我想测试这套流程能不能生成像样的教学PPT于是用“AI大模型应用开发入门”作为主题跑了一次。大模型返回的JSON里包含了一个封面页、10张内容页内容页标题大致是认识大模型、大模型能做什么、常用开发框架、数据准备、微调与部署、应用落地、未来趋势等。其中某一页的内容输出为{ title: 大模型应用开发的基本流程, bullets: [明确任务目标, 收集与清洗数据, 选择模型, 编写提示词, 评估与迭代], speaker_notes: 强调每个步骤都需要反复迭代不要期望一次性拿到完美结果。 }这页生成到PPT后标题显示在上方下面5个要点依次排开备注内容也写进了PPT的备注栏。从内容结构上看它已经是“能上台讲”的水平了。4.3 生成后一定要做的人工检查自动生成的PPT不能直接拿去汇报我会重点检查三件事第一逻辑是否连贯如果发现中间某页顺序不对直接在JSON里调整顺序再重新生成第二文字是否超长有些要点超过20个字会挤爆文本框第三数据有没有编造大模型偶尔会一本正经地给出不存在的引用和数据尤其涉及具体数字时要人工核实。我习惯的做法是先让大模型生成大纲我在大纲层面做增删确认无误后再批量生成PPT。这种做法比“直接一句topic生成整个PPT”有效得多。5. 常见问题与避坑指南5.1 大模型返回的JSON格式不对怎么处理这个问题高频发生。我的经验是三层防线第一层在提示词里写明JSON schema并给出示例第二层在代码里用正则提取最外层JSON不依赖模型的代码块标记第三层如果解析失败把错误信息拼到新请求里让模型修复。很多模型看到“你上次返回的JSON解析失败请重新输出”之后会主动修正。另外如果你用的模型服务支持response_format{type: json_object}一定要用上。这可以在模型层面保证输出是合法JSON虽然不能保证结构完全符合但已经省了很多事。问题原因解决办法返回内容带json代码块模型默认用Markdown正则提取{...}部分JSON字段缺失提示词结构描述不够明确在提示词中给示例并强调字段解析后字段类型不对模型把数组写成了字符串提示词中指定类型并做类型转换兜底5.2 PPT里中文变成方框或乱码前面提过set_font函数里的East Asian字体设置这是最常见的原因。另一个容易被忽略的是如果生成的PPT在Windows上打开正常但换到macOS上字体变了这是正常的因为目标机器没有安装字体。解决办法是使用通用字体或者干脆嵌入字体。嵌入字体可以用PowerPoint的“文件-选项-保存-嵌入字体”但命令行方式比较麻烦我通常不嵌入而是固定用微软雅黑。如果你在Linux服务器上生成PPT一定要确认系统装了中文字体否则python-pptx不会报错但PowerPoint打开后就是方块。5.3 页面太多、每页文字太多怎么办我一开始犯过这个错误大模型非常能写一页PPT塞下10条要点观众根本看不清。后来在提示词里严格限制页数10到15页每页3到5条要点每条不超过20个字效果好很多。如果生成结果还是超了可以在代码里做一个后处理超过5条就只保留前5条单条超过20字就截断并加省略号。这虽然粗暴但至少不会影响排版。页数失控时我建议在main.py里加一个最大页数校验如果检测到slides数量超过预设值就只取前15页。这样比让模型自己遵守规则更靠谱。5.4 如何扩展成更漂亮的PPT模板基础版跑通后你可能会觉得版式太素。这时候不要急着去改代码里的几十个坐标我建议先手动做一个模板PPT在PowerPoint里把母版、配色、Logo都设计好然后用python-pptx打开这个模板把生成的内容填到占位符里。实际操作上可以先在PPT里用“标题和内容”版式建好一张页面再用Python定位到占位符替换文本。这样源码不变模板随便换。我在实际项目中养成的习惯是把“内容结构”和“视觉模板”彻底分离。内容由大模型负责视觉模板由设计师或母版负责两者通过JSON字段对接。这样即使换了一套全新的PPT皮肤也不需要改一行提示词。这大概才是大模型生成PPT最值得投入的方向。本文还有配套的精品资源点击获取
返回列表