Een lokale AI - inclusief een (soort van) vangnet
Al een tijdje loop ik met een vraag rond die eigenlijk vóór alle andere komt: niet welke AI ik gebruik, maar waar die draait. Mijn hele setup hier thuis is gebouwd op één principe: lokaal als het kan, online als het moet. Nextcloud in plaats van Google Drive, Navidrome in plaats van Spotify, Pi-hole tegen de tracking. Maar de AI waar ik dagelijks mee spar, draaide nog gewoon in de cloud. Dat kon vast anders.
Dus toen er een tweedehands mini-pc op de kop te tikken was - een nette Lenovo met genoeg geheugen om een fatsoenlijk taalmodel te draaien - was de keus snel gemaakt. Die machine heet inmiddels pilab, en daarop draait sinds kort Fietje.
Waarom niet gewoon Claude lokaal?
Heel eerlijk: dat kan niet. De modellen waar ik in de cloud mee werk zijn honderden miljarden parameters groot en draaien op datacenters vol dure kaarten. Wat je thuis op een mini-pc krijgt, is een klap kleiner - en dat merk je.
Maar daar zit nou juist de denkfout die ik wilde vermijden: ik hoef thuis Claude niet te kunnen evenaren. Ik wil een eerste lijn. Iets dat de simpele, dagelijkse dingen lokaal afhandelt, en dat eerlijk is over wanneer een vraag te groot voor het model wordt. De zware vragen mogen dan bewust naar de cloud. Niet als default, maar als keuze.
In mijn hoofd ziet dat eruit als lagen. Ik ben Laag 0, degene die beslist. Fietje is Laag 1, lokaal, voor het dagelijkse werk. En pas als een van ons vindt dat het nodig is, gaat het naar Laag 2 - de cloud. Het idee is niet om de cloud uit te bannen, maar om de stap erheen een bewuste handeling te maken in plaats van een automatisme.
Wie is die Fietje dan?
Fietje is een Nederlandstalig taalmodel van Bram Vanroy. En het bijzondere eraan - de reden dat ik juist dit model koos - is dat het echt open is. Niet “open” zoals veel modellen die dat label dragen, waarbij je de gewichten mag downloaden maar verder niks weet. Bij Fietje zijn de gewichten, de trainingsdata, de trainingscode én de evaluatie allemaal publiek. De hele keuken is dus open - niet alleen het bord op tafel.
Dat onderscheid klinkt muggenzifterig, maar het raakt voor mij precies de essentie. “Open gewichten” en “open source” worden voortdurend door elkaar gehaald, vaak met opzet, want “open” bekt lekker en verkoopt. Een model waarvan je alleen de gewichten hebt, is eigenlijk nog steeds een blackbox die je mag gebruiken. Een model als Fietje kun je narekenen. Voor een project dat over soevereiniteit gaat, is dat geen detail maar de kern.
Die naam trouwens - Fietje - komt van Sophie, en dat is weer een knipoog naar sophia - wijsheid. Een naam als opdracht, zeg maar. Daarover later meer.
Het ‘duurzaam’ bouwen
De stack zelf was vertrouwd terrein, dit keer met een tweedehands PC als kavel.
Eerst Debian 13 als .iso downloaden en op mn Mac met Balena Etcher op een usb-stick zetten, zodat ik daarvan kon opstarten op die Lenovo om het OS te veranderen.
Daarna Ollama om het model te draaien, Open WebUI als chatinterface, allebei in Docker - precies het soort docker compose up -d dat hier inmiddels ‘routine’ is.
Een kwartiertje en wat gigabytes later draaide de boel op een fixed ip met een eigen poort. Fietje had een nieuwe woning.
Het kwartje valt (of toch niet…)
Om te kijken wat ze kon, vroeg ik een haiku te schrijven. Die kwam keurig: drie regels, en netjes erbij geteld - (5), (7), (5) - precies het ritme dat een haiku ‘hoort’ te hebben.
Eén probleem: de eerste regel had geen vijf lettergrepen, maar zes. En toen ik vroeg nog eens goed te tellen, hield ze stellig vol dat het er vijf waren.
Dat is eigenlijk ook hoe deze modellen werken: een taalmodel ziet geen lettergrepen, het ziet stukjes tekst, en “haiku” roept nu eenmaal het patroon 5-7-5 op. Ze produceerde het getal dat het beste klonk, niet het getal dat klopte. En - dit is het venijnige - zonder benul dat het een misrekening was. Geen twijfel, geen “even checken”, gewoon zelfverzekerd het verkeerde antwoord.
Daar zit precies de grens van Laag 1. Een mens telt die regel in drie tellen na. Het model kan dat principieel niet betrouwbaar, en weet bovendien niet dát het dat niet kan. En dat laatste is veel belangrijker dan het eerste. Een model dat fouten maakt is werkbaar, mits het die onzekerheid kent. Een model dat fouten maakt mét volle overtuiging is een valkuil.
Wat dat betekent voor de opzet
De voor de hand liggende reflex is: dan maar een groter model erbij. Maar ik had ook twee modellen van het formaat erboven getest, en die waren niet beter - ze waren anders fout. Eentje maakte Marietje Schaake ineens fractievoorzitter van de Groenen, een ander hield haar voor Amerikaanse. Allebei net zo stellig als Fietje met die haiku.
De conclusie was daarmee wel duidelijk: de oplossing zit niet in een groter model, maar in de laag eromheen. Het herkennen van “dit is een vraag die ik beter kan doorgeven” hoort niet in het model zelf thuis - daar is het te klein voor - maar in de aansturing die ervoor zit. Dat was werk voor later, maar de richting was nu in ieder geval al wel helder. En eerlijk gezegd bevestigt het alleen maar het lagen-idee waar ik mee begon.
Voor nu heb ik de andere modellen weggegooid en focus ik op Fietje alleen. Niet de breedste opzet, wel de meest consistente met waar het me om gaat.
De naam als opdracht
Terug naar die naam. Sophia, wijsheid. Er zit een lichte ironie in dat juist het model dat zo heet, nog moet leren waar die wijsheid ophoudt. Maar misschien is dat hier wel precies goed. Wijsheid is niet alles weten - het is weten wat je niet weet.
Dat vind ik eigenlijk ook wel de mooiste samenvatting van wat ik met deze hele stack probeer. Niet alles zelf willen doen of alles naar de cloud schuiven, maar bewust de grens bewaken tussen wat lokaal kan en wat echt naar buiten moet. Fietje is daar nu het nieuwste stukje van - en het stukje dat me, eerlijk is eerlijk, het meest aan het hart gaat.
–JB
[UPDATE] Een paar weken later: het vangnet bestaat - en het liegt terug
Toen ik het stuk hierboven schreef was Laag 2 nog een belofte. “Werk voor een volgende keer,” stond er. Inmiddels is die volgende keer geweest, en het vangnet hangt er - soort van. Tijd voor een eerlijk verslag, want het werd anders dan ik dacht en daarom de moeite van het opschrijven waard.
Eerst het goede nieuws: de escalatie werkt. Onder elk antwoord van Fietje zit nu een knop - een pijlcirkel - die de gebruiker de vraag bewust door laat sturen naar een groter model. Geen automatisme, precies zoals bedoeld: ik, of wie er ook achter zit, drukt zelf op de knop. De stap naar buiten blijft een keuze, geen verborgen sluiproute.
Eén ding is wel veranderd ten opzichte van wat hierboven staat. De zware vragen gaan niet meer naar Claude, maar naar Mistral - een Europees model, via een betaalde API waar mijn invoer niet als trainingsmateriaal wordt gebruikt. Dat past ook beter bij waar dit project over gaat. Claude is sterker, maar het is een Amerikaans pad dat op nationaliteit kan worden afgesneden (we hebben inmiddels ervaring met Fable 5…). Een Europees ’tweede been’ heeft in een andere jurisdictie. Voor een opzet die over soevereiniteit gaat, weegt dat zwaarder dan een betere score op een benchmark.
De ontdekking die ik niet zag aankomen
En toen kwam de les waar ik dit naschrift eigenlijk voor schrijf.
Ik stelde het systeem een strikvraag: waar is de Hoogvliet in Reeuwijk-Tempel? Een instinker, want die supermarkt bestaat daar niet. Fietje trapte erin zoals verwacht - ze verzon een filiaal, compleet met assortiment en scan-and-go-kassa’s, allemaal met dezelfde stelligheid als die haiku van toen.
Dus drukte ik op de knop: het grotere model erbij. En dáár werd het interessant. Mistral trapte niet in de winkel - maar in plaats van “die bestaat niet” te zeggen, herinterpreteerde het “Hoogvliet” als een straatnaam en bouwde daar een heel verhaal omheen: ligging parallel aan andere wegen, nabij de Hervormde Kerk, een stukje etymologie over een “vliet” als waterloop. Gedetailleerd, zelfverzekerd, en volkomen plausibel klinkend. En vrijwel zeker net zo verzonnen.
Daar zat de denkfout die ik al die tijd had gemaakt. Het stond netjes onder elkaar in dezelfde chat: ik had de knop in mijn hoofd “de check” genoemd - alsof het grotere model de waarheid zou leveren waar de kleine de mist in ging. Maar dat is niet wat er gebeurt. Het grotere model is geen waarheidsmachine. Het is een betere verteller. En bij een vraag waar geen van beide het antwoord echt weet, levert de betere verteller geen “dat weet ik niet” op, maar een mooiere, geloofwaardiger verzinsel.
Dat is in zekere zin gevaarlijker dan waar ik mee begon. Fietje’s brouwsel had ik zo door. Mistrals verzinsel had ik bijna geloofd. De escalatie had de fout niet opgelost - het had hem opgewaardeerd van doorzichtig naar overtuigend.
Wat het vangnet wél en niet is
De conclusie is niet dat de tweede laag waardeloos is. Voor het soort vraag waar een groter model écht meer van weet - een technisch probleem, een stuk redenering dat te complex is voor een klein model - vangt de escalatie precies wat die moet vangen. Daar is het verschil tussen klein en groot reëel.
Maar voor feiten - en zeker voor lokale, actuele, of op een valse aanname gebouwde feiten - lost geen van beide lagen iets op. De escalatie dicht een gat in capaciteit, niet in waarheid. En dat onderscheid had ik niet scherp toen ik de knop liet maken.
Het venijnige is dat dit precies de oude haiku-les is, maar een verdieping dieper. Toen ging het over een klein model dat niet weet wat het niet weet. Nu blijkt dat ook het grote model dat niet weet - het verbergt het alleen beter. De grens die ik bij Laag 1 ontdekte, loopt gewoon door tot in Laag 2. Er is geen laag waarin het probleem vanzelf verdwijnt. Er is alleen Laag 0 - ik - die blijft opletten.
En dan nog even over de naam
Ik eindigde dit stuk de vorige keer op sophia, wijsheid: weten wat je niet weet. Ik bedoelde het toen als opdracht voor Fietje. Maar na de Hoogvliet blijkt het net zo goed een opdracht voor de hele opzet, en eerlijk gezegd vooral voor mezelf… De verleiding van een tweede laag is precies dat je denkt: nu heb ik de twijfel weggeorganiseerd. Dat is de mooiste illusie van het hele bouwwerk - en de gevaarlijkste.
Het vangnet is er. Het werkt. En het belangrijkste wat het me leerde, is dat geen enkel vangnet me ontslaat van zelf blijven nadenken. Misschien is dát wel de wijsheid waar het om ging.
We gaan zien waar het naartoe gaat met ‘ons’.
–JB
Gebruikte onderdelen: Lenovo Thinkcentre M920s (pilab, 16GB), Ollama, Open WebUI, Fietje 2 (Bram Vanroy), Docker. De zwaardere vragen gaan sinds kort naar Mistral Small (via een Europese, betaalde API) - bewust niet meer naar Claude, en nog steeds alleen als keuze.