← Blog

AI agents

Lokale coding models: 14 fouten van een SaaS-founder

Het is dinsdagavond 22:14. Je technische co-founder stuurt je een HN-thread waarin een 32B-model Claude vervangt. Voor je die GPU bestelt: lees dit eerst.

Jacob Molkenboer· Oprichter · A Brand New Company· 28 nov 2025· 8 min
Messing relais en gevouwen telegram op ivoren bureau, groene memo, donkergroen leren onderlegger, licht van zijraam.

Het is dinsdagavond 22:14. Je technische co-founder stuurt je een Hacker News-link met de titel "Ik heb Claude vervangen door een lokaal model en mijn team is sneller." Zes minuten later wordt het bericht een vraag: bestellen we deze week een RTX 6000 Ada, of redden we het met de 4090 die al op kantoor staat?

Je leest de thread onderweg naar bed. Tegen de ochtend is de vraag uitgehard tot een budgetaanvraag, een Notion-doc en een mening die je nog niet hebt. Wij hebben coding workflows gebouwd op zowel hosted als lokale stacks voor klanten van twee tot veertig zitplaatsen, en steeds komen dezelfde veertien fouten terug. Sommige los je op in één ollama config-blok. Sommige dwingen je tot een hardware-rebuild voor de volgende sprint begint. De truc is weten welke welke is, voor je het geld uitgeeft.

De HN-thread, kort

De vooruitgang is echt. Qwen2.5-Coder-32B sloot eind 2024 het grootste deel van het gat op coding-specifieke benchmarks. DeepSeek-Coder-V2 en Llama 3.3 volgden. De "ik heb X vervangen door lokaal"-posts liegen niet. Ze laten meestal drie dingen weg: welke taak ze er echt op draaien, welke context length ze gebruikten, en hoe groot hun team is. De fouten hieronder staan op volgorde van wat ze kosten om op te lossen.

Niveau 1: het soort dat één ollama config-aanpassing oplost

Heeft je co-founder een middag ollama geïnstalleerd en kwam hij terug met "het werkt wel, maar het is een beetje dom", check dan eerst deze vijf. Geen daarvan vraagt om nieuwe hardware. Vier van de vijf zitten in ollama's defaults, die zijn ingesteld op "draait op elke laptop", niet op "is het beste model dat mijn hardware aankan".

1. Het 2048-token context window

Ollama zet num_ctx standaard op 2048 tokens. Daar past één kort bestand in. Een echte coding-sessie heeft het bestand dat je bewerkt, twee bestanden die het importeert, een interface-definitie en een docstring nodig. Het model is niet dom. Het is blind.

# Modelfile
FROM qwen2.5-coder:32b
PARAMETER num_ctx 32768
PARAMETER num_predict 4096

32k is het minimum voor serieus werk. 65k als je VRAM het toelaat. Herbouw met ollama create qwen-coder -f Modelfile en benchmark opnieuw.

2. KV-cache quantization uitgelaten

De K/V-cache eet VRAM sneller op dan de model weights zodra je context boven de 16k duwt. Ollama's OLLAMA_KV_CACHE_TYPE=q8_0 halveert de cache-kosten met een kwaliteitsverlies dat zo klein is dat geen enkele developer het bij autocomplete merkt. Bij multi-turn agent loops is het verlies groter. Test het op je eigen taak voor je het vastlegt.

3. Verkeerd num_gpu layer-aantal

Op een 24GB-kaart die een 32B Q4-model draait, laat ollama's autodetect soms zes layers op de CPU staan en zie je 9 tok/s waar het 35 zou moeten zijn. Zet PARAMETER num_gpu 65 (of welk layer-aantal jouw model ook heeft) expliciet. Kijk naar nvidia-smi tijdens generatie. Blijft VRAM-gebruik onder 90%, dan heb je nog ruimte en lekt er werk naar de CPU.

4. De default quant pullen

De tag qwen2.5-coder:32b mapt meestal op Q4_K_M. Prima voor chat. Voor code is Q5_K_M of Q6_K de grens waar mijn eigen team het verschil met FP16 niet meer merkt. De download is één extra commando. Het kwaliteitsverschil op een refactor van 200 regels is niet subtiel.

5. Geen coding template

