【可执行状态】现在就能做(一条链三步跑通;上传前先确认学校对材料外送的规定)
【本讲对应资产】research-assistant 引擎(8 个工具);本讲关键工具 grant_extract_dict(已填申报书 → 课题字典)、grant_build_template(已填 docx → 占位符模板)、grant_fill(课题字典 + 模板 → 全套文档 + 校验报告);收尾可交 docx_polish 统一排版
【本讲原理来源】L3 第 20 课《Function Calling 深度解析》(工具说明书三要素)——本讲落在“参数从哪来、谁是唯一来源”这一条上
先问一个问题:你上一次报课题,是三份材料一起交的吗?如果是,你有没有把这三份材料从头到尾对过一遍——课题名称一个字一个字地、成员顺序一个位置一个位置地?
多数人没有,因为对不完。申报书、匿名活页、成员信息汇总表,三份文档、几十个字段,人眼对拍一遍要一小时,而且第二遍还会漏。改了一个字段,另外两处不改,交上去就是退回来。
这一讲要换的不是“细心程度”,是做法本身:让三份文档长在同一个数据源上——改一处,三处一起变。
赵老师(化名)这次要报一个校级教改课题。科研秘书发来三样东西:一份通知、一份上一届已填好的申报书(学校不发空白模板,只发一份填过的样例当体例),还有一份匿名活页的格式要求。校级课题要交:申报书、匿名活页、成员信息汇总表,三份。
她上一次报课题是怎么栽的,她记得很清楚。
第一稿写完,第二稿改了课题名称——从“基于生成式人工智能的课堂教学模式研究”改成“生成式人工智能赋能课堂教学的模式研究”。改是改了,但只在申报书里改了。交上去两周后,科研处退回来:活页上的课题名称还是旧的那一版;汇总表里成员顺序和申报书里不一致;经费预算表里“资料费”在申报书上是 0.5 万、在活页上写成了 0.8 万。
三份文档,几十个字段,人眼对拍。改一处、漏两处,几乎是必然。
再往深一层想:为什么必然?因为这三份文档本来就不是“一份东西的三个视图”,而是三份各自独立、各自被修改的稿子。就像同一笔账记在三个本子上,你怎么可能指望它们永远一致?
这一讲练的动作是:让三份文档长在同一个数据源上。
上面那三类错,看起来是粗心,实际上是结构问题:同一份信息被存了三遍(申报书一遍、活页一遍、汇总表一遍)。只要存了三遍,就有三遍改的机会,也就有两处漏改的机会。人会累,机器不会——但机器的前提是:信息只存一遍。
这就是“单一数据源”(single source of truth):所有出件都从同一份数据生成,不复制、不各改各的。
举个生活里的例子:一家饭馆如果前厅写一块价目板、后厨贴一份价目表、收银机里再存一套价格,那涨价那天一定会有一处忘改。再比如,一个班的成绩如果教务处、辅导员、任课教师各存一版,那你迟早会见到“同一个学生三个分数”。这些混乱的根子都不是人懒,是同一件事被存了不止一遍。
填申报书这件事的做法,换过四代。
第一代,手抄往年本子。 上世纪八九十年代,报项目的人把上一届别人的本子借来,对着往里抄。抄的是“体例”——哪一段写什么、经费怎么写、成员怎么排。这一代留下的问题是:抄的是别人的内容,容易连不该抄的也抄进来;而且今年格式一变,去年的本子就废了。
比如,老教师至今还记得,那时候借本子要托人情,还回来的本子上常有铅笔改动过的痕迹——那是上一家的内容,抄进去就成了“你的研究成果”。
第二代,四处拷字段。 有了电脑之后,做法变成“在几个文件之间复制粘贴”。课题名称从这份文件拷到那份,成员表从一个 Excel 拷到另一个 Word。这一代比第一代快,但埋下了本讲开头那类错的根:同一份信息被复制成了多份,从此有了各自被改的可能。
第三代,邮件合并。 Word 的邮件合并(一份名单 + 一个模板,批量出函件)第一次把“数据”和“格式”分开了[1]:数据放在名单里,格式放在模板里。它的前提是“得有人先把合并域插好”,所以它一直没真正普及到教师手里。
第四代,就是这一讲的字典驱动。 它把邮件的“数据 / 模板”分家继续往前走一步:先让机器把学校那份已填好的申报书读成一本“字典”(所有字段集中一处),再把同一份件反解成模板,最后拿字典去灌模板,一次出全套件。 三份文档共用一本字典,从此只有一处可改。
| 代 | 代表做法 | 解决了什么 | 留下的老问题 |
|---|---|---|---|
| 一 | 手抄往年本子 | 有了体例参照 | 抄内容、格式一变就废 |
| 二 | 多文件复制粘贴 | 快 | 一份信息存多份,各自被改 |
| 三 | 邮件合并 | 数据与格式分家 | 要人先插域,没普及 |
| 四 | 字典驱动(本讲三步链) | 全套件共用一本字典 | 字典本身要人核一遍,缺字段要补 |
看最后一列:第四代留下的老问题,是“字典要人核”。这正好解释了本讲校验点的第一条——先核字典,再出件。
学校不发空白模板,只发填过的样例;要的又是学校自己的版式。所以做法不是“新建一份漂亮表格”,而是把学校那份已填件反解开:
这里的“反解”,可以类比成给一份成衣反推纸样:不是照着样子重做一件新的,而是把原来那件的版型尺寸量出来,这样以后同一版型可以做无数件,而每一件都与原件同款。
| 第几步 | 工具(真名) | 干什么 | 谁来喂参数 |
|---|---|---|---|
| 第一步 | grant_extract_dict | 把“学校已填的申报书”解成课题字典 JSON(科研助理的单一数据源) | docx_url:那份已填申报书的地址 |
| 第二步 | grant_build_template | 把已填 docx 反解成占位符模板,版式/表格/字体原样保留 | app_docx_url(申报书)、hy_docx_url(活页)、name(课题名) |
| 第三步 | grant_fill | 课题字典 + 模板 → 全套文档 + 校验报告 | dict_json(课题字典)、docs_json(文档清单)、anon(需匿名化的文档名,逗号分隔) |
一句话记住这条链:解出一份字典,反解一套模板,字典灌进模板。
管用,而且这正是它最值钱的地方。
变化的通常只是版式,不是字段。今年把“预期成果”挪到附表里,明年又在表头加一行“依托课程”——字段本身几乎不动,动的是它们摆在哪儿。
字典驱动的好处就在这儿:字典记的是“字段的值”,模板记的是“值摆在哪儿”。 版式一变,你只需要拿新版式的那份件重新反解一次模板(第二步),字典原封不动接着用。打个比方:这就像换了个新式样的行李箱,衣服还是那些衣服,重新装一遍就行——不用重新买衣服。
反过来说,如果你走的是第二代那条路(四处拷字段),版式一变,你手头那几份文件全都得重来。这就是“分开存”和“混着存”长期成本的区别。
这是本讲必须先答的一个问题,因为它涉及学校制度,不是技术偏好。
这条链是服务端在跑的:grant_extract_dict 要能取到那份已填申报书,grant_build_template 要能取到申报书与活页。把已填件交上去,等于把文件送出本机。
而申报书里有什么?负责人与成员姓名、职称、身份证类信息(部分表格要求)、经费预算、以及尚未公开的研究设想。这属于学校数据,不属于公开资料。
举一个常被忽略的情形:假如你在实验室的公共电脑上跑这条链,取件的链接又是公开可访问的,那么这份含成员姓名与经费的件,就有可能在你不注意的时候被别处取走。这不是危言耸听,是材料外送这件事本身的属性。
所以规矩是两条:
打个比方:这好比你是把原件寄出去复印,还是在家里复印好再拿一页出去。规矩不同,做法就不同;但无论哪种,先问一句“这个东西能不能出门”,是动手前的第一个动作。
如果我们自己造一套表格,就会掉进最常见的一个坑:格式对了,版式不对——字号差半号、表头少一条线、页边距不一样,评审眼睛一扫就知道这不是学校那份表。
反解出来的模板,前提就是“版式/表格/字体原样保留”。所以这份模板从哪来?只从学校下发的那份件来,不要从网上下载一份“同名模板”。例如,很多学校的活页有特定的匿名要求与页数限制,网上找来的同名模板十有八九对不上。
anon 参数管什么,不管什么匿名评审的活页不能出现姓名、单位、团队成员。grant_fill 有一个 anon 参数(需匿名化的文档名,逗号分隔),你把哪几份要匿名点给它,它在出件时就处理。
但要注意:匿名不到底的责任在人。 工具处理的是“字段级”的姓名单位,而真正会暴露身份的东西常常不在字段里:
这四处,出件后你自己扫一遍——这是评审规则,不是格式偏好。好比出门前照镜子:机器能帮你把领子翻好,但有没有忘拉拉链,还得你自己低头看一眼。
grant_fill 的产出从来不只是文件,而是全套文档 + 校验报告。这与第 8 至 13 讲那条“先看报告,再看成品”的习惯是同一条:凡是机器批量出货的活,都要有一个能说清“哪里没做对”的东西跟着。
报告要看的还是三张清单:已替换 / 未替换(模板里有、配置没覆盖)/ 缺失字段(配置了但数据取不到)。 两份清单不为零,就不算交件。
设问自答三:报告归零了,是不是就可以直接交?
不是。报告归零只说明“模板里每一个位置都填上了东西”,不说明“填进去的东西是对的”。字典错了,它会照着错的填,而且填得整整齐齐。所以第一顺位永远是核字典——机器擅长“每格都填满”,人负责“每一格都对”。
第一步:先解字典,先看字典。
用grant_extract_dict把这份学校已填的申报书解成课题字典,docx_url是 https://……/申报书样例.docx。解完先把字典打给我看,我要逐字段核一遍,别急着出件。
第二步:反解模板,版式不许动。
用grant_build_template把这份已填件反解成占位符模板:app_docx_url给申报书,hy_docx_url给活页,name用我的课题名称;版式、表格、字体原样保留,不要重排。
第三步:字典 + 模板出全套件,出校验报告。
用grant_fill把课题字典灌进模板,出全套文档和校验报告:dict_json用上一步的字典(我把改过的字段更正在里面),docs_json挂齐申报书/活页/汇总表,匿名的那几份在anon里点名。
| 症状 | 查哪里 |
|---|---|
| 字典里某些字段是空的 | 来源件里本来没写,或那几个字在一个合并单元格里没被识别。补进字典,不要在成品里手改 |
| 报告里出现“未替换 N / 缺失 N” | 字典缺字段,或 docs_json 没挂全模板。补齐字典后重跑,不要手改文件 |
| 出件份数比通知要求的少 | 文档清单没挂全;另一种同类坑(第 8—13 讲的填制工具记录过):数据形状传错会让份数变少。出件份数要按通知核对 |
| 版式变了(字号、表格线、页边距) | 用了自己找的模板,或拿反解出的模板又手工改过。改内容在字典里改,改版式在学校原件上改 |
| 匿名不彻底开了会 | 只匿了正文姓名,漏了文件名与文档属性。按上面第 5 条四处扫一遍 |
| 引擎配置了却完全不用它 | 信任门静默拦截:日志里会有 skipping untrusted server,界面不报错,只是不用。处理步骤见附录 C |
| 改完连接器还是不生效 | 应用只在启动时读一次配置:必须完全退出应用再打开(不是关窗口) |
| 上传时卡在“文件访问不了” | 那几份件要先能被服务端取到(提供可访问的链接)。这一步涉及材料外送,先确认学校的材料管理规定 |
docx_polish 统一中文字体、标题层级与页码,避免几份件字体不齐。三份文档只能有一个源头——改一处、全部一致,才叫交件。
| 你要干的活 | 工具全名 | 关键参数 |
|---|---|---|
| 把已填申报书解成课题字典(单一数据源) | mcp__research-assistant__grant_extract_dict | docx_url(必填) |
| 把已填 docx 反解成占位符模板(版式原样) | mcp__research-assistant__grant_build_template | app_docx_url(必填,申报书)、hy_docx_url(活页)、name(课题名) |
| 字典 + 模板 → 全套文档 + 校验报告 | mcp__research-assistant__grant_fill | dict_json、docs_json(必填,形如 [{“name”:“申报书”,“url”:“https://…/tpl.docx”}])、anon(需匿名文档名,逗号分隔) |
| 全套文档统一排版(字体/标题/页码) | mcp__research-assistant__docx_polish | docx_url |
grant_extract_dict 解字典 → grant_build_template 反解模板 → grant_fill 出全套件[1] 关于“数据与格式分离”这一脉络,邮件合并(mail merge)是 20 世纪 80 年代文字处理软件引入的批量函件生成方式,其思想与此后的模板引擎一脉相承;相关技术史梳理见:Haigh T. Remembering the Office of the Future: The Origins of Word Processing and Office Automation[J]. IEEE Annals of the History of Computing, 2006, 28(4): 6-31.
[2] 国务院. 国家自然科学基金条例(国务院令第 487 号)[Z]. 2007-02-24.(科研项目申请与评审的基本规范依据)
[3] 中共中央办公厅, 国务院办公厅. 关于进一步加强科研诚信建设的若干意见[Z]. 2018-05-30.(科研诚信与学术不端治理的总体要求)
[4] 中华人民共和国国家质量监督检验检疫总局, 中国国家标准化管理委员会. 信息与文献 参考文献著录规则: GB/T 7714—2015[S]. 北京: 中国标准出版社, 2015.
数据与平台:本讲工具步法与参数来自 zhenyuonline.cn 的 research-assistant 引擎(grant_extract_dict/grant_build_template/grant_fill/docx_polish,2026-09-17 核对)。文中标注【需补】之处为需以本校通知为准的事项,未以估计值填充。