Text Generation
PEFT
Safetensors
Chinese
lora
qwen3
information-extraction
structured-output
json
chinese
exam-questions
conversational
Instructions to use wchyin/qwen3-0.6b-exam2json-lora with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use wchyin/qwen3-0.6b-exam2json-lora with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B") model = PeftModel.from_pretrained(base_model, "wchyin/qwen3-0.6b-exam2json-lora") - Notebooks
- Google Colab
- Kaggle
qwen3-0.6b-exam2json-lora — 中文试题结构化抽取(LoRA 适配器)
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 必须用随附的
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 仓库中的复制保真校验自动检出。
局限性
- 训练/测试均为模板合成的计算机基础类试题;OCR 文本、其他学科、其他排版下未验证。
- 选择题固定 A–D 四选项;不支持多选题。
- 假设输入为单道题;多题文本需上游切分。
answer照抄原文标注的参考答案,模型不做答题。
- Downloads last month
- 16