有没有那种感觉——你脑子里有一套课程大纲,但光是做PPT就能把你搞垮半天。
配色、排版、每一页怎么布局、章节怎么分……真的不是在做课程内容,是在跟PPT软件死磕。
所以我花了几天时间,做了个东西:输入课程名称、目标人群和课时数,AI直接生成完整的多页PPT课件。点一下,下载,可以直接用。
这篇文章就是复盘这个工具从零到上线的整个过程,记录一下踩过的坑。







最初的想法特别朴素:把课程信息扔给AI,AI返回内容,我拿python-pptx写到PPT里。
技术栈选的是 Flask + DeepSeek API + python-pptx,三个东西拼在一起,后端生成文件,前端下载。说白了就是一个网页工具。
第一版跑通之后,我信心满满地测试了一下……
结果生成了1页PPT。
对,就1页。标题页。后面什么都没有。
根因是:我让AI用【第X页】这种文本标记来分页,结果AI返回的格式千变万化,正则匹配直接失效,全走了兜底逻辑,就输出了一页。
修法很简单,但思路很重要:不要让AI返回你自己解析的格式,让它返回结构化JSON。
新的prompt让DeepSeek返回这样的结构:
{ "slides": [ {"type": "cover", "title": "短视频剪辑入门"}, {"type": "toc", "chapters": ["第一章", "第二章"]}, {"type": "section", "number": 1, "title": "第一章 基础操作"}, {"type": "content", "title": "1.1 界面认识", "points": ["..."]} ] }后端拿到JSON,直接按 type 字段分发到不同的PPT构建函数。从此不管AI怎么措辞,结构永远是对的。
这一改,从1页变成了正常的十几二十页。
参考了一套做得不错的短视频课程PPT,提取出7种固定页面类型,然后用python-pptx全部代码实现:
🟢 封面页— 课程名 + 副标题🟢目录页— 01/02/03 编号 + 章节名🟢章节过渡页— 大号章节标题 + 装饰线🟢内容页— 标题 + 要点列表(最常见)🟢三栏卡片页— 横排3个知识点卡片🟢步骤流程页— 01→02→03 步骤拆解🟢结束页 — 感谢 + 下期预告
整体用绿色系主题(#15803D),字体 Noto Sans SC,这套配色在教育类课件里辨识度很高,又不会太跳。
AI生成内容 + 代码控制样式,两者解耦之后,页面效果就稳定多了。
功能通了之后,就是无数的细节问题,逐个击破:
目录页数字显示"0"
根因是 f"0{i+1}" 这种拼法,文本框宽度太窄(0.5英寸),"01"被截断了只剩"0"。改成 f"{i+1:02d}" + 加宽文本框,搞定。
章节下出现重复的1.1编号
AI偶尔会在同一章节下生成两个1.1。解法:prompt明确禁止重复编号,同时在后端加 clean_slide_numbers() 函数自动修正,双重保险。
name 'slides' is not defined
在 generate() 里用了 len(slides),但 slides 是 generate_ppt() 的内部变量,出了函数就不存在。修法:让 generate_ppt() 把页数一起返回,调用方接4个返回值。
课时数 = 章节数(动态映射)
之前章节数写死4章,后来改成从课时数动态计算:章节数 = (课时数 + 1) // 2,向上取整,最少2章最多8章。8课时 → 4章,3课时 → 2章,符合直觉。
部署在宝塔面板,CentOS + uWSGI + Flask。几个关键配置点记一下:
① callable 必须是 app
uWSGI ini 文件里 callable=app 这个参数不能省,否则项目起不来。
② 所有路径用绝对路径
用 os.path.dirname(os.path.abspath(__file__)) 作为根目录,不要用相对路径,uWSGI的工作目录和你想的不一样。
③ 中文字体要装
CentOS默认没有中文字体,PPT里的中文会显示成方块。执行 yum install wqy-zenhei-fonts 先装上。
整体跑下来,从本地开发到宝塔上线大概花了2天时间,其中一大半时间在调PPT样式和处理AI输出不稳定的问题。
现在的效果:输入课程名称+目标人群+课时数+风格偏好,大概30秒出一套PPT,十几到二十几页,结构完整,直接能用(或者稍微改改用)。
同时会生成一份TXT文案,包含逐字讲课稿和课后练习题,做直播课的时候可以直接参考。
后面想做的:
— 支持上传参考PPT,自动匹配它的配色风格
— 增加更多页面模板(图文混排、思维导图式)
— 做成SaaS,让其他人也能用
做这个东西最大的体会是:AI干内容,代码管格式,这两件事一定要分清楚。
一旦你让AI既管内容又管格式,解析失败是迟早的事。让它只输出结构化数据,你的代码控制展示逻辑,整套系统才真的稳。
这个道理不只适用于PPT生成,做任何AI+内容的工具都一样。
日常做自媒体、运营社群、发朋友圈,最耗时间的就是文案创作。
而技术的意义,就是把重复、费脑的事情交给AI,把时间留给自己。
后续我会持续分享AI文案工具、PHP趣味源码、自媒体自动化工具,手把手教大家零成本搭建各类实用小工具,解放创作压力。
喜欢折腾、想解锁更多AI实用玩法的朋友,不妨点个关注,持续更新干货,不玩虚的✨