# Qwen3.5 4B Q8 MTP model experiment notes ## Experiment The production experiment serves `unsloth/Qwen3.5-4B-MTP-GGUF` with `Qwen3.5-4B-Q8_0.gguf`, `mmproj-F16.gguf`, and a pinned CUDA-enabled `llama.cpp` build. Modal supplies one L4 GPU and exposes a private, proxy-authenticated OpenAI-compatible endpoint. The server enables model-native speculative decoding: ```text --spec-type draft-mtp --spec-draft-n-max 2 ``` ## Measured results The in-container MTP smoke test generated 440 draft tokens, accepted 222, and reported a 50.5% acceptance rate. The projector-enabled endpoint also read the courier screenshot successfully. The original ten-case evaluation produced: | Measurement | Result | | --- | --- | | Strict passes | 9/10 | | Average judge score | 89.5/100 | | High-risk scam cases | All passed | | Screenshot cases | Both passed | | Mean case time | 9.46 seconds | | Median case time | 6.17 seconds | The only strict failure was a harmless appointment reminder. The model selected the correct `Looks normal` label, but described it as irrelevant input. The production system prompt now explicitly states that appointment reminders, shipment updates, bills, and alerts must be assessed as notices. Case time includes both candidate generation and the independent judge request, so it is not a standalone inference benchmark. After adding explicit risk-label thresholds, evidence rules, and bounded output lengths, the same evaluation passed 10/10 cases with an average judge score of 100/100. Excluding the first cold-start case, the nine warm candidate-plus-judge cases averaged about 8.5 seconds. The first case took about 95 seconds because both Modal endpoints had scaled to zero. ## Output contract The app requests and validates schema-constrained JSON containing: - `risk_label` - `simple_explanation` - `red_flags` - `safe_next_steps` - `reply_draft` Thinking is disabled for these requests so the completion budget is used for the final structured response. ## Product boundary The Modal deployment is the application's primary inference backend. It does not produce a rule-based assessment when the endpoint fails. A local endpoint can replace Modal through `MODEL_BASE_URL` and `MODEL_NAME`. ## References - [Qwen3.5 4B MTP GGUF repository](https://huggingface.co/unsloth/Qwen3.5-4B-MTP-GGUF) - [llama-server](https://github.com/ggml-org/llama.cpp/tree/master/tools/server) - [Modal web servers](https://modal.com/docs/guide/webhooks)