
简介这份压缩包提供了一套基于LLM的高中语文作文自动批改应用源码与工程配置面向高中语文教师、教育技术研究者及具备Python基础的开发者用于解决作文评分、语病识别和个性化反馈等教学痛点。压缩包共18个文件主体为5个Python脚本涵盖主程序、LLM调用与工具函数、4个XML工程配置、4个编译缓存pyc文件并附依赖清单、说明文档及Git忽略规则整体仅21KB轻量易部署。已有93人学习下载。应用覆盖自动评分、错误标注、内容建议、数据分析和个性化反馈等功能展示了如何利用大模型在中文语境下完成语义理解与写作指导对于想快速搭建作文批改原型或学习LLM教育落地方案的读者具有直接参考价值。 我第一次把学生作文丢给大模型的时候它给了一篇五百字的夸夸其谈情感真挚、结构清晰、语言流畅、主题深刻——几乎把所有能想到的褒义词都堆了一遍。第二天我把同一篇文章换个说法再丢进去它又改口说立意不够鲜明、论证不够充分。那一刻我意识到用LLM批改高中语文作文真正的难点根本不在模型会不会评价而在于怎么让它别瞎评价。后来我把这套东西做成了一个能实际跑起来的应用基于LLM的高中语文作文自动批改应用。输入一篇学生作文几十秒后返回分项评分、逐段批注、总评和修改示范整个项目打包成了一个zip部署起来不复杂。过程中踩了无数坑也摸出了一些经验。这篇博文把从设计、Prompt调优到落地实测的全过程记录下来给正在做教育类LLM应用、或者自己就是语文老师想拿AI当助手的你做个参考。1. 为什么作文批改这种主观题反而是LLM的用武之地1.1 先算一笔时间账语文老师批作文有多累高中语文老师一般带两个班一百多号人。一篇800字作文精批细改需要十分钟以上要逐段看逻辑标出错别字写旁批结尾还要写一段总评。一晚上改六十篇基本意味着从八点坐到凌晨两点。这种情况下大部分老师只能提速重点看标题、开头、结尾和每段首句中间扫一眼给个总分再写一句论证不够充分之类的通用评语。批改质量下降学生拿到手也没有可执行的改进方向。LLM最擅长的事情恰恰是快速读完一篇长文本并给出结构化反馈。它不会累不会因为改到第三十篇就失去耐心对每篇作文都能保持同样的注意力。这个特性决定了它在作文批改场景里有不可替代的价值——前提是你把它设计对。1.2 难点主观评价不是给个分而是给依据作文批改难难在它不是客观题。同样一篇作文教师A可能给52分教师B可能给48分两人都能说出道理。这种主观性让很多团队一开始就放弃做语文作文批改转头去做英语作文或者数学题。但我认为恰恰相反LLM在处理主观评价时只要能给出依据它的参考价值就远大于一个冷冰冰的分数。我定义的好批改包含四个方面第一分项评分要对应明确标准不能拍脑袋第二每个扣分点要对应到作文里的具体段落或句子第三总评要指出核心问题和改进方向第四最好能给出局部的改写示范。这四个方面指向的不是让AI替代老师打分而是让AI帮老师把活干完老师只需审核和微调。1.3 定位想清楚是教练不是裁判这是整个项目最关键的定位决定。如果目标是自动评分系统要求LLM的分数和阅卷组完全一致那基本是给自己挖坑。但如果目标是教练那情况完全不同——学生需要的不是一句你有很大提升空间而是你第二段的论据和观点脱节换一个关于坚持的史例会更有说服力。所以这个应用的设计初衷是把LLM当作一个读过大量高分范文、精通高考评分标准的助教它的批改报告是初稿老师在此基础上做最终裁决。想通这一点之后整个系统的技术选型和Prompt设计都变得顺理成章。2. 应用设计从一篇作文到一份批改报告的完整链路2.1 先看zip包里有什么我把项目打包成zip分享出去的时候特别注重拿过去就能跑。整个目录结构长这样grading_app/ ├── app.py # FastAPI 入口提供Web接口 ├── core/ │ ├── models.py # 作文数据模型与输出Schema │ ├── scorer.py # LLM调用与Prompt编排 │ └── rules.py # 本地规则引擎错别字、字数、段落统计 ├── prompts/ │ ├── system.md # 系统提示词 │ └── fewshots.jsonl # few-shot 示例 ├── utils/ │ ├── chunker.py # 长文本分段处理 │ └── formatter.py # 结果格式化为批改报告 ├── frontend/ # 极简Web页面 └── output/ # 批改报告导出目录结构上我把规则引擎和LLM引擎分开这是故意的。作文批改中有大量确定性工作不适合交给LLM字数统计、段落数检测、明显的错别字、标点异常。这些用规则引擎做又快又准。LLM只负责它真正擅长的事理解语义、判断逻辑、评估文采、给出建议。2.2 技术选型为什么是Python FastAPI选型上我基本没犹豫Python FastAPI httpx pydantic。FastAPI的优势在异步处理和自动生成的接口文档批改一篇作文要调用模型接口网络IO是主要耗时异步能把并发顶起来。更重要的是pydantic它对模型输出的JSON做强校验格式不对就能立刻捕获并触发重试这对LLM应用来说是刚需。模型接入层我做成了适配器模式底层支持两种方式一种是直接调用国内主流大模型的API另一种是通过Ollama这类工具加载本地开源模型比如Qwen2.5系列。两种方式通过一个配置项切换方便不同场景使用——个人测试用本地模型省钱正式使用用云端API效果好。2.3 核心调用流程谁先谁后很讲究整个批改流程我调了很多版最后稳定为五步接收作文原文规则引擎先跑一遍统计字数、段落数、标题、明显的错别字和标点问题。将作文和规则引擎的输出一起交给LLM要求它先通读全文提炼中心论点。LLM逐段批注输出每个段落在扣题、论证、语言上的问题。LLM按评分标准分项打分并输出总评和修改建议。后处理解析JSON用pydantic校验汇入模板形成批改报告。这里特别值得说的是第一步和第二步的衔接。一开始我没让规则引擎参与LLM调用结果模型总把错别字漏掉。后来把规则引擎的错别字结果一并塞进Prompt让模型复核漏检率明显下降。这个规则先行、LLM复核的思路在做任何垂直领域LLM应用时都值得借鉴。3. Prompt工程这是整个应用最花功夫的地方3.1 第一版翻车实录跑题作文拿了56分第一版Prompt非常简单你是语文老师请批改下面这篇作文给出评分和评语。结果惨不忍睹。一篇明显跑题的作文写的是坚持就是胜利但通篇在讲科技改变生活模型给了56分满分60评语是文章充分论证了坚持的重要性结构清晰语言优美。为什么会这样我仔细看了几篇输出发现问题出在模型缺少两样东西一是缺少对题意扣合度的强制检查二是在没有参照系的情况下模型默认给出偏高的分数——这大概是因为训练数据里学生作文普遍对应着鼓励性评价。也就是说让LLM裸评作文它的默认行为是和气生财这不符合阅卷逻辑。3.2 角色设定与评分锚点把高考评分标准塞进提示词第二版Prompt做了大幅调整。我先给模型一个明确身份再把评分标准做成了可操作的检查清单。系统提示词的核心部分长这样你是一位有20年阅卷经验的高考语文阅卷组组长。请严格依据《高考作文评分标准》批改作文满分60分基础等级·内容20分题意、中心、内容、思想基础等级·表达20分语言、文体、结构、书写发展等级20分深刻、丰富、有文采、有创新。 批改流程 1. 先用自己的话复述本文的中心论点判断是否切题。 2. 逐段检查该段是否扣题论据是否支撑观点段与段之间是否有逻辑递进 3. 分项评分每一项都要写出扣分依据引用原文原句。 4. 最终给总分、总评和三条最可执行的修改建议。关键改动有两个一是把题意检查放在最前面强制模型先复述中心论点复述得出来且切题才是高分的前提二是要求引用原文原句作为扣分依据这一步能极大抑制模型胡说。实测对比下来有了这个锚点跑题作文的分数降到了45分以下靠谱多了。3.3 结构化输出让模型返回能直接入库的JSONPrompt调优的另一半是输出结构。我要求模型返回固定格式的JSON{ central_idea: 本文的中心论点是……, is_relevant: true, sub_scores: { content: 17, expression: 16, development: 19 }, paragraph_comments: [ { range: 第2段, issue: 论据与观点脱节, quote: 原文原句, suggestion: 建议补充…… } ], overall_comment: 总评150字以内, modification_example: 对某一句话的改写示范 }直接让模型输出JSON一开始出现了不少格式问题字段名漂移、尾逗号、里层引号转义错误。我的解法是配合few-shot示例同时在代码里做容错第一次解析失败就自动让模型修正JSON最多重试两次如果还失败就把整段原始输出丢给正则表达式提取关键字段。这一套兜底逻辑在实际运行中把格式成功率从八成提到了差不多满分。3.4 few-shot示例与版本迭代效果对比few-shot示例我精选了三篇一篇52分的中等偏上作文、一篇46分的中等作文、一篇40分以下的偏题作文。每篇都带完整的批改示例相当于给模型做了手把手示范。这里有个细节few-shot示例里的评语也用引用原文具体建议的格式让模型去模仿这种批改习惯而不是模仿内容。我把几个版本的Prompt在同一个30篇测试集上做了对比版本与教师评分相关系数完全同分比例平均绝对误差v1 裸评0.317%7.8分v2 角色标准0.5817%5.2分v3 JSON结构化0.6123%4.5分v4 few-shot0.6631%3.9分这个数据说明了调优方向是对的角色设定解决立场问题评分标准解决尺度问题结构化输出解决可用性问题few-shot解决风格模仿问题。每一步都在原有的基础上往前推进了一点。4. 分数可靠性让LLM从拍脑袋变成有依据4.1 多次采样与分数聚合减少随机波动同一个Prompt在同一篇作文上跑两次分数可能相差3到5分这是LLM的温度参数带来的随机性。为了压住这种波动我采用了多次采样策略temperature设置为0.3不要降到0否则输出会变得呆板同一篇作文调用3次取三次分数的中位数作为最终分数同时把三次评语去重后合并。这样做的代价是耗时和成本变成原来的3倍但换来的是稳定性的显著提升。实测中单次评分的平均绝对误差是4.5分三次取中位数后降到3.2分左右。如果你在并发量高的生产环境用不建议对所有请求都做三次采样。可以先跑一次如果模型的置信度字段我在Prompt里要求它输出self_eval即本次批改把握程度低于某个阈值再补采能省不少成本。4.2 规则引擎兜底不让模型处理它不擅长的事错别字、字数不足、段落混乱这些硬伤让LLM检查既慢又不可靠。我在规则引擎里维护了一个常见错别字词库的地得混用、形近字等配合正则表达式做初筛再把初筛结果写进Prompt让模型复核确认。这样做的准确率远高于让模型从零开始找错。字数统计也用规则引擎。高考作文一般要求不少于800字如果文字量不足规则引擎直接在报告中置顶提示这比等模型发现靠谱得多。我的经验是凡是能用确定性算法解决的问题就不要交给LLM。LLM的价值在于处理那些没有标准答案的部分比如论证逻辑、立意深度、文采风格。4.3 用真实教师评分做回归校准即使做了这么多约束模型的分数和教师真实阅卷之间仍然存在系统性偏差。我的做法是拿一批有教师评分的真实作文做校准集跑完LLM评分后做一个一元线性回归找到从LLM分数到教师分数的映射关系。公式很简单最终分 a × LLM分 b其中a和b由校准集拟合得出。我在一个60篇样本的小数据集上做过实验LLM确实存在高分容易偏低、低分容易偏高的收敛倾向也就是给分区间偏窄。通过线性校准把52分以上的优秀段和40分以下的待努力段重新拉开最终报告就更接近教师的实际分布。这个校准过程必须定期重跑因为换模型或者改Prompt之后偏差模式会完全变化。5. 实测效果、翻车案例与落地建议5.1 小规模测试的效果数据项目做完之后我请三位在职高中语文老师帮忙拿30篇真实学生作文议论文为主兼有少量记叙文做了盲测。LLM批改的分数与教师平均分的相关系数在0.6到0.7之间不同模型差异较大更强的商用模型能达到0.75以上完全同分的约三成浮动在正负5分以内的约八成。这个数据说明什么说明LLM目前做不到精确判卷但完全做得到把作文分成大致层次。放在辅助定位下这个准确率是够用的它能把明显的好作文和明显需要重写的作文快速分拣出来让老师的精力集中在那批可上可下的中间作文上。5.2 三个典型的翻车场景第一类翻车文笔华丽但内容空洞的作文容易拿高分。模型特别容易被漂亮的排比句、名言警句带偏忽视论点是否扎实。对策是在Prompt里加重中心是否突出、论证是否充分的权重并且要求每个分项都必须引用原文证据。第二类翻车对剑走偏锋的作文评价过于保守。有一篇用书信体写家乡变化的作文教师认为很有创意给了高分但模型只给了中等分原因是文体不够标准。后来我在Prompt里加了一句议论文之外允许并认可记叙文、书信体、散文等其他文体的合理表达情况才好转。第三类翻车长作文后半段失忆。超过1200字的作文模型经常对开头记忆深刻、对结尾关注不足批注集中在前面几个段落。我用chunker把作文按段落分组先让模型对每个分段做批注再汇总成分段批注列表最后整体给分有效缓解了这个失忆问题。5.3 批改报告怎么呈现老师才愿意用一个容易被技术人忽略的点老师对AI味很敏感。如果总评全是通过您的文字我感受到了……这种空话老师会觉得不如自己写。我把输出模板改成了先点出一个最核心的问题再给一条具体的修改路径比如本文最大的问题是第二段论据方仲永的故事与论点坚持无关建议换为左思写《三都赋》的典故并在分析句指明坚持十年与论点的关联。修改示范也很有用。我让模型挑出正文中的一到两句典型病句给出改写版本并附上改写理由。这种看到具体变化的反馈学生最容易接受。我们后台统计过带修改示范的批改报告被学生查看和转发的次数远高于纯评语报告。5.4 落地成本与使用建议成本方面我粗略算过一篇800字作文输入约1500到2000个token批改输出约800到1200个token单次调用约3000个token。即使三次采样一篇总消耗约1万个token。按当前市面上主流模型API的价格一个50人的班级批量批改一次作文的成本在几块钱到十几块钱之间完全在可接受范围内。使用流程上我的建议是LLM先批改教师再审核老师拿到批改报告后调整分数和评语确认没有问题再发布给学生。这样做既保证质量又帮老师省掉八成以上的机械劳动。运行时间上如果配置了并发60篇作文大概能在10分钟到20分钟内全部批完老师冲杯咖啡的工夫就出来了。最后说一个我自己的体会。做这个项目的过程中我最深刻的感受是LLM应用的价值不取决于模型多聪明而取决于你把任务拆得多清楚、把标准定得多具体。给模型一个清晰的评分锚点、一套可执行的输出结构、几条真实可信的示例它交出来的东西就能从正确的废话变成可用的初稿。这个项目打包成zip分享出去之后有不少老师找我要使用说明我说不用什么说明把作文粘进去它给你的批改报告基本能直接改改用。你放心AI不会替你教书但它能让你从凌晨两点的批改桌上解放出来把时间留给真正需要你指导的学生。本文还有配套的精品资源点击获取