Downloads · 30 days
8
10% of all-time downloads
wchyin/qwen3-0.6b-exam2json-lora
qwen3-0.6b-exam2json-lora is a text generation model from wchyin. Use it when you need the model to write or continue text. It is set up for peft. The card lists the license as apache-2.0.
Qwen3-0.6B 的 LoRA 适配器:把中文试卷里的选择题和判断题原始文本(带题号、小节标题、 难度/分值行、答案、解析等噪声)抽取为干净、规范的 JSON。
Downloads · 30 days
8
10% of all-time downloads
All-time downloads
77
Public
Repo size
51.9 MB
Likes
0
Public
Click a slice to open those files.
.safetensors40.4 MB · 78%
From the Hugging Face model README
Qwen3-0.6B 的 LoRA 适配器:把中文试卷里的选择题和判断题原始文本(带题号、小节标题、 难度/分值行、答案、解析等噪声)抽取为干净、规范的 JSON。
完整代码(训练脚本、数据构建、约束解码推理管线、评测)见 GitHub 仓库: https://github.com/wchyin/exam2json
输入(原始试卷文本) 输出
───────────────────────── ─────────────────────────
二、判断题 → {"question": "路由器通常工作在网络层。",
难度:易 "answer": "对"}
3. 路由器通常工作在网络层。( )
正确答案:对
模型自行判断题型:
// 选择题
{"question": "题干", "options": {"A": "...", "B": "...", "C": "...", "D": "..."}, "answer": "B"}
// 判断题
{"question": "题干", "answer": "对"} // answer ∈ {"对", "错"}
question 字段自动剔除:题号(3./三十九、/第5题)、题型前缀(判断:)、句尾空括号占位(( ))、
小节标题及答案/解析行;句中有内容的括号保留。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
ADAPTER = "wchyin/qwen3-0.6b-exam2json-lora"
tok = AutoTokenizer.from_pretrained(ADAPTER)
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", torch_dtype=torch.bfloat16, device_map="auto")
model = PeftModel.from_pretrained(model, ADAPTER).merge_and_unload().eval()
# system prompt 随适配器分发(system_prompt.txt),必须与训练一致
from huggingface_hub import hf_hub_download
SYSTEM_PROMPT = open(hf_hub_download(ADAPTER, "system_prompt.txt"), encoding="utf-8").read().strip()
text = "二、判断题\n3. 路由器通常工作在网络层。( )\n正确答案:对"
messages = [{"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": text}]
inputs = tok.apply_chat_template(
messages, add_generation_prompt=True, enable_thinking=False, # enable_thinking=False 必须!
return_tensors="pt", return_dict=True,
).to(model.device)
out = model.generate(**inputs, max_new_tokens=320, do_sample=False)
print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
# {"question": "路由器通常工作在网络层。", "answer": "对"}
两个使用要点:
enable_thinking=False 必须传——适配器按无思考块的格式训练,不传会导致模型先输出
<think> 段落再给 JSON。system_prompt.txt——LoRA 是在该前缀下训练的条件分布,
换写法会造成输出偏移。GitHub 仓库里还提供生产级推理管线(lm-format-enforcer 约束解码兜底 + 确定性规范化 + 复制保真校验), 推荐实际应用时使用。
| 项目 | 说明 |
|---|---|
| 基座 | Qwen/Qwen3-0.6B(冻结) |
| 方法 | LoRA(r=16, α=32, dropout=0.05,注入 q/k/v/o/gate/up/down),trl SFTTrainer |
| 可训练参数 | ~10M(约 1.7%) |
| 数据 | 2,108 条模板合成中文试题(选择 930 / 判断 1,178),含噪声增强 |
| 超参 | lr 2e-4 cosine + warmup 100 步,有效 batch 16,3 epoch / 357 步,bf16,梯度检查点 |
| 硬件 | 单卡 RTX 4060 Laptop 8GB |
| 训练曲线 | train loss 3.41→0.12;eval loss 0.589→0.150(单调下降) |
80 条独立合成测试集(选择/判断各 40),贪心解码:
| 指标 | 数值 |
|---|---|
| JSON 可解析 / 结构正确 / answer 正确 | 100% |
| question 完全一致 | 98.8% |
| 选项完全一致 | 95.0% |
| 整条完全一致 | 96.2%(选择 95.0% / 判断 97.5%) |
剩余失败均为小模型"抄写走神"(选项抄重/错位、题干复读),可被 GitHub 仓库中的复制保真校验自动检出。
answer 照抄原文标注的参考答案,模型不做答题。