Wie funktioniert Cursor (AI IDE)?
(blog.sshh.io)- Wenn man versteht, wie AI-Coding-Tools wie Cursor, Windsurf und Copilot intern funktionieren, kann man in komplexen Codebasen die Produktivität steigern und eine konsistente Leistung sichern
- Viele behandeln AI-IDEs, ohne ihre Grenzen zu verstehen, wie traditionelle Werkzeuge und erleben dadurch Performance-Probleme
- Dieser Artikel erklärt die interne Funktionsweise von Cursor, System-Prompts sowie Methoden zur Optimierung von Coding- und Cursor-Regeln
Vom LLM zum Coding-Agenten
Large Language Models (LLMs)
- LLMs arbeiten grundsätzlich, indem sie das nächste Wort vorhersagen
- Gibt man einen Prompt vor, erzeugt das LLM seine Antwort per Autovervollständigung
- Frühe decoderbasierte LLMs (z. B. GPT-2) erforderten spezifische Prompts, um das gewünschte Ergebnis zu erhalten
- Prompt Engineering ist die Technik, das Modell so zu „lenken“, dass es die gewünschte Antwort liefert
- Mit der Einführung von Instruction Tuning wurde die Bedienung deutlich einfacher
- Anweisungen wie „Schreibe einen PR zum Refactoring der Methode Foo“ können direkt ausgeführt werden
- Tatsächlich ist das eine erweiterte Version des Autovervollständigungsprozesses
- Tool Calling kam hinzu
- Das Modell kann Aufgaben wie Dateien lesen, schreiben oder Befehle ausführen
- Beispiel:
read_file('index.py')→ der Client liefert den Dateiinhalt → das Modell setzt die Arbeit fort
Agentenbasiertes Coding
AI-IDEs wie Cursor sind mit einer komplexen Wrapper-Struktur aufgebaut:
- VSCode-Fork → Start auf Basis von Open Source
- Ergänzung einer Chat-UI und Auswahl eines passenden LLMs (z. B. Sonnet 3.7)
- Implementierung von Tools für Coding-Agenten
read_file(full_path: str)write_file(full_path: str, content: str)run_command(command: str)
- Prompt-Optimierung
- Zusätzliche Anweisungen wie „Du bist ein Experte im Coden“ oder „Rate nicht, sondern nutze Tools“
→ Wenn man nur diese Schritte umsetzt, funktioniert es zwar grundsätzlich, aber es können Probleme wie Syntaxfehler, Halluzinationen und mangelnde Konsistenz auftreten
- Zusätzliche Anweisungen wie „Du bist ein Experte im Coden“ oder „Rate nicht, sondern nutze Tools“
Strategien und Tipps zur Optimierung agentenbasierten Codings
- Um eine gute AI IDE zu bauen, muss man verstehen, welche Aufgaben LLMs gut lösen, und Prompts und Tools sorgfältig auf die Grenzen von LLMs abstimmen.
- Es ist effektiv, die Hauptaufgabe zu vereinfachen und für Teilaufgaben kleinere Modelle zu verwenden
- Durch die Verteilung komplexer Aufgaben lassen sich Leistung und Konsistenz verbessern
-
Benutzerkontext hinzufügen (mit
@file)- Nutzer kennen wahrscheinlich bereits die passenden Dateien oder den relevanten Kontext
- Durch Hinzufügen der
@file-Syntax wird Kontext bereitgestellt, indem der Inhalt ganzer Dateien oder Ordner einbezogen wird - Tipp: Die aktive Nutzung von
@folder/@filewird empfohlen → klarer Kontext verbessert Antwortgeschwindigkeit und Genauigkeit
-
Code-Suche optimieren
- Code-Suche kann komplex sein, insbesondere semantische Suche (z. B. „wo befindet sich der Authentifizierungscode?“)
- Die Codebasis wird in einem Vectorstore indexiert → bei der Suche filtert und ordnet das LLM die Treffer automatisch neu
- Tipp: Code-Kommentare und Dokumentation sind wichtig → sie verbessern die Leistung von Embedding-Modellen
- Am Dateianfang sollte der Zweck der Datei, ihre Bedeutung und Hinweise zum Änderungszeitpunkt ergänzt werden
-
Dateischreiben optimieren
- Perfekten Code zu schreiben ist schwierig und teuer
- Statt einer vollständigen Datei wird ein Semantic Diff erzeugt → nur geänderte Codefragmente werden bereitgestellt
- Auf Basis dieses Semantic Diffs schreibt ein separates Apply-Modell die eigentliche Datei und korrigiert Syntaxfehler
- Tipp: Dem Apply-Modell können keine Prompt-Anweisungen direkt gegeben werden → mehr Kontrolle durch Bereitstellung der gesamten Datei
- Tipp: Das Apply-Modell wird bei der Bearbeitung großer Dateien langsamer und fehleranfälliger → Dateigröße unter 500 LoC halten
- Tipp: Linter-Feedback ist ein sehr wichtiges Signal → ein starker Linter ist unverzichtbar
- Auch Feedback aus kompilierenden und typisierten Sprachen kann genutzt werden
- Tipp: Eindeutige Dateinamen verwenden → statt
page.jsbesser konkrete Namen wiefoo-page.js,bar-page.js- In Dokumenten den vollständigen Dateipfad angeben → beseitigt Mehrdeutigkeiten für Editier-Tools
-
Agentenspezifische Modelle verwenden
- Es wird empfohlen, keine allgemeinen Code-Generierungsmodelle, sondern agentenspezifische Modelle zu verwenden
- Das ist ein Grund, warum die Modelle von Anthropic in IDEs wie Cursor so starke Leistung zeigen
- Tipp: Nicht einfach ein Modell fürs Code-Schreiben wählen, sondern eines, das für agentenbasierte IDEs optimiert ist
- Die Modellleistung lässt sich auf dem Leaderboard von WebDev Arena prüfen
-
Self-Fix-Tools einsetzen (fortgeschrittene Strategie)
apply_and_check_tool→ führt teure Linter aus und sammelt Konsolenlogs sowie Screenshots in einem Headless-Browser- MCP (Model Context Protocol) → stärkt die Autonomie des Agenten und die Bereitstellung von Kontext
Detaillierte Analyse des Cursor-System-Prompts
- Cursors aktueller Prompt (März 2025) wurde mittels prompt injection auf MCP-Basis extrahiert
- Cursors Prompt Engineers verfügen selbst im Vergleich zu anderen AI-IDEs über herausragende Fähigkeiten beim Schreiben von Prompts.
- Durch die Analyse der Prompt-Struktur lassen sich Fähigkeiten in der Code-Generierung und im Design von Agentenarchitekturen verbessern
-
Wichtige Prompt-Elemente und ihre Bedeutung
- Verwendung von Tags wie
"<communication>","<tool_calling>"- Mischung aus Markdown- und XML-Tags → gut lesbar für Menschen und leicht verarbeitbar für LLMs
"powered by Claude 3.5 Sonnet"- Stärkt die Modellkonsistenz → verhindert, dass das LLM falsche Angaben zum laufenden Modell macht
"the world's best IDE"- Verhindert, dass das LLM bei Fehlern andere Produkte empfiehlt
"we may automatically attach some information…follow the USER's instructions…by the <user_query> tag."- Der Benutzer-Prompt wird nicht direkt weitergereicht, sondern in spezielle Tags eingebettet, um Verwirrung zu vermeiden
"Refrain from apologizing"- Verhindert unnötige Entschuldigungen (zur Kompensation einer Eigenheit des Sonnet-Modells)
"NEVER refer to tool names when speaking"- Zusätzliche Anweisung, Tool-Namen nicht zu erwähnen → wird vom tatsächlichen Modell aber manchmal ignoriert
"Before calling each tool, first explain"- Zustand vor dem Tool-Aufruf erklären → verbessert die User Experience
"partially satiate the USER's query, but you're not confident, gather more information"- Verhindert vorschnelle Antworten durch übermäßiges Selbstvertrauen → regt zum Einholen zusätzlicher Informationen an
"NEVER output code to the USER"- Direkte Ausgabe von Code verboten → Code-Erzeugung nur über Tools erlaubt
"If you're building a web app from scratch, give it a beautiful and modern UI"- Soll mit einem einzigen Prompt die Erstellung attraktiver Web-Apps fördern (für Demo-Zwecke)
"you MUST read the the contents or section of what you're editing before editing it"- Erzwingt das Lesen des Kontexts vor Code-Änderungen → stärkt das Kontextverständnis
"DO NOT loop more than 3 times on fixing linter errors"- Begrenzt Korrekturschleifen → verhindert Endlosschleifen
"Address the root cause instead of the symptoms."- Fördert die Behebung der Grundursache statt bloßer Symptome
"DO NOT hardcode an API key"- Anweisung zur Verbesserung der Sicherheit → verhindert Hardcoding
"codebase_search","read_file","grep_search","file_search","web_search"- Verschiedene Suchwerkzeuge, um vor dem Schreiben von Code den richtigen Kontext zu beschaffen
- Anforderung
"One sentence explanation…why this command needs to be run…"- Stärkt die Logik bei der Verarbeitung von Tool-Argumenten → eingesetzte Technik zur Prompt-Verbesserung
- Das Tool
"reapply"ist"Calls a smarter model to apply the last edit"- Wendet die letzte Änderung mit einem fortschrittlicheren Modell erneut an → verbessert die Qualität der Bearbeitung
- Das Tool
"edit_file"ist"represent all unchanged code using the comment of the language you're editing"- Unveränderter Code wird per Kommentar dargestellt → verbessert die Genauigkeit des Editiermodells
- Verwendung von Tags wie
- Nutzung von Prompt Caching
- System-Prompt und Tool-Beschreibungen bleiben als statischer Zustand erhalten
- Keine Anpassung an Codebasis oder Benutzer → Prompt Caching kann Kosten senken und die Verarbeitung beschleunigen
Cursor-Regeln effektiv schreiben und verwenden
- Die richtige Art, Cursor-Regeln zu schreiben, kann je nach Situation variieren, aber auf Basis von Prompt-Erfahrung und Verständnis der internen Cursor-Struktur lassen sich einige nützliche Tipps geben
- Wichtig ist, Regeln nicht als bloße Anweisungen, sondern als enzyklopädische Leitlinien zu formulieren.
-
Zentrale Konzepte beim Schreiben von Regeln
- Das LLM ruft
fetch_rules(…)auf Grundlage der Namen und Beschreibungen der Regelliste auf - Regeln werden nicht dem System-Prompt hinzugefügt, sondern bei Bedarf referenziert
- Daher ist ein enzyklopädischer Beschreibungsstil statt bloßer Befehle wirksamer
- Das LLM ruft
-
Was man beim Schreiben von Regeln vermeiden sollte
- Keine Definition einer Identität
- Beschreibungen wie „Du bist ein TypeScript-Experte“ vermeiden
- Das LLM kennt seine Identität bereits aus dem eingebauten Prompt → Konfliktrisiko
- Nicht versuchen, den System-Prompt zu überschreiben
- Anweisungen wie „Füge keine Kommentare hinzu“ oder „Stelle vor dem Schreiben von Code Fragen“ → können die Nutzung interner Tools durcheinanderbringen
- Keine negativen Anweisungen
- Positive Anweisungen wie „Tu X“ sind für LLMs wirksamer als „Tu X nicht“
- Beispiel für eine positive Anweisung: „Beim Bearbeiten einer Datei zuerst den gesamten Kontext prüfen“
- Keine Definition einer Identität
-
Empfehlungen für das Schreiben von Regeln
- Klare und intuitive Regelnamen und Beschreibungen verfassen
- Regeln sollten sich schon mit minimalen Informationen über die Codebasis anwenden lassen
- Doppelte Regeln können sinnvoll sein → verbessert die Suchgenauigkeit
- Regeln enzyklopädisch formulieren
- Statt konkreter Befehle Erklärungen zu Situationen und Zielen liefern
- Bei Bedarf können Code-Dateien verknüpft werden, um den Kontext zu stärken
- Cursor zum Entwurf von Regeln verwenden
- LLMs sind stark darin, Kontext für andere LLMs zu schreiben
- Beispiel: „Erstelle unter
@folder/eine Markdown-Datei zu häufig bearbeiteten Codepfaden und Definitionen“
- Nicht zu viele Regeln schreiben
- Zu viele Regeln sind ineffizient und deuten auf eine unübersichtliche Codebasis hin
- Eine ideale Codebasis sollte es dem Agenten ermöglichen, mit möglichst wenigen Regeln zu arbeiten
- Klare und intuitive Regelnamen und Beschreibungen verfassen
-
Beispiele für effektive Regeln
- ✅ Regelanweisungen:
- „Vor dem Bearbeiten einer Datei den gesamten Kontext lesen“
- „Bei Änderungen am Server-Code die Logik des Authentifizierungscodes prüfen“
- „Bei Fehlern zuerst die Ursache beheben“
- ❌ Regelanweisungen (vermeiden):
- „Lösche keine Kommentare“
- „Stelle mir vor Änderungen Fragen“
- „Nimm keine unnötigen Code-Änderungen vor“
- ✅ Regelanweisungen:
-
Kernstrategie beim Schreiben von Regeln
- Regeln nicht als Befehle, sondern als Situationsbeschreibungen formulieren
- Intuitive Namen und Beschreibungen verwenden → maximale Leistung mit minimalen Regeln
- Situationen erklären und Code-Verknüpfungen stärken statt allzu konkreter Anweisungen
Fazit
- Dass Cursor, entstanden aus einem VSCode-Fork und aufgebaut auf Open-Source-basierten Prompts sowie öffentlichen Modell-APIs, mit fast 10 Milliarden US-Dollar bewertet wird, ist bemerkenswert
- Cursor wird derzeit auf Basis eines „wrapper multiple“ mit dem 6-Fachen bewertet
- Cursor liefert dank optimierter Prompts und eines starken Tool-Calling-Systems eine hohe Leistung
- Es ist eher unwahrscheinlich, dass Cursor ein eigenes Agentenmodell entwickelt
- Wahrscheinlicher ist, dass Anthropic mit Claude Code und Sonnet-basierten Konkurrenzprodukten auf den Markt kommt
-
Zentrale Erkenntnisse
- Codebasis, Dokumentation und Regeln korrekt aufzusetzen, bleibt auch künftig eine wichtige Fähigkeit
- Wer die Optimierungsstrategien von AI-Coding-Tools versteht, kann Produktivität und Genauigkeit steigern
- Wenn Cursor nicht richtig funktioniert, liegt das wahrscheinlich eher an der Art der Nutzung
„Wenn Cursor nicht funktioniert, sollte man zuerst die eigene Nutzung überprüfen.“
4 Kommentare
Das sollte ich wohl mal ausprobieren.
Interessant. Liegt es vielleicht daran, dass sie aus demselben Wasser trinken?
Da steckt viel Einsicht drin. Vielen Dank.