Zunächst: Was ist ein Kontextfenster? Und wie hängt es mit effektivem Programmieren in Cursor zusammen? Um etwas weiter auszuholen: Ein großes Sprachmodell (LLM) ist ein künstliches Intelligenzmodell, das darauf trainiert wurde, Text vorherzusagen und zu generieren, indem es Muster aus riesigen Datensätzen lernt. Es treibt Tools wie Cursor an, indem es Ihre Eingabe versteht und Code oder Text basierend auf dem vorschlägt, was es zuvor gesehen hat. Tokens sind die Ein- und Ausgaben dieser Modelle. Sie sind Textfragmente, oft ein Wortfragment, die ein LLM nacheinander verarbeitet. Modelle lesen nicht ganze Sätze auf einmal; sie sagen das nächste Token basierend auf denen vorher, die davor kamen. Um zu sehen, wie ein Text tokenisiert wird, können Sie einen Tokenizer wie diesen hier verwenden. Tokenizer

Was ist Kontext?

Wenn wir einen Code-Vorschlag in Cursor generieren, bezieht sich “Kontext” auf die Informationen, die dem Modell bereitgestellt werden (in Form von “Input-Tokens”), die das Modell dann verwendet, um die nachfolgenden Informationen vorherzusagen (in Form von “Output-Tokens”). Es gibt zwei Arten von Kontext:
  1. Absichts-Kontext definiert, was der Benutzer vom Modell erhalten möchte. Zum Beispiel dient ein System-Prompt normalerweise als übergeordnete Anweisung dafür, wie sich das Modell verhalten soll. Der Großteil des “Promptings” in Cursor ist Absichts-Kontext. “Ändere diese Schaltfläche von blau zu grün” ist ein Beispiel für eine geäußerte Absicht; es ist präskriptiv.
  2. Zustands-Kontext beschreibt den Zustand der aktuellen Welt. Cursor mit Fehlermeldungen, Konsolen-Logs, Bildern und Code-Fragmenten zu versorgen sind Beispiele für Kontext, der sich auf den Zustand bezieht. Er ist beschreibend, nicht präskriptiv.
Zusammen arbeiten diese beiden Arten von Kontext harmonisch, indem sie den aktuellen Zustand und den gewünschten zukünftigen Zustand beschreiben und es Cursor ermöglichen, nützliche Code-Vorschläge zu machen.

Kontext in Cursor bereitstellen

Je mehr relevanten Kontext Sie einem Modell bereitstellen können, desto nützlicher wird es sein. Wenn in Cursor unzureichender Kontext bereitgestellt wird, wird das Modell versuchen, das Problem ohne die relevanten Informationen zu lösen. Dies führt typischerweise zu:
  1. Halluzinationen, bei denen das Modell versucht, Muster zu erkennen (wenn kein Muster vorhanden ist), was zu unerwarteten Ergebnissen führt. Dies kann häufig bei Modellen wie claude-3.5-sonnet auftreten, wenn ihnen nicht genügend Kontext gegeben wird.
  2. Der Agent versucht, selbst Kontext zu sammeln, indem er die Codebasis durchsucht, Dateien liest und Tools aufruft. Ein starkes Denkmodell (wie claude-3.7-sonnet) kann mit dieser Strategie ziemlich weit kommen, und die Bereitstellung des richtigen anfänglichen Kontexts wird die Richtung bestimmen.
Die gute Nachricht ist, dass Cursor mit kontextuellem Bewusstsein als Kern entwickelt wurde und darauf ausgelegt ist, minimale Eingriffe vom Benutzer zu erfordern. Cursor zieht automatisch die Teile Ihrer Codebasis heran, die das Modell als relevant einschätzt, wie die aktuelle Datei, semantisch ähnliche Muster in anderen Dateien und andere Informationen aus Ihrer Sitzung. Da jedoch viel Kontext herangezogen werden kann, ist die manuelle Spezifikation des Kontexts, von dem Sie wissen, dass er für die Aufgabe relevant ist, eine hilfreiche Möglichkeit, die Modelle in die richtige Richtung zu lenken.

@-Symbol

Der einfachste Weg, expliziten Kontext bereitzustellen, ist mit dem @-Symbol. Diese sind großartig, wenn Sie genau wissen, welche Datei, welchen Ordner, welche Website oder welches andere Kontextelement Sie einbeziehen möchten. Je spezifischer Sie sein können, desto besser. Hier ist eine Aufschlüsselung, wie Sie präziser mit Kontext arbeiten können:
SymbolBeispielAnwendungsfallNachteil
@code@LRUCachedFunctionSie wissen, welche Funktion, Konstante oder welches Symbol für die Ausgabe relevant istErfordert viel Wissen über die Codebasis
@filecache.tsSie wissen, welche Datei gelesen oder bearbeitet werden soll, aber nicht genau wo in der DateiKönnte je nach Dateigröße viel irrelevanten Kontext für die anstehende Aufgabe enthalten
@folderutils/Alles oder die Mehrheit der Dateien in einem Ordner ist relevantKönnte viel irrelevanten Kontext für die anstehende Aufgabe enthalten
Context Menu

Regeln

Sie sollten Regeln als Langzeitgedächtnis betrachten, auf das Sie oder andere Mitglieder Ihres Teams Zugriff haben möchten. Das Erfassen domänenspezifischer Kontexte, einschließlich Arbeitsabläufe, Formatierung und andere Konventionen, ist ein großartiger Ausgangspunkt für das Schreiben von Regeln. Regeln können auch aus bestehenden Unterhaltungen generiert werden, indem Sie /Generate Cursor Rules verwenden. Wenn Sie eine lange Hin- und Her-Unterhaltung mit vielen Eingabeaufforderungen hatten, gibt es wahrscheinlich einige nützliche Anweisungen oder allgemeine Regeln, die Sie später wiederverwenden möchten. Rules

MCP

Model Context Protocol ist eine Erweiterungsschicht, mit der Sie Cursor Fähigkeiten geben können, um Aktionen durchzuführen und externen Kontext einzubeziehen. Je nach Ihrem Entwicklungssetup möchten Sie möglicherweise verschiedene Arten von Servern nutzen, aber zwei Kategorien, die sich als besonders nützlich erwiesen haben, sind:
  • Interne Dokumentation: z.B. Notion, Confluence, Google Docs
  • Projektmanagement: z.B. Linear, Jira
Wenn Sie bereits über Tools für den Zugriff auf Kontext und die Durchführung von Aktionen über eine API verfügen, können Sie einen MCP-Server dafür erstellen. Hier ist eine kurze Anleitung zum Erstellen von MCP-Servern. MCP

Selbstsammelnder Kontext

Ein mächtiges Muster, das viele Benutzer übernehmen, ist es, den Agent kurzzeitige Tools schreiben zu lassen, die er dann ausführen kann, um mehr Kontext zu sammeln. Dies ist besonders effektiv in Human-in-the-Loop-Workflows, bei denen Sie den Code vor der Ausführung überprüfen. Zum Beispiel gibt das Hinzufügen von Debugging-Anweisungen zu Ihrem Code, das Ausführen und das Inspizieren der Ausgabe durch das Modell ihm Zugang zu dynamischem Kontext, den es statisch nicht ableiten könnte. In Python können Sie dies tun, indem Sie den Agent dazu auffordern:
  1. print(“debugging: …”) Anweisungen in relevanten Teilen des Codes hinzuzufügen
  2. Den Code oder Tests über das Terminal auszuführen
Der Agent wird die Terminal-Ausgabe lesen und entscheiden, was als nächstes zu tun ist. Die Grundidee ist, dem Agent Zugang zum tatsächlichen Laufzeitverhalten zu geben, nicht nur zum statischen Code. Self-Gathering Context

Erkenntnisse

  • Kontext ist die Grundlage für effektives KI-gestütztes Programmieren und besteht aus Absicht (was Sie wollen) und Zustand (was existiert). Die Bereitstellung beider Aspekte hilft Cursor, genaue Vorhersagen zu treffen.
  • Verwenden Sie chirurgischen Kontext mit @-Symbolen (@code, @file, @folder), um Cursor präzise zu leiten, anstatt sich ausschließlich auf die automatische Kontexterfassung zu verlassen.
  • Erfassen Sie wiederverwendbares Wissen in Regeln für teamweite Nutzung und erweitern Sie Cursors Fähigkeiten mit Model Context Protocol, um externe Systeme zu verbinden.
  • Unzureichender Kontext führt zu Halluzinationen oder Ineffizienz, während zu viel irrelevanter Kontext das Signal verwässert. Finden Sie die richtige Balance für optimale Ergebnisse.