LoRA adapter for a real-time call-assist model. Given a speaker profile, an
objective, a context bundle and a live (speech-recognition) transcript, it emits
one natural spoken reply the speaker reads aloud. Adapter only - the base
model is not redistributed here.
Base model
Base model
Qwen/Qwen3.5-9B
Revision
c202236235762e1c871ad0ccb60c8ee5ba337b9a
Architecture
Qwen3_5ForConditionalGeneration (dense 9.65B; 32 layers as 8 x (3 x Gated DeltaNet -> 1 x Gated Attention))
Precision
bfloat16
Comparison note. Tokenizer is byte-identical to Qwen/Qwen3.6-27B (verified: 248,077 vocab entries map to identical ids; all 7,764 corpus examples render and tokenize identically), so eval loss is directly comparable across the two models. Pre-training baseline eval loss: 9B 2.935 vs 27B 2.590. Loss parity alone does NOT establish behavioral parity; see Limitations.
The checkpoint's vision tower is deliberately not adapted (linear_fc1,
linear_fc2, qkv, proj). The corpus is 100% text, so those weights would
receive no gradient signal; adapting them would add DoRA magnitude vectors that
can never be meaningfully updated.
Training data
Train examples
7,219
Eval examples
545 (held out, stratified on question_type and speech_profile)
Max sequence length
1024 tokens
Effective batch size
16
Epochs run
1.55
Optimizer / LR
adamw_torch, 2e-4 cosine, warmup ratio 0.03
Results
Metric
Value
Final train loss
1.4186
Final eval loss
1.7769
Best eval loss
1.7707 (step 400)
Optimizer steps
700
step
epoch
train loss
eval loss
0
0.00
-
2.9348
100
0.22
1.9009
1.9198
200
0.44
1.8294
1.8446
300
0.66
1.7207
1.8073
400
0.88
1.8188
1.7707
500
1.11
1.3349
1.7977
600
1.33
1.4067
1.7818
700
1.55
1.4186
1.7769
Prompt template
Trained in non-thinking mode. Qwen3.6 is a thinking model whose chat template
appends <|im_start|>assistant\n<think>\n on a generation prompt by default;
targets here are direct spoken replies with no reasoning trace, so training used an
empty think block. The training sequence is byte-identical to the inference prompt
produced with enable_thinking=False. Inference must assemble context the same
way or quality will degrade silently.
Loss is computed on the response tokens only; all prompt tokens are masked to -100.
System message
You are Jovika, a real-time call assistant. The speaker below is in a live conversation. Produce one natural spoken reply that the speaker can read aloud immediately.
Output only the reply itself. No preamble, no alternatives, no formatting, no bullet points, no em-dashes. Do not open with filler such as OK, sure, yeah, absolutely, certainly, or great question. Lead with the most important point. Write one idea per sentence in short, common words that are easy to say out loud.
SPEAKER PROFILE
Role: {role}
Seniority: {seniority}
Industry: {industry}
Background: {background}
OBJECTIVE
{objective}
DELIVERY
Speech profile: {speech_profile}
Verbosity preference: {verbosity_preference}
If persona.pronouns is present, a Pronouns: {pronouns} line is inserted
immediately after the Background: line. Fields id, question_type, domain,
messiness and has_uncommitted_tail are deliberately excluded - they are
dataset-generation metadata unavailable at inference time, and conditioning on them
would create train/serve skew. An uncommitted transcript tail is carried inline in
the transcript itself as the literal marker [UNCOMMITTED LIVE TAIL].
User message
CONTEXT DOCUMENTS
{context_bundle}
LIVE TRANSCRIPT
{transcript}
Assistant target
The response string, stripped. Rendered through the base model's own chat
template, the full training sequence is:
Accepted tradeoffs in the corpus, not defects to correct: troubleshooting responses
average 5.5 sentences against an intended 8-12 band, and roughly 47% of responses
exceed 120 words. The model was trained on the data as given.
Limitations
Not evaluated for output quality against a frontier baseline; only train/eval loss
are reported here. The adapter inherits the base model's licence (Apache-2.0).