Generieke chat-templates wrappen user messages in "You are a helpful assistant". Coding models komen mét FIM-tokens (fill-in-the-middle) en prefix/suffix-structuur. Stuurt je continue.dev- of aider-config gewone chat completions naar een coder-model, dan benut je misschien 60% van wat het kan. De meeste editor-plugins regelen dit als je de model family doorgeeft. Check het config-bestand. Het is één regel.

Niveau 2: het soort dat voor vrijdag een workflow-wijziging vraagt

Deze vragen een middag, geen nieuwe kaart. Schuif je sprint om, bestel geen onderdelen.

6. Verkeerde model family

Llama 3.3 70B is een goed algemeen model. Het is geen coding-model. Pulde je co-founder het omdat een HN-comment zei "70B versloeg Sonnet op MMLU", dan koos hij de verkeerde as. Qwen2.5-Coder, DeepSeek-Coder-V2 en Codestral zijn getraind op code. De 32B coder doet jouw repo beter dan een 70B generalist en gebruikt een derde van de VRAM.

7. Geen draft model voor speculative decoding

Een 32B target koppelen aan een 1.5B draft model uit dezelfde familie geeft je 1,6x tot 2,2x throughput op de meeste coding-loads zonder kwaliteitsverlies. De meeste teams zetten het niet aan omdat de default werkt. De default laat ongeveer 40% inference-snelheid liggen.

8. Single-seat aanname

De HN-poster werkte alleen, om middernacht. Jouw team is vijf mensen die om 14:00 zitten te typen. Eén ollama-server kan requests batchen, maar alleen als je hem start met OLLAMA_NUM_PARALLEL=4 en OLLAMA_MAX_LOADED_MODELS=2. Zonder die flags vormen requests een wachtrij. Je senior vraagt een autocomplete en wacht drie seconden terwijl een junior midden in een refactor zit.

9. Agent loops op een model dat niet tool-getuned is

Je coding-workflow gebruikt waarschijnlijk multi-step tool use: bestand lezen, bewerken, tests draaien, output lezen. De meeste coder-modellen zijn getuned op single-turn completion, niet op function-calling-ketens. Stuur er een agent loop op af en de JSON valt uit elkaar bij turn drie. Pak ofwel een model met function calling in de card (Qwen2.5-Coder-Instruct hanteert lichte loops) of houd agent-werk op het hosted model en gebruik lokaal alleen voor completion.

10. Geen prompt-cache strategie

De hosted APIs geven je flinke korting op cached prefixes. Lokaal geeft je dezelfde versnelling gratis, maar alleen als je editor de prefix hergebruikt. Stuurt elke toetsaanslag een verse "hier is mijn hele repo, ga door", dan betaal je elke keer volle prefill-latency. Aider doet dit goed. Sommige Continue.dev-configs niet. Check het voor je het model de schuld geeft.

Niveau 3: het soort dat voor de volgende sprint een nieuwe GPU vraagt

Komt je eerlijke inschatting van codebase, teamgrootte en context length hier uit, dan redt geen config je. Bestel onderdelen.

11. VRAM-tekort

Een 24GB RTX 4090 draait een 32B coder op Q4 met 16k context als je oplet. Push naar 32k context met KV-cache op Q8 en je zit op 22,4GB voor de cache überhaupt groeit tijdens generatie. Eén lange sessie en je gaat OOM. De RTX 6000 Ada op 48GB is de volgende stabiele trede. De Pro 6000 Blackwell op 96GB is de trede daarna, en tenzij je traint, is dat overkill voor een team van vijf.

12. Geen multi-GPU plan

Eén 4090 bedient één developer goed, twee acceptabel, drie matig. Is je team vijf groot, dan heb je of een kaart op formaat voor batched inference (de 48GB- of 96GB-klasse) nodig, of twee kaarten met vLLM ervoor. Ollama parallelliseert niet zo netjes over kaarten als vLLM. Dat is net zo goed een stack-wijziging als een hardware-wijziging.

13. Stroom, koeling en geluid in een Nederlands kantoor

Een workstation dat onder load 450W trekt in een kantoor van 12 m² in Amsterdam tegen €0,34/kWh kost €1,30 per werkdag aan stroom alleen, en de kamer is om 16:00 vier graden warmer. Een datacenter-kaart met blower-fan is luid genoeg dat niemand ernaast wil zitten. Heb je geen serverhok met eigen lucht, dan heb je net een kachel gekocht waar je team in augustus de pest aan heeft.

