<?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>source code &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/source-code/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Wed, 29 Apr 2026 08:59:04 +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>source code &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>L’IA pour améliorer la sécurité du code&#160;? (Partie 2 : détection de vulnérabilités)</title>
		<link>https://www.smalsresearch.be/ia-pour-ameliorer-securite-du-code-2/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 26 Aug 2025 07:00:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[assistants]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[source code]]></category>
		<guid isPermaLink="false">/?p=23163</guid>

					<description><![CDATA[L'IAGén peut-elle aider à détecter des vulnérabilités dans du code existant ?]]></description>
										<content:encoded><![CDATA[
<p><a href="/ai-om-de-veiligheid-van-code-te-verbeteren-deel-2-opsporing-van-kwetsbaarheden/"><em>Nederlandstalige versie</em></a></p>



<p>Cet article fait suite à une <a href="/ia-pour-ameliorer-securite-du-code-1/">première partie qui s’est penchée sur la sécurité du code généré</a> par les outils d’IA générative (IAGén). Dans cette seconde partie, nous considérons la tâche de détecter des vulnérabilités dans du code existant et comment l’IAGén pourrait peut-être aider.</p>



<p>Les vulnérabilités de sécurité dans le code sont un problème récurrent affectant la plupart des logiciels et ayant un impact sur l’intégrité, la confidentialité et la disponibilité. L’utilisation de certains langages de programmation connus pour être moins susceptibles que d’autres à des problèmes classiques est recommandée (par exemple <a href="https://www.rust-lang.org/">Rust</a> plutôt que C). L’examen du code par d’autres programmeurs experts est aussi une méthode largement répandue. Mais l’IAGén pourrait-elle faciliter la tâche&nbsp;?</p>



<h1 class="wp-block-heading">Recherche de vulnérabilités</h1>



<p>Il existe plusieurs façons de rechercher des vulnérabilités à partir du code ou du binaire et ce, de manière automatique ou manuelle, statique ou dynamique, et systématique ou exploratoire. En 2022, dans une étude très détaillée, Elder <i>et al.</i>&nbsp;<a href="#_ref1">[1]</a> ont comparé plusieurs de ces méthodes sur une application d’ampleur dans le domaine médical&nbsp;: <a href="https://openmrs.org/" target="_blank" rel="noreferrer noopener">OpenMRS</a>. Celle-ci contient près de 4 millions de lignes de code Java et JavaScript. Les auteurs font plusieurs recommandations en fonction des objectifs recherchés et des ressources (expertise, temps, équipement) disponibles et confirment une étude plus ancienne&nbsp;: chaque méthode de détection de vulnérabilité trouve des vulnérabilités qui n’ont pas été trouvées par d’autres méthodes. Cependant, dans leur expérimentation, la méthode manuelle exploratoire par tests d’intrusion a permis de trouver les vulnérabilités les plus dangereuses.</p>



<h1 class="wp-block-heading">IAGén et analyse statique</h1>



<p>Le <a href="#_Table1">Tableau 1</a> compare deux approches d’analyse de code&nbsp;: l’analyse statique (classique) et une analyse utilisant une IAGén. Selon certaines études, l’IAGén aurait commencé à montrer quelques avantages par rapport aux outils d’analyse statiques classiques.</p>



<p><a name="_Table1">Tableau </a>1 – Aperçu des principales différences et similitudes entre deux approches d’analyse du code&nbsp;: analyse statique et analyse avec IAGén (d’après&nbsp;<a href="#_ref2">[2]</a>).</p>



<figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><thead><tr><th>Critère</th><th>Analyse statique «&nbsp;classique&nbsp;»</th><th>Analyse avec IA générative</th></tr></thead><tbody><tr><td>
<b>Objectif et
  conception</b>
</td><td>
Identifier les
  vulnérabilités de sécurité connues dans le code
</td><td>
Comprendre et générer
  un texte de type humain, y compris du code informatique
</td></tr><tr><td>
<b>Représentation du code</b>
</td><td>
Arbres syntaxiques abstraits ou graphes
  de flux de contrôle
</td><td>
Code comme séquences de jetons
</td></tr><tr><td>
<b>Apprentissage et
  adaptation</b>
</td><td>Utilisation de règles et de signatures prédéfinies&nbsp;; pas «&nbsp;d’apprentissage&nbsp;» traditionnel </td><td>«&nbsp;Apprentissage&nbsp;» continu à partir de données d’entraînement&nbsp;; adaptation en fonction des modèles observés </td></tr><tr><td>
<b>Généralisation</b>
</td><td>
Précis et spécifique ; basé sur des
  modèles/signatures connus
</td><td>
Peut généraliser les différents
  modèles/styles de codage
</td></tr><tr><td>
<b>Retour d’information
  et itération</b>
</td><td>
Retour d’information
  déterministe basé sur la correspondance des règles
</td><td>
Retour d’information
  contextuel et descriptif
</td></tr><tr><td>
<b>Couverture des vulnérabilités</b>
</td><td>
Limitée à un ensemble de
  règles/signatures prédéfinies
</td><td>
Potentiellement plus large en raison de
  la formation généralisée, mais peut manquer de précision
</td></tr><tr><td>
<b>Base de
  fonctionnement</b>
</td><td>
Règles
</td><td>Reconnaissance des motifs basée sur des données d’entraînement </td></tr><tr><td>
<b>Adaptabilité</b>
</td><td>
Fixe à moins que les règles ne soient
  mises à jour
</td><td>
Flexible en raison des capacités de
  reconnaissance des motifs
</td></tr></tbody></table></figure>



<p>Par exemple, Noever&nbsp;<a href="#_ref2">[2]</a> a étudié la performance de certaines IAGén pour identifier et rectifier des vulnérabilités dans des logiciels. Son étude portait sur divers dépôts de GitHub et comparait les IAGén avec des outils d’analyse statique. L’auteur a utilisé la requête (« prompt » en anglais) suivante&nbsp;:</p>



<p><code>“Act as the world’s greatest static code analyzer for all major programming languages. I will give you a code snippet, and you will analyze the code and rewrite it, removing any identified vulnerabilities. Do not explain, just return the corrected code and format alone.”</code></p>



<p>Les tests de l’auteur utilisent le cycle suivant pour une base de code donnée&nbsp;:</p>



<ul class="wp-block-list">
<li>Utiliser un outil d’analyse statique pour évaluer le nombre et le niveau de gravité des vulnérabilités&nbsp;;</li>



<li>Demander à l’IAGén d’identifier les vulnérabilités ;</li>



<li>Demander à l’IAGén de corriger les vulnérabilités trouvées ;</li>



<li>Utiliser l’outil d’analyse statique sur le code corrigé et comparer le nombre et le niveau de gravité des vulnérabilités trouvées.</li>
</ul>



<p>Les résultats de l’auteur sont plutôt positifs sur la base de code choisie&nbsp;: l’IAGén a permis de réduire de manière significative le nombre de vulnérabilités très graves.</p>



<h1 class="wp-block-heading">Performance de l’IAGén</h1>



<p>Cependant, même les meilleurs outils utilisant l’IA pour la détection de défauts ont une précision inférieure à 70 % selon <a href="https://microsoft.github.io/CodeXGLUE/">CodeXGLUE</a>. Une étude de Steenhoek&nbsp;<a href="#_ref3">[3]</a> rapporte que les modèles de pointe n’ont obtenu qu’une précision équilibrée de 54,5 %<a href="#_ftn1" name="_ftnref1" title=""><sup>1</sup></a> dans leur évaluation de la détection des vulnérabilités, même pour les modèles pré-entraînés sur de grandes quantités de code source. En d’autres termes, « <i>tous les modèles et toutes les requêtes ont donné des résultats proches de ceux des réponses aléatoires aux devinettes</i>. » Les auteurs expliquent cela par la difficulté qu’ont les IAGén à raisonner sur la sémantique du code. Cette difficulté de raisonnement ne se limite d’ailleurs pas au code&nbsp;<a href="#_ref3">[3]</a>.</p>



<p>Nous avions déjà pu remarquer quelque chose de similaire lors de nos propres tests sur une base de code avec des vulnérabilités de type <a href="https://fr.wikipedia.org/wiki/Common_Weakness_Enumeration" data-type="link" data-id="https://fr.wikipedia.org/wiki/Common_Weakness_Enumeration" target="_blank" rel="noreferrer noopener">CWE</a> connues&nbsp;: le nombre de faux-positifs<a name="_ftnref2" title="" href="#_ftn2"><sup>2</sup></a> était souvent aussi important que le nombre de vrai-positifs<a name="_ftnref3" title="" href="#_ftn3"><sup>3</sup></a> lorsque nous avons demandé à différents modèles (gpt-40-mini, gpt-4o, mistral-large-2411, Llama-4-Scout, DeepSeek-V3, Qwen2.5) d’indiquer si un fichier de code contenait des vulnérabilités potentielles. Même en envoyant une base de code entière nos résultats n’ont pas été plus concluants. En effet, <a href="https://confluence.smals.be/spaces/JAVA/pages/444932902/Test+Llama+Scout+on+full+repository">Llama</a> permet de fournir un contexte très large (10 millions de symboles), et après lui avoir fourni l’entièreté de WebGoat – un logiciel spécialement écrit avec des vulnérabilités – aucune vulnérabilité significative n’a été identifiée&nbsp;!</p>



<p>Dans une étude plus récente et plus systématique, Ullah <em>et al.</em>&nbsp;<a href="#_ref4">[4]</a> montrent – en utilisant 8 modèles et 17 méthodes de requête sur 228 exemples de code – que les IAGén fournissent des réponses non déterministes, un raisonnement incorrect et infidèle, et qu’elles sont peu performantes dans des scénarios du « monde réel ». Plus grave, l’étude confirme aussi un manque de robustesse lors de la détection de vulnérabilités potentielles. De nombreuses études avaient déjà souligné que les techniques d’apprentissage automatique manquaient de robustesse aux transformations de code préservant la sémantique comme le renommage d’identifiants, l’insertion de déclarations non exécutées ou encore le remplacement de code par du code équivalent&nbsp;<a href="#_ref5">[5]</a>. Sans grande surprise, les méthodes d’amplifications permettant à un modèle d’apprendre ce type de transformations, ne permettent d’augmenter la robustesse que pour les transformations spécifiques auxquelles le modèle a été entrainé&nbsp;<a href="#_ref5">[5]</a>.</p>



<p>Dans un autre exemple, plus anecdotique, Heelan&nbsp;<a href="#_ref6">[6]</a> discute de la capacité de ChatGPT-o3 à trouver la vulnérabilité <a href="https://nvd.nist.gov/vuln/detail/CVE-2025-37778">CVE-2025-37778</a> dans le noyau de Linux. Outre le fait que la requête envoyée par l’auteur à l’IAGén était très précise (extrait de code soigneusement sélectionné, instructions détaillées), l’IAGén n’a trouvé la vulnérabilité que 8 fois sur 100 (la même requête a été envoyée 100 fois, et seulement 8 fois l’IAGén a trouvé la vulnérabilité). Dans un autre exemple l’auteur décrit comment, par hasard, l’IAGén lui a permis de découvrir une nouvelle vulnérabilité ; là encore il a envoyé cent fois sa requête à ChatGPT et, dans une seule réponse, il a trouvé un élément le mettant sur la voie. C’est sans compter le coût environnemental et financier de l’exercice et surtout le fait que la nouvelle vulnérabilité est liée sémantiquement à la précédente.</p>



<p>Dès lors, on ne s’étonnera pas que l’expérience de plusieurs projets de logiciels libres tend à montrer que les bogues découverts avec l’aide de l’IAGén ont en réalité peu de valeur&nbsp;<a href="#_ref7">[7]</a>,&nbsp;<a href="#_ref8">[8]</a>.</p>



<h1 class="wp-block-heading">Intégration de l’IAGén dans
l’analyse statique</h1>



<p>Afin d’améliorer la détection de vulnérabilités par une IAGén dans un échantillon de code, Yue Li <i>et al.</i>&nbsp;<a href="#_ref9">[9]</a> suggèrent de rassembler le plus d’informations contextuelles possibles (p. ex., liste de dépendances et informations spécifiques à un type de vulnérabilité recherché). C’est ce qui est mis en pratique dans l’outil IRIS de Ziyang Li <i>et al.</i>&nbsp;<a href="#_ref10">[10]</a>.</p>



<p>IRIS combine l’IAGén avec l’analyse statique pour détecter les vulnérabilités de sécurité dans les logiciels tout en essayant de réduire le taux de faux positifs. Cet outil suit un processus systématique de détection des failles de sécurité&nbsp;:</p>



<ol class="wp-block-list">
<li>Extraction de candidats potentiels pour être des sources ou des récepteurs contaminés dans les interfaces de programmation externes et internes grâce à un outil d’analyse statique.</li>



<li>Interrogation d’une IAGén pour étiqueter en tant que source ou puit (fonction vulnérable) spécifique à une classe de vulnérabilité<a name="_ftnref4" title="" href="#_ftn4"><sup>4</sup></a>, les interfaces candidates.</li>



<li>Les sources et les puits étiquetés sont transformés en spécifications qui peuvent être introduites dans <a href="/publications/document/?docid=293">CodeQL</a> afin d’effectuer une analyse des souillures (les variables entachées par des entrées de l’utilisateur et pouvant atteindre un puit) spécifique à une classe de vulnérabilité. Cette étape génère un ensemble de chemins de code vulnérables (ou alertes) dans le projet.</li>



<li>Enfin l’IAGén est utilisée pour réduire le nombre de faux-positifs signalés par l’analyse statique de <a href="/publications/document/?docid=293">CodeQL</a> tout en fournissant une explication.</li>
</ol>



<p>Nos tests de l’outil IRIS-v1<a name="_ftnref5" title="" href="#_ftn5"><sup>5</sup></a>, sur la base de code WebGoat avec les modèles Codegen25-7b-instruct, qwen2.5-coder-7b et GPT-4 ont pu confirmer une réduction d’environ 18 % du nombre de vulnérabilités potentielles détectées, mais ce, au prix d’un grand nombre d’appels au modèle d’IAGen (1130 appels par type de <a href="https://fr.wikipedia.org/wiki/Common_Weakness_Enumeration" data-type="link" data-id="https://fr.wikipedia.org/wiki/Common_Weakness_Enumeration" target="_blank" rel="noreferrer noopener">CWE</a> testé, pour une base de 259 fichiers Java).</p>



<p>Cet outil encore expérimental montre néanmoins une tendance plus générale de l’introduction de l’IAGén dans les outils de détection existants. C’est le cas, par exemple, de DeepCode, d’ETH Zurich, récemment intégré dans le logiciel Snyk. Il a pour ambition de permettre aux programmeurs de trouver rapidement des vulnérabilités dans leur code. Mais la convergence d’outils d’IAGén examinant du code généré par d’autres outils d’IAGén, crée des boucles de rétroaction qui pourraient s’avérer dangereuses&nbsp;<a href="#_ref11">[11]</a>.</p>



<h1 class="wp-block-heading">Conclusion et recommandations</h1>



<p>Même si quelques études ont montré que les IAGén peuvent résoudre des problèmes simples de correction de vulnérabilités (par exemple, des fuites de mémoire), on constate qu’ils rencontrent des difficultés à résoudre des défauts complexes. La plupart des études que nous avons rencontrées montrent aussi des performances incohérentes et une tendance générale à des taux élevés de faux-positifs, dans la détection des failles de sécurité, confirmant nos propres tests. Les meilleures performances de détection semblent être atteintes sur les vulnérabilités pour lesquelles les IAGén ont été entraînées. Ces observations sont confirmées par une étude systématique et extensive de Basic et Giaretta&nbsp;<a href="#_ref12">[12]</a><i>.</i></p>



<p>Par conséquent, avant de pouvoir utiliser l’IAGén pour la détection de vulnérabilité dans le code, il faudra attendre que des progrès importants soient faits. Pour le moment, il faut prendre conscience des limites actuelles de ces outils. Outre celles mentionnées précédemment, quelle que soit la méthode retenue, de nombreux appels à l’IAGén peuvent s’avérer être très coûteux (ou très lents s’ils sont exécutés localement sans matériel adéquat). De plus il manque encore une méthodologie scientifique solide permettant de comparer efficacement différents outils d’analyse et de mesurer l’apport objectif de l’IAGén.</p>



<p>Chez SMALS, par exemple, une initiative issue du fruit d’une collaboration (groupe de travail « SAST<a href="#_ftn6" name="_ftnref6" title=""><sup>6</sup></a> ») entre l’équipe de développement des applications &amp; projets et celle de recherche travaille sur la performance des outils d’analyse statique et l’apport possible de l’IAGén.</p>



<p>Enfin, on note que <a href="/publications/document/?docid=293">CodeQL</a> est repris par beaucoup d’études comme une base de référence pour la comparaison de l’efficacité des modèles d’IAGén à détecter des vulnérabilités. Cela n’est pas étonnant car des outils comme celui-ci ont fait leur preuve. Alors avant de se lancer tête baissée dans l’utilisation de l’IAGén pour améliorer la sécurité du code, il est probablement plus sage d’intégrer progressivement dans les indispensables revues de code habituelles, des outils d’analyse statique ou dynamique. Nul doute qu’une IAGén sera intégrée à ces outils au moment opportun.</p>



<h1 class="wp-block-heading">Références</h1>



<p><a name="_ref1">[1]</a> S. Elder <i>et al.</i>, « Do I really need all this work to find vulnerabilities? An empirical case study comparing vulnerability detection techniques on a Java application », 2 août 2022, <i>arXiv</i>: arXiv:2208.01595. doi: <a href="https://doi.org/10.48550/arXiv.2208.01595" target="_blank" rel="noopener">10.48550/arXiv.2208.01595</a>.</p>



<p><a name="_ref2">[2]</a> D. Noever, « Can large language models find and fix vulnerable software? », août 2023, [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2308.10345" target="_blank" rel="noopnener">https://arxiv.org/abs/2308.10345</a></p>



<p><a name="_ref3">[3]</a> P. Shojaee, I. Mirzadeh, K. Alizadeh, M. Horton, S. Bengio, et M. Farajtabar, « The illusion of thinking: Understanding the strengths and limitations of reasoning models via the lens of problem complexity », [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2506.06941" target="_blank" rel="noopnener">https://arxiv.org/abs/2506.06941</a></p>



<p><a name="_ref4">[4]</a> S. Ullah, M. Han, S. Pujar, H. Pearce, A. Coskun, et G. Stringhini, « LLMs cannot reliably identify and reason about security vulnerabilities (yet?): A comprehensive evaluation, framework, and benchmarks », 24 juillet 2024, <i>arXiv</i>: arXiv:2312.12575. doi: <a href="https://doi.org/10.48550/arXiv.2312.12575" target="_blank" rel="noopener">10.48550/arXiv.2312.12575</a>.</p>



<p><a name="_ref5">[5]</a> N. Risse et M. Böhme, « Uncovering the limits of machine learning for automatic vulnerability detection », 6 juin 2024, <i>arXiv</i>: arXiv:2306.17193. doi: <a href="https://doi.org/10.48550/arXiv.2306.17193" target="_blank" rel="noopener">10.48550/arXiv.2306.17193</a>.</p>



<p><a name="_ref6">[6]</a> S. Heelan, « How I used o3 to find CVE-2025-37899, a remote zeroday vulnerability in the Linux kernel’s SMB implementation », Sean Heelan’s Blog. Consulté le: 12 juin 2025. [En ligne]. Disponible sur: <a href="https://sean.heelan.io/2025/05/22/how-i-used-o3-to-find-cve-2025-37899-a-remote-zeroday-vulnerability-in-the-linux-kernels-smb-implementation/" target="_blank" rel="noopnener">https://sean.heelan.io/2025/05/22/how-i-used-o3-to-find-cve-2025-37899-a-remote-zeroday-vulnerability-in-the-linux-kernels-smb-implementation/</a></p>



<p><a name="_ref7">[7]</a> T. Claburn, « AI-assisted bug reports make developers bear cost of cleanup », The Register. Consulté le: 14 mai 2025. [En ligne]. Disponible sur: <a href="https://www.theregister.com/2024/01/04/aiassisted_bug_reports_make_developers/" target="_blank" rel="noopnener">https://www.theregister.com/2024/01/04/aiassisted_bug_reports_make_developers/</a></p>



<p><a name="_ref8">[8]</a> C. Jones, « Curl takes action against time-wasting AI bug reports », The Register. Consulté le: 14 mai 2025. [En ligne]. Disponible sur: <a href="https://www.theregister.com/2025/05/07/curl_ai_bug_reports/" target="_blank" rel="noopnener">https://www.theregister.com/2025/05/07/curl_ai_bug_reports/</a></p>



<p><a name="_ref9">[9]</a> Y. Li <i>et al.</i>, « Everything you wanted to know about LLM-based vulnerability detection but were afraid to ask », 18 avril 2025, <i>arXiv</i>: arXiv:2504.13474. doi: <a href="https://doi.org/10.48550/arXiv.2504.13474" target="_blank" rel="noopener">10.48550/arXiv.2504.13474</a>.</p>



<p><a name="_ref10">[10]</a> Z. Li, S. Dutta, et M. Naik, « IRIS: LLM-assisted static analysis for detecting security vulnerabilities », 6 avril 2025, <i>arXiv</i>: arXiv:2405.17238. doi: <a href="https://doi.org/10.48550/arXiv.2405.17238" target="_blank" rel="noopener">10.48550/arXiv.2405.17238</a>.</p>



<p><a name="_ref11">[11]</a> S. Varma, A. Batchu, et N. Tyagi, « Innovation insight: AI code review tools », Gartner, G00834019, juill. 2025.</p>



<p><a name="_ref12">[12]</a> E. Basic et A. Giaretta, « Large language models and code security: A systematic literature review », 19 décembre 2024, <i>arXiv</i>: arXiv:2412.15004. doi: <a href="https://doi.org/10.48550/arXiv.2412.15004" target="_blank" rel="noopener">10.48550/arXiv.2412.15004</a>.</p>



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



<p><a name="_ftn1" title="" href="#_ftnref1"><sup>1</sup></a> Les auteurs préfèrent le score de précision équilibrée (« balanced accuracy ») au score classique F1 afin de mieux prémunir des biais potentiels du modèle évalué. Il est défini comme&nbsp;: </p>



<figure class="wp-block-image aligncenter size-full is-resized"><a href="/wp-content/uploads/2025/07/2025-07-30_17h24_15.png"><img fetchpriority="high" decoding="async" width="970" height="166" src="/wp-content/uploads/2025/07/2025-07-30_17h24_15.png" alt="" class="wp-image-23198" style="width:auto;height:50px" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/07/2025-07-30_17h24_15.png 970w, https://www.smalsresearch.be/wp-content/uploads/2025/07/2025-07-30_17h24_15-300x51.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/07/2025-07-30_17h24_15-768x131.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></a></figure>



<p><a href="#_ftnref2" name="_ftn2" title=""><sup>2</sup></a> Code déclaré contenant une vulnérabilité alors qu’il n’en contient pas.</p>



<p><a href="#_ftnref3" name="_ftn3" title=""><sup>3</sup></a> Code correctement déclaré comme contenant une vulnérabilité.</p>



<p><a name="_ftn4" title="" href="#_ftnref4"><sup>4</sup></a> Actuellement, IRIS ne prend en charge que les <a href="https://fr.wikipedia.org/wiki/Common_Weakness_Enumeration" data-type="link" data-id="https://fr.wikipedia.org/wiki/Common_Weakness_Enumeration" target="_blank" rel="noreferrer noopener">CWE</a> suivants&nbsp;: CWE-022 (Traversée de chemin), CWE-078 (injection de commande du système d’exploitation), CWE-079 (Script inter-site) et CWE-094 (injection de code).</p>



<p><a href="#_ftnref5" name="_ftn5" title=""><sup>5</sup></a> La version 2 a été publiée après l’écriture de cet article.</p>



<p><a href="#_ftnref6" name="_ftn6" title=""><sup>6</sup></a> « <i>Static application security testing</i> »</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI om de veiligheid van code te verbeteren? (Deel 2: opsporing van kwetsbaarheden)</title>
		<link>https://www.smalsresearch.be/ai-om-de-veiligheid-van-code-te-verbeteren-deel-2-opsporing-van-kwetsbaarheden/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 26 Aug 2025 07:00:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[assistants]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[source code]]></category>
		<guid isPermaLink="false">/?p=23204</guid>

					<description><![CDATA[Kan GenAI helpen bij het opsporen van kwetsbaarheden in bestaande code?]]></description>
										<content:encoded><![CDATA[
<p><em><a href="/ia-pour-ameliorer-securite-du-code-2/">Version en français</a></em></p>



<p>Dit artikel is het vervolg op een <a href="/ai-om-de-veiligheid-van-de-code-te-verbeteren-deel-1-veiligheid-van-de-gegenereerde-code/">eerste deel dat zich toespitste op de veiligheid van code die gegenereerd werd</a> door generatieve AI-tools (GenAI). In het tweede deel nemen we de taak onder de loep om kwetsbaarheden in bestaande code op te sporen en zien we hoe GenAI daarbij zou kunnen helpen.</p>



<p>Kwetsbaarheden in code zijn een terugkerend probleem dat de meeste software treft en een impact heeft op integriteit, vertrouwelijkheid en beschikbaarheid. Er wordt aangeraden om bepaalde programmeertalen te gebruiken waarvan bekend is dat ze minder gevoelig zijn voor klassieke problemen dan andere (bijv. <a href="https://www.rust-lang.org/">Rust</a> in plaats van C). Code review door andere expertprogrammeurs is ook een veelgebruikte methode. Maar zou GenAI de taak kunnen vergemakkelijken?</p>



<h1 class="wp-block-heading">Zoeken naar kwetsbaarheden</h1>



<p>Er zijn verschillende manieren om kwetsbaarheden in code of binaire bestanden op te sporen, zowel automatisch als handmatig, statisch of dynamisch, en systematisch of verkennend. In 2022 hebben Elder <i>et al.</i>&nbsp;<a href="#_ref1">[1]</a> in een zeer gedetailleerde studie verschillende van deze methoden vergeleken op een grootschalige toepassing in de medische sector: <a href="https://openmrs.org/">OpenMRS</a>. Deze bevat bijna 4 miljoen regels Java- en JavaScript-code. De auteurs doen verschillende aanbevelingen op basis van de beoogde doelstellingen en de beschikbare middelen (expertise, tijd, apparatuur) en bevestigen een eerdere studie: elke methode voor het opsporen van kwetsbaarheden vindt kwetsbaarheden die met andere methoden niet zijn gevonden. In hun experiment bleek echter de handmatige verkennende methode met penetratietests de gevaarlijkste kwetsbaarheden op te sporen.</p>



<h1 class="wp-block-heading">GenAI en statische analyse</h1>



<p><a href="#_Tabel1">Tabel 1</a> vergelijkt twee benaderingen van code-analyse: statische (klassieke) en een analyse die GenAI gebruikt. Volgens bepaalde studies zou GenAI enkele voordelen beginnen te vertonen ten opzichte van klassieke statische analysetools.</p>



<p><a name="_Tabel1">Tabel </a>1 – Overzicht van de belangrijkste verschillen en overeenkomsten tussen twee benaderingen van codeanalyse: statische analyse en analyse met GenAI (naar&nbsp;<a href="#_ref2">[2]</a>).</p>



<figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><thead><tr><th><b>Criterium</b></th><th><b>Statische analyse</b></th><th><b>Analyse met GenAI</b></th></tr></thead><tbody><tr><td><b>Doel en ontwerp</b></td><td>Bekende<br>beveiligingskwetsbaarheden in de code identificeren</td><td>Menselijke tekst<br>begrijpen en genereren, inclusief computercode</td></tr><tr><td><b>Weergave van code</b></td><td>Abstracte syntactische bomen of<br>controlestroomgrafen</td><td>Code als reeksen tokens</td></tr><tr><td><b>Leren en aanpassen</b></td><td>Vooraf gedefinieerde<br>regels en handtekeningen gebruiken; geen traditioneel ‘leren’</td><td>Continu ‘leren’ op<br>basis van trainingsgegevens; aanpassing op basis van waargenomen patronen</td></tr><tr><td><b>Generalisatie</b></td><td>Nauwkeurig en specifiek; gebaseerd op<br>bekende patronen/signaturen</td><td>Kan verschillende patronen/stijlen van<br>codering generaliseren</td></tr><tr><td><b>Feedback en<br>iteratie</b></td><td>Deterministische<br>feedback op basis van overeenstemming met regels</td><td>Contextuele en<br>beschrijvende feedback</td></tr><tr><td><b>Dekking van kwetsbaarheden</b></td><td>Beperkt tot een reeks vooraf<br>gedefinieerde regels/handtekeningen</td><td>Potentieel breder vanwege algemene<br>training, maar kan onnauwkeurig zijn</td></tr><tr><td><b>Werkingsbasis</b></td><td>Regels</td><td>Patroonherkenning op<br>basis van trainingsgegevens</td></tr><tr><td><b>Aanpasbaarheid</b></td><td>Vast, tenzij de regels worden bijgewerkt</td><td>Flexibel dankzij<br>patroonherkenningsmogelijkheden</td></tr></tbody></table></figure>



<p>Noever&nbsp;<a href="#_ref2">[2]</a> heeft bijvoorbeeld de prestaties van bepaalde GenAI onderzocht om kwetsbaarheden in software te identificeren en te verhelpen. Zijn onderzoek had betrekking op verschillende GitHub-repository’s en vergeleek GenAI met statische analysetools. De auteur gebruikte de volgende prompt:</p>



<p><code>“Act as the world’s greatest static code analyzer for all major programming languages. I will give you a code snippet, and you will analyze the code and rewrite it, removing any identified vulnerabilities. Do not explain, just return the corrected code and format alone.”</code></p>



<p>De tests van de auteur gebruiken de volgende cyclus voor een bepaalde codebase:</p>



<ul class="wp-block-list">
<li>Gebruik een statische analysetool om het aantal en de ernst van de kwetsbaarheden te beoordelen;</li>



<li>Vraag GenAI om de kwetsbaarheden te identificeren;</li>



<li>Vraag GenAI om de gevonden kwetsbaarheden te corrigeren;</li>



<li>Gebruik de statische analysetool op de gecorrigeerde code en vergelijk het aantal en de ernst van de gevonden kwetsbaarheden.</li>
</ul>



<p>De resultaten van de auteur zijn vrij positief op basis van de gekozen codebase: GenAI heeft het aantal zeer ernstige kwetsbaarheden aanzienlijk verminderd.</p>



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



<p>Maar zelfs de beste tools die AI gebruiken voor foutdetectie hebben volgens <a href="https://microsoft.github.io/CodeXGLUE/">CodeXGLUE</a> een nauwkeurigheid van minder dan 70%. Een studie van Steenhoek&nbsp;<a href="#_ref3">[3]</a> meldt dat de meest geavanceerde modellen slechts een gemiddelde nauwkeurigheid van 54,5%<a href="#_ftn1" name="_ftnref1" title=""><sup>1</sup></a> behaalden bij het opsporen van kwetsbaarheden, zelfs voor modellen die vooraf waren getraind op grote hoeveelheden broncode. Met andere woorden: “<i>alle modellen en alle prompts leverden resultaten op die dicht in de buurt kwamen van willekeurige antwoorden op raadsels</i>”. De auteurs verklaren dit door de moeilijkheid die GenAI heeft om te redeneren over de semantiek van code. Deze moeilijkheid om te redeneren beperkt zich overigens niet tot code&nbsp;<a href="#_ref3">[3]</a>.</p>



<p>We hadden al iets soortgelijks opgemerkt tijdens onze eigen tests op een codebase met bekende <a href="https://nl.wikipedia.org/wiki/Common_Weakness_Enumeration" data-type="link" data-id="https://nl.wikipedia.org/wiki/Common_Weakness_Enumeration" target="_blank" rel="noreferrer noopener">CWE</a>-kwetsbaarheden: het aantal valse positieven<a name="_ftnref2" title="" href="#_ftn2"><sup>2</sup></a> was vaak even groot als het aantal echte positieven<a name="_ftnref3" title="" href="#_ftn3"><sup>3</sup></a> toen we verschillende modellen verzochten (gpt-40-mini, gpt-4o, mistral-large-2411, Llama-4-Scout, DeepSeek-V3, Qwen2.5) om aan te geven of een codebestand potentiële kwetsbaarheden bevatte. Zelfs toen we een volledige codebase verstuurden, waren onze resultaten niet overtuigender. <a href="https://confluence.smals.be/spaces/JAVA/pages/444932902/Test+Llama+Scout+on+full+repository">Llama</a> biedt namelijk een zeer grote context (10 miljoen symbolen) en nadat we het de volledige WebGoat – een speciaal geschreven softwareprogramma met kwetsbaarheden – hadden aangeleverd, werd er geen enkele significante kwetsbaarheid geïdentificeerd!</p>



<p>In een recentere en systematischere studie tonen Ullah <em>et al.</em>&nbsp;<a href="#_ref4">[4]</a> aan – aan de hand van 8 modellen en 17 promptmethoden op 228 codevoorbeelden – dat GenAI <a name="_Hlk201156741">niet-deterministische antwoorden en onjuiste en onbetrouwbare redeneringen geeft en slecht presteert in ‘realistische’ scenario&#8217;s. </a>Erger nog, het onderzoek bevestigt ook een gebrek aan robuustheid bij het opsporen van potentiële kwetsbaarheden. Talrijke studies hadden al aangetoond dat machine learning-technieken niet robuust genoeg zijn tegen semantiekbehoudende codetransformaties, zoals het hernoemen van identifiers, het invoegen van niet-uitgevoerde declaraties of het vervangen van code door gelijkwaardige code&nbsp;<a href="#_ref5">[5]</a>. Het is dan ook niet verwonderlijk dat amplificatiemethoden waarmee een model dit soort transformaties kan leren, alleen de robuustheid verhogen voor de specifieke transformaties waarop het model is getraind&nbsp;<a href="#_ref5">[5]</a>.</p>



<p>In een ander, meer anekdotisch voorbeeld bespreekt Heelan&nbsp;<a href="#_ref6">[6]</a> het vermogen van ChatGPT-o3 om de kwetsbaarheid <a href="https://nvd.nist.gov/vuln/detail/CVE-2025-37778">CVE-2025-37778</a> in de Linux-kernel te vinden. Afgezien van het feit dat de prompt die de auteur naar GenAI stuurde zeer nauwkeurig was (zorgvuldig geselecteerde codefragmenten, gedetailleerde instructies), vond GenAI de kwetsbaarheid slechts 8 van de 100 keer (dezelfde prompt werd 100 keer verzonden en slechts 8 keer vond GenAI de kwetsbaarheid). In een ander voorbeeld beschrijft de auteur hoe hij door toeval met behulp van GenAI een nieuwe kwetsbaarheid ontdekte; ook hier stuurde hij zijn verzoek honderd keer naar ChatGPT en vond hij in één antwoord een aanwijzing die hem op het spoor zette. Daarbij komen nog de milieukosten en financiële kosten van deze operatie en vooral het feit dat de nieuwe kwetsbaarheid semantisch verband houdt met de vorige.</p>



<p>Het is dan ook niet verwonderlijk dat de ervaring met verschillende vrije softwareprojecten aantoont dat bugs die met behulp van GenAI worden ontdekt, in werkelijkheid weinig waarde hebben&nbsp;<a href="#_ref7">[7]</a>,&nbsp;<a href="#_ref8">[8]</a>.</p>



<h1 class="wp-block-heading">Integratie van GenAI in statische
analyse</h1>



<p>Om de detectie van kwetsbaarheden door GenAI in een codefragment te verbeteren, stellen Yue Li <i>et al</i>.&nbsp;<a href="#_ref9">[9]</a> voor om zoveel mogelijk contextuele informatie te verzamelen (bijv. lijst van afhankelijkheden en specifieke informatie over een bepaald type kwetsbaarheid). Dit wordt in de praktijk gebracht in de IRIS-tool van Ziyang Li <i>et al</i>.&nbsp;<a href="#_ref10">[10]</a>.</p>



<p>IRIS combineert GenAI met statische analyse om beveiligingskwetsbaarheden in software op te sporen en tegelijkertijd het aantal valse positieven te verminderen. Deze tool volgt een systematisch proces voor het opsporen van beveiligingslekken:</p>



<ol class="wp-block-list">
<li>Extractie van potentiële kandidaten voor besmette bronnen of ontvangers in externe en interne programmeerinterfaces met behulp van een statische analysetool.</li>



<li>Vragen aan een GenAI om de kandidaat-interfaces te labelen als bron of put (&#8220;sink&#8221;, kwetsbare functie) die specifiek is voor een bepaalde klasse van kwetsbaarheden<a name="_ftnref4" title="" href="#_ftn4"><sup>4</sup></a>.</li>



<li>De gelabelde bronnen en putten worden omgezet in specificaties die in <a href="/publications/document/?docid=293">CodeQL</a> kunnen worden ingevoerd om een analyse uit te voeren van smears (variabelen die door gebruikersinvoer zijn besmet en een put kunnen bereiken) die specifiek zijn voor een klasse van kwetsbaarheden. Deze stap genereert een reeks kwetsbare codepaden (of waarschuwingen) in het project.</li>



<li>Ten slotte wordt GenAI gebruikt om het aantal valse positieven dat door de statische analyse van <a href="/publications/document/?docid=293">CodeQL</a> wordt gemeld te verminderen en tegelijkertijd een verklaring te geven.</li>
</ol>



<p>Onze tests van de IRIS-v1-tool<a name="_ftnref5" title="" href="#_ftn5"><sup>5</sup></a>, op basis van WebGoat-code met de modellen Codegen25-7b-instruct, qwen2.5-coder-7b en GPT-4, hebben een vermindering aangetoond van ongeveer 18% van het aantal gedetecteerde potentiële kwetsbaarheden, maar dit ging ten koste van een groot aantal oproepen aan het GenAI-model (1130 oproepen per getest <a href="https://nl.wikipedia.org/wiki/Common_Weakness_Enumeration" data-type="link" data-id="https://nl.wikipedia.org/wiki/Common_Weakness_Enumeration" target="_blank" rel="noreferrer noopener">CWE</a>-type, voor een basis van 259 Java-bestanden).</p>



<p>Deze nog experimentele tool toont niettemin een meer algemene trend aan om GenAI te integreren in bestaande detectietools. Dit is bijvoorbeeld het geval bij DeepCode van ETH Zürich, dat onlangs is geïntegreerd in de Snyk-software. Het is bedoeld om programmeurs in staat te stellen snel kwetsbaarheden in hun code op te sporen. Maar de convergentie van GenAI -tools die code onderzoeken die door andere GenAI-tools is gegenereerd, creëert feedbackloops die gevaarlijk kunnen zijn[11].</p>



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



<p>Hoewel enkele studies hebben aangetoond dat GenAI eenvoudige problemen met kwetsbaarheden (bijvoorbeeld geheugenlekken) kan oplossen, blijkt dat het systeem moeite heeft met complexe fouten. De meeste studies die we hebben gevonden, tonen ook inconsistente prestaties en een algemene neiging tot hoge percentages valse positieven bij het opsporen van beveiligingslekken, wat door onze eigen tests bevestigd wordt. De beste detectieprestaties lijken te worden bereikt voor kwetsbaarheden waarvoor GenAI is getraind. Deze bevindingen worden bevestigd door een systematische en uitgebreide studie van Basic en Giaretta&nbsp;<a href="#_ref12">[12]</a>.</p>



<p>Voordat GenAI kan worden gebruikt voor het opsporen van kwetsbaarheden in code, moet er dus nog aanzienlijke vooruitgang worden geboekt. Voorlopig moeten we ons bewust zijn van de huidige beperkingen van deze tools. Naast de eerder genoemde beperkingen kan het, ongeacht de gekozen methode, erg duur zijn om GenAI veelvuldig te gebruiken (of erg traag als het lokaal wordt uitgevoerd zonder de juiste apparatuur). Bovendien ontbreekt het nog aan een solide wetenschappelijke methodologie om verschillende analysetools effectief te vergelijken en de objectieve bijdrage van GenAI te meten.</p>



<p>Bij SMALS is bijvoorbeeld een initiatief ontstaan ​​uit een samenwerking  (werkgroep “SAST”<a name="_ftnref6" title="" href="#_ftn6"><sup>6</sup></a>) tussen het team voor toepassings- en projectontwikkeling en het onderzoeksteam. Er wordt gewerkt aan de prestaties van statische analysetools en de mogelijke bijdrage van GenAI.</p>



<p>Ten slotte merken we op dat <a href="/publications/document/?docid=293">CodeQL</a> in veel studies wordt genoemd als referentiepunt voor het vergelijken van de doeltreffendheid van GenAI-modellen bij het opsporen van kwetsbaarheden. Dat is niet verwonderlijk, aangezien tools zoals deze hun nut hebben bewezen. Voordat we ons halsoverkop op GenAI storten om de codeveiligheid te verbeteren, is het waarschijnlijk verstandiger om statische of dynamische analysetools geleidelijk te integreren in de gebruikelijke essentiële codebeoordelingen. Ongetwijfeld zal GenAI op een gepast moment in deze tools worden geïntegreerd.</p>



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



<p><a name="_ref1">[1]</a> S. Elder <i>et al.</i>, « Do I really need all this work to find vulnerabilities? An empirical case study comparing vulnerability detection techniques on a Java application », 2 août 2022, <i>arXiv</i>: arXiv:2208.01595. doi: <a href="https://doi.org/10.48550/arXiv.2208.01595" target="_blank" rel="noopener">10.48550/arXiv.2208.01595</a>.</p>



<p><a name="_ref2">[2]</a> D. Noever, « Can large language models find and fix vulnerable software? », août 2023, [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2308.10345" target="_blank" rel="noopnener">https://arxiv.org/abs/2308.10345</a></p>



<p><a name="_ref3">[3]</a> P. Shojaee, I. Mirzadeh, K. Alizadeh, M. Horton, S. Bengio, et M. Farajtabar, « The illusion of thinking: Understanding the strengths and limitations of reasoning models via the lens of problem complexity », [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2506.06941" target="_blank" rel="noopnener">https://arxiv.org/abs/2506.06941</a></p>



<p><a name="_ref4">[4]</a> S. Ullah, M. Han, S. Pujar, H. Pearce, A. Coskun, et G. Stringhini, « LLMs cannot reliably identify and reason about security vulnerabilities (yet?): A comprehensive evaluation, framework, and benchmarks », 24 juillet 2024, <i>arXiv</i>: arXiv:2312.12575. doi: <a href="https://doi.org/10.48550/arXiv.2312.12575" target="_blank" rel="noopener">10.48550/arXiv.2312.12575</a>.</p>



<p><a name="_ref5">[5]</a> N. Risse et M. Böhme, « Uncovering the limits of machine learning for automatic vulnerability detection », 6 juin 2024, <i>arXiv</i>: arXiv:2306.17193. doi: <a href="https://doi.org/10.48550/arXiv.2306.17193" target="_blank" rel="noopener">10.48550/arXiv.2306.17193</a>.</p>



<p><a name="_ref6">[6]</a> S. Heelan, « How I used o3 to find CVE-2025-37899, a remote zeroday vulnerability in the Linux kernel’s SMB implementation », Sean Heelan’s Blog. Consulté le: 12 juin 2025. [En ligne]. Disponible sur: <a href="https://sean.heelan.io/2025/05/22/how-i-used-o3-to-find-cve-2025-37899-a-remote-zeroday-vulnerability-in-the-linux-kernels-smb-implementation/" target="_blank" rel="noopnener">https://sean.heelan.io/2025/05/22/how-i-used-o3-to-find-cve-2025-37899-a-remote-zeroday-vulnerability-in-the-linux-kernels-smb-implementation/</a></p>



<p><a name="_ref7">[7]</a> T. Claburn, « AI-assisted bug reports make developers bear cost of cleanup », The Register. Consulté le: 14 mai 2025. [En ligne]. Disponible sur: <a href="https://www.theregister.com/2024/01/04/aiassisted_bug_reports_make_developers/" target="_blank" rel="noopnener">https://www.theregister.com/2024/01/04/aiassisted_bug_reports_make_developers/</a></p>



<p><a name="_ref8">[8]</a> C. Jones, « Curl takes action against time-wasting AI bug reports », The Register. Consulté le: 14 mai 2025. [En ligne]. Disponible sur: <a href="https://www.theregister.com/2025/05/07/curl_ai_bug_reports/" target="_blank" rel="noopnener">https://www.theregister.com/2025/05/07/curl_ai_bug_reports/</a></p>



<p><a name="_ref9">[9]</a> Y. Li <i>et al.</i>, « Everything you wanted to know about LLM-based vulnerability detection but were afraid to ask », 18 avril 2025, <i>arXiv</i>: arXiv:2504.13474. doi: <a href="https://doi.org/10.48550/arXiv.2504.13474" target="_blank" rel="noopener">10.48550/arXiv.2504.13474</a>.</p>



<p><a name="_ref10">[10]</a> Z. Li, S. Dutta, et M. Naik, « IRIS: LLM-assisted static analysis for detecting security vulnerabilities », 6 avril 2025, <i>arXiv</i>: arXiv:2405.17238. doi: <a href="https://doi.org/10.48550/arXiv.2405.17238" target="_blank" rel="noopener">10.48550/arXiv.2405.17238</a>.</p>



<p><a name="_ref11">[11]</a> S. Varma, A. Batchu, et N. Tyagi, « Innovation insight: AI code review tools », Gartner, G00834019, juill. 2025.</p>



<p><a name="_ref12">[12]</a> E. Basic et A. Giaretta, « Large language models and code security: A systematic literature review », 19 décembre 2024, <i>arXiv</i>: arXiv:2412.15004. doi: <a href="https://doi.org/10.48550/arXiv.2412.15004" target="_blank" rel="noopener">10.48550/arXiv.2412.15004</a>.</p>



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



<p><a name="_ftn1" title="" href="#_ftnref1"><sup>1</sup></a> De auteurs geven de voorkeur aan de ‘balanced accuracy’-score boven de klassieke F1-score om beter te kunnen waken over mogelijke vertekeningen in het geëvalueerde model. Deze wordt als volgt gedefinieerd:</p>



<figure class="wp-block-image aligncenter size-full is-resized"><a href="/wp-content/uploads/2025/07/2025-07-30_17h49_39.png"><img decoding="async" width="942" height="147" src="/wp-content/uploads/2025/07/2025-07-30_17h49_39.png" alt="" class="wp-image-23205" style="width:auto;height:50px" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/07/2025-07-30_17h49_39.png 942w, https://www.smalsresearch.be/wp-content/uploads/2025/07/2025-07-30_17h49_39-300x47.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/07/2025-07-30_17h49_39-768x120.png 768w" sizes="(max-width: 942px) 100vw, 942px" /></a></figure>



<p><a href="#_ftnref2" name="_ftn2" title=""><sup>2</sup></a> Code die als kwetsbaar wordt aangemerkt, terwijl dat niet het geval is.</p>



<p><a href="#_ftnref3" name="_ftn3" title=""><sup>3</sup></a> Code die correct als kwetsbaar wordt aangemerkt.</p>



<p><a name="_ftn4" title="" href="#_ftnref4"><sup>4</sup></a> Momenteel ondersteunt IRIS alleen de volgende <a href="https://nl.wikipedia.org/wiki/Common_Weakness_Enumeration" data-type="link" data-id="https://nl.wikipedia.org/wiki/Common_Weakness_Enumeration" target="_blank" rel="noreferrer noopener">CWE</a>&#8216;s: CWE-022 (<em>path traversal</em>), CWE-078 (injectie van besturingssysteemopdrachten), CWE-079 (<em>cross-site scripting</em>) en CWE-094 (code-injectie).</p>



<p><a href="#_ftnref5" name="_ftn5" title=""><sup>5</sup></a> Versie 2 werd gepubliceerd na het schrijven van dit artikel.</p>



<p><a href="#_ftnref6" name="_ftn6" title=""><sup>6</sup></a> “<i>Static application security testing</i>”</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>L’IA pour améliorer la sécurité du code ? (Partie 1 : sécurité du code généré)</title>
		<link>https://www.smalsresearch.be/ia-pour-ameliorer-securite-du-code-1/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Wed, 30 Jul 2025 14:30:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[assistants]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[source code]]></category>
		<guid isPermaLink="false">/?p=23159</guid>

					<description><![CDATA[L’IAGén permet-elle d’écrire du code informatique plus sécurisé ?]]></description>
										<content:encoded><![CDATA[
<p><a href="/ai-om-de-veiligheid-van-de-code-te-verbeteren-deel-1-veiligheid-van-de-gegenereerde-code/"><em>Nederlandstalige versie</em></a></p>



<p>La communication intense autour de l’intelligence artificielle générative (IAGén) et l’augmentation de son utilisation – au moins en phase de test – que cela soit par peur de rater quelque chose ou pour apporter une réelle valeur ajoutée, conduit à se poser la question de son utilité dans beaucoup de domaines, et, pourquoi pas, afin d’améliorer la sécurité du code. En particulier, l’IAGén permet-elle d’écrire du code informatique plus sécurisé&nbsp;? Peut-elle aider à détecter des vulnérabilités dans du code existant&nbsp;?</p>



<p>Dans cette première partie nous apporterons des éléments de réponse à la première question. Nous traiterons la seconde question dans un autre article.</p>



<h1 class="wp-block-heading">Aspects humains</h1>



<p>Commençons par considérer l’aspect humain du recours à l’utilisation de l’IAGén. Dans une analyse détaillée, dont je recommande vivement la lecture, Simkute <i>et al.</i>&nbsp;<a href="#_ref1">[1]</a> expliquent les raisons pouvant conduire à une perte de productivité des programmeurs ayant recours à l’IAGén. Les chercheurs citent notamment&nbsp;: un glissement du rôle des programmeurs de la production à l’évaluation, une restructuration inutile des flux de travail, des interruptions, et une tendance de l’IAGén à rendre les tâches faciles plus faciles et les tâches difficiles plus difficiles. On s’étonne alors moins des résultats d’une étude de Perry <i>et al.</i>&nbsp;<a href="#_ref2">[2]</a>, de l’université de Stanford. Ceux-ci montrent que les participants ayant accès à un assistant basé sur un modèle d’IA écrivent un code significativement moins sécurisé que ceux sans accès. Pire, les participants avec un accès à l’assistant étaient plus enclins à croire qu’ils écrivaient du code sécurisé, que ceux sans l’assistant. Cette observation de Perry <i>et al.</i> est corroborée par le travail de Klemmer <i>et al.</i>&nbsp;<a href="#_ref3">[3]</a>&nbsp;: l’équipe de chercheurs a interrogé des programmeurs professionnels, et bien que ces derniers se méfient des suggestions des assistants d’IA, il apparait qu’ils surestiment aussi leur propre capacité à examiner les suggestions de ces assistants. L’adoption d’assistants impose donc la mise en place de pratiques de revue de code et d’analyse statique systématiques&nbsp;<a href="#_ref4">[4]</a>.</p>



<h1 class="wp-block-heading">Fiabilité des propositions</h1>



<p>Considérant maintenant la qualité des suggestions de l’IAGén, bien que celle-ci produise en général du code fonctionnellement correct, elle introduit également des problèmes de sécurité&nbsp;<a href="#_ref5">[5]</a>,&nbsp;<a href="#_ref6">[6]</a>. Khoury <i>et al.</i>&nbsp;<a href="#_ref7">[7]</a> ont montré à travers plusieurs exemples que <a href="https://chatgpt.com/" type="link" id="https://chatgpt.com/" target="_blank" rel="noreferrer noopener">ChatGPT 3.5</a> génère souvent du code qui présente des problèmes de sécurité&nbsp;: seuls 5 des 21 cas d’utilisation que les auteurs ont étudiés étaient initialement sécurisés. ChatGPT 3.5 n’a été en mesure de produire du code sécurisé que dans 7 autres cas, et ce, seulement après que les auteurs lui ont explicitement demandé de corriger le code.</p>



<p>Plus récemment, Sivana <i>et al.</i>&nbsp;<a href="#_ref8">[8]</a> concluaient leurs expérimentations en soulignant que ChatGPT, en tant que plateforme, générait plus de vulnérabilités de type <a href="https://fr.wikipedia.org/wiki/Common_Weakness_Enumeration" data-type="link" data-id="https://fr.wikipedia.org/wiki/Common_Weakness_Enumeration" target="_blank" rel="noreferrer noopener">CWE</a> que le site StackOverflow. Indépendamment, Fu <i>et al.</i>&nbsp;<a href="#_ref9">[9]</a> ont montré à travers plusieurs centaines d’échantillons de codes générés par <a href="https://github.com/features/copilot" data-type="link" data-id="https://github.com/features/copilot" target="_blank" rel="noreferrer noopener">Co-Pilot</a> et trouvés sur GitHub, qu’environ un tiers contient des vulnérabilités communes <a href="https://cwe.mitre.org/" data-type="link" data-id="https://cwe.mitre.org/" target="_blank" rel="noreferrer noopener">répertoriées par l’organisme MITRE</a> (certaines faisant partie des 25 plus importantes). Les auteurs recommandent donc aux programmeurs de suivre les meilleures pratiques d’utilisation des outils de génération de code et de toujours vérifier les suggestions de code générées. Des résultats similaires avaient déjà été trouvés par Pearce <i>et al.</i>&nbsp;<a href="#_ref10">[10]</a> deux ans plus tôt.</p>



<p>On pourrait multiplier les références à des résultats similaires. C’est ce qu’ont fait Basic et Giaretta&nbsp;<a href="#_ref11">[11]</a> dans une étude systématique extensive de la littérature académique sur les IAGén et la sécurité du code informatique. Les modèles concernés sont divers et incluent notamment ChatGPT 3.5, GPT 4-Turbo, Copilot, Claude, Sonnet et Gemini Pro. Les auteurs confirment que plusieurs vulnérabilités clés, telles que les injections SQL et les dépassements de mémoire tampon, peuvent être trouvées dans le code généré par les IAGén. Ils signalent aussi que les risques d’empoisonnement des données d’entraînement peuvent non seulement conduire à une génération de code non sécurisé, mais aussi compromettre la détection des vulnérabilités.</p>



<h1 class="wp-block-heading">Empoisonnement de l’IA</h1>



<p>L’empoisonnement d’un modèle génératif de complétion de code consiste à compromettre l’intégrité de ce modèle en intégrant des échantillons de code malicieux dans les données d’entrainement du modèle. Les attaques par porte dérobée, quant à elles, tentent de dissimuler des déclencheurs à l’intérieur du réseau neuronal profond du modèle pendant la phase d’apprentissage, provoquant la génération de résultats choisis par l’adversaire.</p>



<p>Malgré des progrès importants des modèles de complétion de code, ceux-ci restent vulnérables à ce type d’attaques comme l’ont montré Yan <i>et al.</i>&nbsp;<a href="#_ref12">[12]</a> avec CodeBreaker. Pour leur attaque, il n’est pas nécessaire de compromettre un modèle massif pré-entrainé comme <a href="https://github.com/google-research/bert" data-type="link" data-id="https://github.com/google-research/bert" target="_blank" rel="noreferrer noopener">BERT</a> ou <a href="https://github.com/openai/gpt-3" data-type="link" data-id="https://github.com/openai/gpt-3" target="_blank" rel="noreferrer noopener">GPT</a>. En effet ces modèles sont souvent utilisés comme fondation que les victimes règlent finement pour des tâches particulières en utilisant des données spécifiques souvent disponibles publiquement. Il suffit donc alors à l’adversaire de compromettre ces données de réglage fin, ou de téléverser son propre ensemble de données polluées générées avec CodeBreaker. Le code empoisonné généré après l’utilisation de CodeBreaker n’est pas détectable avec des outils de détection de vulnérabilités basés sur des analyses statiques traditionnelles ou des IAGén.</p>



<p>Même si ce type d’attaques est peu probable il pose la question de la provenance de l’outil d’IAGén utilisé et s’inscrit dans la problématique inhérente à l’IAGén actuelle d’obtenir des modèles à la fois sécurisés et exactes&nbsp;<a href="#_ref13">[13]</a>.</p>



<h1 class="wp-block-heading">Importance de la requête</h1>



<p>Tout n’est pas si noir cependant et il faut souligner l’importance du choix des incitations («&nbsp;prompt&nbsp;» en anglais) données à l’IAGén afin d’éviter la génération de code avec des faiblesses potentielles. Götz <i>et al.</i>&nbsp;<a href="#_ref14">[14]</a> montrent qu’alors que 65% du code initialement généré par divers outils d’IAGén est considéré comme non sécurisé par un ingénieur qualifié, ces mêmes outils génèrent du code sécurisé lorsqu’ils sont guidés manuellement. Les auteurs concluent qu’une expertise technique, en particulier dans le domaine de la sécurité est requise pour générer du code sécurisé en utilisant des assistants de codage.</p>



<p>Afin d’obtenir les meilleurs résultats possibles il faut donc que la requête envoyée à l’IAGén soit à la fois précise et clairement interprétable par le modèle. Autrement-dit, le programmeur a tout intérêt à se plier aux exigences de la machine et fournir avec le plus de détails possibles, non seulement la tâche que le modèle doit exécuter, mais aussi le contexte qui décrit cette tâche, ainsi que les données d’entrée et les données de sortie attendues. Cela peut se faire en seule fois ou sous forme de chaîne de pensée suivant un raisonnement particulier.</p>



<p>Il n’existe cependant pas de méthode idéale, mais Bruni <i>et al</i>.&nbsp;<a href="#_ref15">[15]</a> donnent plusieurs exemples simples d’amélioration des incitations. Selon leurs expérimentations la méthode la plus efficace est, après une première requête, de demander à l’IAGén de revoir le code qu’elle a déjà suggéré pour des vulnérabilités potentielles, et enfin de proposer des corrections. Par exemple&nbsp;:</p>



<ul class="wp-block-list">
<li>Requête 1&nbsp;: Génère du code Java pour …</li>



<li>Requête 2&nbsp;: Examine le code suivant et trouve les problèmes de sécurité&nbsp;: <code>&lt;réponse fournie à la requête 1&gt;</code></li>



<li>Requête 3&nbsp;: À partir des problèmes suivants&nbsp;: <code>&lt;problèmes signalés par la requête 2&gt;</code>, améliore le code suivant&nbsp;: <code>&lt;réponse fournie à la requête 1&gt;</code></li>
</ul>



<p>Cette façon de faire suppose bien évidemment que l’IAGén est capable de détecter des vulnérabilités, mais comme nous le verrons dans l’article suivant ce n’est pas encore le cas aujourd’hui.</p>



<h1 class="wp-block-heading">Outils spécialisés</h1>



<p>Nous pouvons néanmoins nous attendre à l’arrivée de nouveaux outils qui pourraient permettre aux programmeurs d’éviter les écueils de sécurité créés par l’IAGén.</p>



<p>Par exemple l’outil <a href="https://github.com/eth-sri/SafeCoder" data-type="link" data-id="https://github.com/eth-sri/SafeCoder" target="_blank" rel="noreferrer noopener">SafeCoder</a> d’ETH Zurich <a href="#_ref16">[16]</a> propose un cadre permettant d’améliorer la sécurité du code généré par une IAGén sans sacrifier la fonctionnalité de ce code. L’outil combine le réglage standard des instructions avec un réglage fin – spécifique à la sécurité, en utilisant des exemples de code sûrs et non-sûrs. Pour créer un ensemble de données de qualité, les auteurs ont mis en place un processus automatisé qui extrait les corrections de vulnérabilités vérifiées à partir des modifications de code enregistrées sur GitHub à l’aide d’un filtrage heuristique et d’une analyse statique basée sur l’outil <a href="/publications/document/?docid=293" data-type="link" data-id="/publications/document/?docid=293" target="_blank" rel="noreferrer noopener">CodeQL</a>. Les résultats montrent que SafeCoder améliore la sécurité du code d’environ 30 % tout en conservant son utilité dans des étalons tels que <a href="https://github.com/openai/human-eval" data-type="link" data-id="https://github.com/openai/human-eval" target="_blank" rel="noreferrer noopener">HumanEval</a> et <a href="https://github.com/hendrycks/test" data-type="link" data-id="https://github.com/hendrycks/test" target="_blank" rel="noreferrer noopener">MMLU</a>. Les auteurs admettent cependant que l’outil n’améliore pas la sécurité de code contenant des vulnérabilités pour lesquelles il n’a pas été entrainé.</p>



<p>En attendant, une façon de procéder pourrait être de combiner un outil d’analyse statique « classique » avec une IAGén en demandant d’abord à l’IAGén de générer le code souhaité, puis en utilisant l’outil d’analyse statique pour analyser ce code. En cas de problème identifié par l’outil, si la correction n’est pas évidente, on peut demander à l’IAGén de modifier celui-ci en indiquant à celle-ci l’erreur précédemment identifiée. On peut recommencer la boucle jusqu’à ce qu’aucun problème ne soit identifié par l’outil d’analyse. Bien évidemment cette procédure fastidieuse pourrait être automatisée dans un cycle de développement logiciel habituel..</p>



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



<p>La première partie de cet article était dédiée à l’impact de l’IAGén sur la qualité du code en termes de sécurité. En l’état actuel des choses, force est de constater que malgré la capacité étonnante des outils d’IAGén à générer du code informatique, ce code peut souvent présenter des problèmes de sécurité – et ce quelque-soit le modèle choisi. Il convient donc d’être très vigilent avant d’utiliser du code généré par des outils d’IAGén. De plus, même si les IAGén peuvent faciliter certaines tâches de programmation, il n’en reste pas moins qu’elles ne portent pas la responsabilité des conséquences potentiellement négatives de leur «&nbsp;travail&nbsp;», responsabilité qui échoit au programmeur et à son employeur.</p>



<p>Les compétences et connaissances en matière de sécurité des programmeurs – dont la tâche évoluera progressivement de créateur de code à contrôleur de code – restent un atout essentiel. L’arrivée de l’IAGén dans le cycle de développement est peut-être une bonne occasion de renforcer la collaboration entre les équipes de sécurité et de développement en établissant (ou renforçant) des groupes de travail dans lesquels sont alignés des objectifs communs afin d’améliorer la sécurité.</p>



<p>Dans la seconde partie nous nous focaliserons sur l’utilisation de l’IAGén pour la détection de vulnérabilités dans le code.</p>



<h1 class="wp-block-heading">Références</h1>



<p><a name="_ref1">[1]</a> A. Simkute, L. Tankelevitch, V. Kewenig, A. E. Scott, A. Sellen, et S. Rintel, «&nbsp;Ironies of generative AI: Understanding and mitigating productivity loss in human-AI interactions&nbsp;», 17 février 2024, <i>arXiv</i>: arXiv:2402.11364. doi: <a href="https://doi.org/10.48550/arXiv.2402.11364" target="_blank" rel="noopener">10.48550/arXiv.2402.11364</a>.</p>



<p><a name="_ref2">[2]</a> N. Perry, M. Srivastava, D. Kumar, et D. Boneh, «&nbsp;Do users write more insecure code with AI assistants?&nbsp;», 16 décembre 2022, <i>arXiv</i>: arXiv:2211.03622. Consulté le: 3 octobre 2023. [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2211.03622" target="_blank" rel="noopnener">http://arxiv.org/abs/2211.03622</a></p>



<p><a name="_ref3">[3]</a> J. H. Klemmer <i>et al.</i>, «&nbsp;Using AI assistants in software development: A qualitative study on security practices and concerns&nbsp;», 14 octobre 2024. doi: <a href="https://doi.org/10.1145/3658644.3690283" target="_blank" rel="noopener">10.1145/3658644.3690283</a>.</p>



<p><a name="_ref4">[4]</a> J. Ganseman, «&nbsp;LLM pour code&nbsp;: the good, the bad and the ugly&nbsp;», Smals Research Blog. Consulté le: 18 octobre 2023. [En ligne]. Disponible sur: <a href="/llms-pour-code/" target="_blank" rel="noopnener">/llms-pour-code/</a></p>



<p><a name="_ref5">[5]</a> A. Chowdhery <i>et al.</i>, «&nbsp;PaLM: scaling language modeling with pathways&nbsp;», 5 octobre 2022, <i>arXiv</i>: arXiv:2204.02311. doi: <a href="https://doi.org/10.48550/arXiv.2204.02311" target="_blank" rel="noopener">10.48550/arXiv.2204.02311</a>.</p>



<p><a name="_ref6">[6]</a> M. Chen <i>et al.</i>, «&nbsp;Evaluating large language models trained on code&nbsp;», 14 juillet 2021, <i>arXiv</i>: arXiv:2107.03374. doi: <a href="https://doi.org/10.48550/arXiv.2107.03374" target="_blank" rel="noopener">10.48550/arXiv.2107.03374</a>.</p>



<p><a name="_ref7">[7]</a> R. Khoury, A. R. Avila, J. Brunelle, et B. M. Camara, «&nbsp;How secure is code generated by ChatGPT?&nbsp;», 19 avril 2023, <i>arXiv</i>: arXiv:2304.09655. doi: <a href="https://doi.org/10.48550/arXiv.2304.09655" target="_blank" rel="noopener">10.48550/arXiv.2304.09655</a>.</p>



<p><a name="_ref8">[8]</a> S. Hamer, M. d’Amorim, et L. Williams, «&nbsp;Just another copy and paste? Comparing the security vulnerabilities of ChatGPT generated code and StackOverflow answers&nbsp;», 22 mars 2024, <i>arXiv</i>: arXiv:2403.15600. doi: <a href="https://doi.org/10.48550/arXiv.2403.15600" target="_blank" rel="noopener">10.48550/arXiv.2403.15600</a>.</p>



<p><a name="_ref9">[9]</a> Y. Fu <i>et al.</i>, «&nbsp;Security weaknesses of copilot generated code in GitHub&nbsp;», 4 avril 2024, <i>arXiv</i>: arXiv:2310.02059. doi: <a href="https://doi.org/10.48550/arXiv.2310.02059" target="_blank" rel="noopener">10.48550/arXiv.2310.02059</a>.</p>



<p><a name="_ref10">[10]</a> H. Pearce, B. Ahmad, B. Tan, B. Dolan-Gavitt, et R. Karri, «&nbsp;Asleep at the keyboard? Assessing the security of GitHub Copilot’s code contributions&nbsp;», in <i>2022 IEEE Symposium on Security and Privacy (SP)</i>, San Francisco, CA, USA: IEEE, mai 2022, p. 754‑768. doi: <a href="https://doi.org/10.1109/sp46214.2022.9833571" target="_blank" rel="noopener">10.1109/sp46214.2022.9833571</a>.</p>



<p><a name="_ref11">[11]</a> E. Basic et A. Giaretta, «&nbsp;Large language models and code security: A systematic literature review&nbsp;», 19 décembre 2024, <i>arXiv</i>: arXiv:2412.15004. doi: <a href="https://doi.org/10.48550/arXiv.2412.15004" target="_blank" rel="noopener">10.48550/arXiv.2412.15004</a>.</p>



<p><a name="_ref12">[12]</a> S. Yan <i>et al.</i>, «&nbsp;An LLM-assisted easy-to-trigger backdoor attack on code completion models: Injecting disguised vulnerabilities against strong detection&nbsp;», présenté à 33rd USENIX Security Symposium, Philadelphia, PA, USA, août 2024.</p>



<p><a name="_ref13">[13]</a> E.-M. El-Mhamdi <i>et al.</i>, «&nbsp;On the impossible safety of large AI models&nbsp;», 9 mai 2023, <i>arXiv</i>: arXiv:2209.15259. Consulté le: 17 octobre 2023. [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2209.15259" target="_blank" rel="noopnener">http://arxiv.org/abs/2209.15259</a></p>



<p><a name="_ref14">[14]</a> S. Götz et A. Schaad, «&nbsp;“You still have to study” &#8211; On the security of LLM generated code&nbsp;», août 2024, [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2408.07106" target="_blank" rel="noopnener">https://arxiv.org/abs/2408.07106</a></p>



<p><a name="_ref15">[15]</a> M. Bruni, F. Gabrielli, M. Ghafari, et M. Kropp, «&nbsp;Benchmarking prompt engineering rechniques for secure code generation with GPT models&nbsp;», 9 février 2025, <i>arXiv</i>: arXiv:2502.06039. doi: <a href="https://doi.org/10.48550/arXiv.2502.06039" target="_blank" rel="noopener">10.48550/arXiv.2502.06039</a>.</p>



<p><a name="_ref16">[16]</a> J. He, M. Vero, G. Krasnopolska, et M. Vechev, «&nbsp;Instruction tuning for secure code generation&nbsp;», 12 juillet 2024, <i>arXiv</i>: arXiv:2402.09497. doi: <a href="https://doi.org/10.48550/arXiv.2402.09497" target="_blank" rel="noopener">10.48550/arXiv.2402.09497</a>.</p>



<p>_________________________<br><br><em>Ce post est une contribution individuelle de Fabien A. P. Petitcolas, spécialisé en sécurité informatique chez Smals Research. Cet article est écrit en son nom propre et n&#8217;impacte en rien le point de vue de Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI om de veiligheid van de code te verbeteren? (Deel 1: veiligheid van de gegenereerde code)</title>
		<link>https://www.smalsresearch.be/ai-om-de-veiligheid-van-de-code-te-verbeteren-deel-1-veiligheid-van-de-gegenereerde-code/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Wed, 30 Jul 2025 14:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[assistants]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[source code]]></category>
		<guid isPermaLink="false">/?p=23190</guid>

					<description><![CDATA[Kan GenAI worden gebruikt om veiligere computercode te schrijven?]]></description>
										<content:encoded><![CDATA[
<p><em><a href="/ia-pour-ameliorer-securite-du-code-1/" data-type="link" data-id="/ia-pour-ameliorer-securite-du-code-1/">Version en français</a></em></p>



<p>De uitgebreide communicatie rond generatieve artificiële intelligentie (GenAI) en het toenemende gebruik ervan – althans in de testfase – uit angst om iets te missen of om een echte meerwaarde te bieden, roept de vraag op of het in veel domeinen nuttig is, en waarom niet, om de veiligheid van code te verbeteren. Meer bepaald: kan GenAI worden gebruikt om veiligere computercode te schrijven? Kan het helpen bij het opsporen van kwetsbaarheden in bestaande code?</p>



<p>In dit eerste deel geven we een antwoord op de eerste vraag. De tweede vraag komt in een ander artikel aan bod.</p>



<h1 class="wp-block-heading">Menselijke aspecten</h1>



<p>Laten we beginnen met het menselijke aspect van het gebruik van GenAI. In een gedetailleerde analyse, die ik ten zeerste aanbeveel, leggen Simkute <i>et al.</i>&nbsp;<a href="#_ref1">[1]</a> de redenen uit die kunnen leiden tot een productiviteitsverlies van programmeurs die een beroep doen op GenAI. Onderzoekers hebben het onder andere over: een verglijding van de programmeurrol van productie naar evaluatie, een onnuttige herstructurering van werkstromen, onderbrekingen en de neiging van GenAI om makkelijke taken nog gemakkelijker en moeilijke taken nog moeilijker te maken. De resultaten van een studie van Perry <i>et al</i>.&nbsp;<a href="#_ref2">[2]</a>, van Stanford University verbazen ons dan minder. Deze tonen aan dat deelnemers die toegang hebben tot een codeerassistent op basis van een AI-model aanzienlijk minder veilige code schrijven dan deelnemers zonder toegang. Erger nog, deelnemers met toegang tot de assistent geloofden vaker dat ze veilige code schreven dan deelnemers zonder toegang. Deze observatie van Perry <i>et al.</i> wordt bevestigd door het werk van Klemmer <i>et al.</i>&nbsp;<a href="#_ref3">[3]</a>: het onderzoeksteam ondervroeg professionele programmeurs, en hoewel zij wantrouwig staan tegenover suggesties van AI-codeerassistenten, blijkt dat zij ook hun eigen vermogen om de suggesties van deze codeerassistenten te beoordelen overschatten. Het gebruik van codeerassistenten vereist daarom de implementatie van systematische codecontrole en statische analyse&nbsp;<a href="#_ref4">[4]</a>.</p>



<h1 class="wp-block-heading">Betrouwbaarheid van de
voorstellen</h1>



<p>Wat betreft de kwaliteit van de suggesties van GenAI: hoewel het over het algemeen functioneel correcte code oplevert, introduceert het ook veiligheidsproblemen&nbsp;<a href="#_ref5">[5]</a>,&nbsp;<a href="#_ref6">[6]</a>. Khoury <i>et al.</i>&nbsp;<a href="#_ref7">[7]</a> hebben met behulp van meerdere voorbeelden aangetoond dat <a href="https://chatgpt.com/" target="_blank" rel="noreferrer noopener">ChatGPT 3.5</a> vaak code genereert die voor veiligheidsproblemen kan zorgen&nbsp;: slechts 5 van de 21 use cases die de auteurs bestudeerd hebben waren aanvankelijk beveiligd. ChatGPT 3.5 was in staat om beveiligde code aan te maken voor slechts 7 gevallen en dit was pas mogelijk nadat de auteurs expliciet vroegen om de code te verbeteren.</p>



<p>Meer recentelijk concludeerden Sivana<i> et al</i>.&nbsp;<a href="#_ref8">[8]</a> dat ChatGPT als platform meer <a href="https://nl.wikipedia.org/wiki/Common_Weakness_Enumeration" target="_blank" rel="noreferrer noopener">CWE-kwetsbaarheden</a> genereerde dan de website StackOverflow. Onafhankelijk daarvan hebben Fu <i>et al</i>.&nbsp;<a href="#_ref9">[9]</a> aan de hand van honderden door <a href="https://github.com/features/copilot" target="_blank" rel="noreferrer noopener">Copilot</a> gegenereerde codevoorbeelden die op GitHub zijn gevonden, aangetoond dat ongeveer een derde daarvan veelvoorkomende kwetsbaarheden bevat die door de organisatie <a href="https://cwe.mitre.org/" target="_blank" rel="noreferrer noopener">MITRE</a> zijn geïnventariseerd (waarvan sommige tot de 25 belangrijkste behoren). De auteurs raden programmeurs daarom aan om de beste praktijken voor het gebruik van codegeneratietools te volgen en de gegenereerde codesuggesties altijd te controleren. Soortgelijke resultaten waren al gevonden door Pearce <i>et al.</i>&nbsp;<a href="#_ref10">[10]</a> twee jaar eerder.</p>



<p>Er zijn nog veel meer voorbeelden van soortgelijke resultaten. Dat hebben Basic en Giaretta&nbsp;<a href="#_ref11">[11]</a> gedaan in een uitgebreide systematische studie van de academische literatuur over GenAI en de veiligheid van computercode. De betrokken modellen zijn divers en omvatten onder meer ChatGPT 3.5, GPT 4-Turbo, Copilot, Claude, Sonnet en Gemini Pro. De auteurs bevestigen dat verschillende belangrijke kwetsbaarheden, zoals SQL-injecties en bufferoverflows, kunnen worden aangetroffen in de code die door GenAI wordt gegenereerd. Ze wijzen er ook op dat het risico van vergiftiging van trainingsgegevens niet alleen kan leiden tot het genereren van onveilige code, maar ook de detectie van kwetsbaarheden in gevaar kan brengen.</p>



<h1 class="wp-block-heading">Vergiftiging van AI</h1>



<p>Het vergiftigen van een generatief model voor codeaanvulling bestaat uit het compromitteren van de integriteit van dit model door kwaadaardige codevoorbeelden in de trainingsgegevens van het model te integreren. Backdoor-aanvallen proberen tijdens de trainingsfase triggers te verbergen in het diepe neurale netwerk van het model, waardoor resultaten worden gegenereerd die door de tegenstander zijn gekozen.</p>



<p>Ondanks aanzienlijke vooruitgang op het gebied van codeaanvullingsmodellen blijven deze kwetsbaar voor dit soort aanvallen, zoals Yan <i>et al</i>.&nbsp;<a href="#_ref12">[12]</a> met CodeBreaker hebben aangetoond. Voor hun aanval is het niet nodig om een vooraf getraind groot model zoals <a href="https://github.com/google-research/bert">BERT</a> of <a href="https://github.com/openai/gpt-3">GPT</a> te compromitteren. Deze modellen worden namelijk vaak gebruikt als basis die slachtoffers nauwkeurig afstemmen op specifieke taken met behulp van specifieke gegevens die vaak openbaar beschikbaar zijn. De tegenstander hoeft dus alleen maar deze finetuning data te compromitteren of zijn eigen set vervuilde data, gegenereerd met CodeBreaker, te uploaden. De vergiftigde code die na gebruik van CodeBreaker wordt gegenereerd, is niet detecteerbaar met kwetsbaarheidsdetectietools op basis van traditionele statische analyses of GenAI.</p>



<p>Hoewel dit soort aanvallen onwaarschijnlijk is, rijst de vraag waar de gebruikte GenAI-tool vandaan komt en past dit in de problematiek die inherent is aan de huidige GenAI om zowel veilige als nauwkeurige modellen te verkrijgen&nbsp;<a href="#_ref13">[13]</a>.</p>



<h1 class="wp-block-heading">Belang van de prompt</h1>



<p>Het is echter niet allemaal kommer en kwel en het belang van de keuze van de prompts die aan GenAI worden gegeven om het genereren van code met potentiële zwakke punten te voorkomen, moet worden benadrukt. Götz <i>et al</i>.&nbsp;<a href="#_ref14">[14]</a> tonen aan dat, terwijl 65% van de code die oorspronkelijk door verschillende GenAI-tools werd gegenereerd, door een gekwalificeerde ingenieur als onveilig wordt beschouwd, dezelfde tools veilige code genereren wanneer ze handmatig worden aangestuurd. De auteurs concluderen dat technische expertise, met name op het gebied van beveiliging, vereist is om veilige code te genereren met behulp van code AI-codeerassistenten.</p>



<p>Om de best mogelijke resultaten te verkrijgen, moet de prompt die aan GenAI wordt gegeven zowel nauwkeurig als duidelijk interpreteerbaar zijn voor het model. Met andere woorden: de programmeur heeft er alle belang bij om zich aan de eisen van de machine te houden en zo gedetailleerd mogelijk niet alleen de taak die het model moet uitvoeren, maar ook de context waarin deze taak plaatsvindt en de verwachte invoer- en uitvoergegevens te specificeren. Dit kan in één keer gebeuren of in de vorm van een chain-of-thoughts volgens een bepaalde redenering.</p>



<p>Er bestaat echter geen ideale methode, maar Bruni <i>et al.</i>&nbsp;<a href="#_ref15">[15]</a> geven verschillende eenvoudige voorbeelden van verbetering van prompts. Volgens hun experimenten is de meest effectieve methode om, na een eerste prompt, GenAI te vragen de code die het al heeft voorgesteld op mogelijke kwetsbaarheden te herzien en vervolgens correcties voor te stellen. Bijvoorbeeld:</p>



<ul class="wp-block-list">
<li>Prompt 1: genereer Java-code voor &#8230;</li>



<li>Prompt 2: analyseer de volgende code en vind de beveiligingsproblemen: <code>&lt;antwoord op prompt 1&gt;</code></li>



<li>Prompt 3: op basis van de volgende problemen: <code>&lt;problemen gemeld door prompt 2&gt;</code>, verbeter de volgende code: <code>&lt;antwoord gegeven op prompt 1&gt;</code></li>
</ul>



<p>Deze werkwijze veronderstelt uiteraard dat GenAI in staat is om kwetsbaarheden op te sporen, maar zoals we in het volgende artikel zullen zien, is dat vandaag nog niet het geval.</p>



<h1 class="wp-block-heading">Gespecialiseerde tools</h1>



<p>We kunnen echter nieuwe tools verwachten die programmeurs in staat zullen stellen om de veiligheidsrisico&#8217;s van GenAI te vermijden.</p>



<p>Zo biedt de tool <a href="https://github.com/eth-sri/SafeCoder" target="_blank" rel="noreferrer noopener">SafeCoder</a> van ETH Zürich&nbsp;<a href="#_ref16">[16]</a> een kader om de veiligheid van door GenAI gegenereerde code te verbeteren zonder de functionaliteit van die code in het gedrang te brengen. De tool combineert de standaardinstellingen van instructies met een veiligheidsgerichte finetuning aan de hand van veilige en onveilige codevoorbeelden. Om een dataset van hoge kwaliteit te creëren, hebben de auteurs een geautomatiseerd proces opgezet dat geverifieerde kwetsbaarheidscorrecties uit de op GitHub geregistreerde codewijzigingen haalt met behulp van heuristische filtering en statische analyse op basis van de <a href="/publications/document/?docid=293" target="_blank" rel="noreferrer noopener">CodeQL-tool</a>. De resultaten tonen aan dat SafeCoder de codeveiligheid met ongeveer 30% verbetert, terwijl de bruikbaarheid in benchmarks zoals <a href="https://github.com/openai/human-eval" target="_blank" rel="noreferrer noopener">HumanEval</a> en <a href="https://github.com/hendrycks/test" target="_blank" rel="noreferrer noopener">MMLU</a> behouden blijft. De auteurs geven echter toe dat de tool de veiligheid van code met kwetsbaarheden waarvoor hij niet is getraind, niet verbetert.</p>



<p>In de tussentijd kan een manier zijn om een traditionele statische analyse te combineren met GenAI door eerst de GenAI te vragen de gewenste code te genereren en vervolgens de statische analyse te gebruiken om deze code te analyseren. Als de tool een probleem identificeert en de correctie niet voor de hand ligt, kan men de GenAI vragen om de code aan te passen, waarbij de eerder geïdentificeerde fout wordt aangegeven. De lus kan worden herhaald totdat er geen probleem meer wordt geïdentificeerd door het analyse tool. Natuurlijk kan deze omslachtige procedure worden geautomatiseerd in een normale softwareontwikkelingscyclus.</p>



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



<p>Het eerste deel van dit artikel ging over de impact van GenAI op de kwaliteit van code in termen van beveiliging. In de huidige situatie moet worden vastgesteld dat, ondanks het verbazingwekkende vermogen van GenAI-tools om computercode te genereren, deze code vaak veiligheidsproblemen kan opleveren, ongeacht het gekozen model. Het is daarom raadzaam om zeer waakzaam te zijn vooraleer we code gebruiken die door GenAI-tools is gegenereerd. Bovendien kunnen GenAI-tools bepaalde programmeertaken vergemakkelijken, maar dat neemt niet weg dat zij niet verantwoordelijk zijn voor de mogelijke negatieve gevolgen van hun “werk”. Die verantwoordelijkheid ligt bij de programmeur en zijn werkgever.</p>



<p>De vaardigheden en kennis op het gebied van veiligheid van programmeurs – wier taak geleidelijk zal evolueren van codeschrijver naar codecontroleur – blijven een essentiële troef. De komst van GenAI in de ontwikkelcyclus is misschien een goede gelegenheid om de samenwerking tussen beveiligings- en ontwikkelingsteams te versterken door werkgroepen op te richten (of te versterken) waarin gemeenschappelijke doelstellingen worden afgestemd om de beveiliging te verbeteren.</p>



<p>In het tweede deel zullen we ons concentreren op het gebruik van GenAI voor het opsporen van kwetsbaarheden in code.</p>



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



<p><a name="_ref1">[1]</a> A. Simkute, L. Tankelevitch, V. Kewenig, A. E. Scott, A. Sellen, et S. Rintel, « Ironies of generative AI: Understanding and mitigating productivity loss in human-AI interactions », 17 février 2024, <i>arXiv</i>: arXiv:2402.11364. doi: <a href="https://doi.org/10.48550/arXiv.2402.11364" target="_blank" rel="noopener">10.48550/arXiv.2402.11364</a>.</p>



<p><a name="_ref2">[2]</a> N. Perry, M. Srivastava, D. Kumar, et D. Boneh, « Do users write more insecure code with AI assistants? », 16 décembre 2022, <i>arXiv</i>: arXiv:2211.03622. Consulté le: 3 octobre 2023. [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2211.03622" target="_blank" rel="noopnener">http://arxiv.org/abs/2211.03622</a></p>



<p><a name="_ref3">[3]</a> J. H. Klemmer <i>et al.</i>, « Using AI assistants in software development: A qualitative study on security practices and concerns », 14 octobre 2024. doi: <a href="https://doi.org/10.1145/3658644.3690283" target="_blank" rel="noopener">10.1145/3658644.3690283</a>.</p>



<p><a name="_ref4">[4]</a> J. Ganseman, « LLM pour code&nbsp;: the good, the bad and the ugly », Smals Research Blog. Consulté le: 18 octobre 2023. [En ligne]. Disponible sur: <a href="/llms-pour-code/" target="_blank" rel="noopnener">/llms-pour-code/</a></p>



<p><a name="_ref5">[5]</a> A. Chowdhery <i>et al.</i>, « PaLM: scaling language modeling with pathways », 5 octobre 2022, <i>arXiv</i>: arXiv:2204.02311. doi: <a href="https://doi.org/10.48550/arXiv.2204.02311" target="_blank" rel="noopener">10.48550/arXiv.2204.02311</a>.</p>



<p><a name="_ref6">[6]</a> M. Chen <i>et al.</i>, « Evaluating large language models trained on code », 14 juillet 2021, <i>arXiv</i>: arXiv:2107.03374. doi: <a href="https://doi.org/10.48550/arXiv.2107.03374" target="_blank" rel="noopener">10.48550/arXiv.2107.03374</a>.</p>



<p><a name="_ref7">[7]</a> R. Khoury, A. R. Avila, J. Brunelle, et B. M. Camara, « How secure is code generated by ChatGPT? », 19 avril 2023, <i>arXiv</i>: arXiv:2304.09655. doi: <a href="https://doi.org/10.48550/arXiv.2304.09655" target="_blank" rel="noopener">10.48550/arXiv.2304.09655</a>.</p>



<p><a name="_ref8">[8]</a> S. Hamer, M. d’Amorim, et L. Williams, « Just another copy and paste? Comparing the security vulnerabilities of ChatGPT generated code and StackOverflow answers », 22 mars 2024, <i>arXiv</i>: arXiv:2403.15600. doi: <a href="https://doi.org/10.48550/arXiv.2403.15600" target="_blank" rel="noopener">10.48550/arXiv.2403.15600</a>.</p>



<p><a name="_ref9">[9]</a> Y. Fu <i>et al.</i>, « Security weaknesses of copilot generated code in GitHub », 4 avril 2024, <i>arXiv</i>: arXiv:2310.02059. doi: <a href="https://doi.org/10.48550/arXiv.2310.02059" target="_blank" rel="noopener">10.48550/arXiv.2310.02059</a>.</p>



<p><a name="_ref10">[10]</a> H. Pearce, B. Ahmad, B. Tan, B. Dolan-Gavitt, et R. Karri, « Asleep at the keyboard? Assessing the security of GitHub Copilot’s code contributions », in <i>2022 IEEE Symposium on Security and Privacy (SP)</i>, San Francisco, CA, USA: IEEE, mai 2022, p. 754‑768. doi: <a href="https://doi.org/10.1109/sp46214.2022.9833571" target="_blank" rel="noopener">10.1109/sp46214.2022.9833571</a>.</p>



<p><a name="_ref11">[11]</a> E. Basic et A. Giaretta, « Large language models and code security: A systematic literature review », 19 décembre 2024, <i>arXiv</i>: arXiv:2412.15004. doi: <a href="https://doi.org/10.48550/arXiv.2412.15004" target="_blank" rel="noopener">10.48550/arXiv.2412.15004</a>.</p>



<p><a name="_ref12">[12]</a> S. Yan <i>et al.</i>, « An LLM-assisted easy-to-trigger backdoor attack on code completion models: Injecting disguised vulnerabilities against strong detection », présenté à 33rd USENIX Security Symposium, Philadelphia, PA, USA, août 2024.</p>



<p><a name="_ref13">[13]</a> E.-M. El-Mhamdi <i>et al.</i>, « On the impossible safety of large AI models », 9 mai 2023, <i>arXiv</i>: arXiv:2209.15259. Consulté le: 17 octobre 2023. [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2209.15259" target="_blank" rel="noopnener">http://arxiv.org/abs/2209.15259</a></p>



<p><a name="_ref14">[14]</a> S. Götz et A. Schaad, « “You still have to study” &#8211; On the security of LLM generated code », août 2024, [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2408.07106" target="_blank" rel="noopnener">https://arxiv.org/abs/2408.07106</a></p>



<p><a name="_ref15">[15]</a> M. Bruni, F. Gabrielli, M. Ghafari, et M. Kropp, « Benchmarking Prompt Engineering Techniques for Secure Code Generation with GPT Models », 9 février 2025, <i>arXiv</i>: arXiv:2502.06039. doi: <a href="https://doi.org/10.48550/arXiv.2502.06039" target="_blank" rel="noopener">10.48550/arXiv.2502.06039</a>.</p>



<p><a name="_ref16">[16]</a> J. He, M. Vero, G. Krasnopolska, et M. Vechev, « Instruction tuning for secure code generation », 12 juillet 2024, <i>arXiv</i>: arXiv:2402.09497. doi: <a href="https://doi.org/10.48550/arXiv.2402.09497" target="_blank" rel="noopener">10.48550/arXiv.2402.09497</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LLM pour code&#160;: the Good, the Bad and the Ugly</title>
		<link>https://www.smalsresearch.be/llms-pour-code/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Thu, 07 Sep 2023 10:01:46 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[computational creativity]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[source code]]></category>
		<guid isPermaLink="false">/?p=19037</guid>

					<description><![CDATA[Quelle est la situation dans le domaine de la génération de code, et que devons-nous encore prendre en compte ?]]></description>
										<content:encoded><![CDATA[
<p><em>Dit artikel is ook te lezen <a href="/llms-voor-code/">in het Nederlands</a>.</em></p>



<p><em>Cet article a été traduit du néerlandais. Les liens peuvent pointer vers des sources en néerlandais.</em></p>



<p>Dans un <a href="/de-ai-augmented-developer/">article précédent</a>, nous avons discuté de manière générale du potentiel de l&#8217;IA générative dans le <a href="https://www.servicenow.com/products/devops/what-is-sdlc.html">Software Development Lifecycle</a>. Examinons maintenant la question du point de vue du développeur&nbsp;: quel est l&#8217;état d&#8217;avancement de la génération de code et que devons-nous encore prendre en compte&nbsp;? Pour faire court&nbsp;: les assistants IA ou les plugins pour IDE sont une aubaine pour ceux qui savent en faire bon usage, mais comme tous les systèmes d&#8217;IA, ils présentent aussi des inconvénients.</p>



<h2 class="wp-block-heading"><strong>Avant-propos</strong></h2>



<p>Une partie de cette <a href="https://theresanaiforthat.com/">hype</a> en termes d&#8217;IA générative est propulsée par des <a href="https://en.wikipedia.org/wiki/Large_language_model">modèles de langages puissants</a> &#8211; les grands modèles de langue ou LLM. Depuis la sortie du GPT-3 en 2020, ces modèles parviennent à écrire des textes normaux d&#8217;une certaine longueur. De là, il n&#8217;y a qu&#8217;un pas vers les langages de programmation. En effet, ils ont aussi une syntaxe et une sémantique.</p>



<p>Dans la pratique, il existe de nombreuses variantes de modèles de langue, chacun ayant ses forces et ses faiblesses, en fonction des choix faits par les créateurs pour les entraîner, et en fonction des données d&#8217;entraînement qui les sous-tendent. Testez vous-même certains des modèles open source existants sur votre propre ordinateur via l&#8217;outil <a href="https://gpt4all.io/index.html">GPT4All</a> (voir également <a href="/publications/document/?docid=270">notre quick review</a> de cet outil).</p>



<p>Le code informatique consiste en une collection de fichiers texte. Rien n&#8217;empêche un modèle de langue d&#8217;essayer de prédire les différents <a href="https://www.techtarget.com/searchapparchitecture/definition/parser">tokens (= unités grammaticales)</a> qui composent le code, plutôt que des mots. Cependant, contrairement au texte brut, le code a beaucoup moins de tolérance à l&#8217;erreur&nbsp;: la moindre faute d&#8217;orthographe ou la plus petite variation peut invalider un morceau de code ou lui faire exécuter quelque chose de complètement différent.</p>



<p>Pourtant, aujourd&#8217;hui, les plus grands modèles de langue, tels que GPT-3.5 et les versions ultérieures, peuvent produire d&#8217;eux-mêmes des morceaux de code informatique tout à fait corrects en réponse à une requête. Cette fonctionnalité est due à la quantité massive de textes sur lesquels ils sont formés, notamment de nombreux tutoriels, articles de blog, questions et réponses provenant de forums de développeurs populaires tels que <a href="https://stackoverflow.com/">StackOverflow</a>, et code documenté provenant de repositories de code publics tels que <a href="https://github.com/">Github</a>.</p>



<h2 class="wp-block-heading"><strong>Canards en plastique bavards</strong></h2>



<p>Depuis <a href="https://en.wikipedia.org/wiki/Socratic_dialogue">Socrate</a>, le dialogue est un moyen efficace de parvenir à de nouvelles perspectives. Ce n&#8217;est pas pour rien que le <a href="https://blog.codinghorror.com/rubber-duck-problem-solving/">rubber ducking</a> est une méthode de correction de bugs qui revient dans tous les cours de génie logiciel. Il existe entre-temps plusieurs plugins qui mettent à disposition une interface de chat alimentée par l&#8217;IA dans l&#8217;IDE même (par exemple <a href="https://github.com/timkmecl/chatgpt-vscode">ceux pour VS Code</a>, beaucoup d&#8217;autres peuvent être trouvés via les <a href="https://marketplace.visualstudio.com/search?term=gpt&amp;target=VSCode">marketplaces pour VS Code</a>&nbsp;ou&nbsp;<a href="https://plugins.jetbrains.com/search?products=idea_ce&amp;search=gpt">IntelliJ IDEA</a>). Si ces plugins utilisent un service cloud externe, il vous suffit d&#8217;entrer votre propre clé API.</p>



<p>Un cadre de dialogue avec une dynamique de questions-réponses peut être bien utilisé pour générer des morceaux de code relativement autonomes, sans trop de dépendances externes. En général, pour obtenir le meilleur résultat, il faut pouvoir énoncer facilement toutes les conditions préalables et les hypothèses nécessaires dans le dialogue lui-même, de manière à ce qu&#8217;il s&#8217;inscrive dans la fenêtre contextuelle du modèle de langue. Les use cases comprennent entre autres&nbsp;:</p>



<ul class="wp-block-list">
<li>La génération <em>from scratch</em> d&#8217;une version initiale du code ou d&#8217;un fichier de configuration</li>



<li>La génération de fonctions ou de procédures relativement courtes à partir d&#8217;une description</li>



<li>La génération de <em>code snippets</em> autonomes&nbsp;: requêtes SQL, expressions régulières&#8230;</li>



<li>Demande de modification d&#8217;un morceau de code ou d&#8217;un fichier de configuration</li>



<li>Correction de bugs&nbsp;: recherche d&#8217;erreurs dans un code qui ne fonctionne pas, poser des questions sur une erreur</li>



<li>Faire expliquer ce qu&#8217;un morceau de code fait</li>
</ul>



<p>Les plus grands modèles de langue disposent de fenêtres contextuelles de plusieurs milliers de mots dans lesquelles il est possible d&#8217;insérer toutes les informations nécessaires. Un modèle de langue open source plus petit, installé localement sur du matériel moins puissant, sera sans aucun doute moins performant. Voici quelques exemples de conversations avec GPT-4 d&#8217;OpenAI, qui montrent qu&#8217;il est possible d&#8217;aller très loin avec quelques questions bien ciblées (cliquez sur l&#8217;image pour obtenir la pleine résolution)&nbsp;:</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-large"><a href="/wp-content/uploads/2023/08/2023-08-22_16h05_32.png"><img decoding="async" width="143" height="1024" data-id="18959" src="/wp-content/uploads/2023/08/2023-08-22_16h05_32-143x1024.png" alt="" class="wp-image-18959" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-143x1024.png 143w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-42x300.png 42w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-286x2048.png 286w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-scaled.png 358w" sizes="(max-width: 143px) 100vw, 143px" /></a><figcaption class="wp-element-caption">Exemple de conversation sur le code avec le modèle GPT-4 de ChatGPT&nbsp;: génération d&#8217;une configuration pour un remote server VNC sur un système Ubuntu partagé.</figcaption></figure>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/2023-08-22_16h17_10.png"><img loading="lazy" decoding="async" width="198" height="1024" data-id="18958" src="/wp-content/uploads/2023/08/2023-08-22_16h17_10-198x1024.png" alt="" class="wp-image-18958" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-198x1024.png 198w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-297x1536.png 297w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-58x300.png 58w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-768x3977.png 768w" sizes="auto, (max-width: 198px) 100vw, 198px" /></a><figcaption class="wp-element-caption">Exemple de conversation avec le modèle GPT-4 de ChatGPT&nbsp;: génération d&#8217;une requête SQL pour la transposition d&#8217;un tableau. La solution finale proposée utilise des techniques assez sophistiquées avec des procédures stockées.</figcaption></figure>
</figure>



<h2 class="wp-block-heading"><strong>Complétion de code sous stéroïdes</strong></h2>



<p>Au cours du développement, un développeur travaille sur de nombreux fichiers dans un IDE. À des endroits aléatoires de ces fichiers, le code doit être modifié, supprimé ou écrit. L&#8217;édition de code existant de cette manière n&#8217;a pas grand-chose à voir avec le dialogue&nbsp;; en fait, nous préférerions utiliser l&#8217;auto-complétion avancée dans ce cas. Les modèles de langue peuvent également faire l&#8217;affaire, mais les modèles les plus appropriés sont plutôt ceux formés aux tâches de &#8220;remplir au milieu&#8221; &#8211; et qui peuvent donc prendre en compte le code présent avant et après l&#8217;endroit que l&#8217;on édite.</p>



<p>Après la sortie de GPT-3, OpenAI a travaillé avec Microsoft (qui possède Github) pour créer un modèle de langue spécialisé, formé exactement pour ce use case. Cette variante a été nommée <a href="https://openai.com/blog/openai-codex">Codex</a>, et le premier outil à l&#8217;utiliser a été <a href="https://github.com/features/copilot">Github CoPilot</a>. Depuis, nous en sommes à plusieurs versions, mais les plugins pour <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot">VSCode</a> et <a href="https://plugins.jetbrains.com/plugin/17718-github-copilot">IntelliJ</a> fonctionnent toujours de la même manière&nbsp;: via un raccourci clavier dans l&#8217;éditeur, on peut utiliser CoPilot pour récupérer diverses suggestions, générées par Codex, qui pourraient correspondre à l&#8217;endroit où se trouve le curseur.</p>



<p>D&#8217;après notre expérience actuelle, le contexte pris en compte est généralement limité au contenu (partiel) du fichier édité. Cela implique évidemment le <a href="https://resources.github.com/copilot-trust-center/">téléchargement vers le modèle de langue</a> &#8211; veillez donc à respecter les directives en matière de confidentialité lorsque vous utilisez un service externe. Pour l&#8217;instant, nous semblons obtenir de meilleurs résultats dans les projets de programmation composés de quelques gros fichiers, tels que les pages web avec JavaScript en ligne, ou Jupyter Notebooks en Python, où il y a souvent un gros fichier à parcourir qui contient à la fois la documentation, le code et l’output. En revanche, dans les projets comportant de nombreux petits fichiers, il semble plus difficile de générer de bonnes suggestions, et il est plus important de disposer d&#8217;une documentation supplémentaire dans le fichier édité afin que le modèle de langue puisse puiser dans suffisamment d&#8217;informations contextuelles.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/copilot-in-vscode-example.png"><img loading="lazy" decoding="async" width="1024" height="604" src="/wp-content/uploads/2023/08/copilot-in-vscode-example-1024x604.png" alt="" class="wp-image-18964" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-1024x604.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-300x177.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-768x453.png 768w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example.png 1276w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Github CoPilot dans VSCode. Suivant un schéma déjà présent dans le même fichier, un objet Rounding() doit être créé pour chaque élément d&#8217;un dictionnaire Python. L&#8217;itération fonctionne bien, mais CoPilot n&#8217;a manifestement aucune connaissance du function header, qui n&#8217;est définie ni dans ce même fichier ni dans la &#8220;connaissance générale&#8221; du modèle Codex de CoPilot&nbsp;: les suggestions proposent des paramètres qui n&#8217;existent pas. Immédiatement après avoir accepté cette solution erronée, le vérificateur de code statique intégré se plaint du paramètre manquant</figcaption></figure>



<p>L&#8217;une des alternatives les plus intéressantes au modèle commercial Github CoPilot est <a href="https://huggingface.co/blog/starcoder">StarCoder</a>, un modèle open source issu de l&#8217;initiative <a href="https://www.bigcode-project.org/">BigCode</a> HuggingFace et ServiceNow. Bien que la performance soit <a href="https://llm-leaderboard.streamlit.app/">moindre que CoPilot</a>, ils font la différence dans de nombreux autres domaines qui peuvent être des obstacles dans des contextes commerciaux ou publics&nbsp;:</p>



<ul class="wp-block-list">
<li>Entraînés sur un dataset public&nbsp;:&nbsp;<a href="https://huggingface.co/datasets/bigcode/the-stack">The Stack</a>. Bien qu&#8217;il ait été collecté par scraping, il ne contient que du code avec <a href="https://en.wikipedia.org/wiki/Permissive_software_license">des licences logicielles permissives</a>, et les développeurs peuvent, s&#8217;ils le souhaitent, <a href="https://huggingface.co/spaces/bigcode/in-the-stack">toujours faire retirer leur code du dataset</a>.</li>



<li>Comprend un outil <a href="https://huggingface.co/spaces/bigcode/search">de vérification de plagiat</a>, qui permet de vérifier que les suggestions générées n&#8217;ont pas été copiées mot pour mot à partir des données d&#8217;apprentissage (éventuellement protégées par des droits d&#8217;auteur).</li>



<li>Pourvu d&#8217;un <a href="https://huggingface.co/bigcode/starpii">filtre d&#8217;informations sensibles</a>, qui détecte les adresses électroniques, les clés API et les adresses IP (pas exact à 100&nbsp;%).</li>



<li>Contient des <a href="https://github.com/bigcode-project/starcoder/tree/main">instructions pour installer localement</a>, ainsi qu&#8217;un <a href="https://marketplace.visualstudio.com/items?itemName=HuggingFace.huggingface-vscode">plugin VSCode</a>. Un <a href="https://plugins.jetbrains.com/plugin/22090-starcoder">plugin IntelliJ</a> a entre-temps également été développé par un tiers.</li>



<li>Le modèle standard a une taille de 15 milliards de paramètres et nécessite au moins 60 GB de RAM ou autant de mémoire GPU (en fonction de l&#8217;utilisation ou non d&#8217;un GPU) pour être utilisé. Il existe également de <a href="https://huggingface.co/spaces/bigcode/multilingual-code-evals">plus petits modèles</a> à 7, 3 ou 1 milliard de paramètres, ainsi que des <a href="https://github.com/bigcode-project/starcoder.cpp">versions quantisées</a> utilisant des types de données à 4 bits, sans grande perte de précision.</li>
</ul>



<p>Plusieurs autres systèmes ont vu le jour cet été et ont obtenu de bons résultats dans de nombreux benchmarks&nbsp;:&nbsp;<a href="https://github.com/nlpxucan/WizardLM">WizardLM</a> et sa variante spécifique <a href="https://arxiv.org/abs/2306.08568">WizardCoder</a>, qui est désormais considéré comme le nec plus ultra de l&#8217;open source, et <a href="https://arxiv.org/abs/2207.11280">PanGu-Coder</a>, avec lequel Huawei s&#8217;est également lancé dans le monde des assistants IA pour le code.&nbsp;</p>



<h2 class="wp-block-heading"><strong>Au cœur de l&#8217;action</strong></h2>



<p>Le <a href="https://arxiv.org/abs/2305.06161">StarCoder paper</a> offre un bel aperçu du fonctionnement d&#8217;un modèle de langue pour le code.<br>Ce n&#8217;est certainement pas comme si vous pouviez &#8220;brancher&#8221; votre propre codebase pour obtenir des suggestions adaptées. Si vous voulez vraiment affiner le modèle (et vous ne ferez cet énorme effort <a href="https://twitter.com/rachel_l_woods/status/1692577254914638340">que si vous n&#8217;y arrivez pas</a> avec <a href="https://en.wikipedia.org/wiki/Prompt_engineering">des modifications astucieuses du prompt</a>), il y a beaucoup de choses à faire, du prétraitement des données d&#8217;entraînement au post-traitement de l’output brut du modèle de langue. Ne vous attendez pas non plus à ce que le réglage fin soit trop élevé&nbsp;: StarCoder l&#8217;a fait pour Python, mais n&#8217;a obtenu <a href="https://huggingface.co/blog/starcoder">que quelques points de pourcentage d&#8217;amélioration</a> par rapport au modèle global qui pourrait traiter tous les langages de programmation. Le peaufinage est difficile et il n&#8217;y a aucune garantie de succès&nbsp;; il y a même un risque d’<a href="https://research.nccgroup.com/2023/05/22/exploring-overfitting-risks-in-large-language-models/">overfitting</a>, ce qui pourrait dégrader les résultats.</p>



<p>L&#8217;étape la plus importante est probablement la collecte et le nettoyage des données.&nbsp;<a href="https://huggingface.co/datasets/bigcode/starcoderdata">Ces données sont constituées de code</a>, mais tous les codes ne sont pas inclus&nbsp;: vous devez également être autorisé à utiliser le code (licences) et, de préférence, l&#8217;avoir aussi correct que possible et écrit dans le langage de programmation que vous souhaitez soutenir. Le code est également collecté à partir <a href="https://en.wikipedia.org/wiki/Bug_tracking_system">des issue trackers</a> et <a href="https://en.wikipedia.org/wiki/Version_control">du commit history</a>. En outre, un filtrage additionnel peut être effectué pour supprimer les (quasi-)doublons, et des pondérations peuvent être attribuées ici et là pour maintenir l&#8217;équilibre&nbsp;: un peu moins de poids pour le code &#8220;boilerplate&#8221;, et/ou un peu plus pour les repositories très populaires qui sont susceptibles d&#8217;être de meilleure qualité. Le code source peut contenir des informations sensibles qui doivent être <a href="https://en.wikipedia.org/wiki/Data_anonymization">rendues anonymes</a> ou supprimées au préalable, pour éviter qu&#8217;elles ne soient divulguées ou suggérées (adresses IP, mots de passe, identifiants, adresses électroniques, coordonnées&#8230;). Tout cela, bien sûr, de préférence aussi automatiquement que possible.</p>



<p>Le code source se compose non seulement de code, mais aussi de descriptions, de commentaires et d&#8217;autres informations. Dans une étape de formatage, le code est donc enrichi par l’ajout de métadonnées et de <a href="https://huggingface.co/docs/transformers/main/internal/tokenization_utils#transformers.SpecialTokensMixin">tokens supplémentaires</a> qui rendent explicites certaines structures implicites. Cela peut avoir des conséquences&nbsp;: si tout ce prétraitement a été effectué sur l&#8217;ensemble des données d&#8217;apprentissage, le modèle résultant ne fonctionnera correctement sur de nouvelles données que s&#8217;il a subi le même prétraitement. Ainsi, les plugins éditeur qui souhaitent utiliser un tel modèle peuvent, pour obtenir un bon résultat, devoir d&#8217;abord effectuer un <a href="https://github.com/huggingface/huggingface-vscode/blob/a4a413723e9687bd2a7195d0e859f74467287571/package.json#L204">prétraitement similaire</a> sur le code qu&#8217;ils souhaitent envoyer au modèle de langue.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2023/08/2023-08-22_10h52_37.png"><img loading="lazy" decoding="async" width="325" height="353" src="/wp-content/uploads/2023/08/2023-08-22_10h52_37.png" alt="" class="wp-image-18951" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_10h52_37.png 325w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_10h52_37-276x300.png 276w" sizes="auto, (max-width: 325px) 100vw, 325px" /></a><figcaption class="wp-element-caption">Pour que le modèle puisse mieux distinguer les différentes parties du code source, les données d&#8217;entraînement sont enrichies de métadonnées et de ce que l&#8217;on appelle des &#8220;tokens sentinelles&#8221;. &#8220;sentinel tokens&#8221;, comme cette liste tirée du <a href="https://arxiv.org/abs/2305.06161">StarCoder paper</a>.</figcaption></figure>



<h2 class="wp-block-heading"><strong>Exactitude et autres benchmarks</strong></h2>



<p>Comme c&#8217;est le cas pour les LLM, il ne peut y avoir de garantie concluante de l&#8217;exactitude ou de l&#8217;exhaustivité de ce qu&#8217;un tel plugin présente, tant sur le plan syntaxique que sur le plan sémantique. Cette précision est évidemment importante&nbsp;: un morceau de code généré ne doit pas seulement être syntaxiquement correct et compiler sans faille, mais aussi être sémantiquement significatif et s&#8217;exécuter correctement. La métrique &#8220;pass@x&#8221; est devenue une mesure importante à cet égard. Elle exprime en pourcentage si un modèle de langue pour une mission donnée peut passer avec succès les tests correspondants après X tentatives. &#8220;pass@1&#8221; est le pourcentage pour lequel le modèle de langue utilisé pour la première fois a pu générer la bonne réponse, &#8220;pass@10&#8221; est le pourcentage pour lequel au moins 1 tentative sur 10 a été correcte.</p>



<p>Dans le monde de l&#8217;IA générative, il existe un besoin général de pouvoir comparer les nouveaux modèles, qui apparaissent désormais presque quotidiennement, avec le meilleur de la technologie. Il n&#8217;y a donc pas de pénurie de benchmarks, et de nouveaux modèles plus importants apparaissent régulièrement. Des résumés utiles sont les &#8220;leaderboards&#8221;, qui montrent en temps réel quels modèles représentent l&#8217;état actuel de la technique selon une série de benchmarks. L&#8217;étape peut changer chaque semaine. Voici quelques leaderboards généraux intéressants&nbsp;:</p>



<ul class="wp-block-list">
<li><a href="https://paperswithcode.com/sota">Papers with Code</a>&nbsp;: l&#8217;état de l&#8217;art dans diverses tâches d&#8217;intelligence artificielle, avec des documents d&#8217;accompagnement.</li>



<li><a href="https://crfm.stanford.edu/helm/latest">Stanford HELM</a>&nbsp;: analyse comparative d&#8217;un large éventail de tâches en se focalisant sur le &#8220;human reasoning&#8221; (raisonnement humain).</li>



<li><a href="https://chat.lmsys.org/?leaderboard">LMsys.org FastChat</a>&nbsp;: se concentre sur les capacités chatbot.</li>



<li><a href="https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard">HuggingFace OpenLLM leaderboard</a>.</li>



<li><a href="https://llm-leaderboard.streamlit.app/">LLM-Leaderboard</a>.</li>
</ul>



<p>En ce qui concerne le code, il existe des benchmarks qui fonctionnent plus ou moins comme un concours de programmation. L&#8217;idée est de confier un ensemble de tâches au modèle de langue, d&#8217;évaluer les résultats automatiquement et de mesurer le &#8220;pass@1&#8221; et, si possible, d&#8217;autres paramètres. Souvent, il s&#8217;agit de &#8220;remplir la fonction&#8221;&nbsp;: à partir d&#8217;une description de l’input, de l’output et d&#8217;un function header, le contenu de la fonction doit être généré. L&#8217;inconvénient est que ce type de problème n&#8217;est parfois <a href="https://www.computer.org/csdl/journal/ts/2023/07/10103177/1MpWUtj7Rwk">pas très représentatif</a> de celui auquel est confronté le développeur lambda. Parmi les initiatives intéressantes, on peut citer&nbsp;:</p>



<ul class="wp-block-list">
<li>HuggingFace&nbsp;<a href="https://huggingface.co/spaces/bigcode/bigcode-models-leaderboard">Big Code Models leaderboard</a>&nbsp;(uniquement LLM publics).</li>



<li>Microsoft <a href="https://github.com/microsoft/CodeXGLUE">CodeXGLUE</a>&nbsp;: évaluation de diverses sous-tâches selon des méthodes connues de Natural Language Processing. Ce <a href="https://microsoft.github.io/CodeXGLUE/">leaderboard</a> semble dépendre de contributions volontaires et est quelque peu incomplet.</li>



<li>Papers with Code a des sections séparées pour&nbsp;<a href="https://paperswithcode.com/task/code-generation">la génération de code</a>,&nbsp;<a href="https://paperswithcode.com/task/code-documentation-generation">la création de documents</a>,&nbsp;<a href="https://paperswithcode.com/task/program-synthesis">la synthèse de programmes entiers</a>&nbsp;et&nbsp;<a href="https://paperswithcode.com/task/program-repair">la correction de bugs</a>.</li>



<li>Le <a href="https://paperswithcode.com/dataset/humaneval">HumanEval dataset</a> et <a href="https://paperswithcode.com/dataset/mbpp">MBPP dataset</a>&nbsp;: problèmes de programmation typique (Python).</li>



<li>Le&nbsp;<a href="https://paperswithcode.com/dataset/ds-1000">DS-1000 dataset</a>&nbsp;: ensemble de problèmes de data processing / data science concrets.</li>



<li><a href="https://paperswithcode.com/dataset/humaneval-x">HumanEval-X</a> ou <a href="https://github.com/nuprl/MultiPL-E">MultiPL-E</a>&nbsp;: versions multilingues de HumanEval, mesurant les performances dans plusieurs langages de programmation.</li>
</ul>



<p>Bien entendu, le fait qu&#8217;un morceau de code généré survive aux tests ne signifie pas qu&#8217;il s&#8217;agit d&#8217;un code sécurisé ou qu&#8217;il respecte les &#8220;best practices&#8221;. Entre-temps, il existe de nombreux exemples connus de code généré qui s&#8217;avère sensible aux &#8220;buffer overflows&#8221;, à l&#8217;injection SQL et à d&#8217;autres risques classiques. Le benchmark de sécurité <a href="https://huggingface.co/datasets/moyix/asleep_keyboard">&#8220;Asleep at the Keyboard&#8221;</a> consiste en 89 scénarios de génération de code basés sur la liste <a href="https://cwe.mitre.org/top25/">MITRE top-25 vulnerability</a>. <a href="https://arxiv.org/abs/2305.06161">Starcoder paper</a> montre que même les meilleurs modèles génèrent encore du code non sécurisé dans 40&nbsp;% de ces scénarios. En outre, il ne semble guère y avoir de différence entre les meilleurs modèles et les autres &#8211; le choix d&#8217;un meilleur modèle semble garantir des résultats syntaxiquement plus corrects, mais pas encore un code plus sûr. Il est donc possible que nous devions nous pencher sur les données d&#8217;apprentissage elles-mêmes, où le code non sécurisé devrait être encore mieux filtré. Quoi qu&#8217;il en soit, il convient de rappeler que l&#8217;utilisation de code généré dans un projet doit impérativement s&#8217;accompagner d&#8217;une solide politique de test et d&#8217;acceptation.</p>



<h2 class="wp-block-heading"><strong>Performance</strong></h2>



<p>En ce qui concerne plus particulièrement les exigences computationnelles, le leaderboard <a href="https://huggingface.co/spaces/optimum/llm-perf-leaderboard">Huggingface OpenLLM-perf</a> et les benchmarks sur le site web <a href="https://bellard.org/ts_server/">TextSynth Server</a> constituent des sources intéressantes. Ce dernier montre quelques chiffres de performance utiles pour ceux qui envisagent un hébergement par leurs propres moyens. Ceux qui n&#8217;ont pas de GPU peuvent compter sur une vitesse de 12 tokens par seconde avec le modèle LLaMa2 de 13 milliards de paramètres, avec un processeur de serveur <a href="https://tweakers.net/pricewatch/1672608/amd-epyc-7313-tray.html">EPYC 7313</a> relativement haut de gamme. Dans un code informatique, un token ne représente parfois qu&#8217;un seul caractère, de sorte qu&#8217;à cette vitesse, il faut parfois attendre une dizaine de secondes pour obtenir une suggestion de complétion de code. La dernière carte graphique RTX-4090 peut le faire 7 fois plus vite, mais pas encore au point de l&#8217;exprimer en millisecondes.</p>



<p>Les besoins en mémoire sont proportionnels au nombre de paramètres d&#8217;un modèle, et la vitesse de génération inversement proportionnelle. À titre d&#8217;approximation, on peut supposer qu&#8217;un modèle comportant 13 milliards de paramètres doit également effectuer 13 milliards de calculs pour chaque token de sortie, même s&#8217;il ne comporte qu&#8217;un seul caractère. En outre, si chaque paramètre est un nombre de 32 bits, il faut au moins 52 Go de stockage et autant de mémoire (V)RAM. Une &#8220;<a href="https://huggingface.co/docs/transformers/main_classes/quantization">quantization</a>&#8220;, arrondissant les paramètres à 8 bits ou même à 4 bits, peut réduire proportionnellement ce besoin en mémoire.</p>



<p><a href="https://gpt4all.io/index.html">GPT4All</a> permet de l&#8217;essayer sur votre propre matériel. Cela donne une idée de l&#8217;énorme puissance de calcul qu&#8217;OpenAI, Microsoft Azure ou Amazon AWS déploient pour que leurs modèles, dont beaucoup sont encore plus grands que les LLM disponibles en libre accès, fonctionnent aussi vite qu&#8217;ils le proposent. On parle d&#8217;investissements de <a href="https://venturebeat.com/ai/nvidia-gpu-shortage-is-top-gossip-of-silicon-valley/">milliards de dollars en matériel informatique</a>, si importants qu&#8217;ils déstabiliseraient le marché mondial.</p>



<p>Même les solutions open source sont loin d&#8217;être légères, en dépit des grandes <a href="https://github.com/ggerganov/llama.cpp">initiatives d&#8217;optimisation</a>. On peut en tout cas supposer que le déploiement local n&#8217;est possible que sur du matériel récent et puissant. Actuellement, on ne peut pas s&#8217;attendre à ce qu&#8217;une installation locale sur un ordinateur portable de bureau moyen offre une expérience fluide à l&#8217;utilisateur.</p>



<h2 class="wp-block-heading"><strong>Productivité</strong></h2>



<p>Internet regorge de contes de fées sur le <a href="https://medium.com/ingeniouslysimple/the-origins-of-the-10x-developer-2e0177ecef60">développeur 10x</a>, et les gourous de l&#8217;IA générative aimeraient vous faire croire que cette technologie peut élever n&#8217;importe quel programmeur à ce niveau. La réalité est plus nuancée. Les développeurs ne passent pas 100&nbsp;% de leur temps à écrire du code, pas plus que les médecins ne passent 100&nbsp;% de leur temps à rédiger des ordonnances. La majorité des développeurs <a href="https://www.software.com/reports/code-time-report">passe moins d&#8217;une heure par jour à coder</a>. Le reste de leur temps est consacré à l&#8217;analyse, à la lecture, à l&#8217;apprentissage, aux tâches de maintenance, à la communication, etc. Jusqu&#8217;à présent, cette réflexion et cette consultation avec les collègues ne sont pas comprimées par l&#8217;emploi de LLM.</p>



<p>Il est difficile de trouver des chiffres précis sur la productivité parce qu&#8217;elle est difficile à définir et donc à mesurer. Une première estimation utile provient de Google même, qui a examiné le temps d&#8217;itération (de la connaissance du problème à la solution). Avec une première version de son propre assistant de complétion de code par l&#8217;IA, <a href="https://ai.googleblog.com/2022/07/ml-enhanced-code-completion-improves.html">l&#8217;entreprise a pu constater un gain de temps de 6&nbsp;%</a>. Github affirme que <a href="https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">le codage pur peut être environ 55&nbsp;% plus rapide</a> avec son CoPilot &#8211; bien qu&#8217;il précise dans le même temps que l&#8217;intervalle de confiance à 95&nbsp;% de sa mesure est de [21&nbsp;%-89&nbsp;%]. En outre, l&#8217;adoption d&#8217;un outil n&#8217;apporte aucune valeur ajoutée si elle n&#8217;est pas accompagnée d&#8217;un parcours pour apprendre à l&#8217;utiliser de manière optimale (tout comme aujourd&#8217;hui encore, de nombreux employés de bureau perdent du temps avec Office en raison d&#8217;une connaissance ou d&#8217;une expérience insuffisante de tous les types de références, de formules et de raccourcis).</p>



<p>Le code généré fournit une solution initiale rapide, mais cette solution doit encore être comprise par le programmeur. Un score &#8220;pass@1&#8221; de 50&nbsp;% signifie que la moitié des bouts de code générés nécessitent encore des ajustements manuels avant de passer les tests unitaires &#8211; sans parler de l&#8217;optimalité ou de la sécurité. Le code généré peut être complexe et utiliser des constructions qui dépassent le niveau de connaissance du programmeur. Le code généré est donc plus difficile à maintenir et à corriger que le code écrit manuellement. Un code généré qui n&#8217;a pas été correctement examiné et testé ajoute une <a href="https://www.techtarget.com/whatis/definition/technical-debt">dette technique</a> considérable à un projet.</p>



<p>L&#8217;utilisation de plugins qui vont jusqu&#8217;à générer des blocs entiers de code et de documentation en un claquement de doigts (ou un peu plus lentement) n&#8217;est une bonne idée que si plusieurs autres aspects du processus d&#8217;ingénierie logicielle sont en ordre&nbsp;: des normes élevées doivent être maintenues dans tous les domaines en termes de stratégie de test, de code reviews, de documentation de code et de savoir-faire des développeurs.</p>



<h2 class="wp-block-heading"><strong>Confidentialité</strong></h2>



<p>Les entreprises et les gouvernements ont rarement le luxe d&#8217;utiliser n&#8217;importe quel modèle de langue. Il existe non seulement des barrières contractuelles, mais aussi des questions de confidentialité, en particulier lors de l&#8217;utilisation du cloud. Après tout, on n&#8217;obtient une bonne suggestion de modèle de langue qu&#8217;en introduisant suffisamment d&#8217;informations au préalable. Ne pas tout mettre en place en interne implique inévitablement de donner à un tiers l&#8217;accès à vos données.</p>



<p>Le degré d&#8217;ouverture et de licence peut varier considérablement &#8211; à un extrême, tout est en &#8220;boîte noire&#8221; et uniquement accessible via le cloud/API (c&#8217;est là que vous trouverez OpenAI, Anthropic, Cohere et la plupart des autres start-ups établies). Celles-ci promettent dans les <a href="https://openai.com/blog/introducing-chatgpt-enterprise">versions Enterprise</a> parfois plus de garanties &#8211; mais vous n&#8217;avez pas d&#8217;autre choix que de les croire sur parole. À l&#8217;autre extrême, tout est en &#8220;open access&#8221; (libre accès) et sous licence permissive. Entre les deux, une entreprise peut également construire un modèle de langue en libre accès sur un dataset fermé. Au moins un de ces datasets a <a href="https://www.theatlantic.com/technology/archive/2023/08/books3-ai-meta-llama-pirated-books/675063/">depuis été divulgué</a> comme contenant des <a href="https://github.com/psmedia/Books3Info">ebooks illégalement copiés et protégés par le droit d&#8217;auteur</a>, ce qui constituera sans aucun doute un argument de poids dans le <a href="https://storage.courtlistener.com/recap/gov.uscourts.cand.415175/gov.uscourts.cand.415175.1.0_1.pdf">recours collectif intenté contre Meta</a> sur ce sujet. Les ensembles de données des Code LLM <a href="https://arxiv.org/abs/2203.13474">Salesforce CodeGen</a> et <a href="https://codegeex.cn/">Tsinghua CodeGeeX</a> ne sont pas non plus publics.</p>



<p>Transparence, licences, options de déploiement, prix, taille et scalabilité&#8230; l&#8217;importance relative de toutes ces caractéristiques dictera les outils que vous pourrez utiliser. Ceux qui souhaitent une transparence maximale seront souvent limités aux <a href="https://github.com/eugeneyan/open-llms">LLM en Open Access</a>. Certaines licences ouvertes limitent en outre l&#8217;utilisation à des fins non commerciales. La nécessité d&#8217;accéder à des données de formation ou la facilité d&#8217;héberger soi-même une instance sur site <a href="https://blog.pragmaticengineer.com/github-copilot-alternatives/">limitent davantage les choix</a>.</p>



<h2 class="wp-block-heading"><strong>Conclusion</strong></h2>



<p>Les outils basés sur le dialogue (chatGPT et autres) peuvent vous être utiles en tant que développeur pour, entre autres, les tâches suivantes&nbsp;:</p>



<ul class="wp-block-list">
<li>Initialiser un projet/fichier/classe/configuration&nbsp;: créer une première version de quelque chose</li>



<li>Correction de bugs et modification sous forme de questions-réponses</li>



<li>Morceaux de code relativement indépendants</li>
</ul>



<p>Les outils qui complètent le code ou remplissent le code manquant (type Github Co-Pilot) sont utiles, entre autres, pour&nbsp;:</p>



<ul class="wp-block-list">
<li>Compléter du code à partir d&#8217;exemples déjà réalisés</li>



<li>Documenter le code</li>



<li>Apporter des modifications au milieu d&#8217;un fichier plus volumineux</li>
</ul>



<p>Pour un développeur, l&#8217;environnement de développement optimal est quelque chose de tout à fait personnel et chacun aura sa propre préférence. À notre avis, ces deux façons d&#8217;obtenir des suggestions de code sont quelque peu complémentaires, et une combinaison intelligente des deux peut permettre d&#8217;obtenir les meilleurs gains de productivité. Dans le même temps, nous tenons à dire qu&#8217;une gestion de projet saine, avec une attention portée à la qualité du code, aux tests, aux révisions, à la documentation, etc. est indispensable.</p>



<p>Le monde de l&#8217;IA est en pleine effervescence. De nouveaux modèles d&#8217;IA pouvant servir de base aux plugins IDE sont ajoutés avec une grande régularité. Pour les industries où la confidentialité du code est importante, les variantes open source sont très intéressantes. Même si les benchmarks montrent qu&#8217;ils sont encore moins performants aujourd&#8217;hui que les dernières initiatives commerciales basées sur le cloud, nous pouvons nous attendre à ce que de meilleures versions apparaissent à l&#8217;avenir. De nombreux efforts sont déjà déployés pour créer des modèles pouvant fonctionner sur du matériel grand public (certes haut de gamme).</p>



<h2 class="wp-block-heading">P.S.</h2>



<p>Quelques heures après la publication de cet article, HuggingFace annonce la venue de <a href="https://huggingface.co/blog/safecoder">SafeCoder</a>&nbsp;: une solution d&#8217;entreprise pour les assistants de codage basés sur LLM qui peut être déployée sur site. Huggingface fournit le tout dans des conteneurs qui peuvent être installés dans un data center propre et fournir des endpoints privés, ainsi que des plugins compatibles avec les principaux IDE. D&#8217;autres frameworks de déploiement général existent depuis un certain temps, notamment <a href="https://www.seldon.io/">Seldon</a>, <a href="https://www.bentoml.com/">BentoML</a> et <a href="https://github.com/kserve/kserve">KServe</a>, qui peuvent également héberger des LLM, <a href="https://bellard.org/ts_server/">TextSynth Server</a> et <a href="https://gpt4all.io/index.html">GPT4All</a> peuvent fonctionner comme des endpoints d&#8217;API. Cependant, vous avez toujours besoin de plugins pour les utiliser dans l&#8217;IDE lui-même, et pour effectuer les traitements préalables et postérieurs nécessaires &#8211; et s&#8217;ils ne sont pas fournis, vous devez en créer un vous-même ou modifier un plugin existant.</p>



<h2 class="wp-block-heading">P.P.S.</h2>



<p>Ces derniers mots à peine écrits, Meta a lancé <a href="https://about.fb.com/news/2023/08/code-llama-ai-for-coding/">CodeLLama</a>, une variante de <a href="https://ai.meta.com/llama/">LLaMa 2</a> spécifiquement entraînée pour le code. Les <a href="https://twitter.com/abacaj/status/1694889597723873562">médias sociaux suggèrent</a> qu&#8217;il est possible de faire tourner la version originale avec 34 milliards de paramètres sur un ordinateur équipé de 4 GPU RTX3090 avec 24 GB de VRAM chacun, générant environ 20 tokens par seconde. Il est sans doute plus facile d&#8217;essayer la <a href="https://huggingface.co/chat">version de chat en ligne</a>.&nbsp;<a href="https://github.com/ggerganov/llama.cpp">Les versions quantisées</a> suivront sans doute très prochainement, et nous attendons les premiers benchmarks sur les différents leaderboards.</p>



<p>______________________</p>



<p><em>Cette contribution a été soumise par Joachim Ganseman, consultant IT chez Smals Research. Elle a été rédigée en son nom propre et ne prend pas position au nom de Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LLMs voor code: the Good, the Bad and the Ugly</title>
		<link>https://www.smalsresearch.be/llms-voor-code/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Tue, 22 Aug 2023 09:43:16 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[computational creativity]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[source code]]></category>
		<guid isPermaLink="false">/?p=18875</guid>

					<description><![CDATA[Wat is de stand van zaken wat betreft het genereren van code, en waar moeten we nog rekening mee houden? AI-assistenten of -plugins voor IDEs zijn een zegen voor wie ze goed kan aanwenden, maar komen, zoals alle AI-systemen, ook met de nodige caveats.]]></description>
										<content:encoded><![CDATA[
<p><em>Cet article est aussi disponible <a href="/llms-pour-code/">en français</a>.</em></p>



<p>In<a href="/de-ai-augmented-developer/"> een vorig artikel</a> bespraken we op algemene wijze het potentieel van generatieve AI in de <a href="https://www.servicenow.com/products/devops/what-is-sdlc.html">software development lifecycle</a>. Laat ons nu eens kijken vanuit het standpunt van de developer: wat is de stand van zaken wat betreft het genereren van code, en waar moeten we nog rekening mee houden? Lang verhaal kort: AI-assistenten of -plugins voor IDEs zijn een zegen voor wie ze goed kan aanwenden, maar komen, zoals alle AI-systemen, ook met de nodige <em>caveats.</em></p>



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



<p>De <a href="https://theresanaiforthat.com/">hype</a> qua generatieve AI wordt onder andere gestuwd door <a href="https://en.wikipedia.org/wiki/Large_language_model">krachtige taalmodellen</a> &#8211; Large Language Models of LLMs. Zeker sinds GPT-3 uitkwam in 2020, slagen die erin om normaal uitziende teksten te schrijven van enige lengte. Van daar is het maar een korte sprong naar programmeertalen &#8211; die hebben immers ook een syntax en semantiek.</p>



<p>In de praktijk bestaan er talloze varianten van taalmodellen, die elk hun sterktes en zwaktes hebben, al naargelang de keuzes die de makers hebben gemaakt bij het trainen ervan, en al naargelang de trainingsdata die eraan ten grondslag liggen. Probeer bijvoorbeeld zelf enkele van de bestaande open source modellen uit op je eigen computer via de tool <a href="https://gpt4all.io/index.html">GPT4All</a> (zie ook <a href="/publications/document/?docid=270">onze korte review</a> van deze tool).</p>



<p>Computercode bestaat uit een collectie van tekstbestanden. Niets verhindert dat een taalmodel, in plaats van woorden, de verschillende <a href="https://www.techtarget.com/searchapparchitecture/definition/parser">tokens ( = grammaticale eenheden)</a> waaruit code bestaat, probeert te voorspellen. In tegenstelling tot gewone tekst is er bij code echter veel minder ruimte voor fouten: de kleinste spelfout of variatie kan een stuk code ongeldig maken of iets helemaal anders laten uitvoeren. </p>



<p>Toch kunnen de allergrootste taalmodellen, zoals GPT-3.5 en later, vandaag uit eigen beweging vrij correcte stukken computercode produceren in een antwoord op een vraag. Deze functionaliteit is het gevolg van de massieve hoeveelheid tekst waarop ze getraind zijn, waaronder talloze tutorials, blogartikels, vragen en antwoorden uit populaire developerfora zoals <a href="https://stackoverflow.com/">StackOverflow</a>, en gedocumenteerde code uit publieke code repositories zoals <a href="https://github.com/">Github</a>.</p>



<h2 class="wp-block-heading">Babbelende badeentjes</h2>



<p>Al <a href="https://en.wikipedia.org/wiki/Socratic_dialogue">sinds Socrates</a> is de dialoog een beproefde manier om tot nieuwe inzichten te komen. Niet voor niets is <a href="https://blog.codinghorror.com/rubber-duck-problem-solving/">rubber ducking</a> een methode voor debugging die ter sprake komt in elke cursus software engineering. Er bestaan ondertussen verschillende plugins die een AI-powered chat-interface in de IDE zelf beschikbaar stellen (bvb <a href="https://github.com/timkmecl/chatgpt-vscode">deze voor VS Code</a> , vele andere kunnen gevonden worden via de <a href="https://marketplace.visualstudio.com/search?term=gpt&amp;target=VSCode">marketplaces voor VS Code</a> of <a href="https://plugins.jetbrains.com/search?products=idea_ce&amp;search=gpt">IntelliJ IDEA</a>). Als die gebruikmaken van een externe cloud-dienst moet je daarbij enkel nog je eigen API-key ingeven.</p>



<p>Een dialogerende setting met een vraag-antwoord dynamiek kan goed aangewend worden voor het genereren van relatief op zichzelf staande stukken code, zonder te veel externe afhankelijkheden. In het algemeen kan je stellen dat je, voor het beste resultaat, alle noodzakelijke randvoorwaarden en aannames gemakkelijk in de dialoog zelf moet kunnen vermelden, zodat het binnen het context-venster van het taalmodel past. De use cases omvatten onder andere:</p>



<ul class="wp-block-list">
<li><em>From scratch</em> genereren van een eerste versie van code of een configuratiebestand</li>



<li>Genereren van relatief korte functies of procedures aan de hand van een beschrijving</li>



<li>Genereren van op zichzelf staande <em>code snippets</em>: SQL queries, reguliere expressies, &#8230;</li>



<li>Vragen om een aanpassing aan een stuk code of een configuratiebestand</li>



<li>Debugging: fouten zoeken in niet-werkende code, vragen stellen over een error</li>



<li>Laten uitleggen wat een stuk code doet</li>
</ul>



<p>De grootste taalmodellen hebben ondertussen contextvensters van duizenden woorden waarin je alle nodige informatie kwijt kan. Een kleiner open-source taalmodel, lokaal geïnstalleerd op minder krachtige hardware, zal ongetwijfeld minder goed presteren. Enkele voorbeelden van conversaties met OpenAI&#8217;s GPT-4 staat hieronder &#8211; hieruit blijkt dat je al heel ver kan geraken met een paar welgemikte vragen (klik voor de volledige resolutie):</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="/wp-content/uploads/2023/08/2023-08-22_16h05_32.png"><img loading="lazy" decoding="async" width="143" height="1024" data-id="18959" src="/wp-content/uploads/2023/08/2023-08-22_16h05_32-143x1024.png" alt="" class="wp-image-18959" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-143x1024.png 143w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-42x300.png 42w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-286x2048.png 286w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-scaled.png 358w" sizes="auto, (max-width: 143px) 100vw, 143px" /></a><figcaption class="wp-element-caption">Voorbeeld van een conversatie over code met ChatGPT&#8217;s GPT-4 model: genereren van een configuratie voor een VNC remote server op een shared Ubuntu systeem.</figcaption></figure>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/2023-08-22_16h17_10.png"><img loading="lazy" decoding="async" width="198" height="1024" data-id="18958" src="/wp-content/uploads/2023/08/2023-08-22_16h17_10-198x1024.png" alt="" class="wp-image-18958" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-198x1024.png 198w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-297x1536.png 297w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-58x300.png 58w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-768x3977.png 768w" sizes="auto, (max-width: 198px) 100vw, 198px" /></a><figcaption class="wp-element-caption">Voorbeeld van een conversatie over code met ChatGPT&#8217;s GPT-4 model: genereren van een SQL query voor een transpositie van een tabel. De uiteindelijk voorgestelde oplossing gebruikt met stored procedures vrij geavanceerde technieken.</figcaption></figure>
</figure>



<h2 class="wp-block-heading">Code completion on steroids</h2>



<p>Tijdens het ontwikkelen werkt een developer aan talloze bestanden in een IDE. Op willekeurige plekken in die bestanden moet er code aangepast, verwijderd of geschreven worden. Het bewerken van bestaande code op deze manier heeft weinig te maken met dialogeren, eigenlijk willen we hier eerder een geavanceerde auto-complete inzetten. Ook dat kunnen taalmodellen goed, maar de meest geschikte modellen zijn eerder diegene die getraind zijn op &#8220;fill in the middle&#8221; taken &#8211; en die dus rekening kunnen houden met de aanwezige code voor én na de plek die men aan het bewerken is. </p>



<p>Na het uitbrengen van GPT-3, werkte OpenAI samen met Microsoft (dat Github bezit) aan een gespecialiseerd taalmodel dat voor exact deze use case werd getraind. Deze variant werd <a href="https://openai.com/blog/openai-codex">Codex </a>genoemd, en de eerste tool die ervan gebruikmaakte was <a href="https://github.com/features/copilot">Github CoPilot</a>. Ondertussen zijn we al enkele versies verder, maar de plugins voor <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot">VSCode</a> en <a href="https://plugins.jetbrains.com/plugin/17718-github-copilot">IntelliJ</a> werken nog op dezelfde manier: via een sneltoets in de editor kan men via CoPilot verschillende suggesties opvragen, gegenereerd door Codex, die zouden kunnen passen op de plek van de cursor. </p>



<p>Voor zover onze ervaring vandaag reikt, is de context die daarbij in rekening wordt genomen vandaag meestal beperkt tot (stukken van) de inhoud van het bewerkte bestand. Daarbij wordt uiteraard code <a href="https://resources.github.com/copilot-trust-center/">geüploaded naar het taalmodel</a> &#8211; let dus zeker op richtlijnen qua confidentialiteit bij gebruik van een externe dienst. Vooralsnog lijken we betere resultaten te krijgen bij programmeerprojecten die bestaan uit weinig grote bestanden, zoals webpagina&#8217;s met inline JavaScript, of Jupyter Notebooks in Python, waarbij vaak sprake is van 1 groot bestand dat doorlopen wordt waarin zowel de documentatie, de code als de output staat. In projecten met vele kleine bestandjes daarentegen, lijkt het moeilijker om goede suggesties te genereren, en is het belangrijker dat er extra documentatie aanwezig is in het geëditeerde bestand zodat er voldoende contextuele informatie is die het taalmodel kan aangrijpen.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/copilot-in-vscode-example.png"><img loading="lazy" decoding="async" width="1024" height="604" src="/wp-content/uploads/2023/08/copilot-in-vscode-example-1024x604.png" alt="" class="wp-image-18964" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-1024x604.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-300x177.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-768x453.png 768w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example.png 1276w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Github CoPilot in VSCode. Een stramien volgend dat al eerder in hetzelfde bestand voorkomt, moet een Rounding()-object gecreëerd worden voor elk element in een Python dictionary. Itereren lukt goed, maar CoPilot heeft duidelijk geen weet van de juiste functieheader, die niet in ditzelfde bestand is gedefinieerd en ook niet in de &#8216;algemene kennis&#8217; van CoPilot&#8217;s Codex-model voorkomt: de suggesties stellen parameters voor die niet bestaan. Onmiddellijk na het accepteren van deze foutieve oplossing, klaagt de ingebouwde statische code checker over de missende parameter. </figcaption></figure>



<p>Een van de interessantere alternatieven voor het commerciële Github CoPilot is <a href="https://huggingface.co/blog/starcoder">StarCoder</a>, een open source model van het <a href="https://www.bigcode-project.org/">BigCode</a> initiatief van HuggingFace en ServiceNow. De performantie is weliswaar  <a href="https://llm-leaderboard.streamlit.app/">minder dan CoPilot</a>, maar zij maken op vele andere vlakken, die mogelijk dealbreakers zijn in commerciële of publieke context, het verschil:</p>



<ul class="wp-block-list">
<li>Getraind op een open dataset: <a href="https://huggingface.co/datasets/bigcode/the-stack">The Stack</a>. Deze is weliswaar via scraping verzameld, maar bevat alleen code met <a href="https://en.wikipedia.org/wiki/Permissive_software_license">permissieve softwarelicenties</a>, en developers kunnen desgewenst <a href="https://huggingface.co/spaces/bigcode/in-the-stack">alsnog hun code eruit laten verwijderen</a>. </li>



<li>Bevat een <a href="https://huggingface.co/spaces/bigcode/search">plagiaat-check</a> tool, waarmee je kan controleren of de gegenereerde suggesties niet verbatim uit de (mogelijk copyrighted) trainingsdata zijn overgenomen.</li>



<li>Voorzien van <a href="https://huggingface.co/bigcode/starpii">filter van gevoelige informatie</a>, die emailadressen, API keys en IP adressen detecteert (niet 100% accuraat).</li>



<li>Voorzien van <a href="https://github.com/bigcode-project/starcoder/tree/main">instructies om het lokaal te installeren</a>, evenals een <a href="https://marketplace.visualstudio.com/items?itemName=HuggingFace.huggingface-vscode">VSCode plugin</a>. Een <a href="https://plugins.jetbrains.com/plugin/22090-starcoder">IntelliJ plugin</a> werd ondertussen ook ontwikkeld door een derde partij.</li>



<li>Het standaardmodel is 15 miljard parameters groot en vergt minstens 60GB RAM of evenveel GPU memory (afhankelijk van of een GPU benut wordt of niet) om te kunnen gebruiken. Ondertussen bestaan ook <a href="https://huggingface.co/spaces/bigcode/multilingual-code-evals">kleinere modellen</a> met 7, 3 of 1 miljard parameters, evenals <a href="https://github.com/bigcode-project/starcoder.cpp">&#8220;quantized&#8221; versies</a> die gebruikmaken van 4bit datatypes zonder veel accuraatheidsverlies.</li>
</ul>



<p>Deze zomer zagen nog enkele andere systemen het licht die goed scoren op vele benchmarks: <a href="https://github.com/nlpxucan/WizardLM">WizardLM</a> en de specifieke variant ervan <a href="https://arxiv.org/abs/2306.08568">WizardCoder</a>, dat ondertussen wordt beschouwd als de open source state-of-the-art, en <a href="https://arxiv.org/abs/2207.11280">PanGu-Coder</a>, waarmee ook Huawei zich heeft gelanceerd in de wereld van AI-assistants voor code. </p>



<h2 class="wp-block-heading">Achter de schermen</h2>



<p>De <a href="https://arxiv.org/abs/2305.06161">StarCoder paper</a> geeft een goed zicht op de werking van een taalmodel voor code. Het is zeker niet zo dat je je eigen codebase kan &#8220;inpluggen&#8221; om suggesties te krijgen die daarop zijn toegespitst. Als je echt zou willen finetunen (en die enorme inspanning doe je in principe <a href="https://twitter.com/rachel_l_woods/status/1692577254914638340">alleen maar als je er niet raakt</a> met slimme <a href="https://en.wikipedia.org/wiki/Prompt_engineering">aanpassingen aan de prompt</a>), komt er heel wat bij kijken, van preprocessing van de trainingsdata tot postprocessing van de rauwe output van het taalmodel. Leg de verwachtingen van finetuning ook niet te hoog: StarCoder deed het voor Python, maar haalde <a href="https://huggingface.co/blog/starcoder">hooguit enkele procentpunten verbetering</a> in vergelijking met het algemene model dat met alle programmeertalen overweg kon. Finetunen is moeilijk en er is geen garantie op succes; er bestaat zelfs een risico op <a href="https://research.nccgroup.com/2023/05/22/exploring-overfitting-risks-in-large-language-models/">overfitting</a> wat tot slechtere resultaten kan leiden.</p>



<p>De belangrijkste stap daarbij is waarschijnlijk het verzamelen en schoonmaken van data. <a href="https://huggingface.co/datasets/bigcode/starcoderdata">Die data bestaat uit code</a>, maar niet alle code komt in aanmerking: je moet de code ook mogen gebruiken (licenties), en je hebt ze liefst zo correct mogelijk en geschreven in de programmeertaal die je wenst te ondersteunen. Code wordt ook verzameld uit <a href="https://en.wikipedia.org/wiki/Bug_tracking_system">issue trackers</a> en <a href="https://en.wikipedia.org/wiki/Version_control">commitgeschiedenis</a>. Daarnaast kan je nog extra filteren om (bijna-)duplicaten te verwijderen, en wil je misschien hier en daar gewichten toekennen om de balans te bewaren: wat minder gewicht voor boilerplate code, en/of wat meer voor erg populaire repositories die waarschijnlijk van hogere kwaliteit zijn. Broncode kan gevoelige informatie bevatten die eerst <a href="https://en.wikipedia.org/wiki/Data_anonymization">geanonymiseerd</a> of verwijderd moet worden, om te voorkomen dat die lekt of wordt gesuggereerd (IP adressen, paswoorden, identifiers, emailadressen, contactgegevens, &#8230;). Dit alles natuurlijk liefst zo automatisch mogelijk.</p>



<p class="has-text-align-left">Broncode bestaat niet alleen uit code maar ook uit beschrijvingen, commentaren en andere informatie. In een formatteringsstap wordt de code daarom nog verrijkt, door het toevoegen van metadata en <a href="https://huggingface.co/docs/transformers/main/internal/tokenization_utils#transformers.SpecialTokensMixin">bijkomende tokens</a> die bepaalde impliciete structuren expliciet maken. Dit kan implicaties hebben: als al deze preprocessing op de hele trainingsdataset is gebeurd, dan zal het resulterende model pas goed werken op nieuwe data als die dezelfde preprocessing heeft ondergaan. Het is dus mogelijk dat editorplugins die willen gebruikmaken van zo&#8217;n model, om een goed resultaat te bekomen, eerst <a href="https://github.com/huggingface/huggingface-vscode/blob/a4a413723e9687bd2a7195d0e859f74467287571/package.json#L204">gelijkaardige preprocessing</a> moeten uitvoeren op de code die ze naar het taalmodel willen sturen.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2023/08/2023-08-22_10h52_37.png"><img loading="lazy" decoding="async" width="325" height="353" src="/wp-content/uploads/2023/08/2023-08-22_10h52_37.png" alt="" class="wp-image-18951" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_10h52_37.png 325w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_10h52_37-276x300.png 276w" sizes="auto, (max-width: 325px) 100vw, 325px" /></a><figcaption class="wp-element-caption">Opdat het model beter onderscheid kan maken tussen de verschillende onderdelen van broncode, wordt trainingsdata verrijkt met metadata en zgn. &#8216;sentinel tokens&#8217;, zoals deze lijst afkomstig uit de <a href="https://arxiv.org/abs/2305.06161">StarCoder paper</a>.</figcaption></figure>



<h2 class="wp-block-heading">Correctheid en andere benchmarks</h2>



<p>Typisch voor LLMs, kan er geen sluitende garantie worden gegeven op de correctheid of volledigheid van wat zo&#8217;n plugin je voorschotelt, zowel syntactisch als semantisch. Die correctheid is uiteraard van belang: een stuk gegenereerde code moet niet alleen syntactisch correct zijn en foutloos compileren, maar ook semantisch betekenisvol zijn en goed runnen. De &#8220;pass@x&#8221; metriek is daarbij uitgegroeid tot belangrijke graadmeter. Ze drukt uit als een percentage, of een taalmodel voor een bepaalde opdracht na X pogingen de bijhorende testen succesvol kan passeren. &#8220;pass@1&#8221; is het percentage dat het taalmodel van de eerste keer het juiste antwoord heeft kunnen genereren, &#8220;pass@10&#8221; is het percentage waarbij minstens 1 van 10 pogingen correct was.</p>



<p>Er is een algemene nood in de wereld van generatieve AI om nieuwe modellen, die ondertussen bijna dagelijks verschijnen, te kunnen vergelijken met de state-of-the-art. Aan benchmarks is er dus geen gebrek, en er verschijnen er geregeld ook nieuwe en grotere. Handige samenvattingen zijn de &#8220;leaderboards&#8221;, die real-time tonen welke modellen de huidige state-of-the-art vertegenwoordigen volgens een waaier aan benchmarks. Het podium kan wekelijks veranderen. Enkele interessante algemene leaderboards zijn:</p>



<ul class="wp-block-list">
<li><a href="https://paperswithcode.com/sota">Papers with Code</a>: state-of-the-art in verschillende AI taken, voorzien van begeleidende papers</li>



<li><a href="https://crfm.stanford.edu/helm/latest">Stanford HELM</a>: benchmarkt een breed scala aan taken met focus op &#8220;human reasoning&#8221;</li>



<li><a href="https://chat.lmsys.org/?leaderboard">LMsys.org FastChat</a>: focus op chatbot-vaardigheden</li>



<li><a href="https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard">HuggingFace OpenLLM leaderboard</a></li>



<li><a href="https://llm-leaderboard.streamlit.app/">LLM-Leaderboard</a></li>
</ul>



<p>Specifiek voor code zijn er benchmarks die min of meer werken zoals een programmeerwedstrijd. Het idee is om een set opdrachten te geven aan het taalmodel, de resultaten automatisch te evalueren, en de &#8220;pass@1&#8221; en zo mogelijk enkele andere metrieken te meten. Vaak neemt dat een &#8220;fill in the function&#8221;-vorm aan: gegeven een beschrijving van input en output en een functieheader, moet de inhoud van de functie gegenereerd worden. Een nadeel is dat dit soort problemen soms <a href="https://www.computer.org/csdl/journal/ts/2023/07/10103177/1MpWUtj7Rwk">weinig representatief</a> is voor dat waarmee de doorsnee developer wordt geconfronteerd. Interessante initiatieven zijn onder andere:</p>



<ul class="wp-block-list">
<li>HuggingFace <a href="https://huggingface.co/spaces/bigcode/bigcode-models-leaderboard">Big Code Models leaderboard</a> (enkel open LLMs)</li>



<li>Microsoft <a href="https://github.com/microsoft/CodeXGLUE">CodeXGLUE</a>: evaluatie van verschillende subtaken volgens methodes bekend uit Natural Language Processing. Hun <a href="https://microsoft.github.io/CodeXGLUE/">leaderboard</a> lijkt af te hangen van vrijwillige contributie en enigszins onvolledig.</li>



<li>Papers with Code heeft aparte secties voor <a href="https://paperswithcode.com/task/code-generation">genereren van code</a> , <a href="https://paperswithcode.com/task/code-documentation-generation">genereren van documentatie</a>, <a href="https://paperswithcode.com/task/program-synthesis">synthese van hele programma&#8217;s</a> en <a href="https://paperswithcode.com/task/program-repair">bugfixing</a></li>



<li>De <a href="https://paperswithcode.com/dataset/humaneval">HumanEval dataset</a> en <a href="https://paperswithcode.com/dataset/mbpp">MBPP dataset</a>: typische programmeerproblemen (Python)</li>



<li>De <a href="https://paperswithcode.com/dataset/ds-1000">DS-1000 dataset</a>: een set van concrete data science / data processing problemen </li>



<li><a href="https://paperswithcode.com/dataset/humaneval-x">HumanEval-X</a> of <a href="https://github.com/nuprl/MultiPL-E">MultiPL-E</a>: multi-language versies van HumanEval, meet performantie in meerdere programmeertalen</li>
</ul>



<p>Dat een gegenereerd stuk code de testen overleeft betekent natuurlijk nog niet dat het ook veilige code is of &#8220;best practices&#8221; volgt. Er zijn ondertussen voorbeelden genoeg bekend van gegenereerde code die vatbaar blijkt te zijn voor buffer overflows, SQL injection, en andere klassieke risico&#8217;s. De <a href="https://huggingface.co/datasets/moyix/asleep_keyboard">&#8220;Asleep at the Keyboard&#8221;</a> security benchmark bestaat uit 89 code generation scenario&#8217;s gebaseerd op de <a href="https://cwe.mitre.org/top25/">MITRE top-25 vulnerability</a> lijst. Uit de <a href="https://arxiv.org/abs/2305.06161">Starcoder paper</a> blijkt dat zelfs de beste modellen in 40% van deze scenario&#8217;s toch nog onveilige code genereren. Ook lijkt er nauwelijks verschil te merken tussen de beste modellen en de rest &#8211; een beter model kiezen lijkt wel te zorgen voor syntactische correctere resultaten, maar vooralsnog niet voor veiliger code. Mogelijk moet daarom eens gekeken worden naar de trainingsdata zelf, waar onveilige code nog beter uitgefilterd zou moeten worden. In ieder geval moeten we op dit moment adviseren: het gebruik van gegenereerde code in een project moet absoluut gepaard gaan met een robuust beleid inzake testing en acceptatie.</p>



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



<p>Specifiek wat betreft computationele vereisten, zijn het <a href="https://huggingface.co/spaces/optimum/llm-perf-leaderboard">Huggingface OpenLLM-perf</a> leaderboard en de benchmarks op de website van <a href="https://bellard.org/ts_server/">TextSynth Server</a> interessante bronnen. Die laatste toont enkele cijfers over performantie, die handig zijn voor wie met het idee speelt om het zelf te gaan hosten. Wie het zonder GPU doet, kan met het LLaMa2 model van 13 miljard parameters rekenen op een snelheid van 12 tokens per seconde, gegeven een relatief high-end <a href="https://tweakers.net/pricewatch/1672608/amd-epyc-7313-tray.html">EPYC 7313</a> serverprocessor. Een token in computercode is soms maar 1 karakter, dus aan dat tempo moet je soms een tiental seconden wachten op een code completion suggestie. De recentste RTX-4090 grafische kaart kan het 7x sneller, maar nog steeds niet zo snel dat je het in milliseconden zou uitdrukken. </p>



<p>De geheugenvereisten zijn evenredig met het aantal parameters van een model, en de generatiesnelheid omgekeerd evenredig. Als een grove benadering mag je aannemen dat een model van 13 miljard parameters, ook 13 miljard berekeningen moet maken voor elk output token, zelfs al is het maar 1 karakter lang. Daarnaast vereist het, als elke parameter een 32-bit getal is, minstens 52GB opslagruimte en evenveel (V)RAM-geheugen. Een &#8220;<a href="https://huggingface.co/docs/transformers/main_classes/quantization">quantization</a>&#8220;, die de parameters afrondt naar 8-bit of zelfs 4-bit, kan die geheugenvereiste evenredig doen dalen. </p>



<p><a href="https://gpt4all.io/index.html">GPT4All</a> laat toe het zelf eens te proberen op je eigen hardware. Dit geeft een idee van de enorme rekenkracht die OpenAI , Microsoft Azure, of Amazon AWS inzetten om hun modellen, die veelal nog groter zijn dan de beschikbare Open Access LLMs, zo snel te kunnen doen draaien als zij dat aanbieden. Er wordt gesproken van investeringen van <a href="https://venturebeat.com/ai/nvidia-gpu-shortage-is-top-gossip-of-silicon-valley/">miljarden dollars in hardware</a>, zodanig groot dat ze de wereldwijde markt destabiliseren.</p>



<p>Zelfs open source oplossingen zijn allesbehalve lightweight te noemen, ondanks verregaande <a href="https://github.com/ggerganov/llama.cpp">initiatieven tot optimalisatie</a>. Je mag er alleszins van uitgaan dat het lokaal deployen alleen maar haalbaar is op recente en krachtige hardware. Een vlotte user experience kan je momenteel nog niet verwachten van een lokale installatie op de doorsnee kantoorlaptop.</p>



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



<p>Het internet staat vol sprookjes over de <a href="https://medium.com/ingeniouslysimple/the-origins-of-the-10x-developer-2e0177ecef60">10x developer</a>, en goeroes van generatieve AI zouden u graag doen geloven dat deze technologie elke programmeur tot dat niveau kan verheffen. De realiteit is hardnekkiger. Developers spenderen om te beginnen geen 100% van hun tijd aan het schrijven van code, net zomin als dokters 100% van hun tijd voorschriften schrijven. Het merendeel van developers <a href="https://www.software.com/reports/code-time-report">spendeert minder dan 1 uur per dag aan het effectief schrijven van code</a>. De rest van de tijd gaat naar analyseren, lezen, leren, onderhoudstaken, communicatie,&#8230; Dat denkwerk en het overleg met de collega&#8217;s wordt vooralsnog niet gecomprimeerd door LLMs in te zetten.</p>



<p>Het is moeilijk om harde cijfers te vinden over productiviteit omdat het <a href="https://queue.acm.org/detail.cfm?id=3454124">moeilijk te definiëren en dus te meten</a> is. Een nuttige eerste schatting komt van Google zelf, die de iteratietijd (van kennisname van het probleem tot oplossing) onder de loep nam. Met een eerste versie van hun eigen AI code completion assistent, <a href="https://ai.googleblog.com/2022/07/ml-enhanced-code-completion-improves.html">konden zij 6% tijdswinst noteren</a>. Github zelf beweert dat het <a href="https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">pure codeerwerk zo&#8217;n 55% sneller kan</a> met hun CoPilot &#8211; al zeggen ze er in één adem bij dat het 95%-confidence interval van hun meting [21%-89%] is. De adoptie van een tool brengt bovendien geen meerwaarde als ze niet gepaard gaat met een traject om ze optimaal te leren benutten (net zoals vandaag nog vele kantoormedewerkers tijd verliezen met Office door onvoldoende kennis of ervaring met alle types van referenties, formules en snelkoppelingen). </p>



<p>Gegenereerde code biedt wel snel een eerste oplossing, maar die oplossing moet nog steeds begrepen worden door de programmeur. Een &#8220;pass@1&#8221; score van 50%, betekent dat de helft van de gegenereerde code snippets nog manuele aanpassingen behoeft voordat ze de unit tests passeert &#8211; en dan spreken we nog niet over optimaliteit of veiligheid. Gegenereerde code kan complex zijn en gebruikmaken van constructies die boven het kennisniveau van de programmeur liggen. Dat maakt gegenereerde code moeilijker om te onderhouden en te debuggen dan code die manueel geschreven is. Gegenereerde code die onvoldoende werd gereviseerd en getest, voegt aanzienlijke <a href="https://www.techtarget.com/whatis/definition/technical-debt">technical debt</a> toe aan een project.</p>



<p>Het gebruik van plug-ins die zo ver gaan dat ze hele blokken code en documentatie met een vingerknip (of iets trager) kunnen genereren, is slechts een goed idee wanneer verschillende andere aspecten van het software engineering proces op orde zijn: er moeten over de hele lijn hoge standaarden aangehouden worden wat betreft teststrategie, code reviews, documenteren van code en kenniscompetenties van de developers. </p>



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



<p>Bedrijven en overheden hebben zelden de luxe om eender welk taalmodel te benutten. Er zijn niet alleen contractuele drempels, maar ook vragen over confidentialiteit, zeker bij gebruik van de cloud. Een goede suggestie van een taalmodel krijg je immers alleen door eerst voldoende informatie te uploaden. Als je niet alles in-house opzet, impliceert dat onvermijdelijk dat je een derde partij inzage geeft in jouw gegevens. </p>



<p>De mate van openheid en licentiëring kan aanzienlijk verschillen &#8211; in het ene uiterste is alles &#8220;black box&#8221; en enkel via cloud/API toegankelijk (hier vind je OpenAI, Anthropic, Cohere en de meeste andere gevestigde startups). Deze beloven in <a href="https://openai.com/blog/introducing-chatgpt-enterprise">Enterprise versies</a> soms meer garanties &#8211; maar je hebt nog steeds geen andere optie dan ze daarin te geloven op hun woord. In het andere uiterste is alles &#8220;open access&#8221; en permissief gelicentieerd. Daartussenin kan een bedrijf ook een Open Access taalmodel bouwen op een gesloten dataset. Van minstens 1 zo&#8217;n dataset is <a href="https://www.theatlantic.com/technology/archive/2023/08/books3-ai-meta-llama-pirated-books/675063/">ondertussen uitgelekt</a> dat ze illegaal gekopieerde  <a href="https://github.com/psmedia/Books3Info">auteursrechtelijk beschermde ebooks</a> bevat, wat ongetwijfeld een sterk argument wordt in de <a href="https://storage.courtlistener.com/recap/gov.uscourts.cand.415175/gov.uscourts.cand.415175.1.0_1.pdf">class action lawsuit over het thema tegen Meta</a>. De datasets van de code-LLMs <a href="https://arxiv.org/abs/2203.13474">Salesforce CodeGen</a> en <a href="https://codegeex.cn/">Tsinghua CodeGeeX</a> zijn evenmin publiek.</p>



<p>Transparantie, licentiëring, deployment mogelijkheden, prijszetting, grootte en schaalbaarheid,&#8230; het relatief belang van al deze kenmerken zal dicteren welke tools je kan gebruiken. Wie maximale transparantie wil, zal sowieso vaak beperkt zijn tot <a href="https://github.com/eugeneyan/open-llms">Open Access LLMs</a>. Sommige open licenties beperken het gebruik daarnaast tot niet-commerciële doeleinden. Een noodzaak tot inzage in de trainingsdata of gemakkelijke voorzieningen om zelf on-premise een instantie te kunnen hosten, <a href="https://blog.pragmaticengineer.com/github-copilot-alternatives/">beperkt de keuzemogelijkheden nog verder</a>.</p>



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



<p>Dialoog-gebaseerde tools (chatGPT en aanverwanten) kan je als developer nuttig inzetten bij o.a.: </p>



<ul class="wp-block-list">
<li>Het initialiseren van een project/bestand/klasse/configuratie: maak een eerste versie van iets</li>



<li>Het debuggen en aanpassen op vraag-antwoord-wijze</li>



<li>Relatief onafhankelijke snippets van code</li>
</ul>



<p>Tools die code aanvullen of ontbrekende code invullen (type Github Co-Pilot) komen dan weer goed van pas bij o.a.:</p>



<ul class="wp-block-list">
<li>Het vervolledigen van code aan de hand van eerder voorkomende voorbeelden</li>



<li>Het documenteren van code</li>



<li>Het maken van veranderingen midden in een groter bestand</li>
</ul>



<p>De optimale ontwikkelomgeving is voor een developer iets vrij persoonlijks en iedereen zal een eigen voorkeur hebben. In onze ogen zijn deze twee manieren om codesuggesties te krijgen enigszins complementair, en het slim combineren van de twee kan voor de meeste productiviteitswinst zorgen. In één adem willen we daarbij wel zeggen dat een gezond projectmanagement, met aandacht voor codekwaliteit, testing, reviews, documentatie, &#8230; daar wel onontbeerlijk bij hoort.</p>



<p>De AI-wereld is in volle beweging. Er komen met de regelmaat van de klok nieuwe AI-modellen bij die kunnen dienen als back-end voor IDE-plugins. Voor industrieën waar vertrouwelijkheid van code belangrijk is, zijn de open-source varianten erg interessant. Zelfs al tonen benchmarks dat die vandaag nog minder performant zijn dan de laatste commerciële cloud-based initiatieven, kunnen we verwachten dat daar in de toekomst ook betere versies van zullen verschijnen. Er zijn alvast veel inspanningen om modellen te maken die op (weliswaar high-end) consumentenhardware kunnen draaien. </p>



<h2 class="wp-block-heading">P.S.</h2>



<p>Enkele uren na het publiceren van dit artikel, kondigt HuggingFace <a href="https://huggingface.co/blog/safecoder">SafeCoder</a> aan: een enterprise-level oplossing voor LLM-gebaseerde coding assistants die on-premise uitgerold kan worden. Huggingface voorziet alles in containers die in het eigen datacenter geïnstalleerd kunnen worden en private endpoints voorzien, én voorziet compatibele plugins voor de belangrijkste IDEs. Andere algemene deployment frameworks bestaan al langer &#8211; o.a. <a href="https://www.seldon.io/">Seldon</a>, <a href="https://www.bentoml.com/">BentoML</a> en <a href="https://github.com/kserve/kserve">KServe</a> kunnen LLMs hosten, ook <a href="https://bellard.org/ts_server/">TextSynth Server</a> en <a href="https://gpt4all.io/index.html">GPT4All</a> kunnen functioneren als API endpoint. Je hebt echter nog steeds plugins nodig om er gebruik van te kunnen maken in de IDE zelf, en om de nodige pre- en postprocessing te doen &#8211; en als ze niet voorzien worden, moet je er zelf eentje maken of een bestaande plugin aanpassen.</p>



<h2 class="wp-block-heading">P.P.S.</h2>



<p>Deze laatste woorden waren nog niet koud of Meta lanceerde <a href="https://about.fb.com/news/2023/08/code-llama-ai-for-coding/">Code LLama</a> , een <a href="https://ai.meta.com/llama/">LLaMa 2</a> variant specifiek getraind voor code. Op <a href="https://twitter.com/abacaj/status/1694889597723873562">sociale media wordt vermeld</a> dat het mogelijk is de originele versie met 34 miljard parameters te draaien op een computer uitgerust met 4 RTX3090 GPUs met elk 24GB VRAM, waarmee ongeveer 20 tokens/seconde gegenereerd kunnen worden. Gemakkelijker is misschien de <a href="https://huggingface.co/chat">online chat-versie</a> uit te proberen. <a href="https://github.com/ggerganov/llama.cpp">Quantized versies</a> zullen ongetwijfeld erg snel volgen, en we verwachten de eerste benchmarks eerstdaags op de verschillende leaderboards.</p>



<p>______________________</p>



<p><em>Dit is een ingezonden bijdrage van Joachim Ganseman, IT consultant bij Smals Research. &nbsp;Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Git, de Definitieve Leider van de Versiecontrole?</title>
		<link>https://www.smalsresearch.be/git-de-definitieve-leider-van-de-versiecontrole/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 23 Jul 2013 07:45:45 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[source code]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[vcs]]></category>
		<category><![CDATA[version control]]></category>
		<guid isPermaLink="false">/?p=3518</guid>

					<description><![CDATA[Er is de laatste jaren nogal wat hype rond Git ontstaan. Git is een gedistribueerd versiecontrolesysteem (DVCS), en wordt vooral gebruikt om de broncode van software-projecten te beheren. Zo vind je b.v. op github de code voor een hele resem bekende en minder bekende open source projecten (git is ook zelf open source). Even in het [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2013/07/Git_icon.png"><img loading="lazy" decoding="async" class="size-thumbnail wp-image-5840 alignleft" alt="Git_icon" src="/wp-content/uploads/2013/07/Git_icon-150x150.png" width="150" height="150" srcset="https://www.smalsresearch.be/wp-content/uploads/2013/07/Git_icon-150x150.png 150w, https://www.smalsresearch.be/wp-content/uploads/2013/07/Git_icon.png 256w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>Er is de laatste jaren nogal wat hype rond Git ontstaan. <a href="https://git-scm.com/">Git</a> is een gedistribueerd versiecontrolesysteem (DVCS), en wordt vooral gebruikt om de broncode van software-projecten te beheren. Zo vind je b.v. op <a href="https://github.com/trending/" target="_blank">github</a> de code voor een hele resem bekende en minder bekende open source projecten (git is ook zelf open source).<span id="more-3518"></span></p>
<p>Even in het kort: het grote verschil tussen een centraal versiecontrolesysteem (CVCS), zoals Subversion (SVN), en een DVCS, is dat je met een DVCS lokale (offline) commits kan doen en je die later kan samenvoegen met de rest, terwijl je bij een CVCS altijd met de centrale server moet communiceren. Dit laat veel kleinere commits toe en vergemakkelijkt het zogenaamde &#8220;branchen&#8221;, wat dan weer de hele workflow vergemakkelijkt. Eén probleem is wel dat het beheer van zo&#8217;n systeem moeilijker wordt, omdat je voor een deel de controle geeft aan de gebruikers.</p>
<p>Voor de rest laat ik de algemene uitleg over VCS aan het internet over, in deze post wil ik het even hebben over Git. Een drietal jaar geleden maakte ik een studie naar VCS, omdat het tijd werd voor een migratie van onze oude CVS-systemen. Doel van de studie was toen om na te gaan welk systeem de opvolger moest worden. Het resultaat was SVN, wat vooral kwam doordat een CVCS systeem beter zou integreren met de huidige organisatie. Een verdienstelijke tweede plaats was toen voor Mercurial (Hg), een DVCS.</p>
<p>Waarom dus niet Git? Heb ik dat dan toen niet bekeken? Zeker wel, maar ik vond dat Git zich toen beter thuis voelde in een *-nix wereld, terwijl wij iets nodig hadden voor Windows. Verder bleek toen ook dat Git werd gebruikt voor het ontwikkelen van de Linux Kernel, en Hg voor de Java OpenJDK, en vermits wij voornamelijk in Java ontwikkelen, voelde Hg dus natuurlijker aan.</p>
<p>De belangrijkste reden waarom ik toen Hg boven Git heb geplaatst, was echter de relatieve eenvoud van Mercurial. Git was eerder een platform, waar je heel krachtige dingen mee kon doen, en Mercurial was eerder een echte eindgebruikerstoepassing, die eenvoudiger was in gebruik en dus een kortere leercurve zou kennen.</p>
<p>Tegenwoordig zijn de gebruikershandleidingen van Git een stuk beter geworden, maar zijn ook de mogelijkheden van Mercurial flink uitgediept. De producten zijn dus wat naar elkaar toegegroeid. Toch is er nog altijd een zekere &#8220;feel&#8221; die anders is, zoals ook besproken wordt op deze site: <a href="https://importantshock.wordpress.com/2008/08/07/git-vs-mercurial/" target="_blank">Git is MacGyver, Mercurial is James Bond</a>. Op <a href="https://stackoverflow.com/questions/35837/what-is-the-difference-between-mercurial-and-git" target="_blank">StackOverflow</a> staan er wat nuttiger vergelijkingen tussen de beide. We onthouden hiervan opnieuw dat Mercurial cleaner en eleganter aanvoelt, maar dat Git meer mogelijkheden tot customizatie biedt.</p>
<p>Sinds mijn vergelijkende studie een aantal jaren geleden, zijn de producten echter niet alleen geëvolueerd, maar is ook hun relatieve populariteit veranderd. In de software-ontwikkelingswereld in het algemeen merken we dat de voorkeur meer en meer naar gedistribueerde systemen zoals Git evolueert. Zelfs de grotere Application Lifecycle Management vendors <a href="https://ovum.com/2013/06/19/alm-vendors-scramble-to-add-support-for-git/">ondersteunen het</a> nu in hun producten. In onderstaande figuur zien we dat, omstreeks 2010, SVN nog steeds het populairste systeem was. Nu liggen de kaarten echter anders, en naar het einde toe zien we dat CVS zelfs onderaan de lijst bengelt. Dit wordt echter tegengesproken door de tweede figuur, waar we merken dat CVS stand houdt qua gebruik in bestaande projecten, ook al is het als zoekterm onderaan het peleton geëindigd. In de eerste figuur is Git echter duidelijk het populairste, en zelfs in de tweede figuur staat het systeem met kop en schouders boven de andere gedistribueerde systemen: Mercurial en Bazaar (bzr).</p>
<p style="text-align: center;"><a href="/wp-content/uploads/2013/07/figuur1.bmp"><img loading="lazy" decoding="async" class="size-thumbnail wp-image-5841  aligncenter" title="VCS systemen volgens google search" alt="VCS systemen volgens google search" src="/wp-content/uploads/2013/07/figuur1.bmp" width="963" height="245" /></a></p>
<p> VCS systemen volgens google search</p>
<p style="text-align: center;"><a href="/wp-content/uploads/2013/07/figuur3.bmp"><img loading="lazy" decoding="async" class="size-thumbnail wp-image-5843  aligncenter" title="VCS systemen volgens gebruik op ohloh" alt="VCS systemen volgens gebruik op ohloh" src="/wp-content/uploads/2013/07/figuur3.bmp" width="576" height="422" /></a></p>
<p>Gebruik van VCS volgens <a href="https://web.archive.org/web/20140718033602/http://www.ohloh.net/">Ohloh</a></p>
<p>Deze trend is al een tijdje aan de gang en lijkt voorlopig niet te keren: wanneer men tegenwoordig een versiecontrolesysteem nodig heeft, grijpt men, zeker in het geval van open source, in de eerste plaats naar Git. Het systeem is de laatste jaren dan ook erg matuur geworden, en heeft het grote voordeel van de gratis online dienst github voor open source projecten. Op deze manier kan Git in de hoofden van nieuwere generaties developers steeds vaker het eerste zijn waar ze aan denken bij de woorden &#8220;source code control&#8221;.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
