EDU-Jev-0.8B

Edu-Jev technical report

EDU-Jev-0.8B is a single-pass decision model for education. You give it the material to judge (a student answer, a response, a solution, ...) and one question with K options. In one forward pass it returns one score per option. It generates no text.

It is a Qwen3.5 text backbone with a pointer head. The hidden state at each option's <opt> marker is compared with the hidden state at the final <|decide|> marker, and the K logits come out in the order the options were given. softmax over them is the model's distribution over the options.

Files

file content
model.safetensors weights (fp32)
config.json model configuration
tokenizer.json, tokenizer_config.json tokenizer, with the six input markers added
chat_template.jinja the input format (below)
configuration_edujev.py, modeling_edujev.py model code, loaded with trust_remote_code=True

Input format

The chat template defines the input. A request has one optional state message and exactly one question message:

messages = [
    {"role": "state", "content": {
        "question": "What is 3 × 4?",
        "reference_answer": "12",
        "student_answer": "twelve",
    }},
    {"role": "question", "content": {
        "type": "choice",
        "instructions": "Is the student's answer correct?",
        "options": ["correct", "incorrect"],
    }},
]

State fields. All are optional. They are rendered in this fixed order, and empty values are skipped:

passage, context, question, reference_answer, rubric, key_points, solution_steps, text, dialogue, student_answer, candidate_response

  • A string is used as it is.
  • A list becomes - item lines.
  • A dict becomes - key: value lines.
  • solution_steps is a list of steps.
  • dialogue is a list of {"role": ..., "text": ...} turns.

Any other key is an error.

Question.

key values
type choice (pick one option), score (options are score levels, listed low → high), noul (two options, yes / no)
instructions what to decide
options K ≥ 2 option texts (strings, or {"text": ...})
lang optional: en (default) or zh (Chinese field labels)
label_scheme optional: keep the default none (plain option texts)

Give the model the context a human grader would need, such as the question, the reference answer, the rubric or the key points. Scores are only meaningful relative to that context.

Rendered text. For the example above:

<|state|>
Question: What is 3 × 4?
Reference answer: 12
Student answer: twelve
<|question|> [choice]
Is the student's answer correct?
<|options|>
correct<opt>
incorrect<opt>
<|decide|>

Marker strings that appear inside user text are escaped, so they never act as markers.

Usage

import torch
from transformers import AutoModel, AutoTokenizer

repo = "jiazhengli/edu_jev-0.8B"
tok = AutoTokenizer.from_pretrained(repo, trust_remote_code=True)
model = AutoModel.from_pretrained(repo, trust_remote_code=True, dtype=torch.bfloat16).eval()

enc = tok.apply_chat_template(messages, tokenize=True, return_dict=True, return_tensors="pt")
with torch.no_grad():
    out = model(**enc)
probs = out.logits.softmax(-1)[0]   # one probability per option, in the order given
print(dict(zip(messages[1]["content"]["options"], probs.tolist())))

Batches. Render each request, then pad on the right (the tokenizer's default):

texts = [tok.apply_chat_template(m, tokenize=False) for m in batch]
enc = tok(texts, padding=True, return_tensors="pt", add_special_tokens=False)
out = model(**enc)    # out.logits: [B, K_max]; slots past out.num_options[b] are -inf

The kwargs form suits OpenAI-style APIs that only accept string message content:

tok.apply_chat_template([{"role": "user", "content": ""}], state={...}, question={...}, tokenize=False)

With vLLM, pass state and question as chat_template_kwargs.

Option order. The model sees the options in display order. For more stable probabilities, you can average them over a few option orders, for example the given order and its reverse. Keep score options low → high.

Requirements

  • transformers with Qwen3.5 support (5.x).
  • flash-linear-attention and causal-conv1d are optional. They speed up the linear-attention layers on GPU; without them a slower PyTorch path is used.

Limitations

  • The output is a distribution over the options you provide. It is not a free-text judgement or explanation.
  • Decisions on high-stakes assessments should be reviewed by a person.

License

CC BY-NC 4.0. The base model, Qwen3.5-0.8B-Base, has its own license.

Downloads last month
41
Safetensors
Model size
0.8B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for jiazhengli/edu_jev-0.8B

Finetuned
(169)
this model

Paper for jiazhengli/edu_jev-0.8B