English Continuation-Writing Evaluator (LoRA)

面向高中英语「读后续写」的 LoRA 适配器,基于 Qwen/Qwen2.5-7B-Instruct 微调。

说明:本仓库是 2025 年高中阶段的一个个人项目产物,不是研究成果,训练与评测都不严谨。公开它,主要是留一份可复现的记录。


Model description

这是一个 Analyzer / Optimizer 两件套,服务于「读后续写」的教与学:

仓库 作用
...-Analyzer 拆题 + 批改(两段式,见下)
...-Optimizer 在原文基础上给出改写版本与改动说明

Analyzer 的两种模式

  1. Prompt Analysis Mode
    • 输入:读后续写题目原文(含两段开头句)
    • 输出:结构化的题目分析——主题、人物关系、情节走向要求、文体与语言期待
  2. Essay Evaluation Mode
    • 输入:题目原文 + 上一步生成的题目分析 + 学生续写作文
    • 输出:结构化批改——连贯性、语言使用、情节一致性、改进建议

两段式的好处是:批改时有「题目要求」作为参照,而不是让模型凭空评判。代价是错误会累积。


数据

  • 来源:广西南宁某中学高二年级 6 次校内英语考试的读后续写答题卡扫描件(高二上:月考一 / 期中 / 12 月月考 / 期末;高二下:月考一 / 期中)。
  • 规模:904 篇学生作文,每篇两段,每篇都带真实阅卷分数(满分 25)。
  • 处理流程:
    1. 扫描件 OCR 提取文字;
    2. 用 Qwen2.5 对识别结果做图像校正,再逐篇人工复核(OCR 错字、分数与正文对不上是常态);
    3. 隐去学生姓名,只保留正文与分数;
    4. 以真实分数与原文为输入,生成「题目分析 / 批改」与「改写」两类语料。

数据不含任何可识别个人身份的信息;原始扫描件未公开。


Training procedure

Hyperparameters

项 值
base model Qwen/Qwen2.5-7B-Instruct
method LoRA(云 GPU,LLaMA-Factory)
learning_rate 5e-05
lr_scheduler cosine
num_epochs 6.0
train_batch_size 2
gradient_accumulation_steps 8
total_train_batch_size 16
eval_batch_size 8
optimizer Adam (betas=(0.9, 0.999), eps=1e-08)
seed 42

Framework versions

  • PEFT 0.12.0
  • Transformers 4.45.2
  • PyTorch 2.4.1+cu121
  • Datasets 2.21.0
  • Tokenizers 0.20.1

已知问题

  1. 重复输出:模型经常在写完一遍后继续重复,不产生停止符(EOS)。当时只剩两三天,没有从数据格式或训练配置上解决,只在推理端做了检测:发现重复即截断。这不是修复,是绕过。
    • 未验证的猜测:① 数据模板未在 labels 中包含 EOS,模型从未学过「何时停止」;② 语料只有几百条,训 6 个 epoch 偏多,过拟合导致退化重复。两条都没来得及验证。
  2. 没有标准化评测:只用少量作文做过人工对比,感觉比基座模型更像样;没有 benchmark,也没有评分一致性检验。
  3. 过拟合风险:语料来自单一学校、单一题型,换题型或换学校大概率失效。
  4. 模型不预测分数:分数只用于构造语料,不是预测目标。

用法

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

base = "Qwen/Qwen2.5-7B-Instruct"
tok = AutoTokenizer.from_pretrained(base)
model = AutoModelForCausalLM.from_pretrained(base, device_map="auto", torch_dtype="auto")
model = PeftModel.from_pretrained(model, "CCsky123/Qwen2.5-7B-Instruct-Eng-ContinueWriting-Analyzer")

prompt = "请分析下面这道读后续写题目:\n" + passage
msgs = [{"role": "user", "content": prompt}]
text = tok.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True)
out = model.generate(**tok(text, return_tensors="pt").to(model.device), max_new_tokens=512)
print(tok.decode(out[0][len(tok(text)["input_ids"]):], skip_special_tokens=True))

许可

仅限学习与研究使用。学生作文数据不随仓库分发。

Downloads last month
20
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for CCsky123/Qwen2.5-7B-Instruct-Eng-ContinueWriting-Analyzer

Base model

Qwen/Qwen2.5-7B
Adapter
(2889)
this model