---
title: edujev-1.1
canonical_url: "https://www.modelscope.cn/models/fuyu2009/edujev-1.1"
md_url: "https://www.modelscope.cn/models/fuyu2009/edujev-1.1.md"
repository: fuyu2009/edujev-1.1
chinese_name: "EduJev 1.1 学科主观题批改模型"
last_updated: 2026-10-24
license: apache-2.0
pipeline_tag: text-classification
tasks:
  - text-classification
base_model:
  - convaiinnovations/laya
base_model_relation: finetune
parameters: 321.9M
tensor_type:
  - F16
library_name:
  - transformer
  - safetensors
language:
  - zh
  - en
downloads: 4
stars: 0
tags:
  - laya
  - education
  - automated-short-answer-grading
  - short-answer-scoring
  - calibrated-decisions
  - modernbert
  - text-classification
  - system-one
---

# edujev-1.1

> edujev-1.1 - fuyu2009 在 ModelScope 开源的模型。Calibrated short-answer grading model for K-12 STEM, fine-tuned from Laya (Apache-2.0).

fuyu2009/edujev-1.1 是 ModelScope 魔搭社区上的 321.9M 参数text-classification模型，采用 apache-2.0 许可，基于 convaiinnovations/laya 构建。

- **Repository**: fuyu2009/edujev-1.1
- **License**: apache-2.0
- **Tasks**: text-classification
- **Parameters**: 321.9M
- **Base model**: convaiinnovations/laya
- **Tags**: laya, education, automated-short-answer-grading, short-answer-scoring, calibrated-decisions, modernbert, text-classification, system-one
- **Downloads**: 4
- **Stars**: 0
- **Last updated**: 2026-10-24

Source: https://www.modelscope.cn/models/fuyu2009/edujev-1.1

---

# EduJev 1.1 — 学科主观题批改模型

**EduJev 1.1** 是一个面向 K-12 学科主观题的自动批改模型。给它一段「题目 + 学生作答」，它在**一次前向传播**内返回三类结构化判定，并附带经过标定的把握度（confidence）。它不生成自然语言，因此不存在解析错误，也不会编造评语。

本模型是 [Laya multilingual](https://huggingface.co/convaiinnovations/laya) 的**二次微调派生版本**（supervised fine-tuning），不是从零训练的模型。编码器为 ModernBERT 架构，共 **321,908,998** 参数。

> 关于定位：Laya 原本是面向邮件分流、工单路由等通用决策场景的模型。EduJev 把它迁移到了教育批改领域——保留其「一次前向、结构化输出、概率标定」的形态，把决策内容换成批改用的三类判断。

---

## 一、能做什么

模型支持三种题型的判定原语（沿用 Laya 的命名）：

| 题型 | API 名称 | 含义 | 输出 |
|---|---|---|---|
| 找错因 | `choice` | 从给定的错误类型列表中选出最匹配的一项 | 各类别概率分布 |
| 打分 | `score` | 按评分档位（0~9 档）给出整体分数 | 10 档概率分布 |
| 判断 | `noul` | 判断某个步骤 / 说法是否正确 | P(True) |

三类题型**在同一次前向中一并计算**，因此一份含多个小题的作业只需一次模型调用。

---

## 二、输入格式

每条记录是一个 JSON 对象。`state` 是共享上下文（题目 + 学生作答），`questions` 是挂在这段上下文上的若干问题：

```json
{
  "state": "考试题目：\n13. (5 分) 已知 a 与 b 为两个垂直的单位向量 ...\n\n学生作答：\n$k=0$ 或者 $k=1$",
  "questions": {
    "total_score": {
      "type": "score",
      "instructions": "请给出该题的整体得分档位。"
    },
    "step_1_err": {
      "type": "choice",
      "instructions": "第 1 步的推导是否存在错误？若有，属于哪一类？",
      "criteria": { "无错误": "...", "符号错误": "...", "计算错误": "..." }
    },
    "step_2_ok": {
      "type": "noul",
      "instructions": "第 2 步的推导是否正确？"
    }
  }
}
```

要点：

- `type` 必须是 `choice` / `score` / `noul` 之一
- `choice` 必须提供 `criteria`（选项字典），模型在选项间做 softmax
- `score` 不需要额外字段，输出固定 10 档分布
- `noul` 不需要额外字段，输出 P(True)
- `state` 超过 1024 token 会被**静默截断**（见「局限」一节）

---

## 三、快速开始

```bash
pip install -r requirements.txt
python infer.py --model-dir . --input example.jsonl
```

`infer.py` 只依赖 `laya`（pip 包，本模型在 `0.3.24` 上验证）与 `transformers`，不依赖任何项目内部代码。

最小代码片段：

```python
import json, torch
from safetensors.torch import load_file
from transformers import AutoTokenizer
from laya.common import QTYPES, amp_dtype, build_model, build_sequence, render_options

MD = "."  # 本仓库根目录

cfg = json.load(open(f"{MD}/rl_agent_config.json", encoding="utf-8"))
tok = AutoTokenizer.from_pretrained(f"{MD}/tokenizer")
model = build_model(cfg, encoder_dir=f"{MD}/encoder")
model.load_state_dict(load_file(f"{MD}/model.safetensors"), strict=True)
model.eval().to("cuda")

state = "考试题目：...\n\n学生作答：..."
q = {"type": "noul", "instructions": "第 2 步是否正确？", "crit": {}}

seq, markers = build_sequence(tok, state, {"t": q["type"], "ins": q["instructions"],
                                          "crit": q.get("crit", {})},
                              cfg["max_len"], cfg["head_max_len"])

with torch.no_grad(), torch.autocast("cuda", dtype=amp_dtype(cfg["amp_dtype"])):
    logits, _ = model(
        torch.tensor([seq]).to("cuda"),
        torch.ones(1, len(seq), dtype=torch.long).to("cuda"),
        torch.tensor([markers]).to("cuda"),
        torch.ones(1, len(markers), dtype=torch.bool).to("cuda"),
        torch.tensor([QTYPES[q["type"]]]).to("cuda"),
    )

k = len(markers)
probs = torch.softmax(logits[0, :k].float(), -1).tolist()
print(probs)   # noul 时 probs[0][1] 即 P(True)
```

---

## 四、把握度与温度标定

模型输出的原始概率存在系统性过自信。本仓库在 `rl_agent_config.json` 的 `temperature` 字段提供了在批改验证集上拟合的标定温度：

```json
"temperature": [3.68488, 5.15, 6.383389]
```

顺序为 **choice / score / noul**。温度缩放**在 logit 空间**进行，即 `softmax(z / T)`；对已归一化的概率做等价操作是 `softmax(log(p) / T)`（数学上严格等价，见 `infer.py` 注释）。

标定前后的期望校准误差（ECE，越低越好）：

| 题型 | ECE（未标定，τ=1） | ECE（标定后） |
|---|---|---|
| choice | 0.1494 | **0.1176** |
| score | 0.1821 | **0.0608** |
| noul | 0.1400 | **0.0737** |

> 如果你在自己的数据分布上使用，**建议重新拟合温度**，不要直接沿用这组值。

![温度标定对期望校准误差的改善](figures/fig10_calibration.svg)

*图：三个题型的 ECE 随温度 τ 的变化。菱形标记为交付采用的温度点（choice 3.68 / score 5.15 / noul 6.38）。*

---

## 五、实测表现

评测卷：365 条记录 / 2,394 道题，来源为 SAS-Bench（中文 K-12 学科主观题，含人工标注的整体分、分步分与错误类型）。推理长度 `max_len=1024`。

| 指标 | 数值 |
|---|---|
| **整体准确率** | **73.48%** |
| 找错因 `choice` 准确率 | 61.12%（macro F1 0.5034） |
| 打分 `score` 准确率 | 54.25%（macro F1 0.2831） |
| **打分平均绝对误差 MAE** | **1.2110 档** |
| 打分 ±1 档内比例 | 72.05% |
| 判断 `noul` 准确率 | 85.88%（macro F1 0.8587） |

### 与未微调底座的对比（同卷同构成）

| 指标 | 未微调底座 | EduJev 1.1 | 变化 |
|---|---|---|---|
| 整体准确率 | 38.64% | 73.48% | **+34.84pp** |
| 打分 MAE | 3.8877 | 1.2110 | **−68.8%** |
| 打分 macro F1 | — | 0.2831 | 微调前近乎不可用 |

![微调过程的三题型准确率与打分误差演进](figures/fig03_training_progress.svg)

*图：从零样本到 EduJev 1.1 的四轮演进。柱为三题型准确率（左轴），折线为打分 MAE（右轴，越低越好）。*

### 推理速度

在 **RTX 4050 Laptop（6 GB 显存）** 上、`batch=1`、bf16 混合精度实测：

| 场景 | 吞吐 | 单题耗时 | 整卷耗时 |
|---|---|---|---|
| 单卷 2,364 题 | **34.63 题/秒** | 28.4 ms（p90 33.1 ms） | **68.3 秒** |
| 全量 37,036 题 | 37.33 题/秒 | 26.7 ms | 16 分 32 秒 |

显存峰值约 **1.50 GiB**。批处理（batch > 1）在此规模下**不带来吞吐收益**，实测为严格线性增长，故建议保持 `batch=1`。

### 完整文档与全部 12 张图

| 文件 | 内容 |
|---|---|
| [`docs/technical-report.md`](docs/technical-report.md) | **完整技术报告**（五章）：问题陈述 → 方案设计 → 实测验证 → 局限说明。每个数字都标注来源 |
| [`docs/figures.md`](docs/figures.md) | 12 张图的图题、图注、解说与注意事项 |
| [`docs/figures/`](docs/figures/) | 12 张 SVG 图源（本页只内嵌 3 张），全部由实测数据绘制 |

图中的 System2 / 云端复核部分（图 1、6、7、9）描述的是方法与实测结果；云端调用代码未包含在本仓库（涉及第三方商业 API）。**本地模型可完全离线运行**，`infer.py` 不依赖云端。

---

## 六、局限（请务必读完再用）

1. **长上下文会被截断。** `max_len=1024`，主评测卷中 **43.65%** 的题目超出该长度，平均丢失 409 token。截断对打分题伤害最大：未截断的题 MAE 0.9514，已截断的题 MAE 1.4778。**如果你的学生作答较长，请自行评估截断带来的精度损失。**
2. **打分档位分布极不均衡。** 训练数据中 0 档占 36%、9 档占 20%，两端合计 56%。这导致 macro F1（0.2831）远低于准确率（54.25%）——模型倾向于押两端，中间档（尤其 7 档，仅占 2.5%）识别能力弱。
3. **`noul` 的把握度不可用于分流。** 97.99% 的判断题把握度恰好等于 1.000，而实际准确率只有 85.88%。该题型**不应用置信度阈值来决定「是否送人工复核」**，会失效。若需分流判据，应改用 top-1 与 top-2 的 logit 间隔。

   ![三类题型给出的把握度分布](figures/fig11_confidence_dist.svg)

   *图：三类题型的把握度分布（按占本类型比例）。判断题（最右一组）几乎全部堆在 1.0 附近，把握度对它没有区分度。*
4. **仅覆盖中英文 K-12 学科主观题。** 训练数据为此领域，跨学科、跨学段或开放域文本的表现未经验证。
5. **不生成评语。** 模型只输出档位与概率，不给自然语言反馈。若需要评语，需另行接一个生成模型（本项目未包含）。
6. **把握度是标定后的相对值，不等于正确率。** 请在自己的分布上重新验证 ECE 后再用于自动化决策。

---

## 七、训练与许可

- **底座**：[convaiinnovations/laya](https://huggingface.co/convaiinnovations/laya) multilingual（Apache-2.0），编码器为 [jhu-clsp/mmBERT-base](https://huggingface.co/jhu-clsp/mmBERT-base)（Apache-2.0）
- **微调方式**：在原有权重上做监督微调，**未增删任何层**，参数量与底座一致（321,908,998）
- **训练数据**：SAS-Bench（Apache-2.0，附带「仅限研究用途」声明）+ TAL-SCQ5K（MIT）+ 少量同源整理数据
- **本仓库不包含任何训练数据**

许可证为 **Apache License 2.0**。详见同目录的 `LICENSE` 与 `NOTICE`——`NOTICE` 中给出了上游归属、相对底座的修改清单，以及关于训练数据许可的说明。

**若你打算商用**：底座与代码部分许可清晰（Apache-2.0，允许商用），但训练数据中的 SAS-Bench 附有「仅限研究用途」声明。模型权重是统计产物、不含数据原文，通常不构成对数据集的再分发；但这一判断涉及具体法域，建议在使用前自行做合规评估。

---

## 八、引用

```bibtex
@misc{edujev2026,
  title  = {EduJev: A Calibrated Short-Answer Grading Model Fine-tuned from Laya},
  author = {Fu, Yu},
  year   = {2026},
  note   = {Base model: convaiinnovations/laya (Apache-2.0)},
  url    = {https://huggingface.co/fuyu2009/edujev-1.1}
}
```

底座与数据集：

```bibtex
@misc{laya2026,
  title  = {Laya: A Non-Autoregressive System 1 Decision Model},
  author = {{Convai Innovations}},
  year   = {2026},
  url    = {https://huggingface.co/convaiinnovations/laya}
}

@article{lai2025sasbench,
  title   = {SAS-Bench: A Fine-Grained Benchmark for Evaluating Short Answer
             Scoring with Large Language Models},
  author  = {Lai, Peichao and Zhang, Kexuan and Lin, Yi and Zhang, Linyihan and
             Ye, Feiyang and Yan, Jinhao and Xu, Yanwei and He, Conghui and
             Wang, Yilei and Zhang, Wentao and Cui, Bin},
  journal = {arXiv preprint arXiv:2505.07247},
  year    = {2025}
}
```
