structure-completeness-distilbert-zh
License: PolyForm Noncommercial 1.0.0 — personal
learning / research / education / non-profit use only,
no commercial use.
This is a "source-available" model, not an OSI-approved open-source license
(the restriction on commercial use is the reason). See the license link for
the full text before using this model in any product or paid service.
What this model does
5-class classifier that scores the structural completeness of a Chinese
interview answer (does it follow a clear situation/action/result-style
structure vs. being disorganized rambling), as one dimension of an AI mock
interview coaching app's answer-scoring pipeline. It is not a general
Chinese text classifier and was not trained for any other task.
Output is one of 5 ordinal bands, each corresponding to a 0-10 structural
completeness score range:
| label id | band | meaning |
|---|
| 0 | 0-2 | little to no structure |
| 1 | 3-4 | minimal structure |
| 2 | 5-6 | partial structure |
| 3 | 7-8 | mostly complete structure |
| 4 | 9-10 | fully complete, clearly organized structure |
Training data
- 150 Chinese interview answers, each with a
structure_completeness score
(0-10) from a single human reviewer (no second independent rater —
see "Known limitations" below).
- Answers span 3 question types (behavioral / technical / case analysis),
50 each, balanced.
- Split: 5-fold stratified cross-validation over a 128-sample pool
(stratified jointly on question type x score band), plus a held-out test
set of 22 samples (14.7%) that never participated in any training,
validation, or early-stopping decision.
- The final checkpoint published here was trained on all 128 CV-pool
samples combined (no validation split left for early stopping), for a
fixed 14 epochs (no back-translation data augmentation — augmentation was
tried and did not help this model, see below).
Final metrics
Held-out test set (n=22, one single predict() call, never touched during
training):
| metric | value |
|---|
| exact_accuracy | 0.773 |
| macro_f1 | 0.769 |
| qwk (quadratic-weighted kappa) | 0.936 |
| within1_accuracy (+/-1 band) | 1.000 |
For reference, the 5-fold cross-validation mean on the 128-sample CV pool
(different data split, not directly comparable 1:1 to the 22-sample test
set above) was macro_f1=0.885,
qwk=0.950. The test-set macro_f1/exact_accuracy
are noticeably lower than the CV mean, which is expected given n=22 is a
small, high-variance sample; qwk and within1_accuracy stay close to the CV
mean, and every miss on the test set was an adjacent-band miss (no error
was off by 2+ bands).
Known limitations
- Test set is small (n=22). Point-estimate metrics on 22 samples have
wide, unreported confidence intervals — don't treat these numbers as
precise beyond +/-1 band roughly.
- Chinese only. All 150 training/eval samples are Chinese-language
interview answers; there is no evaluation on English or code-switched
input, and it will likely not behave sensibly on non-Chinese text.
- Single annotator. Every label came from one human reviewer with no
second independent rater, so no inter-annotator agreement metric (e.g.
Cohen's kappa) exists for the labels themselves — some fraction of any
model "error" against these labels may be label noise, not model error.
- Back-translation augmentation did not help this model. A back-
translation augmented variant (same architecture) scored slightly worse
on every metric (macro_f1 0.885->0.878, qwk 0.950->0.942, exact_accuracy
0.883->0.876, within1_accuracy 0.985->0.977, all 5-fold CV means) than
the plain (non-augmented) version this checkpoint is. The published model
is the non-augmented one.
- Small overall dataset (150 labeled examples total). This is a
small-data fine-tune, not a model trained on a large labeled corpus —
expect it to be sensitive to answer styles/topics that differ a lot from
the training distribution (3 question types: behavioral, technical, case
analysis).
- One dimension of a multi-dimension rubric. Structural completeness is
one of several scoring dimensions (alongside keyword coverage, logical
coherence, specificity) in the source project's full scoring rubric —
this model only covers structure, not overall answer quality.
Usage
1from transformers import AutoTokenizer, AutoModelForSequenceClassification
2import torch
3
4model_id = "a1a1a1aaa/structure-completeness-distilbert-zh"
5tokenizer = AutoTokenizer.from_pretrained(model_id)
6model = AutoModelForSequenceClassification.from_pretrained(model_id)
7model.eval()
8
9answer = "首先我发现了这个问题,然后评估了几个方案,最后选择了风险最低的一个并推动落地。"
10inputs = tokenizer(answer, return_tensors="pt", truncation=True, max_length=512)
11with torch.no_grad():
12 logits = model(**inputs).logits
13band_id = int(torch.argmax(logits, dim=-1))
14
15band_labels = ['0-2', '3-4', '5-6', '7-8', '9-10']
16print(f"predicted band: {band_labels[band_id]}")
Or with pipeline:
1from transformers import pipeline
2
3clf = pipeline("text-classification", model="a1a1a1aaa/structure-completeness-distilbert-zh")
4print(clf("首先我发现了这个问题,然后评估了几个方案,最后选择了风险最低的一个并推动落地。"))
Source project
Trained as part of a 10-week solo AI mock interview coaching app project.
Full training/eval code, data prep, cross-validation splits, and the
decision log documenting model selection reasoning are in the project repo:
https://github.com/Daifanqi/ai-interview-coach (
ml/train.py,
ml/common.py,
docs/week7_finetuning_results.md,
docs/decision_log.md
decisions #33-#34).