Codeium - der einzig sinnvolle Code Assistent?
von Daniel Kleissl
![Resilienz](assets/images/4/a7575331-eba6-44fb-909b-44d9ea8d4509-e84db056.png)
Codeium - der einzig sinnvolle Code Assistent?
Jeder Programmierer und jede Programmiererin kennt mindestens eine Tätigkeit in der Softwareentwicklung, die er oder sie lieber delegieren oder automatisieren würde. Für die einen sind es Unit-Tests, für die anderen ist es Code-Cleanup.
Gerade bezogen auf repetitive Tasks versprechen AI-Sprachmodelle die Befreiung und mehr Zeit für jene Aufgaben, die Erfahrung oder unsere Kreativität erfordern. Doch können die derzeitig verfügbaren Assistenten hier wirklich eine Unterstützung bieten?
Mir war es ein Anliegen, die Fähigkeiten eines Code-Assistenten mit Integration in VS Code auszuloten. Selbst, wenn dieser nur eine kleine Beschleunigung für von mir unliebsamen Tasks bedeuten würde, wäre das schon ein großer Gewinn. Doch bevor ich mich für eine Integration entscheiden konnte, war es nötig zu beleuchten, wie die verschiedenen Anbieter das Thema Datenschutz behandeln und welche Bedeutung das für uns als Programmierer im Allgemeinen und für Auftragsarbeiten für Dritte im Besonderen hat.
Copy Right vs Copy Wrong
Dass die Copyright-Problematik gerade für kommerzielle User äußerst relevant ist, hat mittlerweile auch die Akteure im Feld der AI-Sprachmodelle erreicht. Aus diesem Grund, sind von den gängigsten AI-Assistenten zumindest gewisse Versionen verfügbar, die laut Endnutzervereinbarung die Daten nicht zum Training von neuen AIs einsetzen. Zum Beispiel hat Microsoft Copilot, ehemals Bing Enterprise, einen solchen Passus in seinen Verträgen enthalten. Allerdings ist dieser Assistent nur mit bestimmten Enterprise- oder Universitätslizenzen verfügbar[1]. Das Gleiche gilt für ChatGPT, jedoch verbirgt sich diese Version hinter deren Enterprise Version, für die nicht einmal ein öffentlich bekannter Preis existiert.
Codeium, ein AI-Coding-Assistent mit Plugins bzw. Extensions unter anderem für JetBrains IDEs und VS Code, erlaubt im Kontrast dazu Nutzern auch bei deren kostenfreien Version mittels einfachem Opt-Out die Verwendung der eigenen Telemetrie (z.B. lokale Latenz, welche Features verwendet wurden, wie viel Vorschläge akzeptiert oder abgelehnt wurden etc.) zu unterbinden. Darüber hinaus verwendet Codeium generell keinen User-Code zum Training von deren AIs. Codeium hat allerdings laut deren Marketingmaterial noch ein anderes Alleinstellungsmerkmal, das vor allem für die Verwendung von AIs als Programmierassistent sehr relevant ist, worauf ich im nächsten Kapitel eingehe[2].
Illegalität per Assistenz - Ein Lösungsansatz
Es ist eine Sache, wenn User durch ihre Fragen an die AI dem Unternehmen dahinter mitunter geheime Daten liefern, die entweder nicht nach außen dringen sollten oder die das eigene Intellectual Property in Gefahr bringen. Es ist aber eine ganz andere Thematik, wenn das Unternehmen, das die AI zur Verfügung stellt, diese mit einer unglaublichen Menge an Daten füttert, ohne hundertprozentig sicherzustellen, dass keine geheimen oder patentierten Code-Beispiele in den Trainingsdaten vorkommen. Spuckt nun der jeweilige Coding-Assistent geschützten Code aus und der Programmierer übernimmt diesen, dann stellt sich für mich die Frage, wie die Situation hier aus rechtlicher Sicht zu betrachten ist[3]. Es wird mitunter im Nachhinein sehr schwierig nachzuweisen sein, dass ein fremder, nicht offener Algorithmus in der eigenen Codebasis durch eine solche AI-Assistenz hineingelangt ist.
Nun ist es aber keinem User zumutbar, jeden generierten Code auf das Vorhandensein von patentierten Code-Teilen zu überprüfen.
In genau diese Kerbe schlägt Codeium mit deren Integration. Laut deren Website hat Codeium die Trainingsdaten aufbereitet, damit sichergestellt wird, dass alle nicht öffentlichen Code-Teile daraus entfernt werden. Dass dafür die alleinige Verwendung von Open Source Datensätzen nicht ausreicht, stellt Codeium in einem spannenden Blog Artikel zur Schau[4]. Kurz zusammengefasst, ist die Problematik jene, dass Open Source nicht automatisch bedeutet, dass darauf aufbauend auch kommerzielle Projekte entwickelt werden dürfen. Diese Art von Verwendung von Open Source Projekten fällt unter ein spezielles Subset von Lizenzen, womit es nicht ausreicht darauf zu achten, nur Open Source Daten zum Training zu verwenden. Codeium behauptet hier von sich selbst, mit Hilfe von Filtern und sogar manuellen Modifikationen alle problematischen Daten zu entfernen. Selbst, wenn diese Behauptung als User schwer zu überprüfen ist, allein, dass sich das Unternehmen darüber Gedanken macht, zeigt für mich die richtige Herangehensweise bei der Bereitstellung solcher Services. Dadurch war Codeium der einzige Assistent mit VS Code Integration, der für eine nähere Betrachtung in Frage gekommen ist.
Doch wie ist nun das Fazit nach mehr als 6 Monaten, in denen ich Codeium verwendet habe?
Noch ein weiter Weg zum perfekten Assistenten
Wir verwenden bei razzfazz.io TypeScript für die Programmierung unseres aktuellen Projekts. Für all jene, die keine Erfahrung mit TypeScript haben: Die Typen von TypeScript sind “nur” ein Compile-Time Feature, d.h. zur Laufzeit sind die Typen und die dadurch bereitgestellte Informationen nicht mehr vorhanden. Das bedeutet für den oder die Programmierer oder die Programmiererin einerseits ein gewisses Umdenken bei der Verwendung von Typen, andererseits bietet die Sprache dadurch auch nicht dieselben Run-Time Features wie z.B. Java. Diese Komplexität ist nicht nur für Developer herausfordernd, sondern auch für die Codeiums “Fill-in-the-middle”-Funktion.
Die Schwierigkeit besteht unter anderem darin, dass es in TypeScript, wie in jeder anderen Sprache auch, eine Menge Wege gibt, um dasselbe Ziel zu erreichen - allerdings gekoppelt mit der zusätzlichen Erschwernis eines komplexen, optionalen Typensystems. Hat man sich zusätzlich in einer Codebase auf gewisse Coding-Conventions geeinigt und eine Menge an Typen angelegt, dann werden die Vorschläge der AI immer weniger wertvoll, da die Menge an “Meta-Information” schlicht zu groß wird. Häufig schlägt diese dann generische Lösungen vor, die zwar funktionieren, aber streng genommen falsch sind, da diese eben einen anderen Stil verwenden oder Typen, die an einer anderen Stelle in der Codebase definiert sind, nicht anwenden. Damit befindet man sich schnell in einer Situation, die einem stetigen Code-Review von Fremdcode gleicht. Dies stellt eine komplett andere Herausforderung zum “einfachen” Programmieren dar und erfordert weit mehr Konzentration. Diese Problematik lässt sich zwar von Seiten der AI-Entwickler verbessern, indem der AI mehr Kontext mitgegeben wird. Damit befindet man sich allerdings mitten in der Context vs. Latency Problematik, die derzeit die größte Herausforderung für cloudbasierte AI Modelle darstellt.
Latency vs Context-Länge - Vom Regen in die Traufe
Will man von einem Large Language Model (LLM) bessere Antworten bekommen, dann benötigt dieses unter anderem auch mehr Input-Daten über den Prompt, den sogenannten Context. Allerdings haben cloudbasierte Systeme hier eine doppelte Herausforderung: Erstens müssen sie den Context über die Internetverbindung übertragen, was eine gewisse Zeit benötigt. Andererseits dauert die Inference des Models, also das Erstellen der Antwort, auch eine gewisse Zeit, und die Antwort muss über dieselbe Internetverbindung an den User zurückgeliefert werden. Erschwert wird das ganze davon, dass mit anwachsender Context-Länge die Antwort des LLMs auch mehr Zeit benötigt. Hier müssen also die Entwickler dieser Integrationen einen Sweet-Spot finden. Wenn die Latenz zu groß ist, dann kommt die AI selbst mittelmäßig schnellen Schreibern nicht hinterher. Wird allerdings der Context zu kurz, dann werden die Antworten der AI immer weniger spezifisch, und dafür für den User weitestgehend unbrauchbar[5].
Genau in diesem Spannungsfeld befindet sich auch Codeium mit seiner VSCode Integration. Selbst als nicht sehr schneller Schreiber merke ich, dass die Integration eine gewisse Zeit benötigt, um einen Vorschlag zu unterbreiten. Das Feeling ist dabei nicht vergleichbar mit einer normalen Auto-Completion. Bei mir bürgerte sich mit der Zeit eine Art “Stop-and-Go” Programmieren ein, da ich unbewusst auf den Vorschlag der AI warte. Wenn dieser dann noch dazu nicht passt, ist das umso ärgerlicher. Zumindest kann damit gerechnet werden, dass gerade hier neuere AI-Modelle eine Beschleunigung liefern und die Qualität der Antworten auch mit weniger Context besser werden wird. Doch Codeium hat sich auch eine Möglichkeit einfallen lassen, um das Wissen des Users über die eigene Codebase zu nutzen und für die Erstellung eines sinnvollen Contexts einzusetzen. Dieses Feature wurde als Prototyp im März 2024 unter dem Namen “Context Pinning”[6] vorgestellt. Hierbei handelt es sich um eine Möglichkeit, in der Konfiguration des Assistenten Files oder Verzeichnisse zu hinterlegen, die besonders relevante Informationen beinhalten. Für TypeScript wären das z.B. Files mit Typendefinitionen oder Helper-Klassen. Bei den ersten Tests von Codeium unter Verwendung dieses Features haben sich noch keine massiven Sprünge in der Code-Qualität gezeigt, allerdings ist das auch nicht die Erwartungshaltung an ein Prototype-Feature.
Es zeigt jedoch einmal mehr die richtige Herangehensweise von Codeium: Das Ziel soll eine echte Kollaboration zwischen AI und Programmierer sein. Und damit ist es nötig, dem User niederschwellige Tools in die Hand zu geben, womit die AI auf die eigenen Bedürfnisse zugeschnitten werden kann. Jenseits eines Modells, das mit der kompletten eigenen Codebasis trainiert wurde, wird jeder Algorithmus es schwer haben, genau zu erkennen, wo die wichtigen Stellen im Code zu finden sind. Die Idee des “Context Pinning” ist somit eine Win-Win Situation, da Codeium sich einen Teil der Entwicklung eines Modells zur Context-Erkennung erspart, und der Programmierer die Möglichkeit bekommt, den Assistenten genau zu fokussieren und personalisieren. Es ist mit dem derzeitigen UI sogar möglich, den Context vor einer Chat-Anfrage zu modifizieren, falls nur ein Subset der markierten Files relevant ist.
Der Vollständigkeit halber sei auch gesagt, dass Codeium die Möglichkeit bietet, einen kurzen “Default-Prompt” zu hinterlegen, der jeder Anfrage angehängt wird. Dieses ermöglicht eine weitere Personalisierung des Assistenten, z.B. wenn ich ein bestimmtes Framework verwende, und möchte das Codeium seine Antworten darauf bezieht. Ähnliche Möglichkeiten bieten auch andere AI Assistenten wie ChatGPT, daher gehe ich hier nicht genauer darauf ein.
Kollaboration zwischen Mensch und Maschine
Es gibt Aufgaben beim Programmieren, für die weder Fill-in-the-Middle noch ein separates Chat-Fenster der richtige Ansatz sind. So kann man sich in der Situation befinden, dass man zwar in einfachen Worten beschreiben kann, was man mit einer Codestelle erreichen will, aber man weiß nicht genau, wie man diese Aufgabe am besten angehen soll. Oder man hat eine Codestelle, die man auf eine gewisse Art refaktorieren will, die zwar gut beschreibbar, aber schwer automatisierbar ist.
Hier zeigt sich der große Vorteil eines weiteren Moduls von Codeium: Codeium Command. Dieses Modul ermöglicht direkt im Editor der IDE ein Fenster zu öffnen, über das dann dem AI-Assistenten Anweisungen gegeben werden können. Dieser erstellt dann ein Vorschlags-Diff, das entweder direkt akzeptiert, abgelehnt oder mittels der “Follow-Up”-Funktion modifiziert werden kann. Letztere ist hilfreich, wenn der Vorschlag zwar nahezu dem gewünschten Ergebnis entspricht, aber eben kleinere Anpassungen benötigt. Wie immer bei der Konversation mit einem AI Assistenten lernt man mit der Zeit, wie man den “Prompt” strukturieren muss und welche Informationen wichtig sind. Z.B. kann man bei sich wiederholenden Refactorings einen schon umgeschriebenen Block gemeinsam mit dem zu refaktorierenden Block markieren, und somit der AI ein Beispiel geben, an welche Struktur sie sich halten soll. Oder man kopiert diesen Codeblock in das Command-Fenster und gibt so der AI einen Anhaltspunkt zur gewünschten Struktur.
Ein interessanter psychologischer Effekt bei der Verwendung von Codeium Command war, dass es weit weniger kognitive Anstrengung erforderte, den so generierten Code zu überprüfen. Das mag einerseits daran liegen, dass man sich durch die Verwendung des Command-Fensters bewusst in eine “Code-Review” Situation begibt, andererseits ist die Formatierung des Vorschlags als Diff gut lesbar, und ein Format, das jeder Programmierer vom Lesen von Git Commits gut kennt.
Abbildung: Codeium Command Window (Quelle:SEQIS GmbH)
Abbildung: Codeium Command in Action (Quelle:SEQIS GmbH)
Fazit
Für mich hat sich Codeium Command in der normalen Programmierung als das hilfreichste Modul herausgestellt. Fill-in-the-Middle hat aufgrund der Latenz-Problematik und Qualität der Codevorschläge noch einiges an Weg vor sich, bis es eine ähnlich störungsfreie Unterstützung wie z.B. Intellisense bietet. Codeium Chat wiederum mag für die Exploration von unbekannten Repositories interessant sein, oder um sich das Öffnen eines Browserfensters und die Internetsuche zu ersparen, aber auch hier zeigt sich, dass die Modelle, vor allem GPT 3.5, noch nicht ganz dort sind, wo man sie sich für eine gute Unterstützung wünschen würde. Allerdings kann damit gerechnet werden, dass vor allem hier neuere Modelle weit besser performen und sukzessive auch für den Free-Tier ausgerollt werden. Für Nutzer, die ein bezahltes Abo abgeschlossen haben, stellt Codeium schon jetzt einen auf GPT 4 basierenden Chat zur Verfügung.
Codeium Command allerdings bietet in einem relativ engen Anwendungsbereich eine gute Unterstützung und erreicht dies wiederum einerseits durch Einschränken dessen, was die AI als Aufgabe bekommt, und andererseits dadurch, dass sie dem Entwickler eine einfache Möglichkeit bietet, die AI anzuleiten. Und gerade für mich bietet Codeium hier bei Aufgaben, die durch ihre repetitive Natur anstrengend sind, eine echte Verbesserung.
Auch, wenn Codeium noch am Anfang steht und daher voraussichtlich noch nicht für jeden Programmierer oder jede Programmiererin eine große Unterstützung darstellt, möchte ich dennoch eine Empfehlung dafür aussprechen, in der Hoffnung, dass möglichst viele Personen zumindest das Experiment wagen und die Integration installieren. Wir als Nutzer solcher AI-Assistenten haben hier nicht nur die Möglichkeit, sondern in meinen Augen auch die Verpflichtung durch die Wahl unserer Tools, die Entwicklung in diesem Feld mitzugestalten.
Und da vor allem Codeium in meinen Augen so viel bei der Entwicklung eines Code Assistenten richtig macht, hoffe ich, dass diese Integration erfolgreich ist und somit auch als gutes Beispiel gelten kann, worauf es bei einer AI Integration ankommt: Kollaboration zwischen AI und Entwickler, leicht bedienbares UI und gute, einfach verwendbare Anpassungsmöglichkeiten.
Da Codeium in der Basis-Variante kostenlos verfügbar ist, handelt es sich hier um ein Experiment, dass hoffentlich viele wagen werden.
Downloads
https://marketplace.visualstudio.com/items?itemName=Codeium.codeium
Quellen
[1] https://learn.microsoft.com/en-us/copilot/manage#commercial-data-protection-eligibility
[3] https://x.com/DocSparse/status/1581461734665367554
[4] https://codeium.com/blog/copilot-trains-on-gpl-codeium-does-not
[5] https://codeium.com/blog/latency-the-ultimate-constraint
[6] https://codeium.com/blog/codeium-context-pinning-launch
Weitere Information