47 Punkte von GN⁺ 2025-03-24 | 4 Kommentare | Auf WhatsApp teilen
  • 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

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/@file wird 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.js besser konkrete Namen wie foo-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
  • 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
  • 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“
  • 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
  • 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“
  • 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

 
bluekai17 2025-03-26

Das sollte ich wohl mal ausprobieren.

 
ohyecloudy 2025-03-25

Mit Cursor einen Regelentwurf erstellen
LLMs sind stark darin, Kontext für andere LLMs zu schreiben

Interessant. Liegt es vielleicht daran, dass sie aus demselben Wasser trinken?

 
linker 2025-03-25

Da steckt viel Einsicht drin. Vielen Dank.

 
nicewook 2025-03-25
  • Detaillierte Analyse des Cursor-System-Prompts – beeindruckend.
  • Dass Anthropic möglicherweise eine AI IDE auf den Markt bringt, macht schon jetzt gespannt.