14. Storage-I/O voor model swap

Vraagt je workflow een coder-model voor bewerken én een apart model voor review, dan ga je 20 tot 40 GB aan weights wisselen tussen schijf en VRAM. Een SATA-SSD doet er 90 seconden over. Een PCIe 4.0 NVMe 12. PCIe 5.0 doet 6. Op dagbasis is dit klein. Op "developer breekt zijn flow tijdens het wachten"-basis is dit het verschil tussen lokaal dat snel voelt en lokaal dat voelt als C++ compileren in 2008.

De benchmark die niemand draait

De MMLU-score is voor jou irrelevant. HumanEval komt dichterbij, maar is nog steeds niet jouw codebase. Voor je beslist: pak twintig echte taken uit de git log van de vorige sprint. Voer ze elk in bij het kandidaat-model lokaal, op de context length die je daadwerkelijk gebruikt, met de editor-integratie die je daadwerkelijk gebruikt, op de hardware die je daadwerkelijk hebt. Scoor ze zelf op een viertraps schaal: geleverd, geleverd na bijwerken, fout maar in een nuttige richting, waardeloos.

Belandt 80% van de taken in de bovenste twee bakken, dan heb je je antwoord. Zo niet, dan heb je nog een Niveau 1- of Niveau 2-fout op te lossen.

Wanneer lokaal echt wint

Niet elk lokaal-vs-hosted-argument is een statusspel. Lokaal is de juiste keuze als je data het pand niet uit mag (medisch, juridisch, defensie-onderaannemers die hun MSAs ook echt lezen), als tab-complete latency onder 100 ms belangrijker is dan piekkwaliteit, of als de helft van je team code schrijft in de trein en offline dezelfde ervaring wil. Voor de meeste SaaS-teams onder de €20M die een CRUD-product aan andere bedrijven leveren, geldt geen van die punten, en het eerlijke antwoord is dat hosted met een zorgvuldige prompt-cache strategie nog steeds wint op kosten per kwaliteitseenheid.

Let op

De duurste fout is niet de verkeerde laag kiezen. Het is de RTX 6000 eerst kopen en dan ontdekken dat het echte probleem het 2048-token default context window was.

Wat je morgenochtend doet

Voor de budgetaanvraag naar de bank gaat: pak een uur, zet num_ctx op 32768, zet OLLAMA_KV_CACHE_TYPE op q8_0, pull de Q5_K_M-tag en draai dezelfde twintig taken opnieuw. Wil je co-founder daarna nog steeds de GPU, teken dan de bestelling. Toen we vorig kwartaal de assistant-stack opnieuw bouwden voor een Rotterdamse SaaS-klant, bespaarde precies deze volgorde ze een kaartaankoop van €7.200 en bleek het echte probleem een Continue.dev-config die gewone chat completions naar een coder-model stuurde. Het werk dat we doen rond AI-agents begint bijna altijd met een van die vijf Niveau 1-fixes.

Kern

Vier van de vijf snelle fixes voor een traag lokaal coding model zitten in ollama's default-config. Check die voor je de GPU-bestelling tekent.

FAQ

Welk lokaal coding model probeer ik in 2026 als eerste?

Qwen2.5-Coder-32B-Instruct op Q5_K_M is de veiligste eerste poging voor algemeen repo-werk. DeepSeek-Coder-V2 Lite is het lichtere alternatief als VRAM krap is.

Bedient één RTX 4090 een team van vijf developers?

Comfortabel voor twee zitplaatsen, met batching aan acceptabel voor drie, slecht voor vijf. Schuif door naar een 48GB-kaart of draai vLLM over twee GPU's voor je zitplaatsen toevoegt.

Is lokaal goedkoper dan hosted op onze teamgrootte?

Onder de tien zitplaatsen is hosted met prompt caching meestal goedkoper zodra je stroom, koeling en engineer-tijd voor het onderhoud van de inference-stack meetelt.

Kan een lokaal model agent loops met tool calls aan?

Alleen als het op function calling is getuned. Qwen2.5-Coder-Instruct hanteert lichte loops. Voor multi-step agents met vertakkende tool use houd je een hosted model in de loop.

ai agentstoolingarchitecturestrategyoperations

Iets bouwen?

Start een project