SemIf — Lokale beslissingen in je browser

Een live, lokaal experiment

SemIf maakt gebruik van "semantic ifs" vanuit open modellen, direct in je browser. Het is een beslissingsmodel dat volledig lokaal draait.

Een lokaal model kan op twee manieren werken: het kan de kansberekeningen voor de toegestaan opties lezen zonder deze te decoderen, of het kan hetzelfde type distributie token voor token schrijven. Gebruikers kunnen een modelgrootte kiezen, beide methoden op hun eigen GPU uitvoeren en het verschil meten. Het systeem werkt uitsluitend in de browser en maakt geen gebruik van een backend.

Beschikbare modellen en kwaliteit

Afhankelijk van het apparaat kan er worden gekozen uit verschillende modellen:

  • Qwen3 0.6B: Aanbevolen voor telefoons en kleine apparaten (639 MB).
  • MiniCPM5 2B: De standaardinstelling voor desktops (1,56 GB).
  • Qwen3.5 4B: Voor desktops met veel geheugen (3,01 GB).

Gemeten modelkwaliteit

De kwaliteit is gebaseerd op native checkpoints en publieke benchmarks. De waarden in de kolommen 'Owned' vertegenwoordigen de gebalanceerde nauwkeurigheid. De kolom 'TypeSafe' betreft de equal-case agreement op een publieke subset van 102 rijen. De waarde voor 'Jev' is de gepubliceerde waarde.

ModelGrootteAuthoredPerturbedTypeSafeGepubliceerde Jev (gehost)
Qwen3 0.6B639 MB44,0%52,8%40,7%——
MiniCPM5 2B1,56 GB68,6%69,3%63,7%——
Qwen3.5 4B3,01 GB81,3%76,6%84,5%——
88,3%

Let op: Browser-quantisatie kan de nauwkeurigheid van het model beïnvloeden.

Workflow en implementatie

00 / Setup: Het model laden

Het model wordt één keer geladen. De gewichten zijn afkomstig van Hugging Face en blijven opgeslagen in de browsercache. Invoer verlaat deze pagina nooit. De eerste keer laden kan enkele minuten duren, afhankelijk van het gekozen model, het netwerk en de GPU.

Het proces bestaat uit:

  1. Download/Cache: Start pas na het klikken op 'load'.
  2. Model load: Downloaden en voorbereiden.
  3. Warmup: Compilatie-passes voor beide methoden.

01 / Besluitvorming: Een keuze maken

De gebruiker kan een scenario invoeren (bijvoorbeeld voor accountondersteuning of e-mail triage) met een specifieke status, een vraag en een set toegestane opties.

Beide methoden ontvangen dezelfde beslissingsvraag: status + vraag + opties. De input gaat naar hetzelfde lokale model (bijvoorbeeld MiniCPM5 2B), dat vervolgens twee verschillende paden volgt:

02A / Directe uitlezing (Direct readout)

Hierbij worden de keuzekansen bepaald zonder decodering. Het systeem leest de choice logits van het model en normaliseert deze uitsluitend over de door de gebruiker opgegeven opties.

02B / Generatie (Generation)

Het model wordt gevraagd om dezelfde distributie van de getoonde opties te schatten en deze als JSON-tekst te schrijven, token voor token.

De methoden worden sequentieel uitgevoerd op hetzelfde geladen model om conflicten op de GPU te voorkomen: eerst de directe uitlezing, daarna de generatie. De timing van setup, warmup, prompt-voorbereiding, directe uitvoering en de generatie van tokens wordt gemeten met performance.now().

Technische toelichting

Betekenis van de resultaten

  • Conditionele kansen: De directe scores zijn een softmax over alleen de getoonde optie-tokens. Dit is geen gekalibreerde betrouwbaarheid en bevat niet elk antwoord dat het model mogelijk zou prefereren.
  • Lokale modelniveaus: Het model voor telefoons offert nauwkeurigheid op voor een kleinere omvang. MiniCPM is de standaard voor desktop. De 4B-optie vereist aanzienlijk meer geheugen. Geen van deze lokale modellen claimt Jev te evenaren.
  • Echte lokale timing: Er worden geen vooraf bepaalde resultaten getoond; alle tijden worden live gemeten.
  • Gequantiseerde gewichten: De demo maakt gebruik van vastgelegde GGUF-builds via wllama. Quantisatie kan zowel de kwaliteit als de snelheid beïnvloeden.