模板化文档生成(Word / PPT)
本节定位
很多新人做“生成 Word / 课件”时,最容易直接让模型输出一大段正文,
然后希望它天然就符合:
- 章节顺序
- 格式要求
- 例题位置
- 课件风格
这通常不稳。
更稳的做法通常是:
先让模型产出结构化内容,再把结构填进模板。
学习目标
- 理解为什么文档生成最好走“结构 -> 模板 -> 导出”路线
- 理解 Word / PPT 生成和普通聊天输出的差别
- 看懂一个最小模板填充流程
- 建立“结构化输出先于文档排版”的工程直觉
先建立一张地图
模板化文档生成更适合按“主题 -> 大纲 -> 内容块 -> 模板导出”来理解:
所以这节真正想解决的是:
- 为什么不要让模型直接“自由写一整份 Word”
- 为什么固定模板会让生成结果更稳
一、为什么模板化这么重要?
因为你的目标不是普通问答,
而是要交付:
- 像课件的文档
这意味着系统不只要回答对,
还要满足:
- 结构稳定
- 栏目固定
- 标题级别固定
- 例题和总结位置合理
二、一个更适合新人的总类比
你可以把文档生成理解成:
- 先写提纲,再填内容,最后排版
如果一上来直接写整篇正文,
很容易发生:
- 结构乱
- 内容重复
- 例题跑到不该去的位置
所以更稳的方式通常是:
- 先定骨架
- 再填血肉
三、一个最小结构化课件对象示例
courseware = {
"title": "折扣应用题讲解",
"target_audience": "小学高年级",
"sections": [
{
"heading": "一、知识点回顾",
"content_type": "concept",
"items": ["折扣 = 原价 × 折扣率"],
},
{
"heading": "二、例题讲解",
"content_type": "example",
"items": ["商品原价 100 元,打 8 折后价格是多少?"],
},
{
"heading": "三、课堂练习",
"content_type": "exercise",
"items": ["一件衣服原价 80 元,打 7 折后是多少元?"],
},
],
}
print(courseware)
这个例子最重要的价值是:
- 先把“要生成什么结构”说清楚
也就是说,模型不应该直接输出最终 .docx,
而应该先输出一份结构化内容对象。
四、一个更 适合真实项目的课件 schema
如果你的目标是“生成符合固定格式的 Word 课件”,
建议在最小对象上再多补两层:
- 页面级或章节级顺序
- 模板字段级映射
一个更稳的课件 schema 往往至少包含:
| 字段 | 用途 |
|---|---|
title | 文档标题 |
audience | 适用对象 |
teaching_goal | 教学目标 |
sections | 正文结构 |
source_refs | 引用来源 |
template_version | 用的是哪个模板 |
这张表特别适合新人,因为它会提醒你:
- 你不是在生成“长文本”
- 你是在生成“可被模板稳定消费的数据对象”
五、一个最小模板填充示例
下面这个例子不用真实 python-docx,
先用最简单的字符串模板讲清楚工作流。
template = """# {title}
适用对象:{target_audience}
{body}
"""
def render_body(sections):
blocks = []
for section in sections:
blocks.append(section["heading"])
for item in section["items"]:
blocks.append(f"- {item}")
blocks.append("")
return "\\n".join(blocks)
result = template.format(
title=courseware["title"],
target_audience=courseware["target_audience"],
body=render_body(courseware["sections"]),
)
print(result)
这个例子特别适合初学者,因为它会帮助你先看到:
- 模板化的核心不是库
- 而是“先有结构,再套模板”
六、模板字段应该怎么设计?
第一次做这类系统时,特别推荐先把模板字段明写出来。
| 模板字段 | 对应内容 |
|---|---|
{title} | 课件标题 |
{target_audience} | 适用对象 |
{teaching_goal} | 教学目标 |
{concept_block} | 知识点回顾 |
{example_block} | 例题讲解 |
{exercise_block} | 课堂练习 |
{source_block} | 来源说明 |
它的好处是:
- 模型知道自己要产什么
- 模板渲染层知道自己要填什么
- 你后面改版时也知道是哪一层出了问题