<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
  <title>Marcel van der Hoek</title>
  <id>https://marcelvanderhoek.nl/</id>
  <link href="https://marcelvanderhoek.nl/"/>
  <link rel="self" href="https://marcelvanderhoek.nl/feed.xml"/>
  <updated>2026-08-03T00:00:00.000Z</updated>
  <author><name>Marcel van der Hoek</name></author>
  <entry>
    <title>Notitie · 3 augustus 2026</title>
    <id>https://marcelvanderhoek.nl/notities/twee-definities-vibe-coding-en-ai-slop/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/notities/twee-definities-vibe-coding-en-ai-slop/"/>
    <updated>2026-08-03T00:00:00.000Z</updated>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;I would like to propose some formal definitions.&lt;/p&gt;
&lt;p&gt;AI slop is software whose structure has degraded through repeated AI-assisted modifications until it exceeds the team’s ability to confidently understand, verify, or safely maintain it.&lt;/p&gt;
&lt;p&gt;Vibe code is AI generated code accepted without sufficient human understanding or verification. Vibe coding is the behavior. AI slop is the potential, eventual outcome if we continue to vibe code the same app/source code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a href=&quot;https://x.com/shehackspurple/status/2080366046955843984&quot;&gt;Tanya Janca (@shehackspurple), 23 juli 2026&lt;/a&gt; &lt;span class=&quot;ext&quot; aria-hidden=&quot;true&quot;&gt;↗︎&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Wat mij betreft zijn dit goede definities. Ze maken ook duidelijk waarom we niet alle code die met ondersteuning van AI geschreven wordt als vibe coding moeten bestempelen. Het onderscheid zit niet in het gebruik van AI op zich, maar in de manier waarop je ermee werkt. AI kan een ontwikkelaar wel degelijk versterken, zolang die de gegenereerde code begrijpt, kritisch beoordeelt en verifieert. Verantwoord gebruik van AI betekent dus dat de ontwikkelaar zelf zicht houdt op de werking en kwaliteit van de code, en er ook de verantwoordelijkheid voor blijft dragen. Dat laatste is misschien nog wel het belangrijkste, daar zit een artikel op zich in.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Citaat · Tommy Wieringa</title>
    <id>https://marcelvanderhoek.nl/citaten/joe-speedboot/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/citaten/joe-speedboot/"/>
    <updated>2026-07-31T00:00:00.000Z</updated>
    <content type="html">&lt;blockquote&gt;&lt;p&gt;Overmoed is net zo belangrijk als talent: ik &lt;em&gt;kan&lt;/em&gt; het niet maar ik &lt;em&gt;doe&lt;/em&gt; het toch.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p class=&quot;citaat-bron&quot;&gt;— Tommy Wieringa, &lt;cite&gt;Joe Speedboot&lt;/cite&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Notitie · 29 juli 2026</title>
    <id>https://marcelvanderhoek.nl/notities/de-gebraden-haan-uithangen/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/notities/de-gebraden-haan-uithangen/"/>
    <updated>2026-07-29T00:00:00.000Z</updated>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Alles leek goed te gaan. In het café was Harrie de gebraden haan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a href=&quot;https://www.botuitgevers.nl/product/harrie-jekkers-ik-hou-van-mij/&quot;&gt;&lt;em&gt;Ik hou van mij&lt;/em&gt;, de biografie van Harrie Jekkers&lt;/a&gt; &lt;span class=&quot;ext&quot; aria-hidden=&quot;true&quot;&gt;↗︎&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Die uitdrukking kende ik niet. &lt;a href=&quot;https://onzetaal.nl/schatkamer/lezen/uitdrukkingen/de-gebraden-haan-uithangen&quot;&gt;De gebraden haan uithangen&lt;/a&gt; betekent dat je iedereen wilt laten zien hoe rijk en belangrijk je bent. Waar het vandaan komt weten we niet zeker.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Notitie · 27 juli 2026</title>
    <id>https://marcelvanderhoek.nl/notities/heftruck/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/notities/heftruck/"/>
    <updated>2026-07-27T00:00:00.000Z</updated>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;There are certain situations where AI can do superhuman things, but so can forklifts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a href=&quot;https://archive.ph/t96Am&quot;&gt;Hannah Fry, &lt;em&gt;New Scientist&lt;/em&gt;&lt;/a&gt; &lt;span class=&quot;ext&quot; aria-hidden=&quot;true&quot;&gt;↗︎&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Zo snel code kloppen als AI kan geen mens. Maar bepalen welk probleem opgelost moet worden en welke afwegingen belangrijk zijn, is nog steeds mensenwerk. Dat zal nog wel een tijd zo blijven, al ben ik benieuwd wanneer die conclusie achterhaald blijkt.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Vandaag geleerd #2 · Als spaties in een stuk tekst toevallig onder…</title>
    <id>https://marcelvanderhoek.nl/geleerd/witrivieren/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/geleerd/witrivieren/"/>
    <updated>2026-07-26T00:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Als spaties in een stuk tekst toevallig onder elkaar vallen, ontstaan er verticale &lt;em&gt;witrivieren&lt;/em&gt; door de alinea heen. Die rivieren van wit komen vooral voor bij uitgevulde tekst in smalle kolommen.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Vandaag geleerd #1 · Het woord mayday is niet geïnspireerd door een…</title>
    <id>https://marcelvanderhoek.nl/geleerd/mayday/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/geleerd/mayday/"/>
    <updated>2026-07-25T00:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Het woord &lt;em&gt;mayday&lt;/em&gt; is niet geïnspireerd door een mooie dag in mei, maar een verbastering van het Franse m’aider (‘help mij’), verkort uit venez m’aider.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Citaat · Xavier Rudd</title>
    <id>https://marcelvanderhoek.nl/citaten/part-of-life/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/citaten/part-of-life/"/>
    <updated>2026-07-25T00:00:00.000Z</updated>
    <content type="html">&lt;blockquote&gt;&lt;p&gt;The emptiness you’re feeling deep down inside&lt;br&gt;
May never go away, at least it’s gonna take time&lt;br&gt;
You gotta learn where to put it, it’s a part of life&lt;br&gt;
Don’t let it wreak havoc on the rest of your time&lt;/p&gt;
&lt;/blockquote&gt;&lt;p class=&quot;citaat-bron&quot;&gt;— &lt;a href=&quot;https://open.spotify.com/track/5REUqhW1U6AgMNXBRa1TU6&quot; rel=&quot;noopener&quot;&gt;Xavier Rudd, &lt;cite&gt;Part of Life&lt;/cite&gt;&lt;/a&gt; &lt;span class=&quot;ext&quot; aria-hidden=&quot;true&quot;&gt;↗︎&lt;/span&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Notitie · 21 juli 2026</title>
    <id>https://marcelvanderhoek.nl/notities/hoe-open-is-een-open-model/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/notities/hoe-open-is-een-open-model/"/>
    <updated>2026-07-21T00:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Alibaba &lt;a href=&quot;https://x.com/Alibaba_Qwen/status/2078759124914098291&quot;&gt;kondigde zondag Qwen3.8 aan&lt;/a&gt; en gaat de &lt;a href=&quot;https://marcelvanderhoek.nl/hoe-een-taalmodel-werkt/#gokken-en-bijstellen&quot;&gt;gewichten&lt;/a&gt; vrijgeven. Het is straks dus &lt;em&gt;open-weight&lt;/em&gt; en je kunt het model op je eigen hardware draaien. Open-weight is wat anders dan open source, want je krijgt niet te zien wat er in de trainingsdata zit en hoe het model precies getraind is. (Er bestaan trouwens wel open source modellen, zie bijvoorbeeld &lt;a href=&quot;https://allenai.org/olmo&quot;&gt;Olmo van Ai2&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;In de praktijk maakt het verschil tussen open-weight en open source weinig uit. Een model dat iedereen kan downloaden en hosten is vervangbaar, en vervangbaar betekent in theorie goedkoop. Zodra dit soort open-weight modellen (bijna) net zo goed worden als de gesloten modellen van bijvoorbeeld Anthropic en OpenAI komt de hele markt onder druk te staan. In &lt;a href=&quot;https://stratechery.com/2026/whos-afraid-of-chinese-models/&quot;&gt;&lt;em&gt;Who’s Afraid of Chinese Models?&lt;/em&gt;&lt;/a&gt; gaat Ben Thompson hier verder op in.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Hoe een taalmodel werkt: van token tot agent</title>
    <id>https://marcelvanderhoek.nl/hoe-een-taalmodel-werkt/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/hoe-een-taalmodel-werkt/"/>
    <updated>2026-07-24T00:00:00.000Z</updated>
    <summary>Een uitleg van hoe taalmodellen werken: van tokens en trainen tot hallucinaties en agents, zonder wiskunde.</summary>
    <content type="html">&lt;p&gt;Eerlijk, ik dacht dat dit een lange intro zou worden, met verschillende visies op AI erin, misschien een paar gevatte opmerkingen. Maar de zinnen komen niet. Dus ik sla de intro lekker over en ga meteen naar de vraag die ik wilde beantwoorden: &lt;span class=&quot;newthought&quot;&gt;hoe werkt een taalmodel nou eigenlijk&lt;/span&gt;? Niet tot in de wiskundige details, maar uitgebreid genoeg om het echt te begrijpen.&lt;/p&gt;
&lt;h2&gt;Steeds het volgende token&lt;/h2&gt;
&lt;figure class=&quot;margin-figure&quot;&gt;
&lt;img src=&quot;https://marcelvanderhoek.nl/img/2026/loten.png&quot; alt=&quot;&quot;&gt;
&lt;/figure&gt;
&lt;p&gt;In de kern doet een taalmodel, een &lt;em&gt;LLM&lt;/em&gt;, maar één ding. Het krijgt tekst en berekent voor elk mogelijk vervolg een kans. Niet voor hele zinnen, maar steeds alleen voor het eerstvolgende stukje: een &lt;em&gt;token&lt;/em&gt;. Er wordt één token gekozen, dat wordt geplakt achter de tekst die er al stond, en de hele lap tekst gaat direct weer terug het model in voor de volgende ronde. Het model schrijft dus geen antwoord, maar kiest steeds één token, en dan nog één, etc. Je zou denken dat het model altijd het token met de hoogste kans pakt, maar je raadt het al: dat is niet per definitie zo. Het model trekt er één, gewogen naar de kansen, zodat waarschijnlijke tokens vaker vallen dan onwaarschijnlijke. De favoriet wint alsnog meestal, maar niet altijd.&lt;/p&gt;
&lt;p&gt;Het model krijgt niet alleen jouw tekst, maar een heel samengesteld pakket: systeemprompt, eerdere berichten, opgehaalde documenten, beschrijvingen van beschikbare tools, en helemaal achteraan jouw nieuwe vraag. Het ziet niet alleen je laatste invoer, maar de hele &lt;em&gt;context&lt;/em&gt;, en voorspelt daarmee het volgende token.&lt;/p&gt;
&lt;p&gt;Achter die ene keuze gaan weliswaar miljarden berekeningen schuil (daar kom ik onder &lt;a href=&quot;#gokken-en-bijstellen&quot;&gt;Gokken en bijstellen&lt;/a&gt; op terug), maar de lus zelf is niet ingewikkelder dan: kans berekenen, kiezen, plakken, opnieuw.&lt;/p&gt;
&lt;p&gt;Logische vraag is nu: wanneer stopt die lus dan? Het model kent niet alleen woorden maar ook een aantal speciale tokens, en één daarvan betekent: hier eindigt het antwoord. Dat eindtoken is in de lus steeds een van de kandidaten, met een eigen kans. Wordt het eindtoken gekozen, dan stopt de lus.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Er is ook een maximale lengte van het antwoord. Als die lengte wordt bereikt, dan stopt de generatie. Ook als het model nog geen eindtoken heeft gekozen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;De keuze van het volgende token is dus een soort loterij. Het token dat 97% kans heeft, krijgt 97 lootjes, en over de resterende tokens worden de overige 3 lootjes verdeeld.&lt;/p&gt;
&lt;figure class=&quot;d2&quot; data-d2=&quot;ZGlyZWN0aW9uOiByaWdodAoKY29udGV4dDogIkludm9lciAvIGNvbnRleHRcblxuc3lzdGVlbXByb21wdFxuZWVyZGVyZSBiZXJpY2h0ZW5cbmRvY3VtZW50ZW4gZW4gdG9vbHNcbmpvdXcgdnJhYWciCgpjYWxjdWxhdGU6ICIxLiBCZXJla2VuIHZvb3IgaWVkZXIgbW9nZWxpamtcbnZvbGdlbmQgdG9rZW4gZWVuIGthbnMiCgpjaG9vc2U6ICIyLiBLaWVzIMOpw6luIHRva2VuXG5vcCBiYXNpcyB2YW4gZGllIGthbnNlbiIKCmVuZF90b2tlbjogIkVpbmR0b2tlblxuZ2Vrb3plbj8iIHsKICBzaGFwZTogZGlhbW9uZAp9CgphcHBlbmQ6ICIzLiBQbGFrIGhldCB0b2tlblxuYWNodGVyIGRlIHRla3N0IgoKZmluaXNoZWQ6ICJHZW5lcmF0aWUgc3RvcHQiCgpjb250ZXh0IC0+IGNhbGN1bGF0ZQpjYWxjdWxhdGUgLT4gY2hvb3NlCmNob29zZSAtPiBlbmRfdG9rZW4KCmVuZF90b2tlbiAtPiBmaW5pc2hlZDogamEKZW5kX3Rva2VuIC0+IGFwcGVuZDogbmVlCmFwcGVuZCAtPiBjYWxjdWxhdGU6IG9wbmlldXcK&quot; data-label=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3&gt;De temperatuurknop&lt;/h3&gt;
&lt;p&gt;De &lt;em&gt;temperatuur&lt;/em&gt; van een taalmodel bepaalt hoeveel willekeur er in het antwoord zit, door de kansverdeling voor het volgende token scherper of vlakker te maken. In onze loterij betekent dat: bij een lage temperatuur krijgt de favoriet relatief meer lootjes, en bij een hoge temperatuur worden de kansen gelijkmatiger verdeeld. De temperatuur verandert dus niet welke tokens bovenaan staan, maar wel hoe groot de verschillen ertussen zijn.&lt;/p&gt;
&lt;p&gt;Zet je de temperatuur op &lt;code&gt;0.00&lt;/code&gt;, dan kiest het model altijd het token met de hoogste kans.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Dat heet greedy decoding. In theorie gedraagt het model zich dan volledig deterministisch: bij exact dezelfde invoer krijg je altijd hetzelfde vervolg. In de praktijk zorgen kleine reken- en afrondingsverschillen op de duizenden parallelle chips ervoor dat er soms tóch een ander token uitrolt, maar alle creativiteit is er dan wel uit (voor zover je hier kan spreken over creativiteit, maar dat is weer een ander verhaal).&lt;/span&gt; Handig als je voorspelbaarheid wilt, maar de tekst wordt er vlak en repetitief van. Daarom staat een model meestal niet op nul.&lt;/p&gt;
&lt;p&gt;Nergens in de lus wordt gecontroleerd of het gekozen vervolg klopt, en hallucinaties ontstaan niet simpelweg doordat het model loot. Ook bij een temperatuur van nul kan er nog onzin uitrollen, maar dan is het telkens dezelfde onzin. De temperatuur heeft dus alleen invloed op de variatie en niet op het waarheidsgehalte.&lt;/p&gt;
&lt;p&gt;Hierboven heb ik voor het gemak de eerste stap in de lus, het berekenen van een kans, als één ding behandeld. Maar in die ene stap zit het meeste werk: van tekst naar tokens, van tokens naar getallen, laag na laag, tot er een kansverdeling uitkomt.&lt;/p&gt;
&lt;h2&gt;Geen letters, maar tokens&lt;/h2&gt;
&lt;p&gt;Ergens halverwege 2024 was het opeens hip om aan taalmodellen te vragen hoeveel r’en er in het woord strawberry zitten. Inmiddels is het grapje niet meer actueel, maar het is wel een goed voorbeeld om nog wat beter te illustreren hoe dat tokenverhaal werkt.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://marcelvanderhoek.nl/img/2026/strawberry.png&quot; alt=&quot;Hoeveel r&#39;en er in het woord strawberry zitten volgens ChatGPT&quot;&gt;
  &lt;figcaption&gt;Bijna goed.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Het model ziet dus helemaal geen letters of woorden. Voordat tekst het model ingaat, wordt die in stukken geknipt: tokens met elk een eigen nummer. Een veelvoorkomend woord is vaak één token, een zeldzamer woord valt uiteen in twee of meer blokjes. In dit geval herkent het dus geen tien losse letters, maar een paar genummerde tokens. Losse letters tellen kan zo’n model dus niet zonder omweg. Huidige modellen kunnen al beter tellen doordat ze het woord in een redeneerstap letter voor letter uitspellen, of het antwoord uit de trainingsdata kennen. Soms gebruiken ze een stukje code dat het telwerk overneemt.&lt;/p&gt;
&lt;figure class=&quot;demo&quot;&gt;
&lt;iframe src=&quot;https://marcelvanderhoek.nl/demos/aaaaf786d7.html&quot; title=&quot;Token-speeltuin&quot; loading=&quot;lazy&quot; height=&quot;360&quot; sandbox=&quot;allow-scripts&quot;&gt;&lt;/iframe&gt;
&lt;noscript&gt;&lt;p&gt;Zonder JavaScript is dit voorbeeld niet interactief.&lt;/p&gt;&lt;/noscript&gt;

&lt;/figure&gt;
&lt;p&gt;Tokens zijn de rekeneenheid van een taalmodel, en van de factuur die je krijgt voor het gebruik ervan. Alles wat het model in één keer kan overzien, het contextvenster, wordt gemeten in tokens. En je rekent af per token, voor alles wat erin gaat en alles wat eruit komt: je vraag, instructies, documenten eromheen, en het antwoord.&lt;/p&gt;
&lt;h3&gt;Van tokens naar betekenis&lt;/h3&gt;
&lt;p&gt;Nu wordt het eigenlijk pas interessant, want tokens verklaren op zichzelf niet waarom modellen samenhang lijken te snappen. Daarvoor moet je weten wat er met die genummerde blokjes gebeurt. Hierboven zie je dat elk token een ID heeft, maar dat is niks meer dan een label. “berry” is toevallig nummer 19772. Dat getal zegt verder niks: een verwant woord kan een heel ander ID hebben. De betekenis zit ergens anders. Bij elk token zoekt het model een rij van duizenden getallen op. Die rij vormt een soort coördinaat in een ruimte met evenzoveel richtingen.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Die getallenrijen heten &lt;em&gt;embeddings&lt;/em&gt;. Eén rij is een embeddingvector, opgezocht in een grote tabel die de embeddinglaag heet.&lt;/span&gt; Afstand is in die ruimte verwantschap. Koning ligt dicht bij koningin, Amsterdam dicht bij Nederland.&lt;/p&gt;
&lt;p&gt;Belangrijker nog: die startplek ligt wel vast, maar de betekenis niet. Neem het woord “python”. In de zin “De python loert op zijn prooi” stuurt de context het woord richting reptielen en biologie. Maar in “Ik schrijf een script in python” trekken de omringende woorden het direct naar software en code. Hetzelfde woord, exact dezelfde startplek, maar de context duwt het punt een compleet andere hoek van die ruimte in.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Hoe heette dat ook alweer… O ja, een &lt;a href=&quot;https://onzetaal.nl/taalloket/homoniem&quot;&gt;homoniem&lt;/a&gt;.&lt;/span&gt; Het model zoekt die betekenis niet op in een statische database. Er is geen mapje &lt;code&gt;python-de-programmeertaal&lt;/code&gt; dat wordt klaargezet. Het model berekent die verschuiving live, laag na laag, op basis van de relatie met de andere tokens. In elke laag kijkt elk token naar de tokens eromheen en schuift het zijn eigen positie een stukje op, op grond van wat relevant is.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Dit mechanisme heet &lt;em&gt;attention&lt;/em&gt;: elk token weegt hoe belangrijk de tokens eromheen zijn voor zijn eigen betekenis.&lt;/span&gt; Eén laag doet dat subtiel, maar na tientallen lagen draagt het laatste token zoveel van de hele zin in zich dat het model er rechtstreeks een kans voor elk mogelijk vervolg uit afleest. Daar zit het meeste rekenwerk, en daar komt de kansverdeling van het begin vandaan.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://marcelvanderhoek.nl/img/2026/betekeniskaart.svg&quot; alt=&quot;Kaart van de betekenisruimte: verwante woorden liggen dicht bij elkaar, en de context verschuift waar python terechtkomt.&quot;&gt;
&lt;/figure&gt;
&lt;p&gt;Dit is waarom een model samenhang lijkt te begrijpen: niet door een vaste betekenis op te zoeken, maar door elk token een positie te geven die meebeweegt met de rest van de zin. Of dat “begrijpen” mag heten, is een vraag waar ik nog op terugkom.&lt;/p&gt;
&lt;h2&gt;Gokken en bijstellen&lt;/h2&gt;
&lt;p&gt;Die posities en kansen van daarnet zijn niet geprogrammeerd. Het taalmodel vormt ze zelf. De vraag is hoe, en het antwoord is verrassend simpel: gokken en bijstellen, en dat heel vaak achter elkaar.&lt;/p&gt;
&lt;p&gt;Een vers model is niks meer dan een enorme hoeveelheid getallen: de &lt;em&gt;gewichten&lt;/em&gt;.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Gewichten en &lt;em&gt;parameters&lt;/em&gt; zijn hetzelfde. Lees je een nieuwsbericht over een model met tig miljard parameters, dan betekent dat: tig miljard afgestelde gewichten. Verwar ze niet met parameters in gewone software, want die stelt een mens in, en gewichten worden getraind.&lt;/span&gt; Die gewichten staan bij de start op willekeurige waarden. Als je zo’n model iets zou vragen, rolt er pure onzin uit. Het heeft nog nergens een patroon in gezien. &lt;em&gt;Trainen&lt;/em&gt; is het proces dat die willekeurige berg omvormt tot iets dat zinnig klinkende tekst produceert.&lt;/p&gt;
&lt;p&gt;Dat trainen gebeurt in een lus. Neem een stuk echte tekst, laat het model het volgende token voorspellen, en vergelijk die gok met wat er in werkelijkheid stond. Als het model ernaast zit, dan krijgen alle gewichten een zetje in de goeie richting, zodat de volgende gok een fractie dichterbij komt.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Welk zetje precies, dat bepaalt het model met &lt;em&gt;backpropagation&lt;/em&gt;. De stapjes bergafwaarts naar minder fouten heten &lt;em&gt;gradient descent&lt;/em&gt;.&lt;/span&gt; Als je dit één keer doet, verandert er natuurlijk weinig aan de samenhang. Zodra je dit over een gigantische hoeveelheid tekst miljarden keren herhaalt, ontstaat er een model dat grammatica, feiten en schrijfstijl in de gewichten heeft zitten.&lt;/p&gt;
&lt;p&gt;Alles wat het model “weet” zit dus in de gewichten. Er is geen opgeslagen tekst, en er is geen database met feiten.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Al kunnen stukken trainingstekst wel degelijk vrijwel letterlijk uit de gewichten rollen.&lt;/span&gt; Er zijn alleen afgestelde gewichten en de manier waarop ze samen een kansverdeling opleveren. Dit is ook meteen de reden waarom trainen zo duur is. Je kan je voorstellen dat zoveel getallen afstellen op enorme bergen tekst heel veel rekenkracht kost.&lt;/p&gt;
&lt;p&gt;Dit deel van de training levert een model dat vloeiend tekst aanvult, maar nog niet per se een behulpzame chatbot. Daarvoor is nog een afwerkfase nodig, de &lt;em&gt;posttraining&lt;/em&gt;, en daar kom ik onder &lt;a href=&quot;#twee-levens&quot;&gt;Twee levens&lt;/a&gt; op terug.&lt;/p&gt;
&lt;h3&gt;Stampen of snappen?&lt;/h3&gt;
&lt;figure class=&quot;margin-figure&quot;&gt;
&lt;img src=&quot;https://marcelvanderhoek.nl/img/2026/zakhorloge.png&quot; alt=&quot;&quot;&gt;
&lt;/figure&gt;
&lt;p&gt;Met wat we nu weten zou je kunnen concluderen dat een taalmodel de antwoorden gewoon uit zijn hoofd leert, op basis van die reusachtige set aan data waarop het model is getraind. Dat is ook deels waar, maar daar blijft het niet bij. Dat is aangetoond met een simpel experiment waarin een model leerde optellen op een analoge klok. Hierbij is &lt;code&gt;10 + 5&lt;/code&gt; niet &lt;code&gt;15&lt;/code&gt; maar &lt;code&gt;3&lt;/code&gt;, want op een klok begin je na de 12 weer bij 1 (&lt;a href=&quot;https://nl.wikipedia.org/wiki/Modulair_rekenen&quot;&gt;modulair rekenen&lt;/a&gt;). Dit is hier ideaal omdat er maar twee mogelijke oplossingen zijn: alle uitkomsten uit het hoofd leren, of de methode snappen. Je kan dus zien welke van de twee het model koos.&lt;/p&gt;
&lt;p&gt;Eerst leerde het model de voorbeelden: sommen uit de trainingsdata gingen goed, nieuwe sommen gingen fout. Maar na lang doortrainen sloeg het model om, en gingen ook nieuwe sommen goed. Het model was dus overgestapt op de echte methode. Dat wordt &lt;em&gt;grokking&lt;/em&gt; genoemd.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2201.02177&quot;&gt;Power e.a., 2022.&lt;/a&gt; De term grokking komt van &lt;a href=&quot;https://en.wikipedia.org/wiki/Grok&quot;&gt;grok&lt;/a&gt;, een woord uit Heinleins sciencefictionroman Stranger in a Strange Land (1961). Het betekent iets zo volledig begrijpen dat het deel van je wordt, precies wat hier gebeurt.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Een ander team ging nog wat verder en ontleedde zo’n grokkend model. Dit model bleek een soort klok te gebruiken: het had geleerd de getallen als punten op een cirkel te zien en draaide eromheen om op te tellen.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2301.05217&quot;&gt;Nanda e.a., 2023.&lt;/a&gt;&lt;/span&gt; Geen tabel met antwoorden, maar een uitgevonden procedure.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;Of iets vergelijkbaars ook gebeurt&lt;/span&gt; tussen de miljarden gewichten van een echt taalmodel is lastiger na te gaan. Men begrijpt de architectuur van die modellen tot in detail, maar teruglezen welke methodes een getraind model daarin heeft gevormd, is een ander verhaal. Recentere berichten wijzen wel die kant op: onderzoekers van Anthropic zagen een groot model een vraag als “de hoofdstad van de staat waar Dallas ligt” intern in stappen oplossen, eerst van Dallas naar Texas, dan van Texas naar Austin.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/research/tracing-thoughts-language-model&quot;&gt;Anthropic, “Tracing the thoughts of a large language model”, 2025.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Daarmee is het te simpel om te beweren dat een model alleen heel veel feiten in zijn geheugen stampt en daartussen verbanden legt. Een model stampt niet alleen, maar het vormt ook methodes. Iets wat alleen maar tekst herkauwt, zou nooit een som kunnen oplossen die het nog nooit heeft gezien.&lt;/p&gt;
&lt;p&gt;Of je dat “begrijpen” kan noemen, weet ik niet. Dat is sowieso een definitiekwestie, en aan die discussie ga ik in dit verhaal mijn vingers niet branden.&lt;/p&gt;
&lt;h2&gt;Twee levens&lt;/h2&gt;
&lt;p&gt;Een taalmodel leidt twee levens. Het eerste is het trainen: gokken en bijstellen tot de gewichten kloppen. Het tweede begint zodra het trainen afgelopen is en je het model gebruikt. Na de training ligt het model vast. De gewichten bevriezen, en praten met een model verandert daar niks meer aan. Het leert niet van jouw gesprek.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Dat wil niet zeggen dat je gesprekken nooit gebruikt worden om een nieuwe versie te trainen. Of dat gebeurt, verschilt per aanbieder. Zakelijke abonnementen zijn er meestal van uitgezonderd.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Het trainen heeft twee stappen. De eerste stap is het ruwe trainen van hierboven: de &lt;em&gt;pretraining&lt;/em&gt;. Daarna kan het model vloeiend tekst aanvullen, maar net zo goed jouw vraag met een wedervraag beantwoorden of blijven doorratelen. Het is immers simpelweg tekst uit de trainingsdata aan het imiteren.&lt;/p&gt;
&lt;p&gt;In de tweede stap van de training wordt het model bijgeschaafd met menselijke feedback. Mensen beoordelen antwoorden, en het model leert daarvan welke toon en vorm de bedoeling zijn. Het bekendste onderdeel van deze posttraining is precies dat bijsturen. Dat is ook waar een model zijn omgangsvormen en grenzen leert. Deze stap verandert vooral hóé het model antwoordt, en voegt daarnaast vaardigheden en soms wat kennis toe.&lt;/p&gt;
&lt;p&gt;Bij elk gesprek komt er nog een laatste laag bovenop: de &lt;em&gt;systeemprompt&lt;/em&gt;. Dat is een reeks instructies die je niet ziet, maar die vooraan de context staat en definieert hoe het model zich moet gedragen.&lt;/p&gt;
&lt;p&gt;Het wordt wel een lang verhaal zo, nog even volhouden. Dan heb je een aardig overzicht van hoe modellen in elkaar zitten. We weten nu dat een model min of meer drie soorten “geheugen” heeft:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;De gewichten&lt;/strong&gt;. Alles wat tijdens het trainen is opgepikt. De gewichten staan stil. Na de training komt er niks meer bij.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;De context&lt;/strong&gt;. Alles in het lopende gesprek, van de systeemprompt tot jouw laatste zin. Eigenlijk is dit het vluchtige werkgeheugen, want bij een nieuwe sessie begin je weer alsof er nooit iets gezegd is.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Sommige chatproducten zoals ChatGPT en Claude omzeilen dit met een geheugenfunctie. Informatie uit eerdere gesprekken wordt dan bij een nieuw gesprek in de context geplakt. Dat is dan dus onderdeel van het externe geheugen van het volgende punt.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extern geheugen&lt;/strong&gt;. Wat het model erbij haalt. Dat kan een document zijn, een zoekopdracht of een tool. Opgehaald op het moment zelf, en in de context geplakt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dat verklaart ook waar een hoop verwarring vandaan komt. Geef je een model tijdens een gesprek een paar voorbeelden, dan lijkt het een patroon op te pikken. Maar dat gebeurt dus alleen in de huidige context, niet in de gewichten, en bij een volgend gesprek is het weer weg.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Als je echt interessant wilt doen: &lt;em&gt;in-context learning&lt;/em&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Omdat de gewichten na de training bevriezen, heeft elk model een kennisgrens. Het weet niks van wat er daarna gebeurt, tenzij je dat in de context stopt of via een tool toevoegt. Daarom zoeken recente modellen het web af en kunnen ze documenten lezen. Ze kennen het nieuws niet, maar halen het op en lezen het ter plekke.&lt;/p&gt;
&lt;h2&gt;Waarom een taalmodel hallucineert&lt;/h2&gt;
&lt;p&gt;Een taalmodel verkondigt soms heel stellig dingen die niet kloppen: &lt;a href=&quot;https://www.bbc.com/travel/article/20240222-air-canada-chatbot-misinformation-what-travellers-should-know&quot;&gt;niet-bestaand beleid&lt;/a&gt;, een verzonnen boektitel, een citaat dat nooit is uitgesproken. Zulke verzinsels heten &lt;em&gt;hallucinaties&lt;/em&gt;, en ze komen direct voort uit hoe een model werkt. Een model voorspelt een waarschijnlijk vervolg, niet per se de waarheid. Er zit nergens in de lus een controlestap. Als het model iets niet “weet”, dan valt het niet stil, maar vult het in wat plausibel is.&lt;/p&gt;
&lt;p&gt;Toch zit hier wel een rem op. Onderzoekers van Anthropic ontdekten hoe dit intern werkt. In een bijgeschaafd model zit een soort ingebouwde handrem, die het bij twijfel naar &lt;em&gt;“ik weet het niet”&lt;/em&gt; laat neigen. Zodra er een naam of term voorbijkomt die bekend klinkt, gaat de handrem eraf. Soms gebeurt dat onterecht, en dan zit er geen echte kennis achter de herkenning. Het model begint dan met volle overtuiging te fantaseren.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;De onderzoekers bewezen dit door de handrem er handmatig af te halen, waarna het model meteen de grootste onzin produceerde. Zie: &lt;a href=&quot;https://www.anthropic.com/research/tracing-thoughts-language-model&quot;&gt;Anthropic, “Tracing the thoughts of a large language model”, 2025&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Het model maakt dus geen betrouwbaar onderscheid tussen een feit dat vastligt en een gat dat het opvult. Juist bij namen, datums, cijfers en citaten is de kans op overtuigende onzin het grootst. De remedie is om het niet op zijn woord te geloven, het een bron te geven en te controleren wat eruit komt.&lt;/p&gt;
&lt;h2&gt;De voorspeller in een lus&lt;/h2&gt;
&lt;figure class=&quot;margin-figure&quot;&gt;
&lt;img src=&quot;https://marcelvanderhoek.nl/img/2026/zakmes.png&quot; alt=&quot;&quot;&gt;
&lt;/figure&gt;
&lt;p&gt;Tot nu toe hebben we het eigenlijk maar over één ding gehad: een taalmodel dat tekst voorspelt. Zo’n model kan niet betrouwbaar rekenen, niet in je agenda kijken, en niks opzoeken op internet. Als je naar het weer van morgen vraagt, dan krijg je een nutteloos antwoord.&lt;/p&gt;
&lt;p&gt;De oplossing is het aanreiken van een stukje software dat het model mag gebruiken, een &lt;em&gt;tool&lt;/em&gt; (je zag de term eerder al een paar keer voorbijkomen). Dat kan een rekenmachine zijn, een zoektool of zelfs een omgeving waarin code kan worden uitgevoerd. In de context staat welke tools beschikbaar zijn, en hoe ze aangeroepen kunnen worden. Het model kiest die aanroep zoals het elk ander token kiest: als het waarschijnlijkste vervolg. Met andere woorden: het model voorspelt de aanroep. Om die aanroep ook daadwerkelijk uit te voeren, zit er om het model een laag gewone software heen: het &lt;em&gt;harnas&lt;/em&gt; dat de tekstvoorspeller handen en voeten geeft.&lt;span class=&quot;sidenote-number&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sidenote&quot;&gt;Engelse term: &lt;em&gt;harness&lt;/em&gt;. Harnas is misschien niet de allerbeste letterlijke vertaling, maar in deze context vind ik hem wel mooi passen.&lt;/span&gt; Het harnas ziet de aanroep, voert de tool uit, en plakt het resultaat terug in de context. Daarna voorspelt het model weer verder, met het resultaat uit de tool erbij.&lt;/p&gt;
&lt;p&gt;Zet die stap in een lus en je hebt een &lt;em&gt;agent&lt;/em&gt;. Het model doet iets, ziet het resultaat, en kiest de volgende stap. Het kan verder met het genereren van tekst, nog een tool aanroepen, of stoppen als het doel bereikt is. Het bepaalt zelf wanneer het klaar is. Dit is nog steeds dezelfde lus waar we het heel de tijd al over hebben, maar nu met echte acties ertussen.&lt;/p&gt;
&lt;h2&gt;Zo simpel is het&lt;/h2&gt;
&lt;p&gt;Dat was het wel zo’n beetje. Nog even terug naar de vraag waarmee ik begon: &lt;em&gt;hoe werkt een taalmodel nou eigenlijk&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Het antwoord past nu in een paar zinnen. Een model berekent voor elk mogelijk vervolg de kans, en trekt uit die opties een token. Die voorspellingen zijn aangeleerd door tijdens het trainen miljarden keren te gokken en bij te stellen, tot alle kennis in de gewichten zat. Met een lus en wat tools erbij wordt die tekstvoorspeller opeens een agent die echte taken uit kan voeren. Een model heeft geen begrip zoals een mens, en er is geen database met vaststaande gegevens die wordt geraadpleegd.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How Docker Works Under the Hood</title>
    <id>https://marcelvanderhoek.nl/links/hoe-docker-onder-de-motorkap-werkt/</id>
    <link rel="alternate" href="https://blog.bytebytego.com/p/ep221-how-docker-works-under-the"/>
    <link rel="related" href="https://marcelvanderhoek.nl/links/hoe-docker-onder-de-motorkap-werkt/"/>
    <updated>2026-07-11T00:00:00.000Z</updated>
    <summary>ByteByteGo legt helder uit wat er onder Docker zit: namespaces, cgroups, images en containers.</summary>
    <content type="html">&lt;p&gt;Honderden containers opgestart, en toch nooit helemaal begrepen hoe Docker nu eigenlijk
werkt. Dit stuk legt het helder uit, en de nieuwsbrief van ByteByteGo is sowieso
een aanrader.&lt;/p&gt;

&lt;p&gt;Bron: &lt;a href=&quot;https://blog.bytebytego.com/p/ep221-how-docker-works-under-the&quot;&gt;blog.bytebytego.com&lt;/a&gt; · &lt;a href=&quot;https://marcelvanderhoek.nl/links/hoe-docker-onder-de-motorkap-werkt/&quot;&gt;permalink&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Citaat · T.H. White</title>
    <id>https://marcelvanderhoek.nl/citaten/the-once-and-future-king/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/citaten/the-once-and-future-king/"/>
    <updated>2026-07-11T00:00:00.000Z</updated>
    <content type="html">&lt;blockquote&gt;&lt;p&gt;“The best thing for being sad,” replied Merlin, beginning to puff and blow, “is to learn something. That’s the only thing that never fails. You may grow old and trembling in your anatomies, you may lie awake at night listening to the disorder of your veins, you may miss your only love, you may see the world about you devastated by evil lunatics, or know your honour trampled in the sewers of baser minds. There is only one thing for it then — to learn. Learn why the world wags and what wags it. That is the only thing which the mind can never exhaust, never alienate, never be tortured by, never fear or distrust, and never dream of regretting. Learning is the only thing for you. Look what a lot of things there are to learn.”&lt;/p&gt;
&lt;/blockquote&gt;&lt;p class=&quot;citaat-bron&quot;&gt;— T.H. White, &lt;cite&gt;The Once and Future King&lt;/cite&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Zuurdesembrood</title>
    <id>https://marcelvanderhoek.nl/recepten/zuurdesembrood/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/recepten/zuurdesembrood/"/>
    <updated>2025-08-29T00:00:00.000Z</updated>
    <summary>Mijn basis zuurdesembrood, met genoeg starter over voor de volgende keer.</summary>
    <content type="html">&lt;p&gt;Ik heb inmiddels een brood of vijftig gebakken met zuurdesem. Dat maakt me zeker geen meesterbakker, maar ik begin wel wat gevoel te krijgen voor het proces. Mijn &lt;a href=&quot;https://rutgerbakt.nl/brood-recepten/zuurdesembrood-maken/&quot;&gt;basisrecept&lt;/a&gt; komt van Rutger Bakt, inclusief de &lt;a href=&quot;https://rutgerbakt.nl/brood-recepten/desem-maken/&quot;&gt;methode om een starter te maken&lt;/a&gt;. Voordat ik bij zijn methode belandde heb ik meerdere andere varianten geprobeerd, die voornamelijk platte pannenkoeken opleverden.&lt;/p&gt;
&lt;p&gt;Voor het voeren van de desemstarter gebruik ik T65 bloem. Het bakken van het brood doe ik met een mengsel van Amerikaans patentbloem (60%) en T65 bloem (40%).&lt;/p&gt;
&lt;p&gt;Opbrengst: 1 brood · voorbereiding 1 uur · bereiding 1 uur · wachttijd 1 dag · totaal 1 dag 2 uur&lt;/p&gt;
&lt;h3&gt;Keukengerei&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;banneton (rijsmandje)&lt;/li&gt;
&lt;li&gt;gietijzeren pan met deksel&lt;/li&gt;
&lt;li&gt;keukenmachine met deeghaak&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Ingrediënten&lt;/h3&gt;
&lt;h4&gt;Starter&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;100 gram actieve starter&lt;/li&gt;
&lt;li&gt;100 gram bloem&lt;/li&gt;
&lt;li&gt;100 milliliter water&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Brood&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;390 gram bloem&lt;/li&gt;
&lt;li&gt;225 milliliter water&lt;/li&gt;
&lt;li&gt;165 gram actieve starter&lt;/li&gt;
&lt;li&gt;9 gram zout&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bereiding&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Meng alle ingrediënten in de mengkom van de keukenmachine. Laat vervolgens 25 minuten rusten.&lt;/li&gt;
&lt;li&gt;Kneed in de machine 6 minuten op stand 1 en 6 minuten op stand 2, of met de hand ongeveer 15 minuten tot soepel.&lt;/li&gt;
&lt;li&gt;Vouw het deeg een aantal keer dubbel en bol het vervolgens op. Dit brengt lucht in en versterkt het glutennetwerk. Herhaal dit elke 45 minuten, 3 tot 4 keer.&lt;/li&gt;
&lt;li&gt;Vorm het deeg en laat 12–24 uur in een bebloemd rijsmandje in de koelkast staan.&lt;/li&gt;
&lt;li&gt;Verwarm oven en gietijzeren pan voor op 230 °C.&lt;/li&gt;
&lt;li&gt;Deeg insnijden, 2 ijsblokjes in de pan gooien, brood snel in de pan en in totaal 46 minuten laten bakken. Na 25 minuten het deksel van de pan af, en oven terug naar 210 °C voor de laatste 21 minuten.&lt;/li&gt;
&lt;li&gt;Laat het brood op een rooster afkoelen voordat je het aansnijdt.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Notities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Van de 300 gram actieve starter gebruik je 165 gram voor het brood. De rest blijft in de pot voor de volgende keer.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Chutney van cherrytomaten</title>
    <id>https://marcelvanderhoek.nl/recepten/chutney-van-cherrytomaten/</id>
    <link rel="alternate" href="https://marcelvanderhoek.nl/recepten/chutney-van-cherrytomaten/"/>
    <updated>2025-08-26T00:00:00.000Z</updated>
    <summary>Deze chutney van zoete cherrytomaten smaakt perfect bij oude kaas of gewoon op een stuk brood.</summary>
    <content type="html">&lt;p&gt;De tomaten voor deze chutney kwamen uit onze eigen tuin. Mijn zoon en ik plantten een paar struikjes voor de leuk, en de oogst pakte veel groter uit dan we verwachtten. Pastasaus lag te veel voor de hand, dus het werd een chutney.&lt;/p&gt;
&lt;p&gt;Opbrengst: 1 potje van 370 ml · voorbereiding 15 min · bereiding 1 uur 30 min · totaal 1 uur 45 min&lt;/p&gt;
&lt;h3&gt;Keukengerei&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;steelpannetje&lt;/li&gt;
&lt;li&gt;glazen potje van 370 g, met deksel&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Ingrediënten&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;500 gram cherrytomaten&lt;/li&gt;
&lt;li&gt;2 teentjes knoflook&lt;/li&gt;
&lt;li&gt;180 gram kristalsuiker&lt;/li&gt;
&lt;li&gt;2 eetlepels appelciderazijn&lt;/li&gt;
&lt;li&gt;1 eetlepel balsamicoazijn&lt;/li&gt;
&lt;li&gt;1½ theelepel Old Mother Crispy chili in oil&lt;/li&gt;
&lt;li&gt;1 theelepel zout&lt;/li&gt;
&lt;li&gt;½ theelepel komijnzaad, fijn&lt;/li&gt;
&lt;li&gt;¼ theelepel cayennepeper&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bereiding&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Halveer de cherrytomaten en pers de knoflook.&lt;/li&gt;
&lt;li&gt;Doe alle ingrediënten in het steelpannetje, roer goed door elkaar en breng het geheel aan de kook.&lt;/li&gt;
&lt;li&gt;Laat zachtjes sudderen tot het een stevige, bijna stroperige dikte heeft gekregen. Bij mij duurde dit ongeveer anderhalf uur.&lt;/li&gt;
&lt;li&gt;Schep de hete prut in het schone potje, vul tot 5 mm onder de rand, sluit af en zet het potje 5 minuten op z&#39;n kop. Draai daarna om en laat langzaam afkoelen.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Notities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;De eerste versie van dit recept maakte ik met geleisuiker. Met kristalsuiker gaat het ook goed, de verdikking komt bij chutney door het inkoken.&lt;/li&gt;
&lt;li&gt;De gebruikte tomaten hebben we opgekweekt uit zaadjes en waren van het ras &lt;em&gt;Sweet Million F1&lt;/em&gt;. Een aanrader!&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
</feed>
