【可执行状态】现在就能做(填制引擎跑在公网,按附录 C 把 doc-filler 连接器接进入口即可)
【本讲对应资产】doc-filler 引擎(6 个工具);本讲用 filler_templates filler_template_info filler_run filler_batch filler_check(模板从哪来,见第 9 讲)
【本讲原理来源】L3 第 20 课《Function Calling 深度解析》(工具说明书三要素)· 吴恩达《Agentic AI》· 工具使用
先说一个不会写进任何考核表的数字:一门专业课的教学大纲,从开课到停开,通常要写三到十遍。有的因为学分课时调整,有的因为教务处换了版式,有的只是换了个学期。
每次重写,写的都不是新内容。课程名称、课程代码、学分、学时、适用专业,这几项在教务系统里躺了好几年;课程目标、课程内容、考核比例,早在专业培养方案里定过一遍。老师每一次做的,只是把已经确认的信息,从系统里、从去年的旧表里,一格一格搬到教务处新发的那份 Word 上。
一件事既不产生新知识、又要反复做,它就不该由人一直做下去。
这一讲要按掉的,正是这一次搬家。而且不是搬一份——一学期好几门课,要一起搬。
王老师(化名)这学期挂了两门课:《数智分析与应用》和《跨境电商大数据统计与分析》,都是 3 学分、48 学时、专业必修课。教务处把《课程教学大纲(2026 版)》发到了工作群,要求写得很硬:版式不许动,字段一个不许少,下周二下班前交,两门课各一份 docx。
下午两点,她打开模板另存为一份,光标点进第一个空格,打字,Tab 到下一个空格,再打字。一门课改了十几处,四十分钟过去。第二门课如法炮制,又是四十分钟。改到一半,隔壁同事来问事,回来后把《数智分析与应用》的课程代码填进了另一门课的表格——交上去被教研室打回,理由是两门课串了行。重做一遍,又一个下午。
李老师(化名)做的是同一件事,只是顺序不一样。她先在模板库里选了一份《课程教学大纲(范例版)》,让引擎告诉她这份模板要准备哪些数据;接着把两门课的信息按字段列成一张清单,把两门课共用的学年学期与填制日期集中写在一处;最后说了一句话。三分钟后,两份 docx 回来了,文件名一份是《数智分析与应用》的,一份是《跨境电商大数据统计与分析》的。
同一件事,一个下午,三分钟。差别不在打字快慢,也不在谁更会用电脑,而在有没有把“抄哪一格”这件事,从手上搬到配置里。
引擎现在已经统一成模板库口径:内置范例模板与老师自己上传的模板,走的是同一条路——选模板 → 看要准备什么数据 → 出件。不是“内置一套路、自定义另一套路”。
例如,本讲用到的那份《课程教学大纲(范例版)》,就是模板库里的内置范例;如果教务处发的是本校自己的一版(有的学校在大纲里加了专业认证栏目),按第 9 讲上传一次,以后每学期直接在库里选它就行。再比如同一个学院的老师,一位传好了模板,剩下的同事在库里选同一份就行——模板是学院的公共资产,不是某个人的私产。
六个工具的分工是这样的:
| 工具 | 干什么 | 什么时候用 |
|---|---|---|
filler_templates | 列出模板库(内置范例 + 我上传的),带用途与数据量 | 永远的第一步 |
filler_template_info | 选中一份模板,看它要准备哪些数据(单值字段 / 列表区 / 样例) | 动手之前 |
filler_template_upload | 把学校发的那份 Word 传上来,自动识别 + 注入占位符 | 库里没有合用的模板时 |
filler_run | 出一份(先试通) | 数据拿不准时 |
filler_batch | 出一批(按记录列表) | 数据确认之后 |
filler_check | 给出校验结论 verdict | 交付之前,不许跳 |
这一讲主要用第一、第二、第四、第五个;第三个在上传模板时用(第 9 讲已讲透);第六个留到第 13 讲系统讲,但从这一讲开始,每一讲的交付动作都以它收尾。
想明白“为什么现在能做成一键”,得先看清楚以前是怎么做的。这条路走了半个多世纪,一共五步。
第一步:钢板蜡纸。 二十世纪五六十年代到七十年代,教务干事要在钢板上刻蜡纸——把大纲内容一笔一笔刻上去,再上油印机印。例如一门课的学时从四十八改成四十二,就得重新刻一整版,改一个字都做不到。那一代的瓶颈在“版”,不在“人”。
第二步:打字机与复写纸。 八十年代,打字机进了教研室,改字容易了。但每一份还是要单独打一遍,复写纸一次最多复四五份。那时的教研室里常见一幕:一台打字机后面排着队——内容各不相同,格式一模一样。
第三步:Word 与“另存为去年那份”。 九十年代电脑普及,老师学会了一个动作:把去年的文件另存成今年的,再把里面的字改掉。打个比方,这就像改一幅已经画好的年画——版不用重画,只把年份换掉。这个动作直到今天还是主流,它的弱点不在效率,在“忘了改哪儿”:比如年份改了、适用专业忘了改;学分改了、学时忘了改。手填大纲的返工,绝大多数出在这里。
第四步:教务系统上线,人反而更忙。 两千年以后,课程信息陆续进了数据库,学分学时这些数字系统里都有。但系统的出口是报表,不是教务处那份 Word。于是出现一个奇怪的分工:数据在系统里,表格在硬盘里,老师成了两者之间的搬运工。再比如,系统里明明能查到“48 学时”,可你没法把它直接贴进 Word 的第三行第五格——中间那一步,一直由人来做。
第五步(也是这一讲):模板库 + 一键填制。 模板选一次,数据说一次,剩下的交给引擎。
回头看这条线,规律很清楚:每一步进步,都不是让人打字更快,而是砍掉一件“人必须先做”的事。第一步什么也砍不掉;第二步砍掉“重刻版”;第三步砍掉“重画版式”;第四步砍掉“翻系统查数”;第五步砍掉“搬运”。技术史里最有价值的一类改进,就是把工序从人手上摘下来,交给规则。〔这与泰勒在 1911 年讲的“把工序拆成标准动作”是同一个道理[1]〕
(顺带说一句:第 9 讲讲的那个“四代”(刻板 → 邮件合并 → 填制引擎 → 自动认位置),讲的是机器怎么找位置;这里这个“五步”,讲的是老师报资料这件事本身的历史。一个讲机器,一个讲活,不要混。)
第 8 讲讲过数据分两层,本讲把它落到大纲上,界限非常干净:
本讲的实测样例就是两条记录、一份公共信息。两条记录写成一张表看最清楚:
| 字段 | 例一:数智分析与应用 | 例二:跨境电商大数据统计与分析 |
|---|---|---|
courseCode(课程代码) | DI2026 | EC2026 |
courseName(课程名称) | 数智分析与应用 | 跨境电商大数据统计与分析 |
englishName(英文名称) | Digital Intelligence Analytics | Big Data for Cross-border E-commerce |
teacherName(授课教师) | 任渝 | 任渝 |
department(开课部门) | 智能金融学院 | 智能金融学院 |
credits(学分) | 3 | 3 |
totalHours(总学时) | 48 | 48 |
courseNature(课程性质) | 专业必修课 | 专业必修课 |
applicableScope(适用专业班级) | 数字经济、金融科技专业2024级 | 国际经济与贸易、电子商务专业2024级 |
顶层那一层写成一段行内 JSON 就是:{“semester”:“2026-2027学年第一学期”,“date”:“2026年9月17日”}——花括号里两项,两门课共用。(本书正文里的 JSON 用全角引号排版,与正文引号体例保持一致;实际在入口里输入时,按工具提示的数据形状填即可。)
一个常见误会:既然两门课都是 3 学分 48 学时,是不是可以把学分学时挪到公共层?不行。公共层的含义是“这一批共用”,不是“这次碰巧相同”。例如,下学期加了第三门课,如果它是 4 学分 64 学时,你把它写进记录里就行,公共层一动不用动;可要是当初把学分放进了公共层,第三门课就会被迫继承错误的值。
这是老师问得最多的一句。答案是不白做,而且只多花一分钟。
原因在第 9 讲已经讲透:模板和数据是分开的两样东西。教务处换了版式,动的是“模板”那一层;你手上那份课程清单(数据)一个字都不用改。打个比方,这就像换了新杯子装同一壶茶——壶里的茶没变,倒进去就行。
具体动作只有两步:把新模板上传一次(filler_template_upload),用 filler_template_info 看一眼它要的字段和旧的那份差在哪(差在哪就补哪个字段,例如新版加了“课程思政元素”一栏,那就补一项),再出件。换的是表,不是你的活法。
问得很对,这需要把界线划清楚。
大纲里有两类内容。一类是搬运类——课程代码、学分、学时、学期、教师,这些是已经确认的事实;另一类是判断类——课程目标怎么写、学时怎么分配到各章、考核比例定成三比二比五还是三比三比四、课程思政元素怎么融进去。后一类是教师的专业判断,引擎不替你做,也做不了。
正确的分工是:判断类的内容你先写好(或者由第 3 讲、第 6 讲那类生成工具产出初稿,你改定),搬运类的交给引擎。填制是最后一公里,不是第一步。如果你的大纲模板里“课程目标”也占了一格,而那一格的内容每门课都不同,那就把它当成记录级字段,一门课写一段(比如第一门课写“掌握数据清洗与可视化的基本方法”,第二门课写“掌握跨境交易数据的口径核对”),照给就行。
这一条界线,本讲之后每一讲都会再出现一次:引擎负责“放对位置”,你负责“内容对不对”。
把王老师和李老师那个下午摊开成一张表,差距比“快慢”更值得看:
| 对比维度 | 人工做法 | 引擎做法 |
|---|---|---|
| 两门课耗时 | 约 80 分钟,全在打字与翻查 | 首次约 20 分钟(整理数据)+ 出件 3 分钟 |
| 下学期再来一次 | 又是 80 分钟 | 只换数据那一层,出件 3 分钟 |
| 典型易错点 | 学分学时串行、年份忘改、适用专业漏填 | 数据写错则整批错,所以校验点要前置 |
| 可核对性 | 靠眼睛逐格看,翻到第二份就忘了第一份长什么样 | 文件名即识别符,校验报告逐项列出未替换与缺失 |
| 出错之后 | 不写报告,靠人家退回来才知道 | 报告里列着缺了哪几项,照着补数据重跑 |
| 他人可复用 | 只有本人会这一套改法 | 学院里任何一位老师在同一个库里选它 |
表里最值得注意的不是第一行,是最后一行:人工做法留不下资产,引擎做法留下了一份“学院级的格式档案”。
把指令拆开看,你会发现它不是客套话,每一个动作都在防一类具体的错:
| 指令里的动作 | 防的错 | 不做的后果 |
|---|---|---|
先 filler_templates 选模板 | 防“模板选错、版式不对” | 出的件教务处不收 |
再 filler_template_info 看骨架 | 防“字段名对不上、位置留空” | 出现一堆未替换项 |
公共信息单独传 context_json | 防“成批缺学期与日期” | 两份全缺,批量错得整齐 |
最后 filler_check 读报告 | 防“出完就当交付” | 退件,且说不出哪里错 |
四步都做了,才叫一次完整的填制。这也是本书“动手三件套”里为什么必须带校验点的原因。
用filler_templates看一下模板库里有哪些教学资料模板,我要课程教学大纲那一类;
再用 filler_template_info 告诉我这份模板要准备哪些数据;然后用 filler_batch 把《数智分析与应用》《跨境电商大数据统计与分析》两门课的教学大纲一次出两份:记录按骨架传(课程代码 DI2026 / EC2026、课程名称、英文名称、授课教师任渝、开课部门智能金融学院、学分 3、总学时 48、课程性质专业必修课、适用专业班级按实际填写);
context_json传{“semester”:“2026-2027学年第一学期”,“date”:“2026年9月17日”};
出完把每份的文件名和下载链接给我,并调 filler_check 把校验报告读给我。四条要求各有用处:点模板(决定版式与映射)、点骨架(保证字段名对得上)、点公共信息(最常漏的一层)、点校验(出件不算交付,校验通过才算)。
只有一门课、想先试通链路时,把第五步换成 filler_run,其他照旧——先出一份,读回核对,再出整批,这是所有批量活的标准节奏。
| 产物 | 内容 |
|---|---|
| 成品 docx × 2 | 数智分析与应用-教学大纲-任渝.docx、跨境电商大数据统计与分析-教学大纲-任渝.docx |
| 下载链接 × 2 | 可直接下载的地址;中文文件名在链接里会出现百分号编码(%E6%95%B0... 这样),这是正常的 |
| 校验报告 × 1 | 每份文档的已替换 / 未替换 / 缺失字段 / 表格填充行数,以及总校验结论 |
| 字段核对表(自建) | 把两门课的学分、学时、课程性质、适用专业并列一张表,出件后一对一核 |
| 课程清单(存下来) | 这次写的数据不要用完就扔,下学期只改其中几项,三分钟又一轮 |
本讲的实测结果:两条课程记录 + 一份公共信息,一次出件 2 份 docx,文件名是《数智分析与应用-教学大纲-任渝.docx》与《跨境电商大数据统计与分析-教学大纲-任渝.docx》,校验结论为「校验通过(未替换 0 / 缺失 0)」。
filler_check 给出的结论必须是「校验通过(未替换 0 / 缺失 0)」。不是这个结论,不交。错误一:出件成功,但“学年学期、填表日期”空着。
表现:正文内容都填进去了,模板里这几处还是空的,校验报告的未替换清单里列着它们。
原因:这两项属顶层公共信息,只传了记录列表、没传 context_json。
排错:把公共信息补进去重跑。一门课也要传公共信息——公共不等于可以省。
错误二:只想试一门,结果出了两份;或者想出一批,只出了一份。
表现:份数与预期不合。
原因:数据形状问题——给裸列表时引擎会自动包一层;但给了单条字典(而不是列表)会被自动包成一条,份数就少。
排错:出完先数份数,份数 = 记录条数;不对就回头改数据的形状,不要改字段内容。
错误三:下载失败或下载下来是乱码名。
表现:链接点开报错。
原因:中文文件名和中文链接要做百分号编码,某些客户端对此不友好。
排错:换一个浏览器再点,或把链接里的编码形态复制完整。文件本身没问题。
错误四:收到的交付包里多了一份模板文件。
表现:混进一个不带课程名的文件。
原因:早期版本会把模板当成成品一起给出。
排错:只按引擎报告里的产物清单收件,模板不算交付物。
错误五:引擎明明接好了,却不出件也不报错。
表现:一切正常,就是没有文件。
原因:连接器没登记信任,被静默跳过,日志里会打一行跳过提示。
排错:看日志确认;连接器要写在配置根目录的 mcp.json、名字用裸名 doc-filler,改完完全退出应用再打开(见附录 C)。
filler_batch 一次出十份以上;教学秘书按学院名单跑一遍,学期初的集中出件就结束了。这时“份数对账”比单门课更重要:应交几份、实交几份。大纲不该重写三遍——把变的那一层交出去,把判断的那一层留下来。
| 工具全名 | 一句话作用 |
|---|---|
mcp__doc-filler__filler_templates | 列模板库(内置范例 + 我上传的),带用途与数据量 |
mcp__doc-filler__filler_template_info | 看选中模板要准备哪些数据:单值字段 + 列表区 + 样例 |
mcp__doc-filler__filler_template_upload | 学校发的那份 Word 直接上传,自动识别字段并注入记号 |
mcp__doc-filler__filler_run | 跑一门课(一份)的填制,先试通再批量 |
mcp__doc-filler__filler_batch | 按记录列表一次出一批 docx(本讲:两门课两份) |
mcp__doc-filler__filler_check | 读校验报告,确认「未替换 0 / 缺失 0」再交付 |
[1] Taylor F W. The principles of scientific management[M]. New York: Harper & Brothers, 1911.
[2] 中华人民共和国教育部. 教育部关于加快建设高水平本科教育 全面提高人才培养能力的意见: 教高〔2018〕2号[A]. 2018.
[3] OpenAI. Function calling[EB/OL]. https://platform.openai.com/docs/guides/function-calling.
数据与平台:本讲实测数据来自 zhenyuonline.cn 的 doc-filler 引擎填制能力(2026-09-17 实跑)。
teaching 场景(课程教学资料)模板 13 个占位符,课程粒度,两条课程记录(DI2026 数智分析与应用、EC2026 跨境电商大数据统计与分析)
加一份顶层公共信息(semester = 2026-2027学年第一学期、date = 2026年9月17日),
一次出件 2 份 docx,校验结论「校验通过(未替换 0 / 缺失 0)」。产物已作脱敏处理。