<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>[NL] &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/category/nl/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Fri, 22 May 2026 09:08:08 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>[NL] &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>&#8220;Talk to your data&#8221; met ChatGPT</title>
		<link>https://www.smalsresearch.be/talk-to-your-data-met-chatgpt/</link>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Fri, 22 May 2026 09:08:08 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=29352</guid>

					<description><![CDATA[De recente opkomst van generatieve artificiële intelligentie (GenAI) heeft tal van sectoren op hun kop gezet, waaronder de IT-sector zelf (coding assistants, geautomatiseerd testen, vertaling van programmeertalen…). Het domein van de data-analyse, of data science, vormt hierop geen uitzondering. Vaak wordt gezegd dat 80% van de tijd van een data scientist wordt besteed aan het [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>De recente opkomst van generatieve artificiële intelligentie (GenAI) heeft tal van sectoren op hun kop gezet, waaronder de IT-sector zelf (<a href="https://www.smalsresearch.be/opensource-coding-assistants/">coding</a> <a href="https://www.smalsresearch.be/vibe-coding-met-agentic-ides/">assistants</a>, geautomatiseerd testen, vertaling van programmeertalen…). Het domein van de data-analyse, of <em>data science</em>, vormt hierop geen uitzondering. Vaak wordt gezegd dat 80% van de tijd van een <em>data scientist</em> wordt besteed aan het pre-processing van data (ingestion, transformatie, opschoning, verrijking…), wat vaak arbeidsintensief en repetitief is, en dat slechts 20% een beroep doet op zijn meest geavanceerde vaardigheden. Kan GenAI worden ingezet om deze 80% te versnellen? Aan de hand van dit inleidende artikel zullen we aantonen dat het antwoord grotendeels positief is, maar dat bovendien ook de resterende 20% al in belangrijke mate is aangepakt. We bekijken in hoeverre een tool als ChatGPT kan helpen bij het analyseren van data: begrijpen wat ze bevatten, statistische indicatoren extraheren, afwijkingen identificeren, specifieke fenomenen verklaren….</p>



<p>Om dit te illustreren, baseren we ons op de dataset <a href="https://www.kaggle.com/datasets/nadianassiri/urgences-data">“urgences data”, beschikbaar op Kaggle</a>.<br>&nbsp;Het betreft een CSV-bestand van ~430 MB, bestaande uit 336.253 rijen en 39 kolommen, zonder bijbehorende metadata. Elke rij komt overeen met een bezoek van een patiënt aan de spoeddienst van een (niet nader genoemd) ziekenhuis in Noord-Frankrijk, tussen 6 januari 2016 en 6 december 2020. Het bevat een schat aan informatie: datum en tijdstip van aankomst en vertrek, vervoermiddel, oorzaak, leeftijd, een aantal medische parameters, zoals hartslag, bloeddruk, temperatuur, zuurstofsaturatie, evenals booleaanse waarden die lijken aan te geven of aanvullende onderzoeken zijn voorgeschreven (bloedonderzoek, röntgenfoto, echografie, CT-scan, MRI…)</p>



<p>We gaan gebruikmaken van “Data Analyst”, een van de “GPT’s” die in ChatGPT worden aangeboden. Aangezien de gratis versie beperkt is tot een zeer klein aantal vragen, hebben we een betaalde versie (“Personal Plus”) gebruikt. Voor deze oefening hebben we in het Engels gecommuniceerd, maar vergelijkbare resultaten zouden waarschijnlijk ook in het Frans of Nederlands zijn verkregen.</p>



<h1 class="wp-block-heading">Voorafgaande analyse</h1>



<p>Een eerste stap kan bestaan uit het simpelweg indienen van het te analyseren bestand bij “Data Analyst” en hem te vragen wat hij daarin kan vinden. Meer formeel levert een vraag als “<em>What useful insight can you extract from those data?</em>” ons het onderstaande resultaat op.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1.png"><img fetchpriority="high" decoding="async" width="874" height="1433" data-id="26614" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1.png" alt="" class="wp-image-26614" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1.png 874w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1-183x300.png 183w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1-625x1024.png 625w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1-768x1259.png 768w" sizes="(max-width: 874px) 100vw, 874px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2.png"><img decoding="async" width="823" height="1492" data-id="26616" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2.png" alt="" class="wp-image-26616" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2.png 823w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2-165x300.png 165w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2-565x1024.png 565w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2-768x1392.png 768w" sizes="(max-width: 823px) 100vw, 823px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3.png"><img decoding="async" width="853" height="882" data-id="26615" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3.png" alt="" class="wp-image-26615" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3.png 853w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3-290x300.png 290w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3-768x794.png 768w" sizes="(max-width: 853px) 100vw, 853px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">&#8220;What useful insight can you extract from those data?&#8221;</figcaption></figure>



<p>We verkrijgen een resultaat dat een structuur volgt die in bijna alle antwoorden terug te vinden is:</p>



<ol class="wp-block-list">
<li>Een reeks grafieken. Hier zien we een leeftijdsverdeling van de patiënten, de gemiddelde verdeling per tijdstip van de dag, evenals de verdeling van de bestemming (terug naar huis, interne overplaatsing…). Merk op dat ChatGPT, zonder dat wij daar iets over hebben gezegd, begrepen heeft dat het om patiënten van een spoeddienst ging;</li>



<li>Een gestructureerde tekstanalyse van wat het uit de gegevens heeft kunnen opmaken. De demografische gegevens van de patiënten, de piekuren, waar de patiënten na vertrek naartoe gaan en hoe ze zijn aangekomen;</li>



<li>Strategische voorstellen;</li>



<li>Voorstellen voor de volgende stappen. “<em>If you’d like, I can next:</em>”, gevolgd door een reeks relevante prompts om de analyse voort te zetten (die je helaas moet kopiëren en plakken).</li>
</ol>



<figure class="wp-block-image alignright size-full is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/image.png"><img loading="lazy" decoding="async" width="671" height="681" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/image.png" alt="" class="wp-image-26618" style="aspect-ratio:1;object-fit:cover;width:320px;height:auto" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/image.png 671w, https://www.smalsresearch.be/wp-content/uploads/2026/03/image-296x300.png 296w" sizes="auto, (max-width: 671px) 100vw, 671px" /></a></figure>



<p>Bovendien eindigt de tekst altijd met een link “&lt;/&gt;”, die niet voorkomt in een “standaard” ChatGPT-chat en waarop je kan klikken om de Python-code te verkrijgen waarop deze analyse is gebaseerd. Deze code, die is gemaakt met behulp van de Python-library “Pandas” (een van de meest gebruikte open-source tools voor data-analyse en data science), maakt het mogelijk om de voorgestelde grafieken te genereren, evenals alle cijfers die in de beschrijvingen worden gebruikt. Het is dus volkomen mogelijk om deze code niet alleen direct te gebruiken, maar ook om er zeker van te zijn dat de cijfers niet volledig verzonnen zijn, maar gebaseerd zijn op algemene statistische modellen en zorgvuldig berekend zijn op basis van de verstrekte gegevens.</p>



<p>Zo konden we met één enkele zin en na amper een minuut wachten drie grafieken, Python-code en een beschrijvende tekst verkrijgen, waar een data scientist normaal gesproken meerdere uren over zou hebben gedaan. Dit is natuurlijk een zeer beknopte eerste benadering. Maar we kunnen nog verder gaan.</p>



<p>We kunnen bijvoorbeeld vragen naar een statistische beschrijving voor elke kolom. Het resultaat is hier een lange, zeer gestructureerde beschrijving, per type variabele (numeriek of categorisch), met een reeks indicatoren: gemiddelde, minimum/maximum, aantal ontbrekende waarden… evenals een opmerking (<em>“Not usable for analysis”, “Vital signs moderately complete”, “Excellent for resource utilization analysis”, “Likely categorical indicator”…</em>). De tool biedt ons ook enkele opmerkingen met betrekking tot de kwaliteit van de gegevens (bijvoorbeeld: <em>“Outliers: Age max = 218 (likely error)”</em>).</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1.png"><img loading="lazy" decoding="async" width="567" height="1024" data-id="26621" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-567x1024.png" alt="" class="wp-image-26621" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-567x1024.png 567w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-166x300.png 166w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-768x1388.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-850x1536.png 850w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1.png 860w" sizes="auto, (max-width: 567px) 100vw, 567px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2.png"><img loading="lazy" decoding="async" width="509" height="1024" data-id="26619" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-509x1024.png" alt="" class="wp-image-26619" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-509x1024.png 509w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-149x300.png 149w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-768x1546.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-763x1536.png 763w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2.png 828w" sizes="auto, (max-width: 509px) 100vw, 509px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3.png"><img loading="lazy" decoding="async" width="831" height="914" data-id="26620" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3.png" alt="" class="wp-image-26620" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3.png 831w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3-273x300.png 273w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3-768x845.png 768w" sizes="auto, (max-width: 831px) 100vw, 831px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">&#8220;Perform descriptive statistics on each column&#8221;</figcaption></figure>



<p>Op dezelfde manier kunnen we een “EDA” (Exploratory Data Analysis) aanvragen, die een vergelijkbare analyse oplevert, die deels overlapt maar ook andere aspecten behandelt.</p>



<figure class="wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1.png"><img loading="lazy" decoding="async" width="532" height="1024" data-id="26622" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-532x1024.png" alt="" class="wp-image-26622" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-532x1024.png 532w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-156x300.png 156w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-768x1478.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-798x1536.png 798w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1.png 827w" sizes="auto, (max-width: 532px) 100vw, 532px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2.png"><img loading="lazy" decoding="async" width="546" height="1024" data-id="26624" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-546x1024.png" alt="" class="wp-image-26624" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-546x1024.png 546w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-160x300.png 160w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-768x1441.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-818x1536.png 818w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2.png 820w" sizes="auto, (max-width: 546px) 100vw, 546px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3.png"><img loading="lazy" decoding="async" width="560" height="1024" data-id="26625" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3-560x1024.png" alt="" class="wp-image-26625" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3-560x1024.png 560w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3-164x300.png 164w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3-768x1403.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3.png 827w" sizes="auto, (max-width: 560px) 100vw, 560px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4.png"><img loading="lazy" decoding="async" width="567" height="1024" data-id="26623" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4-567x1024.png" alt="" class="wp-image-26623" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4-567x1024.png 567w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4-166x300.png 166w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4-768x1388.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4.png 830w" sizes="auto, (max-width: 567px) 100vw, 567px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">&#8220;Provide an EDA for this dataset&#8221;</figcaption></figure>



<p>Met dit soort “prompt” hebben we dus binnen enkele minuten een eerste gedetailleerd, cijfermatig maar duidelijk en begrijpelijk overzicht van een redelijk omvangrijke dataset. ChatGPT begrijpt, of gedraagt zich in ieder geval alsof het de inhoud van de gegevens begrijpt:</p>



<figure class="wp-block-image alignright size-medium"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30.png"><img loading="lazy" decoding="async" width="300" height="190" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30-300x190.png" alt="" class="wp-image-26626" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30-300x190.png 300w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30-768x485.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30.png 845w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<ul class="wp-block-list">
<li>De tool berekent een “<em>length of stay</em>” en interpreteert dus duidelijk twee kolommen (DH_arrivee en DH_sortie). Er is echter een klein probleempje: in de gegevens bevat het aankomsttijdstip een datum en een uur, maar de “DH_sortie” bevat alleen de datum (met 00:00 als uur), waardoor de berekening weinig relevant is, vooral voor korte verblijven. Maar als we hem vragen hoe hij deze &#8220;<em>length of stay</em>&#8221; heeft berekend, wijst hij op het probleem;</li>



<li>Hij ‘begrijpt’ dat de kolom ‘Code_CCMU’ (met de codes 1, 2, 3, 4, 5, P of D) verwijst naar de Franse nomenclatuur van de ‘<a href="https://fr.wikipedia.org/wiki/Classification_clinique_des_malades_aux_urgences">Classification Clinique des Malades aux Urgences</a>’ en de ernst aangeeft. Hij stelt voor om een “severity analysis (CCMU code distribution)” uit te voeren, waarin hij de codes correct interpreteert;</li>



<li>Hij komt met voorstellen die weliswaar enigszins naïef zijn, maar relevant in deze context. Hier volgen twee voorbeelden:</li>
</ul>



<figure class="wp-block-gallery has-nested-images columns-default wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h14_41.png"><img loading="lazy" decoding="async" width="627" height="418" data-id="26627" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h14_41.png" alt="" class="wp-image-26627" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h14_41.png 627w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h14_41-300x200.png 300w" sizes="auto, (max-width: 627px) 100vw, 627px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h18_59.png"><img loading="lazy" decoding="async" width="530" height="294" data-id="26628" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h18_59.png" alt="" class="wp-image-26628" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h18_59.png 530w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h18_59-300x166.png 300w" sizes="auto, (max-width: 530px) 100vw, 530px" /></a></figure>
</figure>



<h1 class="wp-block-heading">Analyse per categorie</h1>



<p>Bij het bekijken van de gegevens viel ons op dat er twee kolommen zijn die betrekking hebben op de reden van opname van de patiënt: een kolom “motif_entree”, die zeer weinig gestructureerd is ( “Trauma cheville G”, “A avalé une LED avec une pile”…) en een andere “semi-gestructureerde” kolom: “Cardiologie: Douleur thoracique atypique”, “Pneumologie: Dyspnée sans détresse”, “Toxicologie: Alcoolisation/Ivresse aigue”… Het zou interessant zijn om bepaalde elementen te kunnen analyseren op basis van een “categorie”: “Cardiologie”, “Pneumologie”, “Toxicologie”…</p>



<p>We kunnen ChatGPT eenvoudigweg vragen “extract categories from motif_venue”, zonder het enige informatie te geven over hoe dit moet gebeuren. Als antwoord krijgen we dan een overzicht van deze nieuwe attributen, met uitleg over hoe dit tot stand is gekomen, evenals enkele relevante opmerkingen over de kwaliteit van de gegevens:</p>



<figure class="wp-block-gallery has-nested-images columns-default wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h52_55.png"><img loading="lazy" decoding="async" width="725" height="746" data-id="26632" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h52_55.png" alt="" class="wp-image-26632" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h52_55.png 725w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h52_55-292x300.png 292w" sizes="auto, (max-width: 725px) 100vw, 725px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h53_20.png"><img loading="lazy" decoding="async" width="572" height="314" data-id="26633" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h53_20.png" alt="" class="wp-image-26633" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h53_20.png 572w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h53_20-300x165.png 300w" sizes="auto, (max-width: 572px) 100vw, 572px" /></a></figure>
</figure>



<p>Een vraag die dan natuurlijk in ons opkomt, is hoe deze zich in de loop van de tijd gedragen. We kunnen ons bijvoorbeeld voorstellen dat longproblemen vooral in de winter voorkomen, in de periode waarin griep en andere virussen heersen. Maar hoe zit het met de andere aandoeningen?</p>



<figure class="wp-block-image alignleft size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart.png"><img loading="lazy" decoding="async" width="592" height="491" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart.png" alt="" class="wp-image-26634" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart.png 592w, https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart-300x249.png 300w" sizes="auto, (max-width: 592px) 100vw, 592px" /></a></figure>



<p>Laten we ChatGPT vragen: “<em>Plot occurrence line charts grouped by cleansed categories, for the top 10</em>“. We krijgen dan de grafiek tegenover deze tekst te zien, samen met een reeks opmerkingen. Men kan verrast zijn door de duizelingwekkende daling van de cijfers, over alle categorieën heen, die zich begin 2020 voordeed. Maar iedereen die in deze periode niet onder een steen heeft geleefd, zal de reden hiervoor snel hebben begrepen… wat ChatGPT ook niet is ontgaan, zoals blijkt uit een van zijn opmerkingen:</p>



<p>&#8220;<em>The sharp drop in early 2020 is visible across all categories — a clear COVID shock to ED visit</em>&#8220;</p>



<p>Om seizoensgebonden trends te verkrijgen, kunnen we vragen om de drie jaren waarvoor we volledige gegevens hebben bij elkaar op te tellen en de gegevens af te vlakken, waarbij we uitgaan van een voortschrijdend gemiddelde over 7 dagen: &#8220;<em>For the top 10 cleansed categories, plot the number of visits per date in year (summing up values for 2017, 2018 and 2019, excluding 2016 and 2020), with a moving average of 7 days</em>&#8220;.</p>



<p>Na wat vallen en opstaan met prompts om de grafieklegende weer te geven of diverse aspecten aan te passen, verkrijgen we het volgende resultaat:</p>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg.png"><img loading="lazy" decoding="async" width="1024" height="504" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg-1024x504.png" alt="" class="wp-image-26637" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg-1024x504.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg-300x148.png 300w, https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg-768x378.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg.png 1186w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Zoals verwacht merken we dat longziekten (in het bruin) in de winter vaker voorkomen dan in de zomer, maar wat verrassend is, is die enorme piek in de stomatologie helemaal aan het einde van het jaar. Nadat we ons ervan hadden verzekerd dat de piek zich inderdaad elk jaar voordeed, met enkele uitschieters die we hier buiten beschouwing laten, stelden we de vraag: “<em>how to explain the peak of total visits for stomatology for the last week?</em>”.We waren duidelijk onder de indruk van de relevantie van het antwoord.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-6 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1.png"><img loading="lazy" decoding="async" width="609" height="1024" data-id="26638" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1-609x1024.png" alt="" class="wp-image-26638" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1-609x1024.png 609w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1-179x300.png 179w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1-768x1291.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1.png 833w" sizes="auto, (max-width: 609px) 100vw, 609px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2.png"><img loading="lazy" decoding="async" width="654" height="1024" data-id="26639" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2-654x1024.png" alt="" class="wp-image-26639" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2-654x1024.png 654w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2-192x300.png 192w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2-768x1202.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2.png 815w" sizes="auto, (max-width: 654px) 100vw, 654px" /></a></figure>
</figure>



<p>Twee verklaringen, die ChatGPT niet in de dataset heeft kunnen vinden, maar alleen door een verband te leggen met zijn “algemene kennis”, lijken ons zeer aannemelijk:</p>



<ul class="wp-block-list">
<li>Tandartspraktijken zijn tijdens de feestdagen grotendeels gesloten (of meer in het algemeen tijdens de vakantie, gezien de twee kleinere pieken);</li>



<li>Veel mensen willen hun vergoedingsmogelijkheden vóór het einde van het jaar ‘volledig benutten’.</li>
</ul>



<p>Het spreekt voor zich dat nader onderzoek nodig is alvorens hieruit operationele beslissingen te trekken, maar we hebben hier al tegen zeer lage kosten een reeks hypothesen om te onderzoeken.</p>



<h1 class="wp-block-heading">Beperkingen</h1>



<p>Hoewel een eerste overzicht indrukwekkend kan lijken, is voorzichtigheid geboden. Het is duidelijk dat een dergelijk hulpmiddel een waardevolle bondgenoot kan zijn voor een <em>data scientist</em>, en zelfs professionals met beperkte technische vaardigheden in staat kan stellen toegang te krijgen tot een eerste analyse. Hier volgen enkele aandachtspunten uit onze ervaring met deze dataset.</p>



<ul class="wp-block-list">
<li>Je wordt geen “data scientist” alleen omdat je mooie grafieken kunt maken of cijfers kunt leveren. Je moet ze ook kunnen interpreteren en ervoor zorgen dat je niet in een van de vele valkuilen van de statistiek trapt;</li>



<li>In ons voorbeeld hebben we onze volledige dataset naar ChatGPT gestuurd. We hebben geen enkele controle over wat ermee gebeurt. In dit geval ging het om openbare gegevens, maar hoe zit het met vertrouwelijke gegevens? Het is altijd mogelijk om een LLM on-premise te installeren, maar de kosten zijn aanzienlijk hoger en de prestaties lager;</li>



<li>We hebben slechts één voorbeeld met één tabel getest. De literatuur lijkt aan te geven dat dit ook geldt voor een complexere database, maar we zullen dit nog moeten uitproberen;</li>



<li>De modus “vraag-antwoord” maakt alleen een lange, lineaire dialoog mogelijk. Al snel ontstaat er een lange, zeer rommelige discussie, met meerdere pogingen om de tool duidelijk te maken wat we willen. Als we bijvoorbeeld een criterium willen aanpassen voorafgaand aan een reeds uitgevoerde analyse (bijvoorbeeld door deze te beperken tot een bepaalde periode of bepaalde soorten gegevens te verwijderen), kunnen we niet teruggaan. Je moet dan een nieuwe chat starten of alle vragen opnieuw stellen;</li>



<li>In dezelfde lijn: als de invoergegevens worden bijgewerkt, moet het hele gesprek opnieuw worden gevoerd;</li>



<li>Naast het weinig gestructureerde karakter valt ook een gebrek aan consistentie op:
<ul class="wp-block-list">
<li>Bij het extraheren van de “categorie” hebben we gevraagd om, naast de scheiding op basis van de “:”, ook bepaalde kwaliteitsproblemen te corrigeren (bijvoorbeeld door “Cardiovasculaire” te vervangen door “Cardiologie” of “Intoxications” door “Toxicologie”). De vragen die kort na deze opschoning volgden, hielden rekening met de meest uitgebreide versie. Maar enkele dagen later, toen we het hadden over “cleansed categories”, hield ChatGPT het bij splitsen op basis van de “:”,</li>



<li>We hebben precies dezelfde vraag met een onderbreking van een maand gesteld. De numerieke waarden in het antwoord bleven consistent, maar de tekst was qua vorm radicaal anders (hoewel qua inhoud vergelijkbaar);</li>
</ul>
</li>



<li>De Python-code die bij elke vraag wordt voorgesteld, wordt daadwerkelijk uitgevoerd op de servers van ChatGPT, dat het resultaat gebruikt om zijn antwoord te genereren. Maar de beschikbare uitvoeringstijd is vrij beperkt. Het trainen van een eenvoudig machine learning-model (bijvoorbeeld “<em>Compute feature importance using Random Forest, with ‘scanner’ as target</em>”) leidt vaak tot een <em>time-out</em>. ChatGPT doet dan echter een reeks voorstellen om de benodigde rekentijd te verminderen (stratificatie, vermindering van het aantal bomen, vermindering van de cardinaliteit van bepaalde variabelen…).</li>
</ul>



<p>Een relevante aanpak zou waarschijnlijk zijn om ChatGPT of een van zijn concurrenten te gebruiken om de gegevens te verkennen, snel afwijkingen of kwaliteitsproblemen te identificeren, mogelijke benaderingen te vinden, geschikte voorspellingsmodellen te selecteren&#8230; Je zou ook kunnen vragen om grafieken, tabellen en cijfers te genereren&#8230; Vervolgens kunnen de voorgestelde stukjes code worden opgehaald en geïntegreerd in een script of een geconsolideerd notebook. Merk op dat er ook kan worden geïnterageerd met de API&#8217;s van ChatGPT en anderen, zoals Gemini. We zullen deze aanpak in een volgend artikel bespreken.</p>



<p>Als we naar de toekomst kijken, zijn we niet bang dat GenAI data scientists zal vervangen. Het is duidelijk dat de onvermijdelijke toename van steeds grotere en complexere datavolumes de behoefte aan personeel dat deze analyse kan uitvoeren alleen maar zal vergroten. Maar GenAI zal hun beroep ongetwijfeld veranderen. En GenAI zal zeker de data scientists die het niet gebruiken, vervangen door data scientists die er effectief mee kunnen omgaan.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Digital Twins in administratieve context</title>
		<link>https://www.smalsresearch.be/digital-twins-in-administratieve-context/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Tue, 19 May 2026 06:31:50 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Digitalisation]]></category>
		<category><![CDATA[governance]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26822</guid>

					<description><![CDATA[Digital Twin is een trendy buzzword. Maar kan het ook iets betekenen in een administratieve omgeving?]]></description>
										<content:encoded><![CDATA[
<p>Van het concept <em><a href="https://www.ibm.com/think/topics/digital-twin">Digital Twin</a></em> claimt <a href="https://ntrs.nasa.gov/citations/20210023699">de NASA</a> dat zij het als eersten toepasten. Om beter het gedrag te kunnen voorspellen van wat ze de ruimte in schoten, had men nood aan een kopie op aarde &#8211; niet alleen fysiek, maar ook digitaal. Sommige scenario&#8217;s zijn nu eenmaal moeilijk na te bootsen op aarde, maar moeten wel zo gedetailleerd mogelijk doorgerekend kunnen worden. Deze aanpak vond navolging in andere industrieën, zoals de luchtvaart, waar ontwerpfouten catastrofale gevolgen zouden kunnen hebben, of waar een <em>trial-and-error</em> methodiek te duur of praktisch onmogelijk zou zijn.</p>



<p><em>Digital Twin</em> verschijnt echter pas als onderwerp op de <a href="https://www.forbes.com/sites/gartnergroup/2016/10/26/gartners-top-10-strategic-technology-trends-for-2017/">radar van Gartner</a> eind 2016. Ook de <a href="https://en.wikipedia.org/wiki/Digital_twin">Wikipedia-pagina over het onderwerp</a> is een relatief recent gegeven, aangemaakt in 2015, veel later dan die over <a href="https://en.wikipedia.org/wiki/Virtual_reality">Virtual Reality</a> (2001) en <a href="https://en.wikipedia.org/wiki/Internet_of_things">Internet of Things</a> (2007). Het idee van <em>Digital Twin</em>s werd echter snel populair, daarbij geholpen door het Europese Horizon-2020 programma dat er brood in zag en verschillende projecten rond het thema financierde voor miljoenen euro&#8217;s (<a href="https://www.horizon-europe.gouv.fr/supporting-development-digital-twin-improve-management-operations-and-resilience-eu-electricity">[1]</a>, <a href="https://www.digitalurbantwins.com/">[2]</a>, <a href="https://www.imec.be/nl/vlaamse-innovatiemotor/impactdomeinen/smart-cities/precinct">[3]</a>, <a href="https://sphere-project.eu/">[4]</a>). Alvast in Vlaanderen heeft men die kans gretig gegrepen, met <a href="https://www.imec.be/nl/vlaamse-innovatiemotor/samenwerking/vlaamse-onderzoeksprogrammas/city-of-things">IMEC in een centrale rol</a>, bijgestaan door een enthousiast <a href="https://www.vlaanderen.be/digitaal-vlaanderen/digitaal-vlaanderen-zet-vaart-achter-europese-digital-twins-en-baant-zo-de-weg-naar-een-citiverse">Digitaal Vlaanderen</a>, en ook <a href="https://vito.be/en/research/digital-twins-in-health">VITO</a> is overtuigd.</p>



<p>Marketinggewijs heeft de <em>Digital Twin</em> zijn waarde dus alvast bewezen. Maar kan het een concrete meerwaarde zijn voor publieke administraties? Ook daar worden workflows snel complex, kunnen wijzigingen duur zijn, en wil men misschien éen en ander kunnen simuleren alvorens het effectief te implementeren. In dit artikel onderzoeken we wat de <em>Digital Twin</em> kan betekenen in een administratieve context.  </p>



<h2 class="wp-block-heading">Definities</h2>



<p>Er bestaan nogal wat verschillende interpretaties van <em>Digital Twin</em>. De essentie is alleszins niet nieuw: een systeem wordt digitaal weergegeven zodat het kan worden geobserveerd, getest en verbeterd zonder de daadwerkelijke werking direct aan te tasten. Het belangrijkste onderscheidende kenmerk is de continue (of in ieder geval regelmatige) <strong>synchronisatie </strong>tussen het reële systeem (de &#8216;doelentiteit&#8217; of <em>&#8216;target entity&#8217;</em>), en zijn digitale tegenhanger. De EU JRC hanteert een <a href="https://interoperable-europe.ec.europa.eu/sites/default/files/document/2020-06/ELISEWebinar_9_DigitalTwins.pdf">maturiteitsmodel</a> dat verschillende niveau&#8217;s van integratie onderscheidt; enkel in het geval van tweerichtings-datauitwisseling tussen target en twin wordt echt van een twin gesproken. Op internationaal vlak worden pogingen ondernomen tot <a href="https://www.iso.org/standard/81442.html">standaardisering van terminologie</a>.</p>



<p>Om nuttig te kunnen zijn moet een Digital Twin uitgewerkt zijn in voldoende detail. Al naargelang de toepassing zal het niveau van granulariteit of resolutie variëren. De twin moet de doelentiteit gedurende diens volledige <em>life cycle</em> getrouw kunnen weergeven, maar dat betekent niet dat elk detail tot in de puntjes gesimuleerd moet zijn. In de <a href="https://www.nature.com/articles/s41746-024-01073-0">medische sector</a> zien we digital twins opduiken op het niveau van de <a href="https://www.rfi.ac.uk/focus/projects/digital-twin-cell/">cel</a>, van het <a href="https://www.turing.ac.uk/science-innovation/health/cardiac-digital-twins">orgaan</a>, van een <a href="https://digital-strategy.ec.europa.eu/en/policies/virtual-human-twins">persoon</a> of van de <a href="https://pubmed.ncbi.nlm.nih.gov/40762974/">populatie</a>. Niets belet ook dat een Digital Twin slechts een onderdeeltje vormt van een groter systeem &#8211; het kan bijvoorbeeld alleen maar uitgewerkt zijn voor 1 kritische component. </p>



<p>We kunnen twee stromingen van Digital Twins onderscheiden:</p>



<ul class="wp-block-list">
<li>Hoogwaardige technologische twins (luchtvaart, industrie, infrastructuur), waarbij de twin wordt gebruikt voor diagnostiek, voorspellend onderhoud of iteratief ontwerp op basis van operationele gegevens &#8211; bij <a href="https://ntrs.nasa.gov/api/citations/20210023699/downloads/ASME%20Digital%20Twin%20Summit%20Keynote_final.pdf">NASA</a>, voor <a href="https://initiatives.weforum.org/future-power-system/case-study-details/digital-twin-grid/aJYTG00000010pB4AQ">elektriciteitsdistributie</a>, &#8230; </li>



<li>Informatiesysteem- of socio-technische twins (steden, organisaties, dienstverlening), waarbij de doelentiteit niet zozeer een machine is maar eerder een complex systeem met meerdere belanghebbenden, bestaande uit processen, regels, mensen en gegevensstromen. Deze tweede stroom is waar de publieke sector in past, maar het is ook waar de <a href="https://interoperable-europe.ec.europa.eu/collection/elise-european-location-interoperability-solutions-e-government/glossary/term/digital-twin-government">definities vaag worden</a> en <em>Digital Twin</em> soms wordt gebruikt als <a href="https://eprintspublications.npl.co.uk/9880/">marketingterm voor &#8216;dashboard+model&#8217;</a>.</li>
</ul>



<p>Waar beleidsmatig enige vaagheid misschien onvermijdelijk is, willen we in de praktijk toch een meer operationele interpretatie. We zouden een administratieve digital twin kunnen definiëren als: <strong>een continu geüpdatete, testbare, digitale representatie van de realiteit van de dienstverlening</strong>. Dit omvat processen, dossiers en de status waarin die zich bevinden, een uitvoerbaar systeem van de regels die van toepassing zijn, en alle dataverkeer dat nodig is om het geheel te doen werken. Dat moet toelaten de huidige realiteit van nabij te monitoren, en eventuele wijzigingen vooraf te simuleren voordat ze worden toegepast.</p>



<p>Voor een industrieel proces gedreven door sensordata en de onveranderlijke wetten van de fysica, ligt dat gemakkelijker dan voor het overheidswezen, waar men vaak gevoelige gegevens verwerkt en afhangt van regelmatig wijzigende regels die ruimte laten voor interpretatie (zie ook onze eerder gepubliceerde artikels over <a href="https://www.smalsresearch.be/rules-as-code-nl/">Rules As Code</a>). Bezorgdheden rond <em>data governance</em> (<a href="https://eur-lex.europa.eu/eli/reg/2016/679/oj">GDPR</a> etc.) kunnen het moeilijk maken om synchronisatie met real-time gegevens op te zetten. Beslissingslogica is vaak nauw verweven met de code van applicaties, wat aanpassingen en  compliance checking bemoeilijkt. Het is daarom vaak al een hele prestatie als men in overheidscontext tot een <a href="https://en.wikipedia.org/wiki/Digital_twin_integration_level"><em>Digital Shadow</em></a> komt, die we ergens kunnen situeren tussen een &#8220;dom&#8221; model en een echte gesynchroniseerde twin.</p>



<h2 class="wp-block-heading">Toonaangevende projecten</h2>



<p>In Europa gaan de opvallendste Digital Twin projecten overwegend over klimaat en wetenschap:</p>



<ul class="wp-block-list">
<li><a href="https://destination-earth.eu/">Destination Earth of DestinE</a> combineert grootschalige gegevens van <a href="https://www.eumetsat.int/">(weer)satellieten</a> en <a href="https://www.copernicus.eu/">Copernicus</a> in een <a href="https://destination-earth.eu/destination-earth/destines-components/destination-earth-data-lake/">data lake</a>. Op basis daarvan zagen 2 Digital Twins het licht: <a href="https://destine.ecmwf.int/climate-change-adaptation-digital-twin-climate-dt/">Climate Change Adaptation</a> (langetermijn) en <a href="https://destine.ecmwf.int/weather-induced-extremes-digital-twin/">Weather-induced Extremes</a> (kortetermijn). Daarvoor ontwikkelden ze hun eigen <a href="https://stories.ecmwf.int/the-digital-twin-engine/">Digital Twin Engine</a>. Het project wordt <a href="https://destination-earth.eu/news/destination-earth-moves-into-phase-three/">voortgezet</a>, waarbij men gemakkelijker &#8220;downstream applicaties&#8221; van externe gebruikers wil faciliteren die deelaspecten of specifieke onderzoeksvragen verder kunnen uitdiepen. Dat alles moet gedeeld worden via <a href="https://platform.destine.eu/">1 platform</a> gecoördineerd door <a href="https://www.esa.int/Applications/Observing_the_Earth/Destination_Earth">ESA</a>.</li>



<li>Het <a href="https://www.edito.eu/">EDITO</a> project probeert gelijkaardige doelstellingen te bereiken maar dan voor oceanen. Hiervoor wordt data van <a href="https://emodnet.ec.europa.eu/en">EMODnet</a> en <a href="https://marine.copernicus.eu/">Copernicus</a> samengebracht. Toegang verloopt via een <a href="https://datalab.dive.edito.eu/">Datalab</a> dat ook een reeks andere bouwblokken en services aanbiedt, en de applicaties die erop gebouwd worden kunnen een plaats krijgen op het <a href="https://dive.edito.eu/">digitaal platform</a> van het initiatief.</li>



<li><a href="https://www.intertwin.eu/use-cases">Verschillende use cases</a> worden ook opgelijst in het kader van het <a href="https://www.intertwin.eu/article/intertwin-has-ended-whats-next">recent afgelopen</a> (en Europees <a href="https://cordis.europa.eu/project/id/101058386">gefinancierde</a>) interTwin onderzoeksproject, dat een enigszins <a href="https://zenodo.org/records/10650440">gestandaardiseerde architectuur</a> met <a href="https://www.intertwin.eu/intertwin-digital-twin-engine">herbruikbare componenten</a> voor Digital Twins trachtte ontwikkelen. Zij benaderden het onderwerp eerder vanuit de wereld van het <a href="https://openlab.cern/intertwin/">CERN</a>, en onafhankelijk van de twee eerder vermelde initiatieven. Onderweg leerden ze wel van elkaars bestaan en werd een <a href="https://zenodo.org/records/16966835">mogelijke interoperabiliteit</a> met het <a href="https://www.esa.int/Applications/Observing_the_Earth/Destination_Earth">ESA-gelinkte DestinE</a> alvast onderzocht.</li>
</ul>



<p>In een administratieve context hebben we minder boodschap aan gegevens van satellieten of deeltjesversnellers. Omwille van de <em>governance</em>-vereisten komt de nadruk veeleer te liggen op correcte interoperabiliteit en data-uitwisseling, conform alle geldende wettelijke kaders. In dat opzicht zijn de nuttigste Europese initiatieven misschien nog de <a href="https://digital-strategy.ec.europa.eu/en/policies/data-spaces">Data Spaces</a> &#8211; voor een &#8220;policy twin&#8221; bijvoorbeeld de <a href="https://data.europa.eu/en/ELDS">Legal Data Space</a>. Er zijn ook raakvlakken met het idee van Regulatory Sandboxes zoals dat opduikt in o.a. de <a href="https://eur-lex.europa.eu/EN/legal-content/summary/interoperable-europe-act.html">Interoperable Europe Act</a> of recenter de <a href="https://www.europarl.europa.eu/RegData/etudes/BRIE/2022/733544/EPRS_BRI(2022)733544_EN.pdf">AI Act</a>: een administratieve digital twin kan de rol van zo&#8217;n sandbox vervullen als er goede mechanismen voor scenario-ontwikkeling en -evaluatie zijn.</p>



<h2 class="wp-block-heading">Administratieve Use Cases</h2>



<p>Voordat we zelf aan de slag zouden gaan in complexe sectoren zoals gezondheidszorg en sociale zekerheid, moeten we ons toch afvragen of Digital Twins echt iets kunnen toevoegen aan wat vandaag al bestaat &#8211; want hype op zich draagt niets bij.</p>



<p>Inzake policy modeling voor sociale zekerheid, is er bijvoorbeeld al een sterke basis met het <a href="https://joint-research-centre.ec.europa.eu/euromod_en">EUROMOD</a> microsimulatie model, waarvan de Belgische variant <a href="https://socialsecurity.belgium.be/nl/sociaal-beleid-mee-vorm-geven/impact-assessment-research/belmod">BELMOD</a> heet. Dit zijn statische microsimulaties waarbij gegevens op fijnmazig niveau worden gecombineerd met gecodeerde regels zodat het mogelijk wordt om hervormingen aan de parameters van de sociale zekerheid te simuleren (bijdragen, uitkeringen, etc.). Zulke studies worden typisch uitgevoerd aan <a href="https://cape-saintlouis.be/">universiteiten</a>, men kan een idee krijgen van wat dat inhoudt via <a href="https://euromod-web.jrc.ec.europa.eu/euromod-online/">EUROMOD Online</a>.</p>



<p>In zekere zin komt dit type model al in de buurt van een digital twin voor sociaal beleid, maar het mist nog twee cruciale lagen: </p>



<ul class="wp-block-list">
<li>actuele/live koppelingen met administratieve gegevens: hiermee kan men dan budgettaire en verdelingseffecten simuleren op de situatie van vandaag, in plaats van op verouderde data van enkele jaren geleden. </li>



<li>procesinformatie over de dienstverlening (doorlooptijden van dossiers, behandelingscapaciteit etc): dit zou toelaten ook de operationele impact van hervormingen in te schatten op de uitvoerende diensten. </li>
</ul>



<p>Het zou allerminst eenvoudig zijn om dat toe te voegen: de gegevens in kwestie zijn zeer gevoelig van aard. De echte data gebruiken als real-time databron voor simulaties zou al zeker verregaande anonymisering vereisen (voortvloeiend uit de GDPR), naast een resem andere <a href="https://www.ksz-bcss.fgov.be/nl/page/ivc-in-het-kort">veiligheidsmaatregelen</a>. Dat is een complexe oefening op zich, waarbij mogelijk ook nuttige informatie verloren gaat.</p>



<p>De status van een persoon binnen de sociale zekerheid wordt daarenboven bepaald door een opeenvolging van gebeurtenissen die lang kunnen doorwerken en met elkaar interageren (werk, ontslag, ziekte, ongeval, pensioen, geboorte van een kind, &#8230;). Om echt waardevol te kunnen zijn zou een twin de hele weg moeten kunnen modelleren die een individu aflegt in het systeem. Niet alleen de individuele status, maar ook die van dossiers (worden er deadlines gemist) en administratie (is er behandelingsachterstand) evolueert doorheen de tijd. </p>



<p>Als er vandaag al een goede <em>digital shadow</em> beschikbaar is van een dienst, dan kan met de toevoeging van evolutieve gegevens over werklastverdeling, capaciteit, dossiervoortgang, &#8230; een volgende stap gezet worden, zoals de toevoeging van simulatie van caseflow. Zulke selectieve simulaties kunnen dienen voor tegenfeitelijke (&#8220;wat-als&#8221;) analyses die de impact van verandering (organisatorisch, of in de regelgeving) beter in te schatten maakt. Andersom kan men zoiets ook zien als een framework voor regressietesten: berekeningen op representatieve steekproeven kunnen herhaald worden telkens iets wijzigt, om na te gaan waar de grootste impact ligt. </p>



<p>De administratie van de gezondheidszorg kent andere prioriteiten: opvolging van patiënten en consultaties is tijdskritisch, de toekenning van mensen en middelen is een complexe planningspuzzel, allerlei terugbetalingen en verzekeringen, &#8230; Om daarin richting Digital Twin te evolueren kan er een grote rol weggelegd zijn voor de <a href="https://www.ehealth.fgov.be/nl/page/ehds-european-health-data-space---de-europese-verordening-betreffende-de-europese-ruimte-voor-gezondheidsgegevens">European Health Data Spaces</a>, en voor nieuwe oplossingen die men momenteel tracht uit te denken voor <a href="https://tehdas.eu/">secundair gebruik van gezondheidsdata</a>. </p>



<p>We staan nog ver van de droom van individueel geoptimaliseerde gezondheidszorg op basis van een <a href="https://digital-strategy.ec.europa.eu/en/policies/virtual-human-twins">persoonlijke digital twin van een patiënt</a> &#8211; idee dat trouwens ook gepaard gaat met heel wat niet triviale <a href="https://www.frontiersin.org/journals/genetics/articles/10.3389/fgene.2018.00031/full">risico&#8217;s inzake ethiek en privacy</a>. Op kortere termijn liggen de mogelijkheden eerder op niveau van de organisatie. Met gegevens over opnames, wachtlijsten, personeelsinzet en activiteit, toegevoegd aan een bestaande <em>digital shadow</em>, kunnen strategische en operationele wijzigingen mogelijk beter opgevangen worden.</p>



<h2 class="wp-block-heading">Implementatie: een kostelijke affaire?</h2>



<p>Om de focus te behouden op wat vandaag of op korte termijn mogelijk is, kunnen administraties zich inspireren op &#8220;reference stacks&#8221; van technologische componenten, die uitgebouwd zijn in het kader van bestaande digital twins. Enkele daarvan haalden we reeds eerder aan en herhalen we hier niet. </p>



<p>Een Digital Twin moet een representatie kunnen bevatten van de huidige staat van een systeem, en moet gebeurtenissen kunnen verwerken die daarop een impact hebben. In het kader van de Europese <a href="https://www.fiware.org/">FIWARE</a> initiatieven (Future Internet) werd daarvoor door een werkgroep Context Information Management bij ETSI de <a href="https://ngsi-ld.org/">NSGI-LD</a> standaard en <a href="https://www.etsi.org/deliver/etsi_gs/CIM/001_099/009/01.09.01_60/gs_CIM009v010901p.pdf">API</a> ontwikkeld. Het lijkt er echter op dat er <a href="https://en.wikipedia.org/wiki/NGSI-LD#Uses">nog niet veel adoptie</a> is van deze standaard buiten het <a href="https://www.fiware.org/about-us/smart-industry/">eigen netwerk</a> van voornamelijk Smart City en IoT-initiatieven.</p>



<p>Administratieve systemen bestaan niet louter uit beslissingen. De processen omvatten interactie, documenten, en soms ook enige beoordelingsvrijheid. Open standaarden uit de business process management wereld komen hier van pas. <a href="https://www.omg.org/dmn/">DMN (decision modeling)</a>, <a href="https://www.omg.org/bpmn/">BPMN (business processes)</a> en <a href="https://www.omg.org/cmmn/">CMMN (case management)</a> zijn complementair aan elkaar en laten het modelleren van deze aspecten toe. Op deze initiatieven verschijnen ook uitbreidingen, zoals het aan de KULeuven ontwikkelde <a href="https://cdmn.readthedocs.io/">Constraint DMN (cDMN)</a> dat complexere logica toelaat. Een Digital Twin kunnen we dan samenstellen uit een DMN beslissingsmotor die berekent &#8220;wat de regels zeggen&#8221; (hier kan Rules As Code eventueel een plaats krijgen), verrijkt met lagen die de processen en caseflow voor hun rekening nemen (status, deadlines, ondersteunende documenten), en tot slot een regelmatige synchronisatie om de operationele status (of context) te kunnen updaten. Dit is compatibel met het <a href="https://interoperable-europe.ec.europa.eu/sites/default/files/document/2020-06/ELISEWebinar_9_DigitalTwins.pdf">JRC maturiteitsmodel</a> (model -&gt; schaduw -&gt; twin).</p>



<p>Digital Twins zijn niet duur omdat ze veel visualisatie bevatten of rapporteringsmogelijkheden ingebouwd hebben. Ze zijn duur omdat ze een duplicaat vormen van het doelsysteem, dat net zoals het origineel, doorheen de tijd correct moet blijven werken. Om <a href="https://eprintspublications.npl.co.uk/9880/">meer te zijn dan enkel hype</a>, is constante investering in onderhoud nodig. Die recurrente kosten omvatten ten minste het volgende:</p>



<ul class="wp-block-list">
<li>monitoring en validatie: een digital twin moet elke verandering aan het doelsysteem zo accuraat mogelijk volgen, dit vraagt regelmatige updates,</li>



<li>onderhoud van de regels en traceerbaarheid: zeker wanneer regels vaak wijzigen is dit een grote kost. Hier spelen versionering, test suites en veranderingsmanagement een rol, </li>



<li>functioneren van data pipelines en interoperabiliteit: omvat ook semantiek, toegangscontrole, <a href="https://www.intertwin.eu/ker-4-quality-framework">datakwaliteit, accuraatheid</a> en beveiliging,</li>



<li>privacy en compliance: onontbeerlijk, zeker voor systemen die persoonsgegevens verwerken (gezondheid, inkomen, familie)</li>
</ul>



<p>Voor een administratieve use case is de beste eerste stap daarom een stelselmatige uitbouw van wat we een <em>privacy-aware digital shadow </em>zouden kunnen noemen: initieel beperkt tot monitoring + replay functionaliteit, met strikte toegangscontrole en <a href="https://www.edpb.europa.eu/sme-data-protection-guide/data-protection-basics_nl">dataminimalisatie</a>. Daarna kan gedacht worden aan uitbreiding met simulaties op geanonimiseerde of synthetische datasets. Eventuele near-real-time synchronisatie met gegevens uit het echte doelsysteem, om een echte Digital Twin te vormen, kan pas op het einde volgen, en heeft vaak nogal wat voeten in de aarde.</p>



<h2 class="wp-block-heading">Conclusie</h2>



<p>Is een Digital Twin het juiste type oplossing, of kan het ook eenvoudiger? Samengevat zijn Digital Twins pas te overwegen als al het volgende waar is (anders kan een andere aanpak efficiënter zijn en beter aansluiten):</p>



<ul class="wp-block-list">
<li>Het doelsysteem dat gemodelleerd wordt is dynamisch: uitkomsten hangen af van evoluerende situaties (caseflow, wachtrijen, levenscyclus van gebeurtenissen), niet enkel van <em>eligibility checks</em> of formulieren.</li>



<li>Je kan authoritatieve databronnen identificeren en doorlopende synchronisatie volhouden. Zonder regelmatige updates met operationele data, bouw je een model en geen twin.</li>



<li>Simulaties leiden tot echte beslissingen. Als de organisatie niet voldoende vrijheid heeft om in te grijpen (beleid veranderen, caseflow wijzigen, prioritisering, personeelstaken, &#8230;), zal een reeks dashboards waarschijnlijk volstaan.</li>



<li>Er is een geloofwaardig plan voor audit en permanente kwaliteitsbewaking. Dit mag niet achteraf komen maar moet een acceptatiecriterium zijn. Het heeft geen zin een twin te bouwen die sneller rot dan het doelsysteem.</li>



<li>De wettelijke/compliance omgeving is compatibel. Als er persoonsgegevens aan te pas komen kunnen GDPR en AI Act verplichtingen met zich meebrengen die de haalbaarheid en de kostprijs erg beïnvloeden. Dat kan een Twin limiteren tot een veredeld testsysteem in plaats van een echte bijdrage tot operationele automatisering te leveren.</li>
</ul>



<p>Een niet-Twin kan ook waardevol zijn &#8211; met gecodeerde regels + testharnas + monitoring heb je ook al een transparante setup waarmee allerlei inzichten verworven kunnen worden, zonder de complexiteit en kost van volledige synchronisatie of simulatie-infrastructuur. In een administratieve omgeving kan zulk <em>policy model </em>al veel noden lenigen zonder operationele digital twin, al zal dat misschien teleurstellend zijn voor wie graag uitpakt met trendy buzzwords.</p>



<p></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Smals Research Webinar &#8211; Modernisering van legacy-projecten met AI</title>
		<link>https://www.smalsresearch.be/rag-in-practice-webinar-by-smals-research-2-2/</link>
		
		<dc:creator><![CDATA[Smals Research]]></dc:creator>
		<pubDate>Mon, 11 May 2026 15:15:18 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[[NL]]]></category>
		<category><![CDATA[News]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=29357</guid>

					<description><![CDATA[Free Webinar 04/06/2026 at 10h30 - 
(language: Dutch, Public sector &#038; Smals only)]]></description>
										<content:encoded><![CDATA[

<p><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-scaled.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-29363" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-scaled.png" alt="" width="2560" height="846" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-scaled.png 2560w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-300x99.png 300w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-1024x338.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-768x254.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-1536x507.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-2048x677.png 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></a></p>
<p>(<em>Nederlandstalige tekst&nbsp;: zie onder</em>)</p>
<div>
<div>
<div>
<h1 style="text-align: center;"><strong>Modernisez vos projets legacy grâce à l&#8217;IA</strong></h1>
<h2 style="font-weight: 400; text-align: center;"><b><strong>Free webinar Smals Research &#8211; 04/06/2026 at 10h30<br /></strong></b><b><strong>(language: Dutch, Public sector &amp; Smals only)</strong></b></h2>
<p>Aujourd&#8217;hui déjà, les grands modèles de langage (LLM) et les assistants IA permettent de réaliser des gains de productivité considérables lors de l&#8217;écriture de nouveaux logiciels. <strong>Mais qu&#8217;en est-il du code <em>legacy</em> ?</strong> Les applications plus anciennes, souvent critiques, basées sur des architectures obsolètes ou des technologies dépassées, constituent un tout autre défi. L&#8217;IA offre-t-elle également une aide suffisante pour comprendre et moderniser ces systèmes existants&nbsp;?.</p>
<p>Au cours de ce webinaire, nous partagerons nos propres expériences pratiques. À l&#8217;aide d&#8217;exemples concrets, par exemple dans des projets COBOL ou des bases de code Java vieillissantes, nous montrerons ce qui fonctionne et quels sont les pièges lorsque l’on applique l’IA à des systèmes <em>legacy</em>. Nous aborderons des stratégies ciblées, à la fois pour la documentation et pour la réécriture progressive de code ancien, et partagerons des conseils pratiques autour du <em>vibe coding</em> dans le terminal. Vous pourrez ainsi mieux évaluer ce que vous pouvez attendre ou non de cette technologie aujourd&#8217;hui.</p>
<p>Que vous souhaitiez vous lancer dans la modernisation d&#8217;une ancienne application ou simplement mieux comprendre comment l&#8217;IA, en tant que boîte à outils intelligente, peut contribuer à la gestion des bases de code existantes, ce webinaire vous aidera à faire vos premiers pas en toute prudence et vous donnera un aperçu réaliste de ce que l&#8217;IA peut et ne peut pas encore résoudre pour vous aujourd&#8217;hui.</p>
</div>
<div>
<p>La session sera tenue <strong>en</strong> <strong>néerlandais, avec des slides en anglais</strong>. Ce webinaire est réservé aux collaborateurs du secteur public et de Smals. Pour bien suivre ce webinaire, il est recommandé d&#8217;avoir des connaissances de base en matière de développement logiciel.</p>
</div>
</div>
<div>
<div id="editor-1570449203896">
<p><em><a href="https://www.smalsresearch.be/author/vanderkimpen/" target="_blank" rel="noopener">Koen Vanderkimpen</a> est chercheur chez Smals, spécialisé dans le software engineering.</em></p>
</div>
</div>
</div>
<div>
<div> </div>
<div>Pour participer au webinaire, vous pouvez vous <a href="https://campaigns.eranova.fgov.be/f-772dba985f7eab9e" target="_blank" rel="noopener"><strong>inscrire</strong></a> ici. Vous recevrez ensuite une invitation avec des informations complémentaires.</div>
<div> </div>
<table style="width: 100%; border-collapse: collapse; height: 31px;" border="1">
<tbody>
<tr style="height: 69px;">
<td style="width: 100%; height: 69px;" data-wp-editing="1">
<p><a href="https://campaigns.eranova.fgov.be/f-772dba985f7eab9e" target="_blank" rel="noopener"><span style="color: #ff0000;"><strong><img loading="lazy" decoding="async" class="wp-image-7572 size-full alignleft" src="/wp-content/uploads/2014/10/register.jpg" alt="register" width="136" height="48" /></strong></span></a></p>
<p><strong>La participation est gratuite, Public sector &amp; Smals only<br /></strong><strong>Language: Dutch / Slides in English<br /></strong></p>
</td>
</tr>
</tbody>
</table>
<div> </div>
<div><em>Les webinaires de Smals Research sont gratuits et destinés aux collaborateurs de Smals et du secteur public. L&#8217;intention est de présenter les résultats du travail de <strong><a href="https://www.smalsresearch.be/" target="_blank" rel="noopener noreferrer">Smals Research</a></strong> sur l&#8217;utilisation des nouvelles technologies dans le secteur public. Cette invitation peut donc être envoyée aux personnes intéressées du secteur public. Abonnez-vous à la liste de diffusion Smals Research Newsletter &amp; Webinars via le site web <a href="https://www.smalsresearch.be/" target="_blank" rel="noopener noreferrer"><strong>smalsrech.be</strong></a></em><span style="font-size: inherit;">.</span></div>
<div>
<p><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-scaled.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-29363" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-scaled.png" alt="" width="2560" height="846" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-scaled.png 2560w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-300x99.png 300w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-1024x338.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-768x254.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-1536x507.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2026/05/banner-Legacy-code-AI-2048x677.png 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></a></p>
<div>
<h1 style="text-align: center;"><strong>Modernisering van legacy-projecten met AI</strong></h1>
<h2 style="font-weight: 400; text-align: center;"><b><strong>Free webinar Smals Research &#8211; 04/06/2026 at 10h30<br /></strong></b><b><strong>(language: Dutch, Public sector &amp; Smals only)</strong></b></h2>
</div>
<p>Grote taalmodellen (LLM&#8217;s) en AI-assistenten leveren vandaag al aanzienlijke productiviteitswinst op bij het schrijven van nieuwe software. <strong>Maar hoe zit het met legacy-code?</strong> Oudere, vaak kritieke toepassingen met achterhaalde architecturen of verouderde technologieën vormen een heel andere uitdaging. Biedt AI ook voldoende hulp om deze bestaande systemen te doorgronden en te moderniseren?</p>
<p>Tijdens dit webinar delen we onze eigen onderzoekservaringen uit de praktijk. Aan de hand van concrete voorbeelden, bijvoorbeeld in COBOL-projecten of verouderde Java codebases, laten we zien wat helpt en waar de valkuilen liggen wanneer je AI loslaat op legacy-systemen. We bespreken gerichte strategieën voor zowel het documenteren als het stapsgewijs herschrijven van oude code, en delen praktische tips rond vibe coding in de terminal. Zo kan je beter inschatten wat je vandaag wel én niet van deze technologie mag verwachten.</p>
<p>Of je nu zelf aan de slag wil met het moderniseren van een oude toepassing of simpelweg beter wil begrijpen hoe AI als een slimme gereedschapskist kan bijdragen aan het beheer van bestaande codebases: dit webinar helpt je om een voorzichtige eerste start te maken en schept een realistisch beeld van wat AI vandaag wel én nog niet voor je kan oplossen.</p>
<p>De sessie wordt in het <strong>Nederlands</strong> gehouden, <strong>met Engelstalige slides</strong>. Dit webinar is voorbehouden voor medewerkers van de overheidssector en Smals. Om dit webinar goed te kunnen volgen is basiskennis van softwareontwikkeling aangewezen.</p>
<p><em><a href="https://www.smalsresearch.be/author/vanderkimpen/" target="_blank" rel="noopener">Koen Vanderkimpen</a> is onderzoeker bij Smals en gespecialiseerd in software engineering.</em></p>
<div>
<div>
<div>Om deel te nemen aan de webinar, kan u zich hier zelf <a href="https://campaigns.eranova.fgov.be/f-e83d72a154520647" target="_blank" rel="noopener"><strong>registreren</strong></a>. U ontvangt dan een uitnodiging met bijkomende informatie.</div>
</div>
<div>
<div> </div>
<table style="width: 100%; border-collapse: collapse; height: 31px;" border="1">
<tbody>
<tr style="height: 69px;">
<td style="width: 836.222px; height: 69px;" data-wp-editing="1">
<p><a href="https://campaigns.eranova.fgov.be/f-e83d72a154520647" target="_blank" rel="noopener"><span style="color: #ff0000;"><strong><img loading="lazy" decoding="async" class="alignleft wp-image-7572 size-full" src="/wp-content/uploads/2014/10/register.jpg" alt="register" width="136" height="48" /></strong></span></a></p>
<p><strong>Deelname is gratis, Public sector &amp; Smals only<br /></strong><strong>Language: Dutch / Slides in English<br /></strong></p>
</td>
</tr>
</tbody>
</table>
<div> </div>
<div><em>De webinars van </em><em style="letter-spacing: 0px;">Smals Research zijn gratis en bestemd voor medewerkers van de publieke sector en Smals. Bedoeling is de onderzoeksresultaten van </em><strong style="letter-spacing: 0px;"><em><a href="https://www.smalsresearch.be/" target="_blank" rel="noopener">Smals Research</a></em></strong><em style="letter-spacing: 0px;"> naar het gebruik van nieuwe en recente technologieën in de publieke sector kenbaar te maken. Deze uitnodiging mag dan ook doorgestuurd worden naar geïnteresseerden binnen de overheidssector. Inschrijven in de distributielijst Smals Research Nieuwsbrief &amp; Webinars, kan via <a href="https://www.smalsresearch.be/" target="_blank" rel="noopener"><strong>smalsrech.be</strong></a></em><span style="letter-spacing: 0px;">.</span></div>
</div>
</div>
</div>
<div><hr />
<h1><strong><span style="color: #ffffff;">.</span></strong></h1>
<h1>« Modernisering van legacy-projecten met AI » – Webinar by Smals Research</h1>
</div>
</div>


<div class="wp-block-media-text is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="2560" height="1709" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/Smals-Research-Koen-Vanderkimpen-1598-1-scaled.jpg" alt="" class="wp-image-29373 size-full" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/Smals-Research-Koen-Vanderkimpen-1598-1-scaled.jpg 2560w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Smals-Research-Koen-Vanderkimpen-1598-1-300x200.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Smals-Research-Koen-Vanderkimpen-1598-1-1024x684.jpg 1024w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Smals-Research-Koen-Vanderkimpen-1598-1-768x513.jpg 768w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Smals-Research-Koen-Vanderkimpen-1598-1-1536x1026.jpg 1536w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Smals-Research-Koen-Vanderkimpen-1598-1-2048x1367.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></figure><div class="wp-block-media-text__content">
<p>Webinar Smals, WebEx</p>



<p><a href="https://www.smalsresearch.be/author/vanderkimpen/" target="_blank" rel="noreferrer noopener">Koen Vanderkimpen</a><br><strong>Smals Research</strong></p>



<p>04/06/2026&nbsp; 10h30 &#8211; 11h45</p>



<p>Language: <strong>Dutch </strong>/ Slides in English</p>
</div></div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Een &#8220;on-premise&#8221; Trusted Execution Environment gebruiken</title>
		<link>https://www.smalsresearch.be/een-betrouwbare-runtime-omgeving-on-premise-gebruiken/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26524</guid>

					<description><![CDATA[In deze blogpost gaan we in op het onderwerp door bepaalde aspecten van "CoCo" confidential containers in detail te beschrijven en onze installatie op onze eigen hardware toe te lichten.]]></description>
										<content:encoded><![CDATA[
<p>In een <a href="/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/">vorige blogpost</a> hebben we de voordelen besproken van confidential containers en hun architectuur in het CoCo-project. In deze blogpost gaan we dieper in op het onderwerp door bepaalde aspecten van CoCo in detail te beschrijven en onze installatie op onze eigen hardware toe te lichten.</p>



<h1 class="wp-block-heading">Containercertificering</h1>



<p>Het gebruik van Kubernetes-pods als abstractielaag voor vertrouwelijke container-workloads introduceert diverse uitdagingen. Door hun dynamische karakter – het maken, verwijderen, updaten van de containers – en de invloed van de Kubernetesomgeving (omgevingsvariabelen, toelatingscontrollers, enz.) valt het moeilijk te garanderen dat enkel de door de gebruiker bedoelde code wordt uitgevoerd. Zo kan het injecteren van kwaadaardige variabelen of het wijzigen van de specificatie van een pod voordat deze wordt gestart, de vertrouwelijkheid in gevaar brengen.</p>



<p>Het CoCo-project stelt een elegante oplossing voor, namelijk het gebruik van een engine voor beveiligingsbeleid, geïntegreerd in de containerruntime-omgeving binnen de trusted execution environment (TEE), die de door de gebruiker gedefinieerde regels toepast. Deze engine kan bijvoorbeeld alleen bepaalde images of commando’s toestaan en problematische verzoeken (zoals het uitvoeren van ongeoorloofde processen) afwijzen. <a href="#Figuur-1">Figuur 1</a> toont een voorbeeld van zo’n beleid.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>package agent_policy

# Seules certaines images de conteneurs peuvent être exécutées
default CreateContainerRequest&nbsp;:= false
CreateContainerRequest if {
    every storage in input.storages {
    some allowed_image in policy_data.allowed_images
    storage.source == allowed_image
  }
}

# Seules certaines commandes peuvent être exécutées
# via ‘kubectl exec’ dans les images de conteneurs
default ExecProcessRequest&nbsp;:= false
ExecProcessRequest if {
  input_command = concat(" ", input.process.Args)
      some allowed_command in policy_data.allowed_commands
      input_command == allowed_command
}

policy_data&nbsp;:= {
    "allowed_commands": &#91;
        "ls",
        "cat",
    &#93;,
    "allowed_images": &#91;
        "pause",
        "my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220
",
    &#93;,
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">package agent_policy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines images de conteneurs peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4">default CreateContainerRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">CreateContainerRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">every</span><span style="color: #D4D4D4"> storage</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> input.storages {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_image</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_images</span></span>
<span class="line"><span style="color: #D4D4D4">    storage</span><span style="color: #D7BA7D">.source</span><span style="color: #D4D4D4"> == allowed_image</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines commandes peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4"># via ‘kubectl exec’ dans les images de conteneurs</span></span>
<span class="line"><span style="color: #D4D4D4">default ExecProcessRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">ExecProcessRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">concat</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot; &quot;</span><span style="color: #D4D4D4">, input.process.Args)</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_command</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_commands</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> == allowed_command</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">policy_data</span><span style="color: #D4D4D4">&nbsp;:= {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_commands&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;ls&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;cat&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_images&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;pause&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220</span></span>
<span class="line"><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figuur-1">Figuur 1 – Voorbeeld van een beperkend beveiligingsbeleid voor images die kunnen worden uitgevoerd en de commando’s die in de image kunnen worden aangeroepen. Dit beleid wordt toegepast door een agent die in de vertrouwelijke VM zit.</p>



<p>Vier componenten van de vertrouwelijke virtuele guestmachine worden altijd gecontroleerd om te bepalen of ze nog goed werken: de firmware (bijvoorbeeld OVMF), de kernel van het besturingssysteem, de kernel commandoregel en het rootbestandssysteem (<a href="#Figuur-2">Figuur 2</a>). Een vertrouwelijke externe entiteit, vaak Trustee genoemd, zorgt ervoor dat de vertrouwensketen versterkt wordt.</p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Measurement.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Measurement.svg" alt="" class="wp-image-26527" style="width:500px"/></a><figcaption class="wp-element-caption">Figuur 2 &#8211; Samenstelling van de “meting” (measurement) die door het <a href="https://www.smalsresearch.be/tools-voor-confidential-computing/">SEV-systeem</a> van de AMD-microprocessor wordt berekend tijdens de certificering. De meting is de cryptografische hashwaarde van een versleuteld geheugengebied waarin zich de firmware bevindt (bijv. OVMF). In deze firmware zijn de cryptografische hashwaarden geïnjecteerd van de OS-kernel van de geattesteerde virtuele machine, de command-line waarmee deze kernel is opgestart en, tot slot, het root-bestandssysteem. </figcaption></figure>



<p>Vertrouwelijke containers hebben echter meestal initialisatiedata nodig die niet direct in de image van de virtuele machine of de toepassingscontainer kunnen worden opgenomen, zoals certificaten, adressen van certificeringsdiensten of toe te passen beveiligingsbeleidsregels. Deze data zijn weliswaar niet geheim, maar moeten wel worden beschermd tegen wijzigingen.</p>



<p>Deze initialisatiedata, ook wel <code>init-data</code> genoemd, kunnen worden opgegeven in de vorm van een woordenboek (bijv. JSON-bestanden, TOML, YAML), gecodeerd in base64 en doorgegeven aan de Kubernetes-pod via een Kubernetes annotation (<a href="#Figuur-3">Figuur 3</a>). Om de integriteit ervan te garanderen, wordt hun cryptografische hashwaarde door de certificeringsagent (die in de vertrouwelijke virtuele machine draait) als data voor de berekening van de certificering verstrekt (dit kan worden gedaan met behulp van het veld “<em>HostData</em>” van SEV-SNP). Het is dan mogelijk om de initialisatiedata die naar de hostmachine zijn gestuurd voor het starten van de container te vergelijken met de hashwaarde die op het moment van de certificering is ontvangen, zodat elke wijziging tijdens de certificering op afstand kan worden gedetecteerd.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>version = "0.1.0"
algorithm = "sha256"

&#91;data&#93;

# Configuration de l’agent d’attestation
"aa.toml" = '''
&#91;token_configs&#93;
&#91;token_configs.kbs&#93;
url = "${KBS_ADDRESS}"
'''

# Configuration du gestionnaire de données secrètes
"cdh.toml" = '''
&#91;kbc&#93;
name = "cc_kbc"
url = "${KBS_ADDRESS}"

&#91;image&#93;
authenticated_registry_credentials_uri = "kbs:///${REGISTRY_AUTH_KBS_PATH}"
image_security_policy_uri = "${SECURITY_POLICY_KBS_URI}"
'''

# Politique de sécurité restreignant l’environnement du conteneur
"policy.rego"= '''
&#91;Voir Figure 1 ci-dessus&#93;
'''</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">version</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;0.1.0&quot;</span></span>
<span class="line"><span style="color: #9CDCFE">algorithm</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;sha256&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&#91;data&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration de l’agent d’attestation</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">aa.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs.kbs&#93;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration du gestionnaire de données secrètes</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">cdh.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;kbc&#93;</span></span>
<span class="line"><span style="color: #CE9178">name = &quot;cc_kbc&quot;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">&#91;image&#93;</span></span>
<span class="line"><span style="color: #CE9178">authenticated_registry_credentials_uri = &quot;kbs:///${REGISTRY_AUTH_KBS_PATH}&quot;</span></span>
<span class="line"><span style="color: #CE9178">image_security_policy_uri = &quot;${SECURITY_POLICY_KBS_URI}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Politique de sécurité restreignant l’environnement du conteneur</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">policy.rego</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">= </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;Voir Figure 1 ci-dessus&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figuur-3">Figuur 3 &#8211; Voorbeeld van initialisatiedata die (in gecodeerde vorm) via een Kubernetes-annotatie aan de CoCo-guestagent in de vertrouwelijke virtuele machine worden geleverd.</p>



<h1 class="wp-block-heading">Sleutelbeheer</h1>



<p>Een externe sleutelbemiddelingsdienst (key broker service), die kan worden gekoppeld aan een transactionele &#8216;black box&#8217;, stelt de container in staat om dynamisch de resources op te halen die nodig zijn voor de werking ervan. Indien de client nog niet in het bezit is van een eerder verkregen authenticatietoken van de sleutelbemiddelingsdienst, moet hij zich eerst authenticeren, waarna de sleutelbemiddelingsdienst hem <a href="https://github.com/confidential-containers/trustee/blob/main/kbs/docs/kbs_attestation_protocol.md">een challenge stuurt</a> die hij moet beantwoorden (<a href="#Figuur-4">Figuur 4</a>).</p>



<p>De client genereert een paar cryptografische sleutels en vraagt de processor om een certificaat te verstrekken met daarin de hashwaarde van zijn openbare sleutel en een unieke willekeurige waarde die door de dienst in zijn challenge is verzonden. Het certificaat dat de openbare sleutel van de client, de unieke willekeurige waarde die door de service is gestuurd en de meting van de vertrouwelijke VM die de client bevat aan elkaar koppelt, wordt door de processor ondertekend. De service gebruikt een certificeringsagent die het certificaat controleert door de handtekening te verifiëren en de meting te vergelijken met een referentiewaarde.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture4-Authantication-protocol.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture4-Authantication-protocol.svg" alt="" class="wp-image-26528" style="width:600px"/></a><figcaption class="wp-element-caption"><a>Figuur </a>4 &#8211; Protocol voor authenticatie van de vertrouwelijke virtuele machine bij de externe “Trustee”-service, bestaande uit een sleutelbemiddelingsservice en een certificeringsservice: om een opgeslagen waarde (geheim, sleutel, enz.) van de bemiddelingsservice te kunnen verkrijgen, moet de client eerst zijn authenticiteit bewijzen via de certificering. Dit protocol volgt het <a href="https://www.ietf.org/rfc/rfc9334.html">RATS-model (RFC9334)</a>.</figcaption></figure>



<h1 class="wp-block-heading">Installatie en testen</h1>



<p>Om de CoCo-omgeving te testen, hebben we gekozen voor een EPYC <a href="https://www.amd.com/en/products/processors/server/epyc/9005-series/amd-epyc-9335.html">9335-microprocessor</a> van AMD. Deze maakt gebruik van SEV-SNP-technologie voor versleuteling en bescherming van de integriteit van het RAM-geheugen. We hebben een machine geassembleerd met een moederbord dat deze microprocessor ondersteunt (Supermicro MBD-H13SSL-NT-O) en 128 GB RAM-geheugen. Vervolgens moesten we het BIOS configureren om ervoor te zorgen dat de gewenste beveiligingsfuncties van de microprocessor goed waren geactiveerd. We hebben ook gekozen voor de Ubuntu 24.04.3 LTS-distributie van het Linux-besturingssysteem. Voordat we de beveiligingsfuncties van de processor konden testen, moesten we ten slotte de kernel van het besturingssysteem opnieuw compileren. Dit is eigenlijk vrij simpel dankzij de <a href="https://github.com/AMDESE/AMDSEV">scripts die AMD heeft meegegeven</a>.</p>



<p>Eenmaal het systeem is ingesteld, kun je het Docker-platform installeren (om containerimages te maken), de containeruitvoeringsinterface <em>containerd </em>(inbegrepen in de Docker-distributie) en het Kubernetes-beheersysteem. Het instellen van deze tools is best lastig en afhankelijk van de versie. Er zijn <a href="https://gitlab.smalsrech.be/fape/coco-with-snp">verschillende scripts</a> beschikbaar om deze installatie te vergemakkelijken.</p>



<p>Nadat het systeem was geïnstalleerd, konden we een bestaande toepassing in vertrouwelijke containers zetten: je hoeft alleen maar de naam van de runtimeklasse die Kubernetes gebruikt (<code>runtimeClassName</code>) in het YAML-configuratiebestand van Kubernetes te veranderen in een van de CoCo-klassen (bijvoorbeeld <code>kata-qemu-snp</code>). Natuurlijk is deze simpele wijziging niet genoeg om te profiteren van de beveiligingsfuncties van CoCo. Je moet de productiecyclus aanpassen om de volgende stappen toe te voegen:</p>



<ul class="wp-block-list">
<li>Versleuteling van de containerimage</li>



<li>Ondertekening van de containerimage</li>



<li>Beschikbaar stellen van versleutelings- en ondertekeningssleutels</li>
</ul>



<p>Zodra de containerimage op de gebruikelijke manier is gemaakt, bijvoorbeeld met docker build, kan deze worden versleuteld met de tool <a href="https://github.com/containers/skopeo">skopeo</a>, die verschillende algoritmen ondersteunt: <a href="https://www.ietf.org/rfc/rfc7516.html">JWE (RFC7516)</a>, <a href="https://www.ietf.org/rfc/rfc4880.html">PGP (RFC4880)</a> en <a href="https://www.ietf.org/rfc/rfc2315.html">PKCS7 (RFC2315)</a>. Deze versleutelde image kan vervolgens worden ondertekend met de tool <a href="https://github.com/sigstore/cosign">cosign</a> en ten slotte worden geüpload naar een imageregister.</p>



<p>Bij het opstarten van de container moeten de CoCo-componenten in de vertrouwelijke virtuele machine de handtekening kunnen verifiëren en de image kunnen ontsleutelen. Hiervoor moeten de benodigde sleutels beschikbaar worden gesteld. Hier komt het sleutelbemiddelingssysteem om de hoek kijken. Zoals we eerder hebben gezien, voert dit systeem een certificeringsprotocol uit voordat het de sleutels verstrekt.</p>



<p>De implementatie van confidential ccontainers is transparant voor de gebruiker van Kubernetes. Zodra het gebruikelijke commando <code>kubectl apply</code> wordt aangeroepen, wordt een lichte Kata-virtuele machine aangemaakt. Deze moet bij de sleutelbemiddelaar de toegangssleutel tot het imageregister (als dit niet openbaar is), het toe te passen beveiligingsbeleid, de sleutel voor handtekeningverificatie en de sleutel voor het ontsleutelen van de image ophalen. Deze informatie wordt pas verstrekt nadat de virtuele machine is geverifieerd (zie hierboven). De agents in de virtuele machine kunnen dan het beveiligingsbeleid toepassen, de image downloaden, de handtekening controleren en deze decoderen voordat de toepassingscontainer in de virtuele machine wordt gestart.</p>



<p>Wat betreft de communicatie van de gecontaineriseerde toepassing met externe diensten, moeten wederzijds erkende versleutelingssleutels worden ingesteld. Een eerste mogelijkheid is dat de vertrouwde container bij het opstarten een cryptografisch sleutelpaar aanmaakt en de cryptografische hashwaarde van deze openbare sleutel bij de certificering verstrekt. Dit wordt gebruikt binnen het authenticatieprotocol dat in Figuur 4 wordt beschreven. Een andere optie is om de openbare sleutel van een certificeringsinstantie in de versleutelde en vervolgens ondertekende image te verstrekken. De container kan dan de certificaten checken die deze autoriteit heeft ondertekend en de encryptiesleutels aanvaarden. Een derde optie bestaat erin om te steunen op de sleutelbemiddelingsdienst: hiermee kan de container op een veilige manier geheimen ophalen. Afhankelijk van de gekozen optie moet de code van de toepassing al dan niet worden aangepast.</p>



<h1 class="wp-block-heading">Bescherming tegen een beheerder</h1>



<p>Wat kan een beheerder van de hostmachine doen?&nbsp; In principe niet veel, behalve de container opstarten.</p>



<p>Het certificeringsmechanisme zorgt er namelijk voor dat hij niets kan vervangen of simuleren wat betreft de onderdelen van de virtuele machine die wordt gebruikt om de containers te starten. Door de versleuteling van het geheugen dat aan de virtuele machine is toegewezen, heeft hij geen toegang tot de data die in de virtuele machine en de container worden verwerkt. Door de versleuteling en ondertekening van de containerimage kan hij geen andere container vervangen of de aard van de container achterhalen. In de veronderstelling dat de toepassing geconfigureerd is om versleuteld te communiceren met externe diensten waarmee ze moet interageren, kan de beheerder ook geen toegang krijgen tot gevoelige data door het netwerkverkeer te observeren, tenzij hij ook bevoorrechte toegang heeft tot het systeem voor het aanmaken van sleutels. Ten slotte kan hij de container ook niet ondervragen via het commando <code>kubectl exec</code>, omdat het kan worden beperkt door een beveiligingsbeleid (zie <a href="#Figure-1">Figuur 1</a>).</p>



<p>De beheerder kan daarentegen de toepassingslogboeken lezen die door Kubernetes op de host zijn opgeslagen. Daarom is het belangrijk dat de workload provider ervoor zorgt dat zijn code geen gevoelige informatie onthult in de gelogde berichten van de toepassing.</p>



<p>Tot slot, zoals we in de vorige blogpost al stelden, zijn vertrouwde uitvoeringsomgevingen niet perfect en houdt hun beveiligingsmodel meestal geen rekening met fysieke aanvallen. In een omgeving zoals de G-Cloud biedt de toevoeging ervan tal van mogelijkheden. In een omgeving waar echter noch SMALS, noch haar klanten, noch zelfs de Belgische Staat enige technische of juridische controle hebben over de infrastructuur, zijn er aanzienlijke risico’s die serieus moeten worden geëvalueerd.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>In deze blogpost en de <a href="https://www.smalsresearch.be/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/">vorige </a>hebben we de echte voordelen belicht op het gebied van beveiliging die microprocessors kunnen bieden om &#8220;vertrouwde uitvoeringsomgevingen&#8221; binnen een IT-infrastructuur te creëren. Vooral het “on-premise” gebruik ervan  maakt het mogelijk om gecontaineriseerde toepassingen beter te beschermen tegen kwaadwillige beheerders of indringers en zo onze leden nog meer garanties te bieden.</p>



<p>Omdat ze eenvoudiger in gebruik zijn dan geavanceerde cryptografische methoden, kunnen dergelijke systemen ons ook helpen om meer generieke problemen op te lossen dan met cryptografie alleen, of problemen die we tot nu toe simpelweg niet konden oplossen.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Legacy &#038; AI: Tijdreizen in je Terminal</title>
		<link>https://www.smalsresearch.be/legacy-ai-tijdreizen-in-je-terminal/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Thu, 09 Apr 2026 07:56:17 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[legacy]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=27622</guid>

					<description><![CDATA[Sinds de hype van grote taalmodellen is losgebarsten, zullen de meeste ontwikkelaars ondertussen al wel geproefd hebben van de productiviteitswinst die deze tools, mits correct gebruik, kunnen bieden. In deze blog onderzoeken we of we verder kunnen gaan dan dat: biedt het AI ook voldoende hulp bij het beheersen van Legacy Code?]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignleft size-large is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_6jrj5n6jrj5n6jrj.png"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_6jrj5n6jrj5n6jrj-1024x1024.png" alt="" class="wp-image-27693" style="width:274px;height:auto"/></a></figure>



<p class="no-top-margin justify-text"><em>Cet article est aussi disponible en <a href="https://www.smalsresearch.be/legacy-ai-voyagez-temps-terminal/" data-type="post" data-id="28963">français</a>.</em></p>



<p class="justify-text" style="padding-top:0;padding-right:0;padding-bottom:0;padding-left:0">Sinds de hype van grote taalmodellen is losgebarsten, zullen de meeste ontwikkelaars ondertussen al wel geproefd hebben van de productiviteitswinst die deze tools, mits correct gebruik, kunnen bieden. In deze blog onderzoeken we of we verder kunnen gaan dan dat: biedt AI ook voldoende hulp bij het beheersen van Legacy Code?</p>



<span id="more-27622"></span>



<p class="justify-text">Het inzetten van <a href="https://www.smalsresearch.be/zin-onzin-en-nut-van-llms-zijn-ze-de-hype-waard/" data-type="post" data-id="24386">Large Language Models (LLM)</a> bij het programmeren is inderdaad ondertussen stilaan goed gekend: het gaat van vragen stellen aan een chatbot (&#8220;hoe schrijf ik in Java een algoritme dat &#8230; &#8220;), overheen steeds <a href="https://www.smalsresearch.be/llms-voor-code/" data-type="post" data-id="18875">slimmere en langer wordende <em>code completion</em></a> (automatisch aanvullen wat je wil typen in de editor), tot <a href="https://www.smalsresearch.be/vibe-coding-met-agentic-ides/" data-type="post" data-id="22499">volledige <em>vibe coding</em></a> (in de IDE, of zelfs gewoon in een terminal): AI agenten, via prompts, hele stukken code &#8211; ja, zelfs werkende toepassingen &#8211; laten schrijven op je machine.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:30%">
<p class="justify-text">Deze manier van werken beschreven we reeds <a href="https://www.smalsresearch.be/vibe-coding-met-agentic-ides/" data-type="post" data-id="22499">in een vorige blogpost</a>, en de caveats, zaken waarop men moet letten, gelden nog steeds: blijf continu opvolgen, stel zaken in vraag, controleer, en geef de juiste hoeveelheid nuttige context mee aan het AI (een kunst op zich). Voor het behandelen van <strong><em>legacy code</em></strong>, stellen er zich echter nog een aantal verdere problemen:</p>



<ul class="wp-block-list">
<li class="justify-text">Het is geen nieuwbouw (of <em>greenfield</em>): er is erg veel impact van &#8211; vaak obscure &#8211; beslissingen uit het verleden.</li>



<li class="justify-text">In veel gevallen is er reeds een massa code aanwezig.</li>



<li class="justify-text">Vaak vraagt het com- pileren, uitvoeren en testen van de code specifieke technologie, die zelf verouderd is en soms moeilijk te in-stalleren of simuleren.</li>



<li class="justify-text">Je bent als mens vaak niet meer onderwezen in het hoe en waarom van de bestaande codebase, waardoor het moeilijker wordt de resultaten van het AI kritisch te be-oordelen.</li>
</ul>
</div>



<div class="wp-block-column is-style-section-1 has-accent-5-background-color has-background is-layout-flow wp-container-core-column-is-layout-43dc041e wp-block-column-is-layout-flow is-style-section-1--7" style="border-width:2px;border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;flex-basis:70%">
<h3 class="wp-block-heading is-style-default" style="margin-top:var(--wp--preset--spacing--20);margin-right:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);margin-left:var(--wp--preset--spacing--20)"><span style="text-decoration: underline;">Vibe Coding: Een aantal Tips</span></h3>



<p class="justify-text has-small-font-size" style="padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)"><em>Deze eenvoudige truukjes ondervonden we reeds bij ons werk rond Legacy Code &amp; AI, maar zijn breder toepasbaar naar alle Vibe Coding projecten.</em></p>



<ul class="wp-block-list">
<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Grote Schoonmaak: vóór je een AI loslaat op een codebase, moet je ervoor zorgen dat er geen privégegevens, paswoorden, of andere gevoelige informatie in te vinden zijn!</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Planning: vraag om opties en stel executie uit. Als je zelf bedreven bent in wat je wil doen, heb je vast en zeker al een idee van waar je precies naartoe wilt. Het kan echter soms lonen om je gesprek met het AI heel open van geest te beginnen en te vragen naar ideeën en opties (b.v. qua architectuur of gebruikte technologie) om je algemene visie te bewaarlijken (waarbij je het soms overijverige AI ook duidelijk maakt dat er alleen nog maar wordt gepland). Vraag specifiek naar meerdere suggesties! Dit kan helpen bij het brainstormen, en om je eigen ideeën aan te vullen met meer inspiratie. In het vervolg van het geprek ga je dan dieper in op de opties die je het meeste aanstaan, en dan pas vul je aan met je eigen expertise om de ideeën van het AI bij te sturen, tot er een concreet plan van actie is ontstaan dat zo optimaal mogelijk is. Pas daarna gaan we over tot effectieve implementatie.</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Indirectie en Tools. Zeker als je via een CLI (Command Line Interface) werkt, zijn zowel jij als het AI zich niet meteen bewust van alle mogelijke reeds bestaande tools die zouden kunnen worden geëxploiteerd om je doelen te bereiken. Laat het AI zoeken naar tools die zouden kunnen helpen, en helpen bij de installatie ervan. Hoe meer zaken je via tools kan doen, hoe minder de context wordt vervuild met nodeloos &#8220;manueel&#8221; werk door het AI zelf (om nog maar te zwijgen van de besparing qua token gebruik). Zo bestaan er b.v. allerlei <a href="https://en.wikipedia.org/wiki/Static_program_analysis">static code analysis tools</a> die je kan gebruiken om de kwaliteit van je geschreven code te evalueren en hoog te houden. Het is vaak een koud kunstje voor het AI om heel wat van de gegeven suggesties na de analyse uit te voeren.</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Expert Mode: soms volstaan standaard tools niet om het AI voldoende te helpen bij wat je wil dat het doet. In dat geval kan je het AI eerst diens eigen tools laten schrijven. Daarbij kan je er voor zorgen dat het resultaat, of de output van de tool, iets is wat kort en samenvattend is voor de verdere taken, om de context niet teveel te belasten. Context windows van LLMs worden weliswaar steeds groter, maar dan nog moet je ervoor zorgen dat enkel de nuttigste zaken erin zitten (pas op voor <a href="https://redis.io/blog/context-rot/">context rot</a>).</li>
</ul>
</div>
</div>



<p>In een vorige <a href="https://www.smalsresearch.be/legacy-code-trotseren-best-practices-ai/" data-type="post" data-id="21131">post rond legacy code</a>, gaven we een erg brede definitie. Laten we dus vooreerst iets duidelijker stellen wat we met Legacy bedoelen, en de &#8220;moeilijkheidsgraad&#8221; van Legacy projecten beter illustreren.</p>



<h2 class="wp-block-heading">&#8220;Oude&#8221; code: een spectrum aan mogelijkheden</h2>



<p class="justify-text">Er is niet echt een officiële definitie van legacy code; meestal spreekt men van het gebruik van niet langer ondersteunde technologie, moeilijk te onderhouden, of simpelweg &#8220;code die je van iemand anders erft&#8221;. Het gaat uiteraard altijd wel om code die nog in gebruik, en dus belangrijk is. Ironisch genoeg, zijn het vaak de meest kritische toepassingen, die al jaren meegaan en waar men al jaren &#8220;op vertrouwt&#8221;, maar dan zonder ze goed te onderhouden.</p>



<p class="justify-text">AI kan ons helpen bij het onderhoud van eender welke code, dus we zullen een spectrum demonstreren dat van de oudste, ergste legacy code gaat, tot code van projecten die slechts een kleine update nodig heeft. Aan de ene kant van het spectrum heb je programma&#8217;s, geschreven in ouderwetse programmeertalen, volgens een achterhaalde architectuur, gebruik makend van databases die niet meer van deze tijd zijn, en draaiende op servers met niet langer ondersteunde besturingssystemen: bij deze mastodonten moet men vaak bang zijn dat ze kritisch zullen falen bij de kleinste verkeerde wijziging. Helemaal aan de andere kant heb je vrij goed onderhouden software, waarin een softwarebibliotheek wordt gebruikt die niet meer de meest recente versie is: meestal een koud kunstje om ze weer helemaal up-to-date te krijgen. Ergens in het midden vind je, ten slotte, toepassingen terug waarbij de meeste developers nog niet meteen het woord Legacy in de mond zullen nemen, maar waar wel moeilijke migraties dienen te gebeuren, met b.v. een verouderd framework of twee dat zou moeten worden vervangen.</p>



<figure class="wp-block-image size-large is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_307h9q307h9q307h-scaled.png"><img loading="lazy" decoding="async" width="1024" height="506" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_307h9q307h9q307h-1024x506.png" alt="" class="wp-image-27634" style="width:1301px;height:auto"/></a></figure>



<p class="justify-text">Wat kunnen we hier nu mee? Bieden LLMs ons andere mogelijkheden naargelang de plaats van het project op dit spectrum? Ons onderzoek heeft zich tot nu toe op de linkerkant van dit spectrum gefocust, dus het vervolg van deze blogpost zal veeleer over de mogelijkheden gaan om &#8220;échte&#8221; Legacy aan te pakken. Later dit jaar gaan we ook verder uitdiepen wat we met migraties en updates kunnen doen.</p>



<h2 class="wp-block-heading">Gebruik van LLMs op Legacy Codebases</h2>



<p class="justify-text">Het is duidelijk dat de eenvoudige prompt &#8220;herschrijf mij dit programma volgens moderne standaarden&#8221; niet zal werken (al beweren sommige vendors dat dit eraan zit te komen). We zullen iets concretere zaken gaan vragen, en het werk ook enigszins in stukjes moeten kappen. Verder zijn er eigenlijk twee zaken die we kunnen gaan doen met onze legacy code: ze herschrijven en ze documenteren.</p>



<h3 class="wp-block-heading">Herschrijven van Legacy Code</h3>



<p class="justify-text">Als we beginnen met code herschrijven, zullen we er vaak rekening mee moeten houden dat een heel groot project voldoende goed herbouwen een te moeilijke opgave is. We kunnen &#8220;quick wins&#8221; behalen door strategisch een aantal zaken te gaan herschrijven van een project, en die stukken dan te gebruiken in een ruimere context, waarbij een team van mensen en AI de toepassing opnieuw bouwen volgens de regels van de kunst. Bij onze experimenten stelden we vast dat het een brug te ver was om van het AI te verwachten een volledig nieuwe architectuur te gebruiken, tegelijk met het vertalen van oude code naar nieuwe. Wat wel mogelijk is, is om heel wat van de typische scaffolding (de standaardcode om tot iets werkend te komen) van een nieuw project te vibe coden, en daar dan gericht een aantal stukken code in te injecteren die vertalingen zijn van stukjes van een legacy project. Als mens is het onze taak om duidelijk aan te geven welke architectuur we verwachten, en wat de kwaliteitsregels zijn van de nieuw geschreven code.</p>



<p class="justify-text">Eén van de grotere uitdagingen bij het herschrijven van code met behulp van AI, is het testen van de correctheid van de vertaling: doet de code nog wat ze vroeger deed (los van het feit of dit wenselijk is, want zelfs de business case kan soms te verouderd zijn in geval van Legacy)? Bij redelijk nieuwe projecten zullen er reeds heel wat testen bestaan die we kunnen uitvoeren om de correctheid na te gaan, maar bij legacy hebben we vaak het probleem dat de toepassing eenvoudigweg wordt getest in productie, of op zijn minst met productiedata: er zijn geen specifieke tests of zelfs maar veilig bruikbare testdata. In dat geval komt het erop neer een omgeving te creëren waarin we de nieuwe code op een veilige manier kunnen testen, wat meestal ad hoc werk is en enige creativiteit vraagt. We mogen namelijk geen productiedata naar de Cloud sturen, dus we moeten ervoor zorgen dat het LLM deze niet kan lezen. Het zou eenvoudiger zijn als we lokaal draaiende LLMs zouden kunnen gebruiken, maar voorlopig zijn deze nog niet krachtig genoeg (als ze al beschikbaar zijn) om dergelijke complexe taken uit te voeren met legacy code.</p>



<p class="justify-text">Een andere uitdaging is de gebruikersinterface: bij oudere projecten is deze vaak achterhaald en moet er, vanaf de grond, een nieuwe GUI (Graphical User Interface) worden opgebouwd. Dat geeft echter het probleem dat je geen basis meer hebt in het oude project om mee te vergelijken: de nieuwe interface zal doorgaans manueel door mensen moeten worden getest. Ik verwacht echter dat we op dit vlak nog vorderingen zullen zien in de nabije toekomst, wat de mogelijkheden van het AI betreft. We zien namelijk al systemen opduiken die je volledige computer kunnen besturen (zoals <a href="https://openclawd.ai/">OpenClaw</a> of het <a href="https://www.anthropic.com/news/3-5-models-and-computer-use">&#8220;Computer Use&#8221; van Anthropic</a>), en ook integratie met meer traditionele raamwerken voor het testen van een GUI behoort tot de mogelijkheden.</p>



<p class="justify-text">Waar we, ten slotte, ook quick wins mee kunnen halen, zijn kleinere Legacy projecten. Als we een klein tot matig groot legacy programma gebruiken, met beperkte functionaliteit en een eenvoudige GUI of een duidelijke input en output in geval van batch processing, en geen business case om deze te integreren in een andere manier van werken, dan kunnen we een rechttoe rechtaan aanpak proberen om een moderne versie in een nieuwe programmeertaal te bouwen met AI. We moeten dan nog altijd goed testen en een gestructureerde aanpak hebben met bijsturingen door menselijke developers, maar het wordt wel feasible om dit voor niet-kritische toepassingen te gaan uitproberen. Een intern gebruikte toepassing is bijvoorbeeld een typische goede eerste kandidaat.</p>



<h3 class="wp-block-heading">Documenteren van Legacy Code</h3>



<p class="justify-text">Soms is herschrijven van Legacy met AI net iets te ambitieus, óf we hebben meer informatie nodig voor we er ons aan wagen. In dat geval kan het interessant zijn om eerst richting documentatie te kijken: het AI kan ons ook helpen om het verkennen van een legacy codebase net iets minder op archeologie voor gevorderden te doen lijken.</p>



<p class="justify-text">Van een klein tot matig stuk code uitleggen en er de business logica uithalen, of een groter stuk analyseren en de opbouw en architectuur uitleggen: dat kan met de huidige grote taalmodellen zonder meer. We kunnen echter verder gaan: we kunnen het AI tools laten bouwen om zichzelf te helpen de codebase te verkennen, en b.v. diagrammen te voorzien van de afhankelijkheden tussen de stukken code. Of we kunnen het scripts laten maken om de bevindingen na elk stuk analyse netjes te structureren in een tekstbestand voor zichzelf en een pdf voor de menselijke gebruiker.</p>



<p class="justify-text">We kunnen ook hiërarchisch werken: eerst een verkenning van de codebase doen, en dan telkens dieper duiken in de verschillende modules, om meer en meer detail te verkrijgen en de analyse aan te vullen. Dat is de top-down aanpak, die we echter kunnen aanvullen met een bottom-up versie: eens we tot in de diepte zijn gegaan, kunnen we weer zaken laten samenvatten om van het grotere plaatje een beter geïnformeerde uiteenzetting op te bouwen.</p>



<p class="justify-text">Hier is het wel van belang dat we van tevoren weten wat we precies willen bereiken. Een algemene analyse van een codebase door het AI kan interessant zijn wanneer de menselijke gebruikers het systeem nog totaal niet kennen en aanknopingspunten willen hebben om zaken te leren, maar biedt meestal weinig extra aan mensen die de codebase reeds beheersen.</p>



<p class="justify-text">Maar wanneer het doel is om de codebase te kunnen onderhouden, kunnen we eventueel een systeem opbouwen waarbij we een chatbot aanbieden die de specifieke context en bijzonderheden van het legacy project kent, en daar heel gerichte vragen over kan beantwoorden. Dit kan b.v. in <a href="https://adoption.microsoft.com/en-us/ai-agents/copilot-studio/">CoPilot Studio</a>. Wanneer dat niet goed genoeg werkt, kunnen we nog overwegen om manueel een knowledge base op te bouwen, gebruik makend van het AI, die dan weer door het AI kan worden gebruikt om vragen te beantwoorden.</p>



<p class="justify-text">Nog een andere optie bestaat eruit dat we specifieke informatie uit de codebase willen extraheren, zoals de business logica per afzonderlijke module, of pseudocode die menselijke developers kan helpen om de logica in een ander project te herimplementeren. (En uiteraard kan bij die tweede stap ook weer een AI worden ingezet.)</p>



<p class="justify-text">Kortom, met een beetje creativiteit kunnen we voor de meeste ad hoc analyses een betere aanpak verzinnen dan &#8220;analyseer er maar gewoon op los&#8221;. En het documenteren van een legacy systeem kan ook gewoon een eerste opstap zijn naar het herschrijven.</p>



<p></p>



<h2 class="wp-block-heading" style="margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)">Besluit: vakmannen gevraagd</h2>



<figure class="wp-block-image alignright size-large is-resized is-style-default" style="margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_98eus398eus398eu-scaled.png"><img loading="lazy" decoding="async" width="1024" height="559" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_98eus398eus398eu-1024x559.png" alt="" class="wp-image-27699" style="aspect-ratio:1.8333516399024625;object-fit:contain;width:546px;height:auto"/></a></figure>



<p class="justify-text no-top-margin">Zoals we hebben aangekaart, bieden LLMs ons stilaan erg krachtige mogelijkheden om onze Legacy Codebases aan te pakken, zéker wanneer we toegang hebben tot de grote en krachtige modellen die vandaag beschikbaar zijn. We zien echter ook dat het eigenlijk een heel goed gevulde gereedschapskoffer is, met een aantal krachtige &#8220;power tools&#8221;, en dat we moeten weten <em>wat </em>we ermee willen bereiken en <em>hoe </em>we deze best kunnen gebruiken.</p>



<p class="justify-text">We zitten nog niet op het punt dat alles automatisch gaat: we zullen dus nog steeds goede <em>vakmannen </em>nodig hebben om optimaal van dit gereedschap gebruik te maken. Onze raad aan developers is om zeker niet bang te zijn van AI en er geregeld gebruik van te maken bij de analyse en ontwikkeling van software: ervaring is de beste leerschool om de goede vakmannen die we hiervoor nodig hebben, op te leiden.</p>



<p class="justify-text">Voorlopig is dus het besluit: voor legacy code is AI geen wondermiddel, maar een handige gereedschapskist die je best kan uitproberen als deel van een bredere aanpak. Zoals gezegd kijken we later dit jaar eerder naar het midden en de rechterkant van het spectrum van legacy. Wij vermoeden dat hier meer mogelijkheden zijn tot automatisering van een aantal workflows, zeker als we ook dieper gebruik gaan maken van agents. Mogelijks kunnen we, voor iets eenvoudigere en repetitievere projecten, dus toch van &#8220;vakman&#8221; naar &#8220;fabriek&#8221; evolueren.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Je data beschermen tegen beheerders: ‘on-premise’ Confidential Computing</title>
		<link>https://www.smalsresearch.be/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 07:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26512</guid>

					<description><![CDATA[In deze en de volgende blogpost kijken we naar de mogelijkheid om TEE's op onze eigen infrastructuur (on-premise) te gebruiken. Het doel is drieledig: gebruikmaken van de kracht van confidential computing om data te beschermen en nieuwe toepassingen mogelijk te maken, terwijl we een zekere controle behouden over de software- en hardwarestack, en zo het vertrouwen van onze klanten versterken.]]></description>
										<content:encoded><![CDATA[
<p><em>Cet article est aussi disponible&nbsp;en&nbsp;<a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">français</a>.</em></p>



<p>Wat als je systeembeheerders toegang zouden hebben tot je gevoelige data zonder dat je het weet? <em>Confidential Computing</em> biedt een oplossing: data isoleren, zelfs voor degenen die de infrastructuur beheren. Maar hoe?</p>



<p><em>Confidential Computing</em> omvat een geheel van technologieën waarmee gevoelige data zodanig worden beschermd dat ze niet hoeven te worden ontsleuteld om te worden verwerkt. Hoewel sommige technologieën, zoals homomorfe versleuteling, nog steeds erg complex zijn om te implementeren, zijn <em>Trusted Execution Environments</em> (TEE&#8217;s) inmiddels zo ver ontwikkeld dat ze kunnen worden beschouwd als belangrijke technologie bij databescherming.</p>



<p>Het belangrijkste doel van TEE&#8217;s is om een buffer te vormen tegen de <a href="https://tweakers.net/nieuws/245316/1700-politiemedewerkers-bekeken-dossier-vermoorde-lisa-buitengewoon-kwalijk.html">nieuwsgierigheid</a> van de entiteiten die de infrastructuur beheren. Technische bescherming lost echter niet alles op. Extraterritoriale wetten [<a href="#ref1">1-5</a>] en het gebruik van eigen softwarelibrary&#8217;s die door sommige IT-infrastructuurproviders worden opgelegd, kunnen deze isolatie ondermijnen.</p>



<p>In deze en de volgende blogpost kijken we naar de mogelijkheid om TEE&#8217;s op onze eigen infrastructuur (<em>on-premise</em>) te gebruiken. Het doel is drieledig: gebruikmaken van de kracht van confidential computing om data te beschermen en nieuwe toepassingen mogelijk te maken, terwijl we een zekere controle behouden over de software- en hardwarestack, en zo het vertrouwen van onze klanten versterken.</p>



<h1 class="wp-block-heading">Scheiding van rollen</h1>



<p>Laten we beginnen met een overzicht van de verschillende spelers die betrokken zijn bij de implementatie van een toepassing op een IT-infrastructuur. Hun rollen moeten strikt gescheiden zijn om de integriteit van het systeem te garanderen.</p>



<ul class="wp-block-list">
<li>De <strong>infrastructure operator</strong> beheert de hardware en infrastructuur (computing, storage, network) en onderhoudt de beveiligde runtime-omgevingen. Hij beheert de firmware-updates en de toewijzing van middelen, maar zou geen toegang mogen hebben tot de data of de uitgevoerde workloads.</li>



<li>De <strong>orchestration operator</strong>, die dezelfde kan zijn als de infrastructure operator, is verantwoordelijk voor het beheer van de serverclusters en de implementatie van de workloads. Hij configureert de benodigde middelen voor de toepassing en houdt toezicht op de bijbehorende diensten (logging, monitoring). Ook zijn rechten zouden strikt beperkt moeten blijven om elke vorm van inbreuk op de toepassing te voorkomen, terwijl de noodzakelijke orchestratie wel mogelijk blijft.</li>



<li><strong>De workload provider </strong>ontwerpt de specificaties van de toepassingen en kiest de juiste container images, waarbij hij de conformiteit en integriteit ervan garandeert. Hij moet aan de data owners (zie hieronder) laten zien dat de gebruikte code veilig is en de privacy respecteert, zonder direct toegang te geven tot gevoelige data.</li>



<li><strong>De container image provider</strong> bouwt, ondertekent en versleutelt de container images, zodat hun herkomst en veiligheid gegarandeerd zijn. Hij verstrekt de verificatie en decryptiesleutel. Zijn samenwerking met de toepassingsprovider is cruciaal om de softwareketen te garanderen en ervoor te zorgen dat de geïmplementeerde code precies dezelfde is als de geauditeerde code.</li>



<li>Ten slotte bezit <strong>de data owner</strong> de data die door de toepassingen worden verwerkt en eist hij de vertrouwelijkheid en integriteit ervan. Hij vertrouwt op de code van de toepassing (de container) en de cryptografische bewijzen die door de microprocessor worden geleverd, waardoor infrastructure en orchestration operators buiten zijn vertrouwensbereik vallen. Hij kan extra controles opleggen om ervoor te zorgen dat zijn data niet zichtbaar zijn voor of gemanipuleerd worden door onbevoegde personen.</li>
</ul>



<p>De relaties tussen deze spelers brengen specifieke uitdagingen met zich mee: de data owner moet bijvoorbeeld kunnen vertrouwen op de code van de containers (geleverd door de workload provider) om zijn data te verwerken, terwijl hij deze tegelijkertijd moet beschermen tegen andere spelers, zoals de infrastructure of orchestration operator. Met name de beheerders van deze operators mogen in geen geval toegang hebben tot de data die door de containers worden verwerkt.</p>



<h1 class="wp-block-heading">Betrouwbare runtime-omgeving</h1>



<p>Met TEE&#8217;s kan een technische barrière worden gecreëerd die het vertrouwen van de data owner in de toepassingscontainer versterkt. We hebben al uitvoerig uitgelegd hoe ze werken en wat hun voor- en nadelen zijn in een technisch rapport [<a href="#ref6">6</a>] en blogposts [<a href="#ref7">7</a>], [8]. Hier gaan we even de belangrijkste punten herhalen alvorens we de technologische keuzes voor een implementatie op onze onderzoeksinfrastructuur voorstellen.</p>



<p>Het goed functioneren van TEE&#8217;s hangt af van de hardware. Sommige moderne microprocessors maken het mogelijk om een deel van het RAM-geheugen dat is toegewezen aan een specifieke virtuele machine (VM) te reserveren en te versleutelen. Zo zal een beheerder van de hostmachine, zelfs met de hoogste privileges, alleen versleutelde data zien als hij dit geheugengebied probeert te inspecteren. Hoewel er aanvallen via side-channels bestaan (bijv. [<a href="#ref9">9</a>]), vereisen deze vanwege hun complexiteit doorgaans langdurige fysieke toegang en de toevoeging van kwaadaardige hardwarecomponenten, waardoor ze in de praktijk uiterst moeilijk uit te voeren zijn.</p>



<p>Opdat de data owner er zeker van kan zijn dat zijn toepassing in een veilige omgeving draait, gebruikt hij het <a href="https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/#Attestation">certificeringsmechanisme</a>. Dit proces genereert een cryptografische handtekening van de inhoud van het geheugen van de VM op het moment dat deze wordt opgestart. Deze handtekening wordt gecertificeerd door de fabrikant van de microprocessor.</p>



<p>Dit proces heeft zijn beperkingen, vooral als de infrastructure operator een buitenlandse onderneming is (bijvoorbeeld Amazon AWS, Google Cloud of Microsoft Azure) die zijn eigen libraries in de VM oplegt om bijvoorbeeld de juiste hardware-abstractielaag te bieden.</p>



<p>Dit heeft ons ertoe aangezet om dit soort hardware op onze eigen infrastructuur binnen het onderzoekslabo te testen, in afwachting van de mogelijkheid om dit op een dag op <a href="https://www.gcloud.belgium.be/">G-Cloud</a> toe te passen. Het voordeel hiervan is dat een klant van SMALS een toepassingscontainer op een veilige manier kan gebruiken, zonder dat een beheerder van SMALS toegang heeft tot de inhoud van de container.</p>



<p>Maar het nut van TEE&#8217;s gaat verder dan alleen bescherming tegen beheerders. Het opent de deur naar andere toepassingen.</p>



<h1 class="wp-block-heading">Use case</h1>



<p>Een eerste voorbeeld is te vinden in de Europese infrastructuur voor <a href="https://health.ec.europa.eu/ehealth-digital-health-and-care/digital-health-and-care/electronic-cross-border-health-services_nl">digitale gezondheidsdiensten (eHDSI)</a>. Daar kunnen zorgverleners in het land waar de behandeling plaatsvindt de relevante gezondheidsdata van de patiënt opvragen in het land waar de patiënt is aangesloten. Technisch gezien wordt de aanvraag via de gateway van het nationale contactpunt voor gezondheidszorg (NCPeH) van het land waar de onverwachte gezondheidsgebeurtenis plaatsvindt, doorgestuurd naar het land waar de patiënt is aangesloten. De gevraagde info moet dan worden opgehaald uit de nationale infrastructuur van het land van aansluiting, vertaald naar het Engels en getranscodeerd (de gezondheidsdata worden omgezet van het nationale coderingssysteem naar het algemeen aanvaarde coderingssysteem, bijvoorbeeld van het <a href="https://www.hl7.org.uk/standards/hl7-standards/fhir/">FHIR</a>&#8211; of <a href="https://www.ehealth.fgov.be/standards/kmehr/en">KMEHR</a>-formaat naar <a href="https://www.hl7.org.uk/standards/hl7-standards/cda-clinical-document-architecture/">CDA</a>), en vervolgens teruggestuurd en gepresenteerd worden aan de zorgverlener in het land van behandeling. Vanwege het gevoelige karakter van de data moeten deze van begin tot eind worden versleuteld, vanaf de gegevensbron op de infrastructuur van het land van aansluiting tot aan de zorgverlener in het land van behandeling. In de praktijk is dit nog niet mogelijk vanwege de grote verschillen tussen de Europese landen. Het zou echter op zijn minst mogelijk moeten zijn om te garanderen dat de data versleuteld en ontoegankelijk blijven voor alle gebruikers of beheerders tussen de bron van de data en de uitgang van de NCPeH-gateway. Een mogelijkheid is dan om TEE&#8217;s te gebruiken voor het vertalen en transcoderen van de data.</p>



<p>Een ander voorbeeld van het gebruik van TEE&#8217;s is de beveiligde samenwerking tussen entiteiten die hun ruwe data niet willen delen. In de onderwijs- en werkgelegenheidssector heeft een experiment van Bogdanov <em>et al.</em> in Estland [<a href="#ref10">10</a>] de kracht van confidential computertechnieken aangetoond. De auteurs van deze studie wilden achterhalen of werken naast een hogere opleiding ertoe leidt dat je je diploma niet op tijd behaalt – een vraag die vooral belangrijk is voor de sector van de informatie- en communicatietechnologie (ICT) in Estland. Om deze probleemstelling te beantwoorden zonder de privacy van persoonlijke data in gevaar te brengen, hebben de onderzoekers de onderwijsregisters van het ministerie van Onderwijs en Onderzoek gecombineerd met de data van de belastingdienst, dankzij een speciale techniek van confidential computing. Maar een simpelere variant met een TEE zou net zo goed hebben gewerkt voor de analyse, terwijl de fiscale vertrouwelijkheid en databescherming gewaarborgd bleven.</p>



<h1 class="wp-block-heading">CoCo</h1>



<p>Om TEE&#8217;s te gebruiken in onze eigen onderzoeksinfrastructuur bestaan er verschillende softwareoplossingen. We hebben gekozen voor het project &#8220;<a href="https://confidentialcontainers.org/">Confidential Containers (CoCo)</a>&#8220;, waarvan de broncode vrij toegankelijk is. Dit project zorgt voor een goede isolatie van de toepassingscontainers en ondersteunt het certificeringsmechanisme op een transparante manier, terwijl de flexibiliteit van de implementatie en de compatibiliteit met het <a href="https://kubernetes.io/">Kubernetes</a>-platform waarop het is gebaseerd, behouden blijven. Elke Kubernetes-pod is geïsoleerd in een zeer lichte Confidential Virtual Machine, om te garanderen dat alleen geautoriseerde applicaties toegang hebben tot gevoelige gegevens.</p>



<p>CoCo&#8217;s bevatten naast de toepassing zelf enkele noodzakelijke softwarecomponenten. Deze maken het mogelijk om de uit te voeren containerimage te downloaden, de verificatie van de certificering te vergemakkelijken en bepaalde beveiligingsbeleidsregels toe te passen. Hun programmeerinterface is relatief klein, vooral vergeleken met een oplossing waarbij een hele Kubernetes-node in een Confidential Virtual Machine wordt geplaatst. Bovendien is de image van de guest-VM statisch en generiek voor alle workloads en zelfs platforms, waardoor het eenvoudiger is om veiligheidsgaranties te bieden. Tegelijkertijd is het makkelijk om dingen te delen tussen containers in dezelfde Kubernetes-pod. De naamruimte van het netwerk van de pod blijft bijvoorbeeld binnen de confidential VM, waardoor de containers daarin zonder extra kosten vertrouwelijk met elkaar kunnen communiceren.</p>



<p>CoCo is gebaseerd op <a href="https://katacontainers.io/">Kata</a>-containers, een ander open source-project, waarmee Kubernetes-pods kunnen worden uitgevoerd binnen zeer lichte Confidential Virtual Machines (zie <a href="#Figuur-1">Figuur 1</a>). CoCo voegt echter twee cruciale componenten toe om vertrouwelijkheid en veiligheid te garanderen (zie <a href="#Figuur-2">Figuur 2</a>).</p>



<ul class="wp-block-list">
<li>De eerste heeft te maken met het <strong>ophalen van containerimages</strong>: deze worden meestal gedownload door de Kubernetes-hoofdnode met behulp van een Container Runtime Interface (CRI) zoals “containerd”, waardoor de images via het bestandssysteem zichtbaar worden voor de hostmachine. Met CoCo worden de images binnen de Confidential Virtual Machine ontsleuteld en uitgepakt, vandaar de noodzaak van de bovengenoemde componenten.</li>



<li>Het tweede onderdeel is het <strong>certificaat</strong>, dat, zoals we al hebben gezien, essentieel is voor het opzetten van een betrouwbare uitvoeringsomgeving. Om bijvoorbeeld een image te ontsleutelen, dient de guest de geheime ontsleutelingssleutel te kunnen verkrijgen, maar deze wordt alleen verstrekt als de guest zijn authenticiteit kan aantonen. Dit is de rol van twee componenten die steunen op een zogenaamd “<em><a href="https://github.com/confidential-containers/trustee">Trustee</a></em>”-systeem, dat buiten de virtuele machine staat en uit twee diensten bestaat: een certificeringsdienst om de vertrouwde runtime te valideren en een key mediation-dienst om de geheime middelen te leveren die de virtuele machine en de toepassing nodig hebben.</li>
</ul>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-1"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Voorbeeld-architectuur.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Voorbeeld-architectuur.svg" alt="" class="wp-image-26516" style="width:600px"/></a><figcaption class="wp-element-caption">Figuur 1 &#8211; Voorbeeld van een architectuur met twee Kubernetes-nodes en lichte Kata Confidential Virtual Machines, die zelf weer Kubernetes-pods bevatten. Het aan elke virtuele machine toegewezen geheugen wordt direct versleuteld door de microprocessor van node 2. Dit zorgt ervoor dat elke pod niet alleen sterk geïsoleerd is van de andere, maar ook van de kernel van de hostmachine.</figcaption></figure>



<p>CoCo levert dus de basis voor het bouwen van confidential toepassingscontainers door het mogelijk te maken deze containers binnen confidential virtuel machines uit te voeren, waarbij de geëncrypteerde en ondertekende images van de containers, de verzegelde geheimen en andere kenmerken worden beheerd. Elke container of groep containers van dezelfde toepassing kan worden toegewezen aan een confidential virtuele machine, waarbij niet alleen de werklast wordt meegenomen, maar ook processen waarmee de toepassing bepaalde beveiligingsdiensten kan aanroepen. </p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-CoCo-schematische-weergave.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-CoCo-schematische-weergave.svg" alt="" class="wp-image-26518" style="width:600px"/></a><figcaption class="wp-element-caption">Figuur 2 &#8211; Schematische weergave van een CoCo en zijn omgeving. Door het kubelet-commando te gebruiken om de implementatie van een CoCo te starten, wordt een lichte VM gemaakt met verschillende basisagenten erin. Eén agent zorgt ervoor dat de (versleutelde en ondertekende) image van de app-container wordt gedownload uit een register. De andere zorgen ervoor dat de virtuele machine zich kan authenticeren en de nodige sleutels kan ophalen om de image te ontsleutelen en de handtekening te verifiëren, voordat de container wordt gestart. Gebaseerd op <a href="https://github.com/confidential-containers/confidential-containers/blob/main/images/coco-threat-model.png">dit figuur</a>.</figcaption></figure>



<p>Alles buiten de confidential VM op de host wordt als onbetrouwbaar beschouwd, inclusief de kubelet-tool, de runtime-interface van de containers en de kernel van het besturingssysteem van de host. De uitwisseling van informatie tussen vertrouwde en niet-vertrouwde contexten wordt streng gecontroleerd, met name via dynamische en configureerbare beveiligingsbeleidsregels. Ten slotte wordt de Kubernetes-orkestratie zelf als niet-vertrouwd beschouwd, waardoor de garanties met betrekking tot de planning of de volgorde van uitvoering van de workloads beperkt zijn, met uitzondering van de implementatie ervan in een geauthenticeerde enclave.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>Confidential containers maken deel uit van een algemene beveiligingsaanpak, waarbij certificering, verificatie van images en best practices in de softwaretoeleveringsketen worden gecombineerd. Ze maken het mogelijk om use cases eenvoudiger te verwerken dan geavanceerde cryptografie (<em>confidential collaboration, private set intersection, </em>geavanceerde pseudonimisering, enz.). Puristen kunnen natuurlijk aanvoeren dat een oplossing op basis van confidential containers minder veilig is, maar in de praktijk zal deze waarschijnlijk volstaan in een on-premise omgeving, des te meer omdat het veel aspecten vereenvoudigt zodra het eenmaal is geïmplementeerd.</p>



<p>In de volgende blogpost gaan we dieper in op de installatie en het gebruik van confidential CoCo&#8217;s.</p>



<h1 class="wp-block-heading">Referenties</h1>



<p id="ref1">[<a href="https://ref1">1</a>]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C. Bômont, “Strategic Brief no.70 &#8211; 2024 &#8211; Extension of the FISA Law European ‘digital sovereignty’ far from American concerns &#8211; IRSEM”, Institut de Recherche Stratégique de l’Ecole Militaire. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.irsem.fr/en/strategic-brief-no-70-2024">https://www.irsem.fr/en/strategic-brief-no-70-2024</a></p>



<p id="ref2">[2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Michels, “Europeans, forget the US Cloud Act… worry about FISA instead (!)”. Geraadpleegd: 1 juli 2025. [Online]. Beschikbaar op: <a href="https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze">https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze</a></p>



<p id="ref3">[3]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Paul Kunert, “Microsoft exec admits it ‘cannot guarantee’ data sovereignty”. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/">https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/</a></p>



<p id="ref4">[4]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M. Rochefort, “Microsoft face au Sénat : l’aveu qui fait vaciller la souveraineté numérique française”, clubic.com. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html">https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html</a></p>



<p id="ref5">[5]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Deridder, “Understanding Sovereignty: Who Rules your Cloud?”, Dirk Deridder. Geraadpleegd: 1 juli 2025. [Online]. Beschikbaar op: <a href="https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/">https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/</a></p>



<p id="ref6">[6]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Informatique confidentielle &#8211; État de l’art”, Smals Research, jul. 2023. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/publications/document?docid=269">https://www.smalsresearch.be/publications/document?docid=269</a></p>



<p id="ref7">[7]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Introduction à l’informatique confidentielle”, Smals Research. Geraadpleegd: 9 januari 2026. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/">https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/</a></p>



<p id="ref8">[8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Outils pour l’informatique confidentielle”, Smals Research. Geraadpleegd: 9 januari 2026. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/">https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/</a></p>



<p id="ref9">[9]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J. De Meulemeester, D. Oswald, I. Verbauwhede, en J. V. Bulck, “Battering RAM: Low-cost interposer attacks on confidential computing via dynamic memory aliasing”, gepresenteerd bij 47th IEEE Symposium on Security and Privacy (S&amp;P), mei 2026.</p>



<p id="ref10">[10]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Bogdanov, L. Kamm, B. Kubo, R. Rebane, V. Sokk, en R. Talviste, “Students and taxes: a Privacy-preserving study using secure computation”, <em>Proc. </em><em>Priv. Enhancing Technol.</em>, vol. 2016, nr. 3, pp. 117-135, jul. 2016, doi: 10.1515/popets-2016-0019.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>De performance van LLM’s: Een vergelijkende analyse tussen Frans en Nederlands</title>
		<link>https://www.smalsresearch.be/de-performance-van-llms-een-vergelijkende-analyse-tussen-frans-en-nederlands/</link>
		
		<dc:creator><![CDATA[Katy Fokou]]></dc:creator>
		<pubDate>Wed, 04 Mar 2026 15:27:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[chatbot]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26548</guid>

					<description><![CDATA[Uit onze evaluatie van een RAG-chatbot blijkt er een prestatieverschil te bestaan tussen het Frans en het Nederlands, wat wijst op een aanhoudende uitdaging bij het gebruik van meertalige grote taalmodellen (LLM’s). Dit prestatieverschil kan deels worden verklaard door de beschikbaarheid van de middelen die worden gebruikt om deze modellen te trainen, maar er kunnen ook andere factoren meespelen.]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.smalsresearch.be/performance-des-llm-analyse-comparative-entre-le-francais-et-le-neerlandais/" data-type="link" data-id="https://www.smalsresearch.be/performance-des-llm-analyse-comparative-entre-le-francais-et-le-neerlandais/">Version française</a></p>



<p>Het opmerkelijke meertalige potentieel van grote taalmodellen (LLM’s) heeft bijgedragen aan de brede verspreiding en integratie ervan binnen AI-gebaseerde toepassingen. Er bestaan echter prestatieverschillen tussen het Engels en andere talen, met name talen met beperkte middelen.</p>



<p>Bij de evaluatie van een door ons ontwikkelde <a href="https://www.smalsresearch.be/rag-in-practice-webinar-by-smals-research/">RAG-chatbot</a> stelden we een duidelijk verschil vast in de kwaliteit van de antwoorden, afhankelijk van de gebruikte taal. De chatbot leverde namelijk betere antwoorden in het Frans dan in het Nederlands. De in het Frans gegenereerde antwoorden waren vlotter en betrouwbaarder ten opzichte van de door de gebruiker gevraagde informatie. De antwoorden in het Nederlands waren over het algemeen minder relevant. Deze resultaten wijzen op een cruciale uitdaging bij de ontwikkeling van LLM&#8217;s die door chatbots worden gebruikt: hoewel deze indrukwekkende meertalige capaciteiten hebben, vertonen de huidige modellen vaak een uitgesproken voorkeur voor talen met veel middelen, zoals het Engels.</p>



<p>In deze blogpost beschrijven we de resultaten van ons onderzoek naar de door ons vastgestelde taalkloof en tonen we de bevindingen van ons onderzoek.</p>



<h1 class="wp-block-heading">Prestatieverschil tussen het Engels en de andere talen: oorzaken en factoren</h1>



<p>Verschillende factoren dragen bij aan de taalvoorkeur voor het Engels. Deze omvatten:</p>



<ul class="wp-block-list">
<li><strong>Onevenwichtige datasets:</strong> het trainingsproces van grote taalmodellen is gebaseerd op omvangrijke tekstcorpora, maar deze worden sterk gedomineerd door het Engels, gevolgd door talen met veel taalkundige middelen zoals het Chinees, het Frans en het Spaans. Daarentegen zijn de data in talen met beperkte middelen vaak van mindere kwaliteit vanwege het beperkte aantal bronnen. Dit onevenwicht in de data leidt tot slechte prestaties in andere talen dan het Engels, met hogere foutpercentages en hallucinaties tot gevolg. Om dit probleem op te lossen, maken modelontwikkelaars gebruik van een techniek die “interlinguïstische overdracht” genoemd wordt. Hierbij verbetert een model zijn prestaties in minder goed uitgeruste talen door universele of gedeelde taalkundige patronen af te leiden uit talen met veel middelen. Hoewel het exacte percentage Engelstalige data in propriëtaire modellen niet openbaar bekend is, is 93% van de data die worden gebruikt om GPT-3 te trainen in het Engels. Leveranciers van grote taalmodellen, zoals OpenAI en Google, maken vaak gebruik van het Common Crawl-webgegevensarchief, dat zelf wordt gekenmerkt door een dataset waarin het Engels overheerst (44% in het Engels, 4% in het Frans, 2% in het Nederlands). Deze vertekening wordt nog versterkt in gespecialiseerde domeinen zoals financiën en gezondheidszorg, waar hoogwaardige data bijzonder schaars is. Het is belangrijk op te merken dat het Nederlands wordt beschouwd als een taal met hoge middelen in het domein van automatische natuurlijke taalverwerking (NLP), hoewel het over minder middelen beschikt dan het Frans of het Engels.</li>



<li><strong>Morfologie en tokenisatie:</strong> modelarchitecturen zijn vaak geoptimaliseerd voor het Engels. Tokenisatieprocessen kunnen ingewikkeld zijn voor talen die niet met het Latijns alfabet worden geschreven, zoals het Chinees of het Japans, alsook voor talen met een gemiddelde tot hoge morfologische complexiteit, zoals het Nederlands. Engelse tokenizers kunnen het moeilijk hebben met het verwerken van samengestelde woorden (de combinatie van meerdere zelfstandige naamwoorden in een woord), wat kan leiden tot grammaticaal foute resultaten wanneer modellen tekst genereren.</li>
</ul>



<p>Zeer weinig studies hebben de prestaties geanalyseerd van grote taalmodellen in het Frans en het Nederlands. Een onderzoek naar de taalkundige kwaliteit van LLM’s in deze twee talen bracht aan het licht dat de prestaties algemeen beter waren in het Frans dan in het Nederlands, in het bijzonder bij taken waarbij tekst moest worden gegenereerd [1]. Een ander onderzoek rapporteerde betere prestaties van LLM’s in het Engels in vergelijking met het Nederlands bij een vraag-antwoordtaak [2].</p>



<p>In de industrie blijven er grote uitdagingen bestaan met betrekking tot de toepassing van grote taalmodellen op niet-Engelse technische domeinen, met name in de medische en financiële sector. De huidige implementaties vereisen vaak een verfijning van de vooraf getrainde modellen zoals Mistral en Llama om bevredigende prestaties te bereiken.</p>



<p>Een andere bekende uitdaging bij de toepassing van AI-modellen in de Nederlandse taalomgeving is spraakherkenning. Dit is grotendeels een gevolg van de grote variatie in regionale accenten. Onze experimenten met het transcriberen van opnames van Teams-vergaderingen hebben aangetoond dat de Franse transcripties systematisch van betere kwaliteit waren dan de Nederlandse. Gespecialiseerde tools zoals <a href="https://www.sembly.ai/">Sembly</a> leveren echter acceptabele transcriptieresultaten in het Nederlands.</p>



<h1 class="wp-block-heading">Vergelijkende analyse van de prestaties van het Nederlands en het Frans in een chatbot</h1>



<p>Er is een vergelijkende analyse van de prestaties uitgevoerd op een chatbot die is ontwikkeld om vragen van burgers te beantwoorden. Voor de eerste evaluatie van de chatbot hebben we een reeks vragen gebruikt die door experts zijn opgesteld. Deze vragen werden in het Frans en het Nederlands aan de chatbot voorgelegd, waarna de antwoorden door dezelfde expert werden beoordeeld en door twee andere personen werden gecontroleerd. Uit de eerste evaluatie blijkt een aanzienlijk verschil in prestaties tussen de twee talen: de chatbot behaalde een nauwkeurigheid van 95% in het Frans, tegenover 82% in het Nederlands.</p>



<p>Na de implementatie van de chatbot in een productieomgeving werd een tweede evaluatiefase uitgevoerd op basis van vragen die door gebruikers waren ingediend en in een database waren opgeslagen. We merkten opnieuw een verschil in prestaties: 82% nauwkeurigheid in het Frans en 69% in het Nederlands.</p>



<p>Verschillende factoren kunnen bijdragen aan deze waargenomen verschillen, waaronder:</p>



<ul class="wp-block-list">
<li>de vooringenomenheid van de beoordelaars – beoordelaars zijn minder of meer streng in hun beoordelingen;</li>



<li>de variatie in het soort vragen (dubbelzinnig, slecht geformuleerd, niet ter zake) – dezelfde vragen werden niet systematisch in beide talen beoordeeld;</li>



<li>het kwaliteitsverschil bij het ophalen van de bronnen (<em>retrieval</em>) – er zijn verschillen tussen de talen in de data-bronnen die worden opgehaald om de generatie te voeden;</li>



<li>de intrinsieke capaciteiten van het generatieve model (GPT-4o) in beide talen.</li>
</ul>



<p>Er was dus aanvullend onderzoek nodig om de waargenomen verschillen in het Frans en het Nederlands volledig te begrijpen en deze factoren te verminderen.</p>



<h3 class="wp-block-heading"><strong>Test</strong></h3>



<p>Om de prestaties van LLM&#8217;s in zowel het Frans als het Nederlands grondig te evalueren, werd een experiment uitgevoerd met de chatbot. We selecteerden een aantal vragen waarvan de eerdere antwoorden van LLM&#8217;s als onjuist waren beoordeeld, waarbij we ervoor zorgden dat de vragen niet te complex of te simplistisch waren. Het was van cruciaal belang dat elke vraag van een gebruiker tussen het Frans en het Nederlands werd vertaald om een directe vergelijking te vergemakkelijken. Bij het evaluatieproces waren twee onafhankelijke evaluatoren betrokken, een vakexpert en een technisch expert, om vooringenomenheid te beperken en een robuuste evaluatie te garanderen. De evaluatoren beoordeelden de nauwkeurigheid, relevantie en vlotheid van de gegenereerde antwoorden. Daarnaast werden ook andere modellen dan GPT-4o getest.</p>



<p>Naast de tests in het Nederlands en het Frans hebben we ook een test uitgevoerd waarbij vragen in het Nederlands naar het Engels werden vertaald. De antwoorden werden in het Engels gegenereerd en vervolgens opnieuw naar het Nederlands vertaald.</p>



<h3 class="wp-block-heading"><strong>Resultaten</strong></h3>



<p><em>Vraag in het Nederlands, antwoord in het Engels</em></p>



<p>Het experiment waarbij vragen in het Nederlands naar het Engels werden vertaald en hierna de antwoorden naar het Nederlands werden vertaald leverde een genuanceerd resultaat. Hoewel de vertaling van Nederlandstalige vragen naar het Engels leidde tot ietwat betere antwoorden, van 67% naar 73%, verslechterde de kwaliteit van de antwoorden bij het omgekeerde proces, namelijk het vertalen van de gegenereerde Engelse antwoorden naar het Nederlands.</p>



<p><em>Nauwkeurigheid van Franse antwoorden versus nauwkeurigheid van Nederlands antwoorden</em></p>



<p>Tijdens ons experiment hebben we de antwoorden gegenereerd op basis van Nederlandstalige vragen vergeleken met hun Franse equivalenten in verschillende tekstreeksen. We hebben vastgesteld dat de samenstelling van deze reeksen een invloed had op de evaluatie van het model. De scores varieerden namelijk van set tot set voor elk model en elke taal, en de prestatieverschillen tussen de talen kwamen niet altijd tot uiting. Dit onderstreept het belang van het selectieproces van de testvragen: voor onze laatste test hebben we een evenwichtige testset samengesteld met voorbeelden van vragen die door gebruikers in beide talen zijn ingediend en vragen die door domeinexperts zijn opgesteld. In tegenstelling tot wat aanvankelijk werd waargenomen, laten de onderstaande resultaten slechts een klein verschil in nauwkeurigheid zien tussen het Frans en het Nederlands <strong>voor onze use case</strong>.</p>



<p>Tabel 1. Resultaten van de eindevaluatie van de chatbot.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>&nbsp;</td><td><strong>Maximale score</strong><strong></strong></td><td><strong>GPT-5 (OpenAI)</strong><strong></strong></td><td><strong>Gemini (Google)</strong><strong></strong></td><td><strong>o3 (OpenAI)</strong><strong></strong></td><td><strong>Beste score (Gemini)</strong><strong></strong></td></tr><tr><td><strong>FR</strong><strong></strong></td><td>60</td><td>44</td><td><strong>46</strong><strong></strong></td><td>32</td><td><strong>77%</strong><strong></strong></td></tr><tr><td><strong>NL</strong><strong></strong></td><td>60</td><td>38</td><td><strong>43</strong><strong></strong></td><td>32</td><td><strong>72%</strong><strong></strong></td></tr></tbody></table></figure>



<p><em>Opmerking: slecht geformuleerde vragen in het Frans of Nederlands werden uit de testset verwijderd omdat ze moeilijk nauwkeurig in de andere taal te vertalen bleken.</em><em></em></p>



<p><em>Vergelijking van de LLM&#8217;s</em></p>



<p>GPT-5 presteerde goed op het vlak van nauwkeurigheid en beknoptheid. Het vertoonde echter een groter verschil in nauwkeurigheid tussen het Frans en het Nederlands dan de andere modellen. Gemini presteerde weliswaar beter in zowel het Frans als het Nederlands, maar genereerde aanzienlijk langere antwoorden, wat leidde tot een hoger tokengebruik. We hebben ook vastgesteld dat Claude Sonnet, met een vergelijkbare nauwkeurigheid als Gemini, soms Engelse termen invoegde in het gegenereerde antwoord, en dit vaker in het Nederlands dan in het Frans. Na evaluatie concludeerden de experts op dit gebied dat Gemini het meest geschikte model was voor hun use case.</p>



<p><em>Effect van de retrieval</em></p>



<p>Het proces van <a href="https://www.smalsresearch.be/betere-zoekresultaten-met-vector-databases/">retrieval</a> bestaat erin om relevante tekstfragmenten te extraheren om een vraag te beantwoorden vanuit de vector database, afhankelijk van de gelijkenis tussen de vraag en deze fragmenten. Deze gelijkenis wordt berekend met behulp van vectorrepresentaties van de teksten, gegenereerd door een <em>embeddingmodel</em>. We hebben vragen geanalyseerd die aanvankelijk betere resultaten opleverden in het Frans dan in het Nederlands en hebben vastgesteld dat ongeveer 50% van de opgehaalde informatie (context) in beide talen voorkwam. Om de impact van de resterende 50% afwijkende informatie te evalueren, hebben we het model (Gemini) aan identieke contexten onderworpen om zowel Franstalige als Nederlandstalige antwoorden te genereren. Ondanks het gebruik van deze identieke contexten bleef het model prestatieverschillen vertonen tussen het Frans en het Nederlands. Het retrievalproces lijkt dus een beperkte invloed te hebben op het waargenomen prestatieverschil tussen de twee talen.</p>



<h1 class="wp-block-heading">Conclusie en aanbevelingen</h1>



<p>Het prestatieverschil tussen het Nederlands en het Engels in grote taalmodellen is een vaststaand feit, dat geworteld is in de overweldigende dominantie van het Engels in de trainingscorpora. Dit verschil wordt nog versterkt door de specifieke morfologie van het Nederlands. Ter vergelijking: als LLM&#8217;s over het algemeen betere resultaten opleveren in het Frans, is dat te danken aan een betere vertegenwoordiging van de taal in de trainingscorpora.</p>



<p>Ons experiment heeft waardevolle informatie opgeleverd over de prestaties van LLM&#8217;s in een RAG-toepassing (Retrieval Augmented Generation) in het Nederlands en het Frans. Hoewel we aanvankelijk een significant verschil in nauwkeurigheid tussen de antwoorden in het Nederlands en de antwoorden in het Frans constateerden, bleek uit grondig onderzoek dat andere factoren dan de capaciteit van het model de resultaten konden beïnvloeden. Het prestatieverschil is dus minder groot dan we dachten. Bovendien hebben we vastgesteld dat variaties in de samenstelling van de testset kleine schommelingen in de resultaten veroorzaakten. Deze conclusies tonen aan dat de prestaties van LLM&#8217;s zeer gevoelig zijn voor de context en de specifieke formulering van de vragen. We hebben ook een lichte kwaliteitsverbetering&nbsp; van de antwoorden waargenomen bij de Engelse vertaling van Nederlandstalige vragen; dit voordeel werd echter grotendeels tenietgedaan door de daaropvolgende Nederlandse vertaling van deze Engelse antwoorden.</p>



<p>De bovenstaande conclusies gelden voor een chatbot die zorgvuldig opgestelde inhoud in algemene taal gebruikt om vragen te beantwoorden. Ze zijn niet noodzakelijkerwijs van toepassing op andere use cases. Het is daarom essentieel om voor elk geval grondige evaluaties uit te voeren, zeker wanneer men in specifieke domeinen zoals gezondheidszorg, financiën, recht, enzovoort werkt.</p>



<p><strong>Moeten we een eentalig model gebruiken?</strong></p>



<p>We hebben deze vraag niet grondig kunnen onderzoeken. Ons literatuuronderzoek heeft geen overtuigend bewijs opgeleverd dat LLM&#8217;s voor het Nederlands de prestaties verbeteren; integendeel, de aanwezigheid van talen met veel bronnen in meertalige modellen lijkt de prestaties van minder goed bedeelde talen tot op zekere hoogte te verbeteren. Er zijn echter verschillende initiatieven genomen om LLM&#8217;s voor het Nederlands te ontwikkelen. De meest opvallende zijn:</p>



<p>&#8211; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GEITje: model gebaseerd op Mistral 7B en verfijnd voor het Nederlands. Dit model is niet langer beschikbaar vanwege auteursrechtelijke problemen.</p>



<p>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://gpt-nl.nl/gpt-nl/">GPT-NL</a>: lopend initiatief, ondersteund door Nederland, om een LLM te ontwikkelen die is aangepast aan de Nederlandse taal en cultuur.</p>



<p>Referenties</p>



<ol class="wp-block-list">
<li><a href="https://aclanthology.org/2024.humeval-1.2/">Exploratory Study on the Impact of English Bias of Generative Large Language Models in Dutch and French</a>&nbsp;(Rigouts Terryn &amp; de Lhoneux, HumEval 2024)</li>



<li><a href="https://documentserver.uhasselt.be/bitstream/1942/46335/1/__TRBWS07_FileUploads_2024%20AM%20Presentations_23064_Presentation-137767_23064_TRBAM-25-02712_2025-02-03-05-58-09.pdf">Performance of Large Language Models in Domain-Specific and Underrepresented Languages: A Case Study on the Transportation Domain and Dutch Language</a> (UHasselt)</li>



<li><a href="https://arxiv.org/pdf/2303.12528">MEGA: Multilingual Evaluation of Generative AI</a> (Ahuja et al., 2023)</li>



<li><a href="https://arxiv.org/html/2410.12835v1">A Dutch Financial Large Language Model</a> (Sander Noels, Jorne De Blaere &amp; Tijl De Bie, 2024)</li>



<li><a href="https://blog.premai.io/multilingual-llms-progress-challenges-and-future-directions/">Multilingual LLMs: Progress, Challenges, and Future Directions</a> (PremAI blogpost)</li>



<li><a href="https://hogent-cads.github.io/blog/posts/vlaamse-spraakherkenning/">https://hogent-cads.github.io/blog/posts/vlaamse-spraakherkenning/</a> (HoGent blogpost)</li>



<li><a href="https://www.smalsresearch.be/rag-in-practice-webinar-by-smals-research/">Webinar Smals Research – Generatieve AI: verder dan de hype | Smals Research</a></li>
</ol>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Made by Smals Research &#8211; Privacyvriendelijk Kruisen van Persoonsgegevens</title>
		<link>https://www.smalsresearch.be/innovatiesmals-privacyvriendelijk-kruisen-van-persoonsgegevevens/</link>
		
		<dc:creator><![CDATA[Kristof Verslype]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[Privacy by design]]></category>
		<category><![CDATA[privacy-enhancing technologies]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://staging.smalsresearch.be/?p=26251</guid>

					<description><![CDATA[In samenwerking met internationaal toonaangevende universiteiten werkte Smals aan een prototype om met behulp van geavanceerde cryptografie het pseudonimiseren en kruisen van persoonsgegevens voor secundaire doeleinden aanzienlijk te vereenvoudigen.]]></description>
										<content:encoded><![CDATA[
<p><em>Cet article est aussi disponible&nbsp;en&nbsp;<a href="/innovationsmals-croisement-des-donnees-a-caractere-personnel-dans-le-respect-de-la-vie-privee/">français</a>.</em></p>



<p>Digitale persoonsgegevens vormen <span data-olk-copy-source="MessageBody">binnen een overheidscontext</span> een bron van inzichten die innovatie, welzijn en beleidsvorming ten goede komen. Die persoonsgegevens zijn over heel wat organisaties verspreid; de ene organisatie heeft informatie over kanker, de andere over medicijngebruik en nog een andere bewaart inkomensgegevens. In de praktijk worden geregeld persoonsgegevens afkomstig van verschillende organisaties samengevoegd om op specifieke vragen van onderzoekers en beleidsmakers te kunnen antwoorden.</p>



<p>De huidige processen garanderen dat dit met respect voor de privacy gebeurt. Helaas is het – mede daardoor – ook te vaak een complexe, dure en tijdrovende aangelegenheid. In samenwerking met internationaal toonaangevende universiteiten werkte Smals Research daarom aan een prototype om met behulp van geavanceerde cryptografie deze processen aanzienlijk te vereenvoudigen.</p>



<h1 class="wp-block-heading">Probleemstellig op basis van concrete case</h1>



<p>We vertrokken van een <a href="https://www.ehealth.fgov.be/ehealthplatform/file/cc73d96153bbd5448a56f19d925d05b1379c7f21/5749691d1687866fa0e6852fe4536cb54f2bf4ad/20-020-n042-behandeling-herstellende-multiple-sclerose.pdf">concrete onderzoeksvraag</a>:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Lopen MS-patiënten die medicijnen met de moleculen teriflunomide of alemtuzumab gebruiken een verhoogd risico op kanker in vergelijking met MS-patiënten die met andere medicijnen worden behandeld?</p>
</blockquote>



<p>Om die – op zich eenvoudige – vraag te kunnen beantwoorden moeten medische gegevens over MS-patiënten afkomstig van twee organisaties, met name het <a href="https://kankerregister.org/nl">Belgisch Kankerregister (BCR)</a> en het <a href="https://www.ima-aim.be/">InterMutualistisch Agentschap (IMA)</a> gekruist worden.</p>



<p>Beide organisaties beheren de gegevens onder aparte pseudoniemen voor meer privacy; unieke codes ter vervanging van rijksregisternummers.</p>



<ul class="wp-block-list">
<li>Het BCR beheert gegevens met betrekking tot kanker over mensen die een kankerdiagnose kregen. Het BCR weet niet welke records betrekking hebben op MS-patiënten.</li>



<li>Het IMA kent gegevens m.b.t. voorgeschreven medicijnen en kan de records selecteren van MS-patiënten.</li>
</ul>



<p>De onderzoekers dienen in een beveiligde omgeving (<a href="https://www.european-health-data-space.com/European_Health_Data_Space_Article_50_(Proposal_3.5.2022).html">SPE = Secure Processing Environment</a>) toegang te krijgen tot gegevens afkomstig van het BCR en het IMA, over alle MS-patiënten. Gegevens over dezelfde patiënt maar afkomstig van verschillende bronnen moeten aan elkaar gekoppeld kunnen worden op basis van een uniek pseudoniem dat enkel gebruikt wordt in het kader van die specifieke onderzoeksvraag. Dit wordt geïllustreerd in figuur 1.</p>



<figure class="wp-block-image aligncenter wp-image-24710"><a href="https://staging.smalsresearch.be/wp-content/uploads/2025/12/set.png"><img loading="lazy" decoding="async" width="598" height="154" src="https://staging.smalsresearch.be/wp-content/uploads/2025/12/set.png" alt="" class="wp-image-24710" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/set.png 598w, https://www.smalsresearch.be/wp-content/uploads/2025/12/set-300x77.png 300w" sizes="auto, (max-width: 598px) 100vw, 598px" /></a><figcaption class="wp-element-caption">Figuur 1: Links de verzameling van MS-patiënten, rechts de verzameling van burgers die de kankerdiagnose kregen. Enkel gegevens over burgers in de twee groene regio&#8217;s mogen aan de beveiligde omgeving gepseudonimiseerd prijsgegeven worden.&nbsp;</figcaption></figure>



<p>De centrale vraag luidt als volgt:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Hoe kan het BCR <u>enkel </u>records over MS-patiënten aanleveren aan de beveiligde omgeving zonder te weten te komen wie MS heeft of welke records die het beheert betrekking hebben op MS-patiënten?</em></p>
</blockquote>



<p>In een klassieke benadering zal ofwel het BCR te veel informatie naar de beveiligde omgeving sturen – met name gegevens over elke kankerpatiënt – ofwel lekt er informatie naar het BCR – waarbij het BCR te weten komt welke records betrekking hebben op MS-patiënten. Een laatste mogelijkheid is het inschakelen van een vertrouwde centrale partij die weliswaar persoonsgegevens te weten komt, maar vertrouwd wordt daar niets onrechtmatigs mee te doen.</p>



<p>Geen van deze aanpakken is ideaal. Vandaag wordt in binnen- en buitenland ofwel beroep gedaan op – sterk gereguleerde – centrale partijen ofwel is duur en traag maatwerk vereist, waarbij voor elke onderzoeksvraag een nieuwe flow uitgetekend, gevalideerd en uitgevoerd wordt om de privacy maximaal te beschermen.</p>



<p>We geven nog mee dat de onderzoeker doorgaans toegang nodig heeft tot de ruwe data, waardoor oplossingen gebaseerd op <a href="https://www.smalsresearch.be/secure-multiparty-computation-collectieve-berekeningen-op-verspreide-gevoelige-gegevens/">secure multi-party computation</a> ongeschikt zijn.&nbsp;</p>



<h1 class="wp-block-heading">Ons voorstel tot oplossing</h1>



<p>Laat ons even vertrekken van een fictief scenario waarbij gewerkt wordt met een vertrouwde intermediaire partij en het – voor de eenvoud – IMA en BCR de persoonsgegevens niet onder pseudoniemen beheren, maar onder rijksregisternummers. IMA en BCR sturen beiden alle gegevens die potentieel relevant zijn naar de vertrouwde tussenpartij. </p>



<p>Het BCR stuurt naar de intermediaire partij geïdentificeerde kankergegevens over <em>alle</em> burgers die de kankerdiagnose kregen, wat uiteraard veel meer is dan nodig voor de onderzoeker. De intermediaire partij krijgt ook alle geïdentificeerde medicatiegegevens over MS-patiënten van het IMA en weet op basis daarvan welke door het BCR aangeleverde records betrekking hebben op MS-patiënten en dus relevant zijn in het kader van de onderzoeksvraag. De intermediaire partij voert nu de volgende stappen uit:</p>



<ol class="wp-block-list">
<li>Het verwijdert de niet relevante records, dus de records over alle burgers die de kankerdiagnose kregen maar geen MS hebben.</li>



<li>Het voegt records over dezelfde burgers samen en vervangt in de samengevoegde records de rijksregisternummers door unieke pseudoniemen</li>



<li>Het stuurt het resultaat &#8211; enkel samengevoegde records &#8211; naar de <a href="https://www.european-health-data-space.com/European_Health_Data_Space_Article_50_(Proposal_3.5.2022).html">beveiligde omgeving</a>.</li>



<li>Het verwijdert alle ontvangen en afgeleide gegevens.</li>
</ol>



<p>In dit scenario zijn er geen onbedoelde datalekken naar de databronnen en ontvangt de beveiligde omgeving enkel de minimaal noodzakelijke, gepseudonimiseerde persoonsgegevens.</p>



<p>Ons prototype doet exact dit, maar dan <strong>zonder de vertrouwde partij</strong>. De rol van de vertrouwde partij wordt gedistribueerd: <em>Data holders</em> &#8211; in dit geval het IMA en het BCR &#8211; en een <em>data collector</em> &#8211; in dit geval de beveiligde omgeving &#8211; interageren met elkaar om samen de rol van de vertrouwde partij over te nemen. Daarbij worden de veiligheidseigenschappen uit de vorige paragraaf behouden; er lekt dus niet onbedoeld informatie naar de data holders en de data collector komt enkel de minimaal noodzakelijke gepseudonimiseerde gegevens te weten. De oplossing blijft niettemin praktisch en efficiënt. Dit alles is mogelijk dankzij geavanceerde cryptografie.</p>



<p>We schreven eerder dat het IMA en het BCR de data bewaren onder pseudoniemen. Er bestaan procedures om die op een gecontroleerde wijze om te zetten in rijksregisternummers. De partij die data beheert komt daarbij nooit rijksregisternummers te weten en de partij die pseudoniemen kan koppelen aan rijksregisternummers heeft op geen enkel moment toegang tot de eigenlijke persoonsgegevens. Om redenen van eenvoud gaan we er de rest van dit artikel vanuit dat de data holders de data kennen onder rijksregisternummers. Ons concept kan ook op een veilige manier overweg weg met de meer realistische situaties waarbij dit niet het geval is.</p>



<h1 class="wp-block-heading">In de praktijk</h1>



<p><a href="https://www.smalsresearch.be/wp-content/uploads/2025/12/Wilhelm_Wandschneider_-_Lethe_Modell.jpg"><img loading="lazy" decoding="async" width="150" height="106" class="alignright size-medium wp-image-23397" src="https://www.smalsresearch.be/wp-content/uploads/2025/12/Wilhelm_Wandschneider_-_Lethe_Modell.jpg" alt=""></a>Smals Research werkte samen met academische partners het concept uit. Initieel luisterde het naar de naam <em>Oblivious Join</em>, maar in academische context werd het herdoopt naar <em>LetheLink</em>. <a href="https://nl.wikipedia.org/wiki/Lethe_(mythologie)">Lethe</a> (Λήθη) is in de Griekse mythologie de godin van de vergetelheid en een van de vijf rivieren in de onderwereld, waaruit de doden drinken om hun aardse leven te vergeten. Ondanks die vergetelheid &#8211; of beter, gebrek aan kennis &#8211; slagen de interagerende partijen er toch in de noodzakelijke data aan elkaar te linken. Centraal in de ontwikkeling van dit concept stonden gebruiksvriendelijkheid en efficiëntie.</p>



<p>Smals Research heeft een demonstreerbaar prototype uitgewerkt dat alvast een zicht geeft op hoe een enterprise-ready oplossing zou kunnen werken. Het gebruik van het prototype wordt geïllustreerd in figuur 2 en bestaat uit de volgende stappen:</p>



<ol class="wp-block-list">
<li><strong>Creatie JSON-bestand.</strong> Een organisatie die als aanspreekpunt kan dienen (vb, de <a href="https://www.hda.belgium.be/nl">HDA</a> of de <a href="https://www.ksz-bcss.fgov.be/nl">KSZ</a>) krijgt een vraag binnen van een onderzoeker. Wanneer de juridische basis voor deze gegevensverwerking er is, stelt deze organisatie een digitaal ondertekend JSON-bestand op. Dat bestand bevat in een gestructureerde vorm alle informatie om het protocol voor het beveiligd kruisen van de gegevens van de data holders op een correcte manier uit te kunnen voeren: connectiegegevens van de clients van zowel data holders als de data collector, de cryptografische parameters, publieke sleutels, informatie over welke data holder welke data moet aanleveren, etc. In de praktijk zal men vertrekken van templates, van waaruit met een minimale inspanning JSON-bestanden afgeleid kunnen worden.</li>



<li><strong>Distributie JSON-bestand.</strong> Dit JSON-bestand wordt bezorgd aan zowel de data collector als de data holders. Allen verifiëren de digitale handtekening. Alle betrokken partijen weten nu hoe ze het protocol moeten uitvoeren en hoe ze de andere betrokken partijen veilig kunnen contacteren.</li>



<li><strong>Downloaden client.</strong> Indien dit nog niet gebeurd is, downloaden de data collector en data holders de LetheLink client.</li>



<li><strong>Creatie CSV-bestanden.</strong> Op basis van het JSON-bestand genereert elke data holder een CSV-bestand die alle potentieel relevante geïdentificeerde data bevat. In de eerder geschetste use case zou dit voor het SKR alle gevraagde geïdentificeerde informatie bevatten over alle burgers die de kankerdiagnose kregen. De creatie van dit bestand valt buiten de scope van LetheLink. In ons prototype worden enkel CSV-bestanden ondersteund, maar dit kan uitgebreid worden.</li>



<li><strong>Invoer client.</strong> Elke participant geeft het JSON-bestand als invoer aan zijn lokale LetheLink client. De data holders geven daarnaast ook hun lokaal gegenereerde CSV-bestand aan hun client. Data worden in klaar aangeleverd en de client neemt de versleuteling op zich.</li>



<li><strong>Uitvoering protocol.</strong> Het protocol wordt uitgevoerd. Dit resulteert aan de kant van de data collector (SPE) in een CSV bestand dat enkel de gepseudonimiseerde, minimaal noodzakelijke gegevens bevat. &nbsp;</li>
</ol>



<figure class="wp-block-image aligncenter"><a href="https://staging.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1.png"><img loading="lazy" decoding="async" width="1024" height="572" src="https://staging.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-1024x572.png" alt="" class="wp-image-24742" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-1024x572.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-300x168.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-768x429.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-1536x858.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-2048x1144.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 2. Overzicht van het gebruik van LetheLink in de praktijk</figcaption></figure>



<p>Het voordeel van deze benadering is de flexibele inzetbaarheid. Er zijn data holders die maar heel af en toe in dergelijke kruisingsprojecten betrokken zijn en niet alle data holders beschikken over evenveel middelen. Dankzij de LetheLink benadering zijn geen grote investeringen of voorbereidingen nodig. De installatie van de client en creatie van de CSV file volstaan.</p>



<p>Figuur 3 geeft een fictief voorbeeld van dergelijke CSV bestanden. Bovenaan staan extracten van CSV bestanden&nbsp; die de – in dit geval drie – data holders elk als invoer aan hun LetheLink client geven. Onderaan de figuur is een extract te zien van het CSV bestand dat de client van de data collector als output genereert als resultaat van de protocoluitvoering. In ons fictieve voorbeeld is de onderzoeker enkel geïnteresseerd in data in de doorsnede; dus in data over de 50 000 MS-patiënten die de kankerdiagnose kregen en een hoog risicoprofiel hebben. De persoon met rijksregisternummer 60.01.05-045.05 behoort tot die groep. De data collector ziet de gecombineerde informatie over deze burger, niet onder dit rijksregisternummer, maar onder het pseudoniem “153807…”.</p>



<figure class="wp-block-image aligncenter"><a href="https://staging.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1.png"><img loading="lazy" decoding="async" width="1024" height="574" src="https://staging.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-1024x574.png" alt="" class="wp-image-24717" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-1024x574.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-300x168.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-768x430.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-1536x860.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-2048x1147.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 3. Fictief voorbeeld met exctracten van drie input CSV bestanden (boven) en het resulterende output bestand (onder)</figcaption></figure>



<h1 class="wp-block-heading">Performantie</h1>



<p>In het kader van de academische samenwerking werd de performantie in meerdere iteraties grondig verbeterd, zowel op het niveau van het algoritme, als op het niveau van de implementatie. De voornaamste testresultaten zijn weergegeven in tabel 1. Een beetje duiding:</p>



<ul class="wp-block-list">
<li>De testen werden uitgevoerd op op AWS EC2 r7i.8xlarge VMs, met 32 vCPU&#8217;s (Intel Xeon Platinum 8588C @ 3.2 GHz) en 256 GB RAM.</li>



<li>Er wordt een onderscheid gemaakt tussen een uitvoering op een LAN aan een snelheid van 1 Gbps en op een WAN aan een snelheid van 150 Mbps.</li>



<li>De variable <em>m</em> representeert het aantal records dat door elk van de databronnen meegegeven wordt. Het is in onze testen minimaal 2<sup>16</sup> = 65 536 en maximaal 2<sup>24</sup> = 16 777 216. In werkelijkheid is het aantal records uiteraard verschillend per databron, maar deze resultaten geven alvast een bovengrens.</li>



<li>De variable κ (kappa) representeert het computationele veiligheidsniveau. 128 bit security volstaat vandaag, al wordt voor data die lange tijd gevoelig blijft toch 192 of zelfs 256 bit security aanbevolen. De variable λ (lambda) representeert de corresponderende statistische veiligheidsparameter.&nbsp;</li>



<li>De variabele <em>n</em> representeert het aantal data holders. We deden testen met 3, 5 en 7 data holders, maar er zijn geen technische beperkingen voor een veel groter aantal.</li>
</ul>



<figure class="wp-block-image aligncenter"><a href="https://www.smalsresearch.be/wp-content/uploads/2025/12/results.png"><img loading="lazy" decoding="async" width="1024" height="255" src="https://www.smalsresearch.be/wp-content/uploads/2025/12/results-1024x255.png" alt="" class="wp-image-24718" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/results-1024x255.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-300x75.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-768x191.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-1536x382.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results.png 1713w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption"><em>Performantieresultaten (in seconden) van het LetheLink prototype</em></figcaption></figure>



<p>Nu we weten hoe deze tabel te interpreteren, zien we dat er bijvoorbeeld 25 seconden nodig zijn om het protocol uit te voeren waarbij drie databronnen elk 1 miljoen (2<sup>20</sup>) records aanleveren over een WAN, met een veiligheidsniveau van 256 bits. De hoeveelheid meegeleverde data heeft eveneens impact op de uitvoeringstijd, maar daarvoor verwijzen we naar tabel 3 in onze gemeenschappelijke <a href="https://arxiv.org/abs/2512.08558">publicatie</a>. <strong>Samengevat zijn zowel het protocol als de implementatie ervan bijzonder efficiënt. </strong>Figuur 4 geeft, ter afronding, een sfeerbeeld van het uitvoeren van de testen.</p>



<figure class="wp-block-image aligncenter"><a href="https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-scaled.jpg"><img loading="lazy" decoding="async" width="1024" height="611" src="https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-1024x611.jpg" alt="" class="wp-image-24721" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-1024x611.jpg 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-768x459.jpg 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-2048x1223.jpg 2048w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-300x179.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-1536x917.jpg 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 4. Sfeerbeeld bij het uitvoeren van de testen</figcaption></figure>



<h1 class="wp-block-heading">Verhouding tot eHealths Blinde Pseudonimiseringsdienst</h1>



<p>Smals Research ontwikkelde in de periode 2021-2022 de <a href="https://www.smalsresearch.be/basisprincipes-voor-een-moderne-pseudonimiseringsdienst/">blinde pseudonimiseringsdienst voor eHealth</a>. Daarmee kunnen rijksregisternummers omgezet worden in pseudoniemen – unieke codes – en vice versa. Die omzetting gebeurt door een pseudonimiseringsdienst die echter blind is: het ziet rijksregisternummers noch pseudoniemen. Deze dienst kan <a href="https://www.smalsresearch.be/kruisen-van-persoonsgegevens-met-ehealths-blinde-pseudonimiseringsdienst-2/">eveneens</a> gebruikt worden om gegevens te pseudonimiseren én te kruisen. Wat zijn dan de verschillen?</p>



<ul class="wp-block-list">
<li><strong>Status.</strong> De blinde pseudonimiseringsdienst staat reeds in productie, terwijl LetheLink slechts een prototype is.</li>



<li><strong>Datalekkage.</strong> Voor complexere kruisingsprojecten, zoals diegene waar in dit artikel van vertrokken wordt, zal de blinde pseudonimiseringsdienst niet altijd kunnen verhinderen dat er datalekken optreden. Met name zal er sprake zijn van gegevenslekkage wanneer een databron niet autonoom kan bepalen welke records relevant zijn om de onderzoeksvraag te kunnen beantwoorden. Afhankelijk van de use case kan dit gaan om een aanvaardbaar residuele datalekkage, of het kan gaan over meer substantiële datalekken, die effectief de privacy van betrokkenen aantasten. Anderzijds ontstaan er bij LetheLink risico&#8217;s wanneer één entiteit zowel data holder als data collector is.</li>



<li><strong>Snelheid.</strong> eHealths blinde pseudonimiseringsdienst is weliswaar erg snel – het kan duizenden conversies per seconde aan -, maar LetheLink is bliksemsnel – het doet tienduizenden conversies per seconde en onder bepaalde omstandigheden kan het over de honderduizend gaan. Veel zal natuurlijk afhangen van de gebruikte infrastructuur.</li>



<li><strong>Infrastructuur.</strong> eHealths blinde pseudonimiseringsdienst is sowieso een centrale entiteit die over voldoende capaciteit moet beschikken. LetheLink daarentegen is gedistribueerd, waardoor een dergelijke centrale partij niet langer vereist is: het volstaat dat elke partij de LetheLink client draait op zijn bestaande machines. Dat kunnen zelfs reguliere laptops zijn.</li>



<li><strong>Integratie.</strong> Om gebruik te maken van de blinde pseudonimiseringsdienst moet een organisatie logica integreren in zijn clienttoepassing. Uit ervaring weten we dat dit gelukkig relatief eenvoudig is, maar het blijft niettemin een investering. LetheLink is een standalone client en dus is er geen integratietraject nodig.</li>



<li><strong>Type aanvragen.</strong> eHealths blinde pseudonimiseringsdienst kan overweg met zowel batch aanvragen als met aanvragen die in real-time afgehandeld moeten worden. LetheLink kan enkel overweg met verwerkingen in batch.</li>
</ul>



<p>Deze positionering van LetheLink en eHealths blinde pseudonimiseringsdienst ten opzichte van elkaar zou organisaties moeten helpen om te bepalen welke technologie het meest geschikt is voor hun use cases.</p>



<h1 class="wp-block-heading">Uitbreidingen</h1>



<p>Er zullen een aantal uitbreidingen van LetheLink nodig zijn om het ook daadwerkelijk in de praktijk te kunnen inzetten. Alle voorgestelde uitbreidingen zijn conceptueel alvast mogelijk, maar niet steeds in het prototype geïntegreerd. <strong>Dit zal enkel gebeuren indien er een concrete vraag komt.</strong></p>



<ul class="wp-block-list">
<li><strong>Minimale grootte resultaatset.</strong> Indien de gepseudonimiseerde resultaatset voor de data collector onvoldoende records bevat is er een risico voor de privacy van de betrokkenen en is het onmogelijk om statistisch relevant onderzoek te doen. Daarom ondersteunt het prototype vandaag reeds de mogelijkheid om een minimale grootte mee te geven in het JSON bestand.</li>



<li><strong>Gecontroleerde re-identificatie.</strong> Indien onderzoekers merken dat een bepaalde burger een hoog risico heeft om een bepaalde ziekte te ontwikkelen, moet het mogelijk zijn deze burger daarvan op de hoogte te stellen. Ook wanneer bij een fraudeonderzoek er een sterk vermoeden van fraude is door bepaalde burgers, moet het mogelijk zijn de bevoegde instantie op de hoogte te brengen. <span data-olk-copy-source="MessageBody">Er moet dus&nbsp;</span>in een mogelijkheid voorzien worden om in uitzonderlijke situaties op gecontroleerde wijze de identiteit van een burger te achterhalen.</li>



<li><strong>Data holder pseudoniemen.</strong> Zoals eerder in dit artikel aangegeven, hebben data holders vaak zelf geen toegang tot het rijksregisternummer van de burgers waarover ze data beheren. Ook in dergelijk gevallen moet het protocol efficiënt uit te voeren zijn.</li>



<li><strong>Selectieve prijsgave.</strong> Momenteel focust het prototype op doorsnedes; enkel indien <em>alle</em> data holders records over eenzelfde burger aanleveren, wordt het samengestelde record zichtbaar voor de data collector. In de praktijk is er meer flexibiliteit nodig, zoals aangegeven in figuur 5. In de use case waarmee we dit artikel begonnen had de onderzoeker gepseudonimiseerde gegevens nodig over alle MS-patiënten, terwijl ons protoype op dit moment enkel gepseudonimiseerde gegevens aanlevert over alle MS-patiënten die <em>ook</em> de kankerdiagnose kregen.&nbsp;</li>



<li><strong>Multi-batch transfer.</strong> In sommige gevallen moeten data holders meermaals data aanleveren aan de data collector, bijvoorbeeld in het kader van longitudinaal onderzoek. De data collector moet in staat zijn doorheen de tijd data over eenzelfde burger aan elkaar te koppelen.</li>



<li><strong>Vereenvoudigde communicatie.</strong> In het prototype communiceren alle betrokken data holders met elkaar, om vervolgens individueel vercijferde data naar de data collector te sturen. In een aangepast protocol zouden data holders enkel data uitwisselen met en via de data collector, bijvoorbeeld via een REST-interface. In de praktijk is dit de meer wenselijke benadering.</li>
</ul>



<p>Laat ons weten indien u andere nuttige uitbreidingen ziet.</p>



<figure class="wp-block-image aligncenter"><a href="https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure.png"><img loading="lazy" decoding="async" width="1024" height="570" src="https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-1024x570.png" alt="" class="wp-image-24754" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-1024x570.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-300x167.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-768x428.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-1536x855.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure.png 1882w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 5. Een mogelijke uibreiding, waarbij de resultaatset meer kan zijn dan enkel de records over burgers waar elke betrokken data holder informatie over aanlevert</figcaption></figure>



<h1 class="wp-block-heading">Referenties</h1>



<p>Het initiële concept alsook het prototype en de performantietesten werden uitgevoerd door Smals Research. De academische partners, met name de <a href="https://www.esat.kuleuven.be/cosic/">COSIC</a> groep en de <a href="https://distrinet.cs.kuleuven.be/">DistriNet</a> groep aan de KU Leuven, alsook de <a href="https://crysp.uwaterloo.ca/">CrySP</a> groep aan Waterloo University in Canada, focusten zich op de theoretische uitwerking. Dit resulteerde in 2025 in twee publicaties:</p>



<ul class="wp-block-list">
<li><a href="https://eur06.safelinks.protection.outlook.com/?url=https%3A%2F%2Flink.springer.com%2Fchapter%2F10.1007%2F978-3-031-84748-6_6&amp;data=05%7C02%7Ckristof.verslype%40smals.be%7C68b705fdb22f4881110008de3bb9eb83%7C578bcd46a26646edac84b52b4ebacd22%7C0%7C0%7C639013866892057810%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;sdata=Yo%2F02a8KKrOvYRkjqLNpVqlXRrS%2BP8W95v6yVUBBrsQ%3D&amp;reserved=0">Springer publicatie &#8211; Privacy-By-Design in the Belgian Public Sector</a>. Dit toegankelijke document bespreekt twee innovatieve oplossingen bedacht door Smals Research voor het pseudonimiseren en kruisen van persoonsgegevens; Lethelink en<a href="https://www.smalsresearch.be/kruisen-van-persoonsgegevens-met-ehealths-blinde-pseudonimiseringsdienst-2/"> eHealths blinde pseudonimiseringsdienst</a>.</li>



<li><a href="https://eur06.safelinks.protection.outlook.com/?url=https%3A%2F%2Farxiv.org%2Fabs%2F2512.08558&amp;data=05%7C02%7Ckristof.verslype%40smals.be%7C68b705fdb22f4881110008de3bb9eb83%7C578bcd46a26646edac84b52b4ebacd22%7C0%7C0%7C639013866892083584%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;sdata=Bom%2Fw3Um684o6Y4kJ9Gf8AT3UgIPUwjOVxBZUBQ3oC8%3D&amp;reserved=0">Arxiv publicatie &#8211; Labeled Delegated PSI and its Applications in the Public Sector</a>.&nbsp; Dit academisch artikel beschijft formeel LetheLink, bewijst de correctheid, bespreekt de performantie en positioneert het werkt t.o.v. bestaand academisch werk.</li>
</ul>



<p>Daarnaast verwijs ik graag naar mijn <a href="https://www.youtube.com/watch?v=-mx9vmdezL4">Devoxx talk</a> en <a href="https://www.smalsresearch.be/wp-content/uploads/2024/06/20240606_webinar_pseudonimisatie_PRINT.pdf">Webinar</a> uit 2024 getiteld “<em>Privacy in Practice with Smart Pseudonymisation</em>”. LetheLink/Oblivious Join is één van de drie pseudonimiseringstechnieken die ik er bespreek.</p>



<p>Ten slotte zijn er nog <a href="/wp-content/uploads/2025/12/OJ-simple.pptx">slides</a> beschikbaar voor diegenen die graag snel een intuïtief beeld ontwikkelen over de basisprincipes van Oblivious Join. De bijhorende nota’s geven extra uitleg.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>Secundair gebruik van persoonsgegevens kan ons heel wat inzichten verschaffen die beleidsvorming ondersteunen en wetenschappelijk onderzoek stimuleren. Om die inzichten te ontsluiten moeten gegevens afkomstig van verschillende bronnen op een efficiënte wijze verzameld kunnen worden, met respect voor de privacy. Dat wil zeggen dat enkel de noodzakelijke persoonsgegevens gepseudonimiseerd en gekruist worden en dat participerende partijen in dit proces geen persoonsgegevens te weten komen. Dit was in de praktijk verre van evident.</p>



<p>In samenwerking met internationaal toonaangevende universiteiten werkte Smals Research daarom een concept uit dat met behulp van geavanceerde cryptografie dit op een efficiënte wijze mogelijk maakt. Verder werd een demonstreerbaar prototype gebouwd, wat een eerste stap is om dit effectief in de praktijk te kunnen gaan inzetten.</p>



<p>We hebben de voorbije jaren met heel wat partijen samen gezeten. Iedereen vindt het een zeer nuttige tool, maar vooralsnog missen we de commitment van onze partners om dit in de praktijk om te zetten.</p>



<p><strong>De voornaamste uitdaging vandaag is dan ook het productieklaar krijgen van deze oplossing. Neem dus zeker contact met ons op indien u interesse heeft in deze oplossing en eventueel mee uw schouders hieronder wil zetten.</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Rules as Code: lessen uit een experiment</title>
		<link>https://www.smalsresearch.be/rules-as-code-deel2-nl/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Fri, 30 Jan 2026 18:57:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[AI4GOV]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[governance]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[rules]]></category>
		<category><![CDATA[Society]]></category>
		<guid isPermaLink="false">/?p=25971</guid>

					<description><![CDATA[Wat gebeurt er als een leek zich waagt aan een Rules as Code project met een AI-powered IDE?]]></description>
										<content:encoded><![CDATA[
<p><em>Cet article est aussi disponible&nbsp;<a href="/rules-as-code-partie2-fr/" data-type="post" data-id="24294">en français</a>.</em></p>



<p><a href="/rules-as-code-nl/">In een vorig artikel</a> fileerden we <a href="https://interoperable-europe.ec.europa.eu/collection/eugovtech/news/rules-code-rac">Rules as Code</a>, een aanpak die erop gericht is om de kloof tussen regelgeving en software te verkleinen. We illustreerden daarbij dat er heel wat praktische obstakels te overkomen zijn, niettegenstaande het lovenswaardige doel. De uniforme encodering van regels met hun geschiedenis, verwevenheden en afhankelijkheden is een uitdaging die een aanzienlijke investering van mensen en middelen kan vergen. Permanent actief beheer is daarenboven nodig om elke wijziging aan de regels op te vangen. Zelfs op kleine schaal is een nauwe samenwerking tussen juristen en ontwikkelaars onontbeerlijk, want regelmatig zullen gemotiveerde beslissingen genomen moeten worden over interpretatie. Omdat industriestandaarden nog ontbreken en best practices nog volop in ontwikkeling zijn, riskeer je als <em>early adopter</em> de zogenaamde <a href="https://terryu.substack.com/p/bridging-the-gap-between-early-and">pioneer tax</a> te moeten betalen. De complexe lasagna van overheidsbevoegdheden maakt een eventuele toepassing in België niet eenvoudiger.</p>



<p>Mede onder impuls van het uitgebreide <a href="https://www.oecd.org/en/publications/cracking-the-code_3afe6ba5-en.html">rapport van de OESO uit 2020</a>, hebben enkele overheden toch al volop ingezet op het uitwerken van, soms vrij grootschalige, proof-of-concepts. Er bestaan vandaag dan ook enkele frameworks die relatief matuur zijn. Ongetwijfeld is Frankrijk het voortrekkersland; het initiatief dat we hieronder zullen toelichten komt van Franse bodem. Ook <a href="https://regels.overheid.nl/">in Nederland</a> beweegt er wel wat: de Nederlandse fiscus gebruikt al enige tijd haar eigen domeintaal <a href="https://regels.overheid.nl/docs/methods/REGELSPRAAK">RegelSpraak</a> die zij met de <em>rule engine</em> <a href="https://regels.overheid.nl/docs/methods/ALEF">ALEF</a> interpreteert en verwerkt, echter lijkt de daarover <a href="https://gitlab.com/normativesystems">gepubliceerde broncode</a> vooralsnog meer op methodologie dan op applicaties te focussen.</p>



<h1 class="wp-block-heading">OpenFisca</h1>



<p>OpenFisca is <a href="https://openfisca.org/en/about/">ontstaan in 2011</a> als open-source <a href="https://en.wikipedia.org/wiki/Microsimulation">microsimulatie</a>-motor om belasting- en uitkeringsregels (“tax &amp; benefit system”) om te zetten naar uitvoerbare code. De effecten van die regelgeving, en eventuele wijzigingen, kunnen dan gesimuleerd worden voor zowel individuele cases als hele populaties. Websites met OpenFisca in de achtergrond zijn onder andere <a href="https://leximpact.an.fr/">LexImpact</a> (simulatie van wijzigingen in socio-fiscale wetgeving), <a href="https://www.mesdroitssociaux.gouv.fr/">Mes droits sociaux</a> (simulatie van sociale rechten), en <a href="https://mes-aides.1jeune1solution.beta.gouv.fr/">1jeune1solution</a> (allerhande steunmaatregelen). Buitenlandse voorbeelden zijn <a href="https://benefitme.nz/">BenefitMe</a> (Nieuw-Zeeland), <a href="https://lesmevesajudes.barcelona.cat/">Les meves ajudes</a> (Barcelona), of <a href="https://www.policyengine.org/">PolicyEngine</a> (UK/USA) &#8211; deze laatsten wel met <a href="https://github.com/PolicyEngine">grondige aanpassingen</a> aan de engine.</p>



<p>Om ons eigen belasting- en/of sociale-zekerheidsstelsel te modelleren, moeten we een fork maken van het generieke <a href="https://github.com/openfisca/country-template">OpenFisca country-template</a>. Verschillende andere landen hebben er tenminste al mee geëxperimenteerd, zo vinden we in de <a href="https://github.com/orgs/openfisca/repositories">lijst van repositories</a> o.a. Senegal, Paraguay en Tunesië. Regionale of lokale wetgeving kan middels <a href="https://openfisca.org/doc/contribute/extensions.html">plugin-extensies</a> toegevoegd worden aan een nationaal systeem, zoals <a href="https://github.com/openfisca/openfisca-paris">deze voor Parijs</a>. Eens de repository geïnitialiseerd, kunnen we beginnen werken aan wat misschien ooit <em>openfisca-belgium</em> kan worden. De modellering in OpenFisca gebeurt door het schrijven van Python-klassen en -methodes, die de entiteiten, variabelen en berekeningsformules uit de regelgeving vertegenwoordigen.</p>



<p>Helaas houdt het gemakkelijke deel daar ongeveer op. De <em>country-template</em> repository is minimalistisch en hoewel er wel <a href="https://openfisca.org/doc/index.html">documentatie</a>, met een kleine tutorial, beschikbaar is om een eigen versie uit te bouwen, focust deze vooral op de eerste stappen. Richtlijnen over hoe we onze eigen fork best zouden structureren zodra het aantal variabelen en parameters groeit, ontbreken grotendeels. De repository van moederproject <a href="https://github.com/openfisca/openfisca-france/tree/master">openfisca-france</a> kan weliswaar als voorbeeld dienen, maar is dan weer erg groot, en het waarom van hun structurele of architecturale keuzes is er niet echt uit af te leiden.</p>



<p>Ook het aspect van een GUI of webinterface blijft onderbelicht. Nochtans is de interface van bijvoorbeeld de <a href="https://socio-fiscal.leximpact.an.fr/?parameters=irpp_economique&amp;waterfall=brut_to_disponible">LexImpact simulator van de Franse inkomstenbelasting</a>, net een sterk punt. Als leidraad voor bouwen van een webinterface verwijst men naar <a href="https://github.com/redte-ch/ReDistributeMe/tree/main">tutorials en slides van een workshop</a>, waar men de eerste stappen toont in <a href="https://svelte.dev/">Svelte</a>, <a href="https://react.dev/">React</a> en <a href="https://vuejs.org/">VueJS</a>. Het is echter een extra barrière voor adoptie, dat een GUI of webapp nog <em>from scratch</em> zelf te bouwen is bovenop een eigen OpenFisca-instantie. Het bouwen van een GUI is immers tijdrovend. Het zou nuttig zijn om OpenFisca-GUI-libraries te hebben met herbruikbare componenten voor de belangrijkste web frameworks, zodat een OpenFisca server misschien met een generieke <em>default</em> webinterface gebundeld kan worden. Een <a href="https://www.drupal.org/project/webform_openfisca">Drupal-plugin</a> lijkt momenteel het enige project dat enigszins in die richting gaat.</p>



<h1 class="wp-block-heading">AI to the rescue?</h1>



<p>Gezien OpenFisca, Svelte, React en Vue allen nieuw zijn voor de auteur, en AI-tooling belooft om developers sneller te laten onboarden, grijpen we de kans om de AI-powered IDE <a href="https://cursor.com/download">Cursor</a> tegelijk uit te testen. Deze kloon van <a href="https://code.visualstudio.com/">Visual Studio Code</a> is verrijkt met de mogelijkheid tot het aanroepen van (in ons geval public-cloud-gebaseerde) LLMs. Daarbij kunnen selecties uit bestanden in het project worden gemarkeerd als context bij de vraag. Cursor kan <a href="https://cursor.com/docs">suggesties geven</a> voor toevoegingen of wijzigingen aan bestanden die, eens goedgekeurd, direct geïntegreerd kunnen worden in de codebase.</p>



<p>Interageren met AI-modellen <a href="https://news.stanford.edu/stories/2025/10/ai-chatbot-privacy-concerns-risks-research">houdt privacy-risico&#8217;s in</a>. Dit experiment vooral mogelijk omdat we werken met open-source code, gepubliceerde regelgeving, en de eveneens openbare documentatie daarvan, wat niet gevoelig is. Maar gezien alles wat zich in de IDE bevindt naar het taalmodel gestuurd kan worden, moeten we er nog steeds op letten dat we geen bestanden openen in de IDE die credentials, API keys of persoonlijke informatie bevatten. Dat blijft de verantwoordelijkheid van de individuele developer. Sowieso is het goede praktijk om voorbereid te zijn op het roteren van API keys of credentials, want in het heetst van een debugging-strijd is <em>oversharing</em> met een LLM snel gebeurd.</p>



<p>Tot slot moeten we vermelden dat dit experiment nog werd uitgevoerd met Cursor versies 1.6 en 1.7 in september-oktober 2025, met OpenAI&#8217;s GPT-4.5 en later GPT-5.0 als achterliggend taalmodel, gebruikt met een eigen API key (niet via Cursor). Latere versies hebben heel wat nieuwere features (waaronder meer <em>agentic</em> workflows) en het zou kunnen dat de ervaring vandaag (januari 2026) al heel anders zou zijn. De belangrijkste lessen blijven echter algemeen gelden voor alle AI-powered development, of dat nu via IDE, command line of beide gebeurt (vb. Anthropic <a href="https://code.claude.com/docs/en/overview">Claude Code</a>).</p>



<p>Als eerste stap voegen we de nodige documentatie toe aan ons project. Als case nemen we de <a href="https://www.ejustice.just.fgov.be/eli/wet/2002/05/26/2002022559/justel">Wet op de Maatschappelijke Integratie van 26 mei 2002</a>. Samen met alle andere relevante wetten, koninklijke besluiten en omzendbrieven is die overzichtelijk geïnventariseerd op de website van de <a href="https://www.mi-is.be/nl/wetgeving">POD Maatschappelijke Integratie</a>. Om de tekst gemakkelijk doorzoekbaar en interpreteerbaar te maken voor een LLM in een IDE, slaan we hem op als plat tekstbestand zonder opmaak, en dat voegen we toe aan een nieuw mapje voor relevant bronmateriaal in de source tree van het project. Of dat optimaal is, daar hebben we het raden naar, maar we moeten ergens beginnen.</p>



<h2 class="wp-block-heading">Entiteiten</h2>



<p>Entiteiten in OpenFisca drukken uit voor wie we de berekening maken. Dat kunnen individuen, gezinnen of andere groeperingen van mensen zijn (bedrijven, organisaties, &#8230;). Het zijn de basisbouwstenen waarvoor we later variabelen zullen kunnen specifiëren die samen een &#8220;situatie&#8221; vormen waarvoor we een berekening zullen kunnen doen. <em>Person </em>en <em>Household </em>zijn al aanwezig <a href="https://github.com/openfisca/country-template/blob/main/openfisca_country_template/entities.py">in de code</a>. Een logische vraag is dus of we, op basis van de gegeven wettekst, andere entiteiten kunnen definiëren die nuttig zouden zijn.</p>



<p>Na het stellen van de vraag aan GPT-5 in Cursor, met de wettekst geselecteerd als context, wordt voorgesteld de volgende entiteiten toe te voegen: </p>



<ul class="wp-block-list">
<li>Eligible Person for Societal Integration</li>



<li>Living Wage Recipient</li>



<li>Employment Project Participant</li>
</ul>



<p>De voorgestelde aanpassingen aan de code zijn syntactisch correct. Geen van deze 3 zijn echter nuttig of noodzakelijk: het gaat in alledrie de gevallen om varianten van <em>Person</em>. De eigenschappen die maken dat ze bijvoorbeeld een leefloon zouden ontvangen, zijn veeleer variabelen toegevoegd aan de reeds bestaande <em>Person </em>entiteit. De waarde van die variabelen hangt bovendien af van andere variabelen die eveneens aan datzelfde individu gebonden zijn, zoals een inkomen uit werk of een handicapstatus. Entiteiten, die vooral dienen voor op zichzelf staande concepten, zijn hiervoor niet de juiste keuze.</p>



<p>Daarnaast lijkt GPT-5 het concept van een &#8220;rol&#8221; binnen een OpenFisca groepsentiteit verkeerd te hebben begrepen. Hij probeert &#8220;Eligible Person for Societal Integration&#8221; op te bouwen met verschillende &#8220;rollen&#8221; als onderdelen: &#8220;Belgian National&#8221;, &#8220;EU Citizen&#8221;, &#8220;Foreigner&#8221;, &#8220;Stateless&#8221;, &#8220;Refugee&#8221;&#8230; Dit ongetwijfeld omdat deze mogelijkheden verschijnen in <a href="https://www.ejustice.just.fgov.be/eli/wet/2002/05/26/2002022559/justel#Art.3">Art.3, 3° lid, van de wet</a>. In OpenFisca is een groepsentiteit echter samengesteld uit Personen die elk een rol krijgen. Een <em>Household </em>bevat zo <em>Adult </em>en <em>Child </em>rollen. Het is vrij nonsensicaal dat een EligiblePerson meerdere Foreigners zou kunnen bevatten. Nationaliteit of herkomst, of andere voorwaarden die gesteld worden in deze wet, zijn ook hier variabelen die gebonden zijn aan de persoon, geen entiteit op zich.</p>



<p>Op een ander moment werd nog een aparte entiteit gecreëerd voor het OCMW. Hoewel het logisch lijkt om de OCMWs te modelleren en als een entiteit te beschouwen &#8211; ze worden immers vermeld in de wet &#8211; is het dat hier (nog) niet. Er zijn immers geen verschillende types OCMWs met verschillende eigenschappen of rollen, waarvoor we telkens andere berekeningen moeten maken. In de context van deze wet, waarbij het de burger is voor wie we het recht op maatschappelijke steun berekenen, is het OCMW vooral een constant, invariant gegeven. In OpenFisca kunnen we dat dus vooralsnog overslaan. (Een entiteitstype &#8220;instituut&#8221; is ook niet voorzien.)</p>



<p>We merken hier dus dat Cursor niet &#8220;nee&#8221; kan antwoorden op de vraag of er nuttige andere entiteiten kunnen toegevoegd worden. Het kan de denkrichting achter die vraag niet bekritiseren of corrigeren uit eigen beweging. Doorheen het hele experiment bleken Cursor en GPT-5 ook een neiging te vertonen tot onnodige complexiteit. Dit is voor developers die met onbekende code of frameworks werken een groot risico:  indien men te snel te ver meegaat met zulke suggesties, dreigt men later de pedalen te verliezen en achteraf erg moeilijke correcties te moeten aanbrengen aan de fundamenten van het project. Eens een verkeerde route is ingeslagen, blijkt het ook moeilijk om op de stappen terug te keren en deze weer te doen vergeten. Zeker als men ze eerst onwetend heeft toegelaten, komen ze terecht in de context en wordt er in vervolgvragen op verdergebouwd. Deze sluipende &#8220;<a href="https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html">context rot</a>&#8221; is ondertussen een bekend probleem en een belangrijke oorzaak van tijdverlies met AI-enabled coding.</p>



<h2 class="wp-block-heading">Variabelen</h2>



<p>De kern van het model zit in de variabelen die de rechten en voorwaarden uit de wet voorstellen. <a href="https://www.ejustice.just.fgov.be/eli/wet/2002/05/26/2002022559/justel#Art.2">Artikel 2</a> van de wet somt de verschillende vormen van maatschappelijke integratie op waarop iemand recht kan hebben (o.a. tewerkstelling, leefloon, geïndividualiseerd project). <a href="https://www.ejustice.just.fgov.be/eli/wet/2002/05/26/2002022559/justel#Art.2">Artikel 3</a> bevat de voorwaarden waaraan een persoon moet voldoen om van dat recht gebruik te maken. We hebben deze bepalingen stap voor stap in code omgezet.</p>



<p>Recht op maatschappelijke integratie betekent in de praktijk dat een OCMW een persoon moet ondersteunen via (1) een job of opleiding, (2) een leefloon, of (3) een geïndividualiseerd project voor maatschappelijke integratie. Dit kan vertaald worden naar drie boolean variabelen op de Persoon-entiteit, bijvoorbeeld <em>employment_right</em>, <em>living_wage_right </em>en <em>individualized_project_right</em>. Cursor geeft hier een goede code-suggestie, en voorziet een eenvoudige <em>placeholder</em>-formule: zolang iemand “in aanmerking komt voor integratie” (een andere variabele) zou het recht gelden. We bekomen een definitie van <em>employment_right</em> als volgt:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>class employment_right(Variable):
  value_type = bool
  entity = Person
  definition_period = MONTH
  def formula(person, period, parameters):
    return person("eligible_for_integration", period)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">employment_right</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Variable</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">  value_type = </span><span style="color: #4EC9B0">bool</span></span>
<span class="line"><span style="color: #D4D4D4">  entity = Person</span></span>
<span class="line"><span style="color: #D4D4D4">  definition_period = MONTH</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">formula</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">person</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">period</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">parameters</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> person(</span><span style="color: #CE9178">&quot;eligible_for_integration&quot;</span><span style="color: #D4D4D4">, period)</span></span></code></pre></div>



<p>De invulling van deze placeholder-formule komt aan bod in het daaropvolgende Artikel 3. Die modelleert de volgende voorwaarden om in aanmerking te komen:</p>



<ul class="wp-block-list">
<li><strong>Verblijf in België </strong>(volgens de regels nader te bepalen bij KB).</li>



<li><strong>Leeftijd:</strong> De persoon is <strong>meerderjarig</strong> (18+), of als minderjarige <strong>gelijkgesteld</strong> aan een meerderjarige volgens de uitzonderingen in deze wet.</li>



<li><strong>Nationaliteit of verblijfsstatuut:</strong> De persoon is Belg, EU-burger (na 3 maanden verblijf), ingeschreven vreemdeling, staatloze, vluchteling of subsidiair beschermde. </li>



<li><strong>Onvoldoende bestaansmiddelen</strong></li>



<li><strong>Werkbereidheid </strong>(tenzij onmogelijk om gezondheidsredenen of billijkheidsredenen).</li>



<li><strong>Rechten uit andere stelsels uitgeput</strong></li>
</ul>



<p>Al deze voorwaarden komen samen in één centrale boolean variabele <em>societal_integration_right</em>. Die variabele geeft aan of iemand, gegeven zijn persoonlijke situatie, recht <strong>kan</strong> hebben op maatschappelijke integratie. In feite is dit de vertaalslag van <em>“voldoet de persoon aan alle voorwaarden van art.3?”</em>. De formule combineert alle subvoorwaarden:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>class societal_integration_right(Variable):
  value_type = bool
  entity = Person
  definition_period = MONTH
  label = "Right to societal integration"
  def formula(person, period, parameters):
    residency = person("residency_status", period)
    is_major = person("is_major", period)
    nationality = person("nationality_status", period) in &#91;"belgian", "eu_citizen", "registered_foreigner", "stateless", "refugee"&#93;
    insufficient_income = not person("has_sufficient_income", period)
    willing_to_work = person("willing_to_work", period)
    claiming_benefits = person("claiming_benefits", period)
    return (residency and is_major and nationality and insufficient_income and willing_to_work and claiming_benefits)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">societal_integration_right</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Variable</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">  value_type = </span><span style="color: #4EC9B0">bool</span></span>
<span class="line"><span style="color: #D4D4D4">  entity = Person</span></span>
<span class="line"><span style="color: #D4D4D4">  definition_period = MONTH</span></span>
<span class="line"><span style="color: #D4D4D4">  label = </span><span style="color: #CE9178">&quot;Right to societal integration&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">formula</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">person</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">period</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">parameters</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    residency = person(</span><span style="color: #CE9178">&quot;residency_status&quot;</span><span style="color: #D4D4D4">, period)</span></span>
<span class="line"><span style="color: #D4D4D4">    is_major = person(</span><span style="color: #CE9178">&quot;is_major&quot;</span><span style="color: #D4D4D4">, period)</span></span>
<span class="line"><span style="color: #D4D4D4">    nationality = person(</span><span style="color: #CE9178">&quot;nationality_status&quot;</span><span style="color: #D4D4D4">, period) </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #CE9178">&quot;belgian&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;eu_citizen&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;registered_foreigner&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;stateless&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;refugee&quot;</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    insufficient_income = </span><span style="color: #569CD6">not</span><span style="color: #D4D4D4"> person(</span><span style="color: #CE9178">&quot;has_sufficient_income&quot;</span><span style="color: #D4D4D4">, period)</span></span>
<span class="line"><span style="color: #D4D4D4">    willing_to_work = person(</span><span style="color: #CE9178">&quot;willing_to_work&quot;</span><span style="color: #D4D4D4">, period)</span></span>
<span class="line"><span style="color: #D4D4D4">    claiming_benefits = person(</span><span style="color: #CE9178">&quot;claiming_benefits&quot;</span><span style="color: #D4D4D4">, period)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (residency </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> is_major </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> nationality </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> insufficient_income </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> willing_to_work </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> claiming_benefits)</span></span></code></pre></div>



<p>Let hier vooral op enkele vreemde lacunes in de suggestie van Cursor. Zo is de naam van de variabele <code>societal_integration_right</code> niet gelijk aan de eerder gedefinieerde placeholder <code>eligible_for_integration</code>, hoewel dat wel de bedoeling is. Daarnaast wordt in de nationaliteitsvoorwaarde de mogelijkheid van subsidiair beschermden simpelweg vergeten! Tot slot is de zesde voorwaarde, dat men eerst zijn rechten laat gelden op eventuele sociale uitkeringen, wel erg rudimentair benoemd als <code>claiming_benefits</code> &#8211; een variabelenaam die niet echt dekt wat bedoeld wordt.</p>



<p>We kunnen deze suggestie dus wel aanvaarden, maar we zijn al direct verplicht om 3 correcties door te voeren. De niet-overeenkomst van de variabelenaam kunnen we daarbij nog gemakkelijk detecteren&nbsp;omdat de tests niet zullen werken als er nog ongedeclareerde variabelen in de code zitten. Een mankerend element in de formule, zoals een vergeten voorwaarde, is echter veel gemakkelijker over het hoofd gezien, en leidt wanneer dat ongedetecteerd blijft gegarandeerd tot fouten in de uitvoering. Hier merken we dus echt wel de noodzaak om terug te koppelen naar de wettekst om te verifiëren dat de gegenereerde code wel degelijk overeenkomt met wat de wettekst zegt. Deze terugkoppeling moet aandachtig genoeg gebeuren om ook ongelukkige benamingen of subtiele misinterpretaties van te tekst te kunnen identificeren.</p>



<p>Eventuele correcties kunnen daarnaast ook best zo snel mogelijk gebeuren. Als foutieve code in de editor aanwezig blijft, gaat ze immers deel uitmaken van de context die het AI-model gebruikt en dient ze zelf als fundament voor daaropvolgende suggesties. Dit kan leiden tot een situatie waarbij men suggesties blijft ontvangen waarin steeds dezelfde fouten terugkomen, die men dus ook telkens weer moet corrigeren, wat niet bevorderlijk is voor de productiviteit.</p>



<p>De variabelen gebruikt in de <code>formula()</code> methode van <code>societal_integration_right</code> hierboven, moeten uiteraard op hun beurt ook gedefinieerd worden: voor elk van deze variabelen moeten we een klasse schrijven. Dit kan aanleiding geven tot complexe kettingen van afhankelijkheden. Zo zou <code>is_major</code> een eenvoudige booleaanse inputvariabele kunnen zijn, maar we kunnen dat ook berekenen op basis van de datum van vandaag en weer een nieuwe variabele <code>birthdate</code>. De berekening van de formule van de variabelen kan daarnaast ook gebruik maken van de parameters van een wet &#8211; zo is de meerderjarigheid in België pas vanaf 18 jaar <a href="https://www.ejustice.just.fgov.be/eli/wet/1990/01/19/1990009050/justel">sinds 1 mei 1990</a>. Dat zou ons dan weer bij het Burgerlijk Wetboek brengen, en haar geschiedenis &#8211; om het beknopt te houden gaan we daar nu niet verder op in.</p>



<p>Laatste opmerking: het model zoals hier gebouwd is uiteraard een vereenvoudigde weerspiegeling. Merk wel op dat we zelfs dan, slechts 3 artikels ver in een wet, al snel 10 Python-klassen hebben gedefinieerd hebben, met potentieel voor meer als we echt in de diepte zouden willen gaan. Cursor en GPT-5 schrijven daarbij relatief <em>verbose </em>code, met vele hulpvariabelen en -methodes, die soms echt wel eenvoudiger kan. Sommige details uit de wet, zoals de 3-maanden wachttijd voor EU-burgers, of de uitzonderingen die bestaan voor bepaalde categorieën van minderjarigen (<a href="https://www.ejustice.just.fgov.be/eli/wet/2002/05/26/2002022559/justel#Art.7">Art. 7</a>), zouden in een volwaardig model nog heel wat extra variabelen of condities vergen. </p>



<h1 class="wp-block-heading">AI en code: enkele valkuilen</h1>



<p>Wat betreft <em>best practices</em> voor de inzet van AI-hulp bij zulke projecten, identificeren we nog enkele valkuilen, naast diegene die we tot nu toe al genoemd hebben.</p>



<p>Teveel documentatie toevoegen in het begin leidt snel tot &#8220;<a href="https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html">context confusion</a>&#8220;, waarbij de suggesties of de antwoorden van de LLM gebaseerd gaan zijn op stukken informatie die (nog) niet relevant zijn. Het is beter de documentatie geleidelijk toe te voegen, in gelijke tred met de functionaliteit, in plaats van de volledige analyse en achtergrond op voorhand toe te voegen aan de IDE. In het geval van regelgeving: voeg de regels artikel per artikel toe aan de IDE, naarmate de projectontwikkeling vordert, en weersta de verleiding om de hele wettekst op voorhand als &#8220;encyclopedische referentie&#8221; te integreren in de IDE.</p>



<p>Context rot of context poisoning ontstaat dan weer wanneer de AI een verkeerde weg is ingeslagen,&nbsp; daarop voortboomt, en uiteindelijk relevantere informatie vergeet zodat het ook moeilijker wordt om ervan te herstellen. &#8220;<a href="https://www.anthropic.com/engineering/multi-agent-research-system">Context quarantining</a>&#8220;, het opdelen van het probleem in kleinere deelproblemen elk met hun eigen context, is daarvoor een logische remedie. Dit is ook de weg die de meeste &#8220;deep research&#8221; of &#8220;<a href="https://www.anthropic.com/engineering/multi-agent-research-system">multi-agentic</a>&#8221; systemen inslaan. In een IDE zou dat impliceren dat een AI-systeem de codebase en de documentatie vanaf een zekere grootte zou moeten segmenteren. Hoe dat technisch uitgewerkt kan worden achter de schermen lijkt een uitdaging van formaat, en verschillende IDEs zullen daar in de nabije toekomst waarschijnlijk hun eigen <em>approach </em>voor ontwikkelen.</p>



<p>Een andere frustratie was dat de AI soms code of bestanden verkeerd plaatste of aannam dat bepaalde dingen bestonden. Zo refereerden gegenereerde formules naar variabelen die nog helemaal niet gedefinieerd waren. Dit zorgt bij het testen natuurlijk voor foutmeldingen. We moesten de AI dan bijsturen of zelf extra variabelen invoegen om die referenties af te dekken. Ook kleine zaken, zoals de formattering van documentatie of het wel/niet aanmaken van noodzakelijk imports, vergden manuele correctie. Dit soort inconsistenties tonen aan dat je AI-suggesties niet blindelings kunt vertrouwen. Een developer moet voortdurend valideren of de code die gegenereerd wordt strookt met de bedoeling, en zo niet, onmiddellijk ingrijpen.</p>



<h1 class="wp-block-heading">publi.codes</h1>



<p>We willen ook nog wijzen op het bestaan van <a href="https://publi.codes/">publi.codes</a> als eventueel alternatief voor OpenFisca. Recenter en moderner, moeten de regels daar gecodeerd worden in een YAML-formaat, wat veel hanteerbaarder is dan het schrijven van subklassen in Python, en veel leesbaarder voor niet-developers. Men is in ruil daarvoor echter wel beperkt tot de <a href="https://publi.codes/docs/mecanismes">bewerkingen die zijn toegelaten</a> door de achterliggende motor. Pas vanaf de <a href="https://github.com/orgs/publicodes/projects/5">nog in ontwikkeling zijnde versie 2</a> komen daar mogelijkheden bij om <a href="https://github.com/publicodes/publicodes/issues/707">barema&#8217;s</a> te encoderen, of <a href="https://github.com/publicodes/publicodes/issues/705">abattementen</a> (vrijgestelde bedragen), die in België erg veelvuldig voorkomen. </p>



<p>De huidige versie van publi.codes is bovendien afhankelijk van het NPM ecosysteem dat tegenwoordig regelmatig geplaagd wordt door <a href="https://about.gitlab.com/blog/gitlab-discovers-widespread-npm-supply-chain-attack/">supply chain aanvallen</a>. Publi.codes v2 zou dan weer <a href="https://publi.codes/blog/publicodes-v2">gecompileerd worden naar OCaml</a>, een programmeertaal die we bij Smals niet gebruiken. Gezien de kans klein is dat Smals deze programmeertaal zou willen introduceren in haar portfolio (en een ondersteunend team ervoor zou willen uitbouwen), leek het weinig nuttig om voor deze oefening ook publi.codes in de diepte te bekijken. Het valt echter wel op dat op het vlak van UI-componenten, publi.codes wel <a href="https://publi.codes/docs/api/react-ui">enkele libraries</a> heeft klaarliggen.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>Zowel OpenFisca als publi.codes zijn als platform vooral sterk wanneer je regels kunt modelleren als expliciete, testbare berekeningen. Minder ideaal is het voor regels die vooral draaien op discretionaire beslissingen, vrije interpretatie, bewijswaardering, uitzonderingen zonder heldere parameters, of “case management”-workflows. Het zijn primair reken- en regelsystemen, geen dossierbehandelingsplatformen. Daarmee zijn ze eventueel wel geschikt als motor voor apps die belastingen of uitkeringen op niveau van persoon/huishouden kunnen berekenen (recht op iets + bedrag), of om beleidsimpact te simuleren van eventuele wijzigingen (&#8220;wat kost deze hervorming?&#8221;, &#8220;wie wint/verliest?&#8221;). Dat kan voor beleidsmakers én burgers interessant zijn.</p>



<p>Toch is een OpenFisca-project niet snel even opgezet. Conceptueel is OpenFisca enigszins verwarrend voor een developer: hoewel OpenFisca gebruikmaakt van Python-klassen, dienen deze niet om objecten te modelleren, maar om entiteiten, variabelen en berekeningsregels uit de regelgeving declaratief vast te leggen. Gegeven dat er 1 klasse per variabele moet geschreven worden, en er vlotjes tientallen variabelen kunnen meespelen in een fijnmazig wetsartikel, zit men met een snel groeiende stapel code die een uitdaging is om overzichtelijk georganiseerd te krijgen. Daarnaast vergt ook de ontwikkeling van een GUI veel extra werk. Het project mist nog de nodige <em>tooling</em> om deze recurrente problematieken te verlichten. (Het helpt natuurlijk niet wanneer de <a href="https://openfisca.org/en/about/">opdrachtgevende overheid in 2020 plots de kraan dichtdraait</a>, schijnbaar van mening dat open-source projecten per definitie zelfbedruipend kunnen zijn.)</p>



<p>Tot slot kunnen we nog zeggen dat dit experiment tegelijk een nuttige en leerzame <em>reality check</em> was over wat LLMs kunnen bijdragen, en kunnen verknoeien, aan een developer-werkomgeving. Zelf de regie stevig in handen blijven houden en werken met kleine incrementele stapjes, blijft de beste raad. De ene AI tool zal daarbij al wat minder steken laten vallen dan de andere op allerlei vlakken. Het geven van negatieve antwoorden of het detecteren van fouten in de vraagstelling blijft erg uitdagend voor LLMs en dat brengt wat risico met zich mee. AI-assistentie in IDEs evolueert echter razendsnel, en een gelijkaardig experiment zal volgend jaar ongetwijfeld anders verlopen. </p>



<p>Rules As Code betekent zeker niet dat we vandaag een wettekst aan een AI kunnen geven om er een programma te laten uitrollen. Wel zal er op <a href="https://rules-as-code.yellenge.nl/">gespecialiseerde fora</a> de komende jaren ongetwijfeld veel aandacht gaan naar de interactie tussen wet, implementatie, en AI-tooling. Vooralsnog blijft de complexiteit van de regelgeving zelf, ook met steeds betere AI, de grootste hinderpaal voor Rules As Code projecten. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Rules as Code</title>
		<link>https://www.smalsresearch.be/talk-rac/</link>
		
		<dc:creator><![CDATA[Smals Research]]></dc:creator>
		<pubDate>Fri, 09 Jan 2026 03:33:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Research talks]]></category>
		<category><![CDATA[AI4GOV]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[governance]]></category>
		<category><![CDATA[rules]]></category>
		<category><![CDATA[Society]]></category>
		<guid isPermaLink="false">/?p=25459</guid>

					<description><![CDATA[Interview met Joachim Ganseman van Smals Research over het omzetten van regels naar code: Rules as Code.]]></description>
										<content:encoded><![CDATA[
<p><strong>(NL)</strong> In deze Research Talk wordt <a href="/author/ganseman/" target="_blank" rel="noreferrer noopener">Joachim Ganseman</a>, researcher bij Smals, aan de tand gevoeld over zijn ervaringen met “Rules as Code”-systemen (RaC) en hun inzetbaarheid binnen het — complexe — domein van de sociale zekerheid. Joachim plaatst een aantal kanttekeningen bij de directe toepasbaarheid van deze systemen in onze context. Kijk en luister hier waarom.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>(FR)</strong> Dans ce Research Talk (en Néerlandais, sous-titres FR sont disponibles), <a href="/author/ganseman/" target="_blank" rel="noreferrer noopener">Joachim Ganseman</a>, chercheur chez Smals, est interrogé sur ses expériences avec les systèmes « Rules as Code » (RaC) et leur mise en œuvre au sein du domaine — complexe — de la sécurité sociale. Joachim émet quelques réserves quant à l&#8217;applicabilité directe de ces systèmes dans notre contexte. Regardez et écoutez ici pourquoi.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>(EN)</strong> In this Research Talk (Dutch speaking, EN subtitles available), <a href="/author/ganseman/" target="_blank" rel="noreferrer noopener">Joachim Ganseman</a>, researcher at Smals, is interviewed about his experiences with “Rules as Code” (RaC) systems and their implementation within the complex domain of social security. Joachim places some reservations regarding the direct applicability of these systems in our context. Watch and listen here to find out why. </p>



<figure class="wp-block-embed aligncenter is-type-rich is-provider-embed-handler wp-block-embed-embed-handler wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ResearchTalk - Rules as Code" width="500" height="281" src="https://www.youtube.com/embed/SeYI0Tz1DOE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
