【可执行状态】现在就能做
【本讲对应资产】doc-filler 引擎的模板库能力(filler_template_upload / filler_templates)
【本讲原理来源】L3 第 20 课《Function Calling 深度解析》(工具的描述与参数)、L3 第 19 课(把能力封装成可复用的东西)
教了十几年的老师,第一次看到“自动填制”这件事,多半会问同一句话:
“你们这个模板,跟我们学校发的那个不一样吧?”
问得对。教务处发的表格,每所学校长得都不一样:有的把课程信息放页首、一栏一项;
有的塞进一张大表,一格一格排得密密麻麻;有的连“课程目标”都要填三行字。
任何一套“预置好的模板”,只能覆盖一小部分人的需求。
所以真正要解决的问题不是“我们做一套万能模板”,而是:
老师手上的那份表,能不能直接拿来用?
这一讲讲的就是这件事——模板从哪来。答案有三条路,最省事的那条,
不需要老师改一个字、也不需要标任何记号。
办公室主任把两份表格发到两位老师手上。
第一份是学校统一的教学大纲模板,格式规整,一栏一项:
课程名称、课程代码、课程类别、适用专业、课程学时、课程学分……
第二份是某学院自己用的教案格式,是一张大表——横着好几栏,竖着十几行,
“授课内容”“教学目标”“重点难点”“教学内容与过程”全在格子里,
还有一行写着“课堂导入(5分钟)”。
按老办法,两份表都得一个字一个字敲。
王老师(化名)的处理方式是:把去年的表翻出来,另存成“新版”,
然后逐格改——改到第 8 格的时候,接了个电话,回来接着改,
把去年的班级名“2023级1班”留在了表里,交上去被打回。
她自嘲说:“这种表,我一年要填四五十份,每份都要重复劳动一遍。”
李老师(化名)的做法不一样:她把学校发的那份空白表格原样上传,
入口问她“我要填哪些内容”,她照着提示把课的信息给了一遍,
几分钟后拿到的是一份版式完全没变、内容换成本学期的成品。
第二份学院表格她也上传了一次,同样不用改格式。
同一张表,一个下午 vs 几分钟。差别只有一处:表格是不是被“看懂”过一遍。
这一讲反复要用这个词,先给它一个说得清的定义:
模板,就是那份“格式已经定好、只有部分内容要换”的文件。
换成你的课、你的班、你的学期,格式不许变。
一份教师手上的 Word,按“能不能被机器直接填”分,有三种形态。
这三条路,本书都支持,而且走的是同一个入口:
| 形态 | 长什么样 | 老师要做什么 |
|---|---|---|
| A 空白表格 | 学校发的新表,格子里是空的或写着提示 | 原样上传即可 |
| B 已填样例 | 去年填过的、或者别人的(如院里给的样本) | 原样上传即可 |
| C 已带占位符 | 有人已经标好了 {{课程名称}} 这类记号 | 原样上传即可 |
三条路都不需要老师自己动手标记号——这是这一讲最重要的一句话。
为什么要有 C 这条路? 因为有一部分老师(尤其是跟着本书做过一遍的)
会自己先把模板标好再存起来,标好之后每年直接复用;
这种情况机器只要把记号读出来就行,一个字段都不用猜,最准。
先说清难点的位置,后面的做法才好理解。
人看一张表,一眼就知道“课程名称”后面那个位置要填课名、“学分”旁边那格要填数字。
这是因为人懂“填表”这件事本身:知道表是干什么用的、知道哪些格子是“要你填的”、
哪些是“印上去不许动的”。
机器没有这种常识。对它来说,一张表格从头到尾就是一堆文字盒子,
“课程目标1”和“课程名称”看上去没什么区别——都是几个汉字,都在格子里。
所以机器要做的判断,其实是三个:
“网络营销”是内容(真正填进去的)。
“桂林学院”通常不变,“(中文)”这种格式提示不变。
“课程内容”那张表要一行一行填(一个项目一行、一个学时一行)。
这三问,恰好对应一台机器要干的三件事:找位置、分类别、定结构。
“从格式化的文书里把要填的位置找出来”,这件事在办公自动化里做了几十年,
只是做法一代一代在变:
打个比方:这就像给一屋子人量体裁衣——每一件都得重新量;
而模板的做法是先做一套通用尺码,谁来了按尺码挑。
第一代是“刻板”——八十年代的公文套打,位置是人量出来的:
哪一行第几格,用尺子量好,刻在蜡纸或者套打模板上。位置一变,全部重来。
第二代是“邮件合并”——九十年代 Word 里出来的功能:
在文档里插入“合并域”(就是今天的占位符),然后拿一张表往里喂数据。
它的前提是“得有人先把域插好”——这一步只能手工,所以它一直没有真正普及到教师手里。
第三代是“填制引擎”——也就是第 8 讲讲的那道公式:
数据 × 模板 × 映射规则,三个要素抽出来放到配置里,换场景不用改程序。
第四代就是这一讲讲的:让机器自己把“要填的位置”找出来,
不用人先插域,也不用量尺子。
回头看这四代,有一条清晰的线:每往前走一步,都是把“人必须先做的准备”再砍掉一层。
刻板时代要人量尺寸,邮件合并要人插域,到了今天,老师只需要把表交出来。
顺带说一个更早的例子,能帮我们记住这件事的价值:
十七世纪以前,欧洲的文书靠抄写员手抄,一份公文抄一遍,抄错一个数就要重来。
十五世纪活字印刷出现后,“内容”和“格式”第一次被分开——排版排一次,内容换多少遍都行。
我们今天讲的“模板”与“数据”分家,本质上还是这条老路[1]:
把重复的格式固化下来,把变化的内容留出来。
讲清做法。整个过程分两步,很像出版社的校对流程:
第一步,把“像位置的地方”全找出来(这一步快、宁可多找)。
规则很简单,都是表格里最明显的几种信号:
课程名称:网络营销、课程代码:ZB35002811。冒号左边是要填什么的说明,右边是内容。
再比如教案大表里“课程名称 | 网络营销”这一对,左边是标签、右边是内容。
判断标准是“这一格字数很少、而且含关键词(名称/代码/学时/教师/班级…)”。
{{课程名称}}(形态 C 直接收下)。第二步会用到这一步的结果。这一步只管“撒网”,不管“是不是”——
多找出来一些没关系,漏掉才麻烦。
比如,候选里会冒出“课程目标1”“项目一”“34学时”这些,看着都像内容,
其实全是编号和数据行,该被剔掉——这一步就是干这个的。
第二步,把网络上来的候选,逐条判断“是不是要填的”(这一步慢、但要准)。
判断工作交给模型来做,因为它恰好擅长读语义。
给它的任务就是前面那三问:
用打比方讲清这两步的分工:第一步像“征集线索”,第二步像“甄别证据”。
只做第一步,会把一大堆格式性文字混进来(表里“课程目标1、课程目标2”都会被抓出来);
只做第二步,又容易漏(模型读一万字的表格很贵,而且会看花眼)。
两步合起来,才既不漏、又够准。
这一步也顺带解释了第 8 讲留下的那个问题——题目为什么要给字段起名字。
因为字段有名字,才能写出 {{课程名称}} 这样的记号;
有了记号,机器填的时候才知道“这一格该放哪个数据”。
起名这件事,是从“看得懂”到“填得进”的桥。
判断完,机器要把结果写回模板——在每一个“内容位置”上放一枚记号,
例如把 课程名称:(中文):网络营销 变成 课程名称:(中文):{{课程名称}}。
这里有两条纪律,都是从真实使用中总结出来的:
打个比方:这就像修理钟表——只换掉那个坏齿轮,别的零件一颗不动。
第一条:只动该动的地方,格式一个字节都不改。
学校表格的字体、字号、表格线、页边距,都是教务处定的,机器不许碰。
所以注入记号时采取的做法是“原地替换”:在原来那个位置把内容换成记号,
周围的文字、格式、行距全部原样保留。
这也是为什么成品打开后,和学校原表看起来一模一样——因为它本来就是同一份表。
第二条:位置找得准不准,最终要人过一眼。
识别是概率性的判断(模型看语义),不是查表——所以本书的规矩是:
识别结果必须读给老师核对,字段齐不齐、名字顺不顺口,由老师一句话确认。
这不是在推卸责任,而是这条路的正确分工:机器擅长找和填,人负责确认“要填的是不是这些”。
讲到这儿应该主动交代边界,免得读者踩坑。
它认得好的:学校发的常规表格。含“标签:内容”结构的、表格里“标签格 + 内容格”结构的、
文字型模板(大纲、教案、总结、申报表、检查表……)。
它认不好的:
而是一堆像素,机器读不出位置。遇到这种,先用 Word 重打一份格式再上传——
这份辛苦是值得的,因为以后每学期都能用。
这种机器只能猜,识别结果会偏少。核对时发现漏了字段,手工把名字补给它即可。
机器目前只能认出第一个位置(中文名),英文名那一段要老师在核对时补上。
这种情况下建议改用简化版——毕竟填制要的是“把信息放对位置”,不是还原设计。
说清这些,不是自我贬低,而是让读者把期望放对:
这一讲的能力解决的是“常规教学管理表格的批量填制”,
不是“任何一张纸都能自动处理”。知道边界在哪,才知道什么时候该动手补一步。
先看模板库里有什么(内置范例 + 自己上传过的):
教学资料填制有哪些模板可选?用 filler_templates 列给我。库里没有合用的,就把学校发的那份传上来:
上传这个模板,用 filler_template_upload,模板名就叫【本校课程教学大纲】。拿到识别结果后(这一步要人过一眼):
用 filler_template_info 看看【本校课程教学大纲】这个模板要准备哪些数据。然后出件:
按【本校课程教学大纲】这个模板出教学大纲,用 filler_run。数据是:课程名称【数智分析与应用】、课程代码【DI2026】、学分【3】、学时【48】……两样东西,缺一不可:
打开它,你会看到 课程名称:(中文):{{课程名称}} 这样的记号。
这份要留着,以后每学期都用它。
以实测为例(用某学院真实的教学大纲模板跑的):
识别出 9 个变量字段 + 1 张课程内容表,注入 12 处记号;
给数据后出件 1 份,校验结果「未替换 0 / 缺失 0」,
读回确认“课程名称”从原来的“网络营销”换成了“数智分析与应用”,表格逐行填入 3 行。
四问,逐条对:
该填的地方有没有漏掉的?(漏了就在核对时手工补上。)
verdict 必须是「校验通过(未替换 0 / 缺失 0)」。固定说明),如果属本学期要改的,要在模板里改一次——
这是老师自己的活,机器不管。
错误一:上传的是 PDF 或扫描件。
表现是识别出零个字段,或者提示“没在模板里找到可填位置”。
原因:PDF 里的文字常常不是文字(尤其扫描件),机器无从判断位置。
排错:用 Word 重打一份格式再上传;重打一次,以后每学期都省事。
错误二:把“识别结果”当成“最终答案”。
表现是上传后直接出件,成品里少了几个字段。
原因:识别是判断,可能漏(尤其“一行里填两个值”的排版)。
排错:读一遍字段清单再出件。这一步花一分钟,省半小时返工。
错误三:指望机器改“固定文案”。
表现是成品里课程名称换了,但标题还写着《网络营销》。
原因:标题在模板里是固定文字,不属变量字段。
排错:固定文案在模板里改一次,之后长期不动——这正是第 8 讲“三变三不变”里“模板偶尔变”那一条。
错误四:一个老师传一堆模板,名字起得像谜语。
表现是过两个月自己都分不清哪个是哪个。
排错:模板名照实际叫——“本校课程教学大纲(2026版)”“学院教案(商学院格式)”,
不要叫“新模板2”“最终版”。
错误五:拿别人学校的模板当自己的用。
表现是直接把同事或外校的表传上来出件。
排错:模板里含学校名、学院名、公章位这类信息,
换成自己的再上传;涉及第三方版式的,先问一句能不能用。
校名、课程标题、固定说明这些属于模板本身的一部分,改动由老师决定。
用完的产物及时归档,不要散放在公共目录(详见第 13 讲)。
外校/企业的版式涉及权利,不要随手传播。
而是本书第 13 讲那条纪律在这里的具体形式:校验通过 + 人核对过,才算交付。
一位老师上传好,其他老师直接在同一个库里选它就行——这就是模板的复用价值:
一次识别,全教研室受益。
国际经济与贸易专业可以传合同封面与报关单据——换的是表,走的是同一条路。
检查表),新老师入职第一天就能用;老教师退休,格式也不丢。
这件事的价值,等于给学院建了一个“文档格式档案”。
模板不必是我们预置的——老师手上的那份表,交出来就能用;机器负责认位置,老师负责确认。
| 你要做的事 | 工具全名 | 一句话作用 |
|---|---|---|
| 看模板库有哪些模板 | mcp__doc-filler__filler_templates | 内置范例 + 我上传的,一张清单 |
| 看某个模板要准备哪些数据 | mcp__doc-filler__filler_template_info | 单值字段 + 列表区 + 样例 |
| 上传自己的模板 | mcp__doc-filler__filler_template_upload | 自动识别字段 + 注入占位符 |
| 按选中的模板出件 | mcp__doc-filler__filler_run | 一份 / 一批 |
| 核对是否真填完 | mcp__doc-filler__filler_check | 给出校验结论 |
[1] 关于“内容与格式分离”这一脉络,活字印刷(约 1450 年)使排版与内容可分离、进而使批量出版成为可能,相关论述见:Eisenstein E L. The Printing Press as an Agent of Change[M]. Cambridge: Cambridge University Press, 1979.
[2] OpenAI. Function calling[EB/OL]. https://platform.openai.com/docs/guides/function-calling.(工具的描述与参数如何决定模型能否正确调用)
数据与平台:本讲实测数据来自 zhenyuonline.cn 的 doc-filler 引擎模板库能力(2026-09-17 实跑):
以某学院真实教学大纲模板(无占位符)为输入,识别出 9 个变量字段与 1 张动态表,注入 12 处占位符;
给数据后出件 1 份,校验结果「未替换 0 / 缺失 0」。所用模板已作脱敏处理。