Table of Contents
Copilot Data Sources / Context Extension
Ich nutze schon seit einiger Zeit Copilot in meinen Entwicklungsumgebungen wie VSCode, IntelliJ und manchmal auch Visual Studio. Dabei habe ich mich oft gefragt, wie man die oft nicht sehr nützlichen Code-Vervollständigungen verbessern könnte.
Dazu habe ich zunächst die online verfügbare Dokumentation von Copilot durchgelesen. Mein Ziel war es herauszufinden, wie ich den „Kontext“ manipulieren oder anreichern kann.
Kontext? Also quasi das Kurzzeitgedächtnis der KI, alles was die KI nur über mein Projekt auf dem Rechner weiß und das nicht Teil des Models ist.
Copilot hat verschiedene Modi, die unterschiedliche Datenquellen nutzen, um den Kontext anzureichern/befüllen.
(Nein, die Tabelle ist noch nicht der Grund, diesen Artikel zu lesen, und ja, die Tabelle wurde garantiert von einer KI erstellt.)
Feature | Data Source / Context Used | Description |
---|---|---|
Code Completion | Current code, open files, project context | Provides real-time code suggestions as you type, using your code and open files as context[1][2]. |
Copilot Chat | Current code, selected text, project context, documentation | Interactive chat to ask questions or get explanations, using code and documentation as context[2]. |
Next Edit Suggestions | Current editing context, recent changes, cursor position | Predicts your next likely edit and suggests code based on your editing context (VS Code only)[2]. |
Copilot Coding Agent | Selected files, prompt, or GitHub issue | Autonomous agent makes code changes or creates pull requests based on your prompt or issue[2]. |
Spaces/Knowledge Bases | Organized code, documentation, or specs in a Space/knowledge base | Uses collections you provide for context when answering or generating code (Enterprise/preview). |
Also jetzt, da ich wusste, dass ich den Autocomplete verbessern kann, indem ich einfach eine Datei offen habe (so einfach), brauchte ich jetzt nur noch sinnvolle Inhalte.
Ein Inhalt, der gut wäre, wäre z.b. wenn die Vervollständigungen auch existierende Methoden an den korrekten Objekten verwenden würden.
Im Default ist, das momentan eher so, als würde man im Traum sich die tollsten und immer passenden Methoden ausdenken (die es aber 99 % der Fälle nicht gibt) und die dann direkt vorschlagen. Das führt zu Verwirrung, wenn man sowieso schon an schwierigem Code arbeitet.
Warum ist Copilot jetzt also so „blöd“ und erfindet einfach nur Funktions-Namen?
Copilot kennt out-of-the-box nur die aktuelle oberste Ebene der Objekte, und damit auch nur die obersten Methoden der Objekte. (Siehe die Tabelle oben.)
Ausnahme von dieser Regel sind alle Funktionen, die so oft im Internet vorkommen, sodass diese Informationen teil der AI sind, also in dessen Brains vorliegen. Diese also sozusagen auswendig kennt.
Mein Lösungsansatz
Von den Hauptobjekten im Programm habe ich iterativ und mit per Reflection alle Public Methoden ausgeben lassen.
Das Programm durchläuft zuerst das Hauptobjekt und anschließend alle zugehörigen Sub-Objekte. Dabei werden alle verfügbaren öffentlichen Methoden strukturiert aufgelistet und den jeweiligen Sub-Objekten zugeordnet. Diese Zuordnung wird mit Textpfeilen visualisiert, da wir ein Sprachmodell (LLM) verwenden.
Je nach Größe dieses Objekts kann man Zusatzinformationen wie Eingabe und Ausgabe Typen mit in die Liste (Listen Baum) aufnehmen.
Am Ende kommt eine Textdatei dabei herauskommen, die einen strukturierten Methodenbaum zeigt, der sich anhand des Objekts und dessen Unterobjekte aufbaut.
Das ganze setzt natürlich voraus, dass eine Objekt-Orientierte-Sprache verwendet wird.
Eine Sprache wie Java mit ihrer JVM ist quasi dafür gemacht, aber, um einen Überblick zu geben, hier wieder etwas AI generiertes:
Wie gut lässt sich das, was ich beschrieben, habe nun auf welche Sprache anwenden:
Python – Built-in inspect module, dynamic typing, easy object traversal – Excellent
Java – Comprehensive Reflection API, method signatures, type information – Excellent
C#/.NET – Powerful Type system, attributes, generics support – Excellent
JavaScript – Dynamic object inspection, prototype chain traversal – Very Good
…
…
C++ – RTTI very basic, requires external libraries – Limited
C – No built-in reflection capabilities – Not Supported
Meine Lösung / This Does The Trick
Ich habe das ganze mit Java und mit Python sowie JS praktisch umgesetzt, mit Java habe ich die meisten Erfahrungen gemacht.
Das ganze funktioniert, ziemlich gut, solang die Datei offen ist, schlägt Copilot nach einiger Zeit wirklich fast nur noch Methoden und Unterobjekte vor, die auch Sinn machen.
Hier ist ein Beispiel wie so eine Kontextdatei aussieht, wenn diese generiert wurde:
Diese Dateien enthalten noch einen gewissen Overhead, die eine AI aus meiner sich nicht braucht, dieser Overhead (mehr an Zeichen und Text) erleichtert es aber dem Leser dieses Artikels das ganze schnell zu erfassen.
Dadurch ist Copilot auch in der Lade komplexere Dinge vorzuschlagen, die vorher durch den fehlenden Kontext der AI schlicht und einfach nicht bekannt waren.
–> Hier ist meine Umsetzung in Python.
Weitere Gedanken
Die Frage, die ich mir stelle, bei der ganzen Angelegenheit ist, ob eine mehr auf AI ausgelegte Lösung wie die Currser IDE solche Mechanismen bereits im Hintergrund nutzt, und wann ein solcher Ansatz in Copilot eingebaut wird. Immerhin kann man so durch Extraktion komprimiert und somit speicher schonenden relevante Informationen dem Kontext bereitstellen.
Vielleicht gibt es ja irgendwann in naher Zukunft Rechner zu kaufen, mit AI Beschleunigern (wir wollen ja nur ausführen und nicht die AI trainieren), die über 128 RAM und mehr verfügen, die es dann letztendlich möglich machen sich von den sehr begrenzten Individual-Ressourcen (viel speicher für das Model, wenig speicher für den jeweiligen Kontext) der Rechenzentren freizumachen. Oder bis dahin scannen diese Dienste vom Rechenzentrum aus einfach alles auf dem Entwicklerrechner.
Es wird sich zeigen, oder auch nicht.
Auf jeden Fall kann man bis dahin tricksen per Reflecion.
Chat GPTs kommentar zu dem Artikel
Interessante Informationen zum Thema arbeiten mit AI
(echt Hand-Verlesen)
Salesforces-New-Developers-YoutubeVideo
Prompt-Engineering-Best-Practices-For-Chatgpt
Copilot-Comparring-Diffrent-AI-Models-For-Diffrent-Tasks
How-To-Promt-„Historic“-Information-From-2023-(Gives-You-A-Nice-Context)