简介:这份由之江实验室与中国教育科学研究院数字教育研究所联合发布的《教育专用大模型研究报告(简版)》,面向教育科技研究者、教育信息化从业者及大模型产品设计人员,系统解答了通用大模型如何深度融入教育场景的问题。资源仅1个PDF文档,压缩包约890KB,便于快速阅读与传播。报告从技术基础入手,解析了大模型涌现能力、两条开发技术路线及局限,进而提出“通用大模型+教育场景模型+知识库”的开放架构构思;同时,梳理了星火语伴、EmoGPT、MathGPT、智海-三乐、Khanmigo等五个典型应用案例,覆盖语言学习、心理疏导、数学学习、知识学习与多学科教学,并结合潜在挑战给出落地方向。读者可据此快速建立对教育专用大模型当前进展、核心难点与应用前景的系统认知,为自身教研、产品选型或方案设计提供参考。目前已有120人学习下载。
1. 教育专用大模型研究报告在讲什么:从“能聊天的模型”到“能教书的系统”
这份报告简版的核心结论,一句话就能说清:教育专用大模型不是给通用大模型换个名字,而是在数据、知识组织、教学任务三个层面重新做了一遍工程。报告把“会聊天”和“会教书”明确分成两条技术路线,这个判断直接影响我们后面所有的选型和投入方向。如果你正在做 AI 助教、智能批改、自适应学习这类产品,或者准备选一套教育大模型底座,这份报告能帮你省掉至少两个月的试错期。适合谁读:教育产品的技术负责人、做题库和讲题逻辑的算法工程师、负责教育知识库落地的数据工程师。报告属于研究报告,不是开源代码包,所以本文侧重把报告里的架构判断讲透,再给出一套可复现的本地落地路径。
2. 教育大模型和通用大模型差在哪:三层架构与选型依据
2.1 报告把教育专用模型拆成了哪三层:数据层、知识层、教学层
报告的架构拆法很干净,它不是按模型结构去区分,而是按“知识从哪里来、知识怎么组织、能力怎么输出”三层拆。这个拆法对落地特别友好,因为每层都能对应到具体的工程模块。
数据层解决的是“喂什么”。通用大模型的训练语料以网页、论文、代码为主,而教育场景需要的是教材、课标、真题、教辅解析这类高结构化内容。两者混在一起训练,教材知识的占比会被严重稀释。报告给出的判断是:教育专用模型的底座可以复用通用模型,但必须叠加一个高比例的教育语料继续训练阶段,这个阶段的目标不是让模型变聪明,而是让模型“懂教学语言”。
知识层解决的是“怎么组织”。通用模型把知识打散在参数里,而教育场景要求知识必须是可定位、可追溯、版本可控制的。比如一道物理题,它涉及的知识点必须能关联到课标条目,答案必须能追溯到某本教材的某个章节,这是通用模型做不到的。所以报告在这个层面强调学科知识图谱与认知诊断模型的配合,图谱管知识结构,认知诊断模型管“学生到底会还是不会”。
教学层解决的是“怎么输出”。通用模型擅长写一篇流畅的文章,但教育场景要求的是苏格拉底式提问、分步引导、错因归因,并且同一个知识点要能针对不同水平的学生给出不同难度的讲解。这个层面靠的是指令微调和教学任务编排,跟模型本身的基座能力关系已经不大了。
三层拆完,选型和投入的优先级就清晰了:数据层决定模型下限,知识层决定产品差异化,教学层决定用户体验。我们内部做选型评估时,也是按这三层逐项打分,而不是只看模型跑分。
2.2 为什么不建议直接拿通用底座裸奔:评测视角的对比
很多人会问:通用大模型已经很强了,直接接个提示词模板不就够用了吗?报告里给了一组对比,我用一个更具体的场景来解释为什么不建议裸奔。
拿“鸡兔同笼”来测试。通用模型面对“笼子里有 35 个头、94 只脚,问鸡和兔各几只”这种经典题,通常能算对。但教育场景的真实问题是学生写出来的错误过程,比如“假设全是兔,脚数为 140,多了 46 只,每只鸡多算 2 只,所以鸡有 23 只”这种半成品,模型要能指出学生错在哪一步、为什么错、怎么引导学生自己发现错误。通用模型面对这种输入时,最常见的两种表现是:直接给完整答案(毁灭了思考过程),或者顺着学生的错误逻辑强行合理化(给了一个完全错误的引导)。
我见过一个很典型的案例:某开发者接入通用模型做小学数学答疑,上线第一天就收到家长投诉,因为模型对一个“1/2 + 1/3 = 2/5”的错误过程回复说“你的计算步骤很清晰,继续加油”。这不是模型笨,而是通用模型没有经过“识别错误过程”这个教学任务的针对性训练。教育专用模型在这个方向上的差异是质变级的,它需要能判断学生对知识点的掌握状态,而不只是生成一段通顺的文字。
从评测指标上看,两者的差距更明显。通用模型的评测看的是连贯性、信息量、指令跟随,而教育专用模型的核心指标是:知识点识别准确率、错误归因准确率、讲解步骤完整度、答案可回溯率。这四个指标在通用模型的评测体系里基本不存在。这也就是报告的另一个观点:教育大模型的评测体系必须单独建,直接套用通用模型的评测榜单,等于用体育比赛的规则去评判棋类比赛。
参数与选型对比表
| 评估维度 | 通用大模型 | 教育专用大模型 |
|---|---|---|
| 知识来源 | 网页/论文/代码为主 | 教材/课标/真题/教辅 |
| 知识组织形式 | 参数内隐式存储 | 知识图谱 + 可追溯条目 |
| 核心任务 | 续写/摘要/对话 | 讲解/出题/批改/导学 |
| 错误处理 | 倾向于通顺输出 | 要求识别错误并归因 |
| 评价指标 | 连贯性/信息量/指令跟随 | 知识点识别率/归因准确率/可回溯率 |
| 典型失败模式 | 对错误过程给正面反馈 | 不会出现“顺着错误逻辑夸学生” |
3. 从报告到可复现的搭建路径:数据准备与基座选型
3.1 一份每周能跑完的教育语料清洗流程
报告里有一句话很实在:教育大模型的效果差异,七成来自数据而不是模型。这句话对应到工程上就是:基座选型只要选当前主流的开源底座就行,真正的精力要花在教育语料的清洗和组织上。下面这套流程是我实际跑过的方案,按周为周期迭代。
第一步是确定语料来源与清洗规则。教育语料的核心来源是教材电子版、课标文件、历年真题、教辅解析。这里有个容易忽略的点:教材电子版的格式通常是 PDF 或扫描件,直接丢给模型是没用的,必须转成可检索的文本,并且要保留章节结构和题目标号。
# 用 miniconda 建一个独立的 python 3.10 环境,避免依赖冲突 conda create -n edu_data python=3.10 -y conda activate edu_data # 安装 PDF 解析工具链(pdfplumber 处理文本型 PDF,paddleocr 处理扫描件) pip install pdfplumber paddleocr tqdm opencc-python-reimplemented# 批量清洗教材 PDF:按页抽取文本、统一简体、过滤页眉页脚 import pdfplumber from opencc import OpenCC cc = OpenCC("t2s") # 繁体转简体 def pdf_to_text(path): """抽取 PDF 每页文本,丢弃字符数过少的页眉页脚""" pages_text = [] with pdfplumber.open(path) as pdf: for page in pdf.pages: text = page.extract_text() or "" # 页眉页脚通常是 10 个字符以内的短行,直接过滤 lines = [ln.strip() for ln in text.split("\n") if len(ln.strip()) > 10] pages_text.append("\n".join(lines)) return "\n".join(pages_text) def clean_to_standard(raw_text): """统一为简体,并压缩连续空行""" text = cc.convert(raw_text) import re text = re.sub(r"\n{3,}", "\n\n", text) return text这段脚本的逻辑不复杂,但有几个参数值得说明。len(ln.strip()) > 10这个阈值是按教材页眉页脚的实际长度调的,有的教材页眉是课程名称超过 10 个字,需要单独调优,我一般会先抽两页看看再定阈值。OpenCC("t2s")做简繁转换是因为部分教辅电子版是繁体或混合排版,不统一会影响后续分词和检索效果。如果遇到扫描版教材,把pdfplumber换成paddleocr的predict接口即可,但速度会慢一个数量级,建议只在真正没有文本层的 PDF 上用。
第二步是题库与答案的配对检查。题库类数据最常见的坑是题干和答案分离存储,导入知识库后模型检索到题干却找不到对应答案。我一般会在清洗脚本里做一个强校验:每条题目记录必须同时包含题号、题干、答案、知识点标签四字段,缺失任何一个就丢进待人工复核队列,不直接入库。这个校验逻辑看起来简单,但在真实数据上能拦下两到三成的脏数据。
3.2 基座选型:为什么先看评测再看参数
教育专用大模型的基座选型,我的习惯是先确定评测集、再选模型,而不是反过来。选评测集的标准是:必须覆盖目标学段和学科的核心题型,且每道题都有标准答案和解析。拿数学答疑场景举例,评测集至少要包含计算题、应用题、几何证明题三类,每类不少于 100 道。
# 用 lm_eval 跑一套教育场景自定义评测集(以 math 子集为例) pip install lm_eval lm_eval --model hf \ --model_args pretrained=MODEL_NAME,dtype=bfloat16 \ --tasks math_qa_edu \ --num_fewshot 0 \ --batch_size 8 \ --output_path ./eval_results这里math_qa_edu是自定义评测任务名,需要提前在 lm_eval 的任务目录里注册,指向你整理好的教育评测集。num_fewshot 0是有意设置的,教育测试不应该给示例,因为真实场景中学生不会给模型示范。batch_size按显存调,A100 上可以开到 16,普通 24G 显卡建议 4~8。跑完看的不只是准确率,还要看模型在“错误归因”类题目上的表现,这部分报告里单独强调了:错误归因能力只能靠评测发现问题,然后靠数据补充解决。
基座本身的参数量级,报告的隐含建议是 7B 到 14B 之间作为起步。7B 以下的教学推理能力明显不足,70B 以上部署和推理成本对大多数教育产品团队不现实,14B 是目前性能和成本平衡点上最稳妥的选择。如果团队只有消费级显卡,可以先拿 7B 跑通流程,把数据和评测体系建好,再平滑迁移到 14B。
4. 让模型“会教书”的关键模块:指令微调与检索增强调优
4.1 教学指令集的构造:从通用指令到苏格拉底式提问
基座定下来之后,教育能力的核心就落在指令微调上。报告里没有公开指令集的具体规模,但根据教育场景的任务类型,我一般会按“讲解、出题、批改、导学”四类任务构造指令集。
构造指令集的第一原则是:每条指令必须包含完整的学生上下文。以批改任务为例,通用指令可能是“请检查这段解答是否正确”,而教育场景的指令应该更详细。
{ "instruction": "你是一位初中数学教师。请判断学生的解答过程是否正确。如果错误,指出第一步出错的位置并解释原因,但不要直接给出完整正确答案。", "input": "题目:解方程 2x + 3 = x + 5。学生解答:第一步 2x + 3 = x + 5,第二步 2x - x = 5 - 3,第三步 x = 3。检验:将 x=3 代入原方程,左边 9,右边 8,不相等。请问学生错在哪里?", "output": "学生的前三步化简正确,但从第三步到检验之间没有操作错误。真正的错误在于验算时左边应为 2×3+3=9,右边应为 3+5=8,两边不相等,说明第二步移项符号出错:x 从右边移到左边应为 x,5 从左边移到右边应变为 5-3=2。指导学生检查移项符号。" }注意 output 里的写法:报错要定位到具体步骤,解释要指出知识错误(移项符号),最后给教学建议而不是答案。这个结构本身就是训练信号,模型学到的不只是“判断对错”,而是“如何做教学反馈”。
构造教学指令集时,常见的翻车点是把通用对话数据混进来。通用对话数据会稀释教学风格,导致模型讲解变得啰嗦或者喜欢用表情包。我的做法是在指令集里做一个权值分配:讲解类任务占四成,批改类三成,出题类两成,导学类一成。这个比例不是报告给的,但按教学场景的任务频次来配,实践效果最稳。
4.2 检索增强的 4 个必调参数:分段、阈值、候选数、重排
教育知识的时效性和版本敏感度决定了纯靠微调不够,必须叠加检索增强。原因很简单:教材改版、课标调整、新题型出现,这些通过微调更新一次的成本极高,而通过检索库更新只需要替换文档。
第一个参数是分段长度。教材和教辅的内容结构跟网页差异很大,我推荐按章节语义块而不是固定字数切分。具体实现是:先按教材的目录层级切到小节,小节内再按自然段聚合,每段控制在 400~600 字。太短则检索结果上下文不全,太长则容易混入相邻知识点。
第二个参数是检索阈值。常见做法是用向量检索的相似度分数做过滤。低于 0.45 的结果基本可以判定为不相关内容,但不同嵌入模型的分数分布差异很大,阈值必须基于你自己的知识库实测。我的经验是先收集 50 条材料内检索和 50 条材料外检索的正负样本,画出分数分布曲线,取两类分布的交点作为阈值。
第三个参数是候选数。初始召回数量建议 30 条,重排后取前 5 条输入给模型。30 这个数字来自一个经验:教育知识库条目短且密集,候选太少容易漏掉与题干表述不同但知识点相关的条目,候选太多会引入干扰。
第四个参数是重排策略。教育场景的特殊性在于必须优先保证知识点匹配而不是文本相似。比如“路程问题”和“行程问题”文本相似度高但知识点标签不同,我通常在重排阶段引入一个学科知识点标签匹配分,与向量相似度加权求和。权值我一般设向量 0.6、标签 0.4,具体要按学科调整。
# 知识库问答链路的简化示意:向量召回 + 知识点标签重排 from langchain.embeddings import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5") def retrieve_with_rerank(query, top_k=30, final_k=5, threshold=0.45): """先向量召回 top_k,再做知识点标签加权重排,返回最终 final_k 条""" candidates = vector_search(query, top_k) # 第一步过滤:低于阈值的直接丢弃 candidates = [c for c in candidates if c["score"] >= threshold] # 第二步重排:知识点标签匹配加权 query_tags = extract_knowledge_tags(query) for c in candidates: tag_score = len(set(query_tags) & set(c["tags"])) / max(len(query_tags), 1) c["final_score"] = 0.6 * c["score"] + 0.4 * tag_score candidates.sort(key=lambda c: c["final_score"], reverse=True) return candidates[:final_k]这段代码里的extract_knowledge_tags是学科知识点抽取模块,建议直接用现成的学科知识图谱接口,不要自己用规则去猜。0.6和0.4这两个权值是我在数学场景下调出来的,语文或英语场景可能要调整,因为文本相似度的可靠性会变化。测试方法是抽出 20 道题,人工标注每道题应该命中哪些知识库条目,然后扫一遍不同的权值组合,看命中率最高的一组。
5. 教育大模型落地必踩的五个坑:从幻觉到评测失真
5.1 幻觉:学生问为什么,模型在编答案
现象:学生对一道历史题追问“为什么这个朝代要实行这个政策”,模型给出了一个逻辑通顺、但教材里从未出现的解释。学生按这个解释答题,被老师判错。
原因:模型在解码时倾向于生成“最连贯”的内容,而不是“最正确”的内容。教育指令集里如果没有覆盖足够多的“不确定就承认不确定”样本,模型会默认所有问题都能回答。
解决:在指令集的系统提示里显式加入一条规则:“如果问题超出教材范围或无法确定,明确告诉学生这个知识点教材未涉及,建议查证教材第几章或询问老师”。同时在检索链路里做兜底:当检索结果最高分低于阈值时,不直接生成答案,而是返回“当前知识库未找到相关内容”的模板。
5.2 诊断失效:模型判断学生“懂了”,实际没懂
现象:学生在对话里答对了某道题,模型判断该知识点已掌握,后续不再推送相关题目。但换一道同知识点的变式题,学生立刻出错。
原因:模型只看了单次回答的正确性,没有结合学生的历史作答序列和作答时间来综合判断。这是一个非常典型的把“对话模型”当“认知诊断模型”用的错误,报告里明确把这两个模型分开列,原因就在这里。
解决:知识掌握状态的判断不依赖对话模型,单独部署一个认知诊断模型,输入是学生的答题记录序列(题目、知识点、对错、用时),输出是知识点掌握概率。对话模型只负责讲解,诊断模型只负责判断,两套输出在导学流程里汇合。这个改动能让推荐题目的准确率明显提升,代价是多维护一个模型,但这是教育产品的必付成本。
5.3 知识过期与教材版本错位
现象:模型讲的是旧教材的内容,学生用的是新教材,章节号和知识点归属对不上。
原因:知识库更新是滞后于教材改版的。教材改版周期短则两三年,长则五六年,而训练语料里的知识停在旧版上。
解决:在知识库系统里给每个文档打上“教材版本”元数据字段,检索时把版本作为过滤条件而不是排序条件,这样新教材学生只会检索到匹配版本的条目。微调语料和知识库要建立一致的版本映射表,两者一旦不一致,模型给出的知识引用会指向错误章节。这个版本映射表的维护需要人工介入,每学期开学前核对一次。
5.4 评测自嗨:只看指标不看教学效果
现象:内部评测中模型得分很高,但真实学生反馈“讲得太绕”“不如老师讲得清楚”。
原因:评测集的题目分布与真实学生提问分布不一致,或者评测指标只统计了“答案正确率”,没统计“讲解被理解”的程度。教育产品的最终用户是学生,学生说没听懂就是失败,这个结论不参考任何指标。
解决:把评测拆成两层:离线评测看知识点识别率、答案正确率、可回溯率,这是研发阶段的快速反馈;在线评测必须引入真实学生的理解反馈,做法是在讲解结尾加一个“请复述刚才的解题思路”的追问,学生能复述才算讲解有效。这个追问设计也是报告提到的“教学闭环”思想,模型不能只输出,还要能验证输出是否被接收。
5.5 幻觉检测与内容安全:未成年人场景的特殊约束
现象:模型在作文批改场景中,对学生的一篇记叙文给出了“立意不够深远”的评价。这一句评价本身没有错误,但学生由此产生了“我写得不好”的自我否定。
原因:面向未成年人的模型输出,不能只用文本质量的标准衡量,还要过心理安全这道关。教育的特殊性在于每次输出都可能影响学生的自我认知,这不是通用大模型的安全对齐能覆盖的。
解决:在生成层增加一个“鼓励优先”的规则:任何批评性反馈必须附带一个具体的改进建议,且改进建议的数量不能少于批评点的数量。这个规则用提示词约束很容易实现,但要写成可测试的用例,纳入每次发版前的回归检查。这个坑很难用技术参数去彻底解决,因为它本质上是教育学问题,但技术侧至少可以做到不推波助澜。
6. 验收一套教育大模型:五维评测清单与一个主动测试技巧
报告把教育大模型的评测拆成了五个维度,我把它转成一份可勾选的验收清单:知识点识别准确率,把它定位到一个具体知识点而不只是相关文本;错误归因准确率,定位到具体步骤和具体知识错误;讲解步骤完整度,从审题到结论中间的关键步骤不能跳;答案可回溯率,每个结论能指向知识库里的具体条目;教学安全合规项,不包含不当评价和超出学段的表述。
这五条全部过一遍,模型才算具备基本的“教书”能力。但仅仅让模型被动答题是不够的。我常用的一个技巧是“主动追问测试”,做法很简单:让模型给出答案之后,紧接着追问三次“为什么”。第一次追问验证讲解的稳定性,第二次追问验证知识的可回溯性,第三次追问验证边界认知。一个真正可靠的教育模型,在第三次追问时应该说出“这个知识点已经超出当前学段范围”或者“抱歉,这一点我不能确定”。如果模型在连续追问下依然坚持编造,上线之后遇到较真的学生一定会翻车。
这个技巧的成本极低,但能筛出大部分看似聪明、实则内在逻辑混乱的模型。另一个性价比很高的习惯是保留一份“失败案例集”:每次测试中发现模型给出错误教学反馈,就把案例连同后续修复记录一起归档,下一轮微调时优先补充进训练数据。教育大模型没有一次性到位的捷径,它是在一轮轮“发现错误、定位原因、补充数据、重测”中变可靠的。
希望这篇能帮你减少一些试错。教育场景对错误容忍度极低,方向对了慢一点也没关系。
本文还有配套的精品资源,点击获取