Во-первых, что такое окно контекста? И как оно связано с эффективным программированием в Cursor? Чтобы взглянуть на это шире, большая языковая модель (LLM) — это модель искусственного интеллекта, обученная предсказывать и генерировать текст, изучая закономерности из массивных наборов данных. Она питает такие инструменты, как Cursor, понимая ваш ввод и предлагая код или текст на основе того, что она видела раньше. Токены — это входные и выходные данные этих моделей. Это фрагменты текста, часто часть слова, которые LLM обрабатывает один за другим. Модели не читают целые предложения сразу; они предсказывают следующий токен на основе тех, которые были до него. Чтобы увидеть, как некоторый текст токенизируется, вы можете использовать токенизатор, например этот. Tokenizer

Что такое контекст?

Когда мы генерируем предложение кода в Cursor, “контекст” относится к информации, которая предоставляется модели (в форме “входных токенов”), которую модель затем использует для предсказания последующей информации (в форме “выходных токенов”). Существует два типа контекста:
  1. Контекст намерения определяет, что пользователь хочет получить от модели. Например, системный промпт обычно служит высокоуровневыми инструкциями о том, как пользователь хочет, чтобы модель вела себя. Большая часть “промптинга”, выполняемого в Cursor, является контекстом намерения. “Измени цвет этой кнопки с синего на зеленый” - это пример заявленного намерения; он является предписывающим.
  2. Контекст состояния описывает состояние текущего мира. Предоставление Cursor сообщений об ошибках, логов консоли, изображений и фрагментов кода являются примерами контекста, связанного с состоянием. Он является описательным, а не предписывающим.
Вместе эти два типа контекста работают в гармонии, описывая текущее состояние и желаемое будущее состояние, позволяя Cursor делать полезные предложения по коду.

Предоставление контекста в Cursor

Чем больше релевантного контекста вы можете предоставить модели, тем более полезной она будет. Если в Cursor предоставлено недостаточно контекста, модель попытается решить задачу без соответствующей информации. Это обычно приводит к:
  1. Галлюцинациям, когда модель пытается найти паттерны (когда их нет), что вызывает неожиданные результаты. Это может часто происходить с моделями вроде claude-3.5-sonnet, когда им не предоставлено достаточно контекста.
  2. Агент пытается собрать контекст самостоятельно, выполняя поиск по кодовой базе, читая файлы и вызывая инструменты. Сильная модель мышления (как claude-3.7-sonnet) может далеко продвинуться с такой стратегией, и предоставление правильного начального контекста определит траекторию.
Хорошая новость заключается в том, что Cursor создан с учетом контекстной осведомленности и спроектирован так, чтобы требовать минимального вмешательства от пользователя. Cursor автоматически подтягивает части вашей кодовой базы, которые модель считает релевантными, такие как текущий файл, семантически похожие паттерны в других файлах и другую информацию из вашей сессии. Однако контекста может быть очень много, поэтому ручное указание контекста, который вы знаете как релевантный для задачи, является полезным способом направить модели в правильном направлении.

Символ @

Самый простой способ предоставить явный контекст — использовать символ @. Это отлично работает, когда вы точно знаете, какой файл, папку, веб-сайт или другой фрагмент контекста хотите включить. Чем более конкретными вы можете быть, тем лучше. Вот разбор того, как быть более точным с контекстом:
СимволПримерСлучай использованияНедостаток
@code@LRUCachedFunctionВы знаете, какая функция, константа или символ релевантны для генерируемого результатаТребует глубокого знания кодовой базы
@filecache.tsВы знаете, какой файл должен быть прочитан или отредактирован, но не точно где в файлеМожет включать много нерелевантного контекста для текущей задачи в зависимости от размера файла
@folderutils/Все или большинство файлов в папке релевантныМожет включать много нерелевантного контекста для текущей задачи
Context Menu

Правила

Вы должны думать о правилах как о долгосрочной памяти, к которой вы или другие члены вашей команды хотите иметь доступ. Фиксация контекста, специфичного для предметной области, включая рабочие процессы, форматирование и другие соглашения, является отличной отправной точкой для написания правил. Правила также могут быть сгенерированы из существующих разговоров с помощью /Generate Cursor Rules. Если у вас была долгая беседа с множеством запросов, вероятно, есть некоторые полезные директивы или общие правила, которые вы могли бы захотеть использовать повторно позже. Rules

MCP

Model Context Protocol — это уровень расширяемости, где вы можете предоставить Cursor возможности для выполнения действий и получения внешнего контекста. В зависимости от вашей среды разработки, вы можете захотеть использовать различные типы серверов, но две категории, которые мы считаем особенно полезными:
  • Внутренняя документация: например, Notion, Confluence, Google Docs
  • Управление проектами: например, Linear, Jira
Если у вас есть существующие инструменты для доступа к контексту и выполнения действий через API, вы можете создать MCP сервер для этого. Вот краткое руководство о том, как создавать MCP серверы. MCP

Самостоятельный сбор контекста

Мощный паттерн, который принимают многие пользователи, заключается в том, чтобы позволить Агенту писать краткосрочные инструменты, которые он затем может запускать для сбора дополнительного контекста. Это особенно эффективно в рабочих процессах с участием человека, где вы проверяете код перед его выполнением. Например, добавление отладочных операторов в ваш код, его запуск и предоставление модели возможности проанализировать вывод дает ей доступ к динамическому контексту, который она не могла бы вывести статически. В Python вы можете сделать это, предложив Агенту:
  1. Добавить операторы print(“debugging: …”) в соответствующие части кода
  2. Запустить код или тесты с помощью терминала
Агент прочитает вывод терминала и решит, что делать дальше. Основная идея заключается в том, чтобы предоставить Агенту доступ к фактическому поведению во время выполнения, а не только к статическому коду. Self-Gathering Context

Выводы

  • Контекст является основой эффективного программирования с ИИ, состоящий из намерения (что вы хотите) и состояния (что существует). Предоставление обеих частей помогает Cursor делать точные предсказания.
  • Используйте хирургический контекст с символами @ (@code, @file, @folder), чтобы точно направлять Cursor, а не полагаться исключительно на автоматический сбор контекста.
  • Фиксируйте повторно используемые знания в правилах для использования всей командой и расширяйте возможности Cursor с помощью Model Context Protocol для подключения внешних систем.
  • Недостаточный контекст приводит к галлюцинациям или неэффективности, в то время как слишком много нерелевантного контекста размывает сигнал. Найдите правильный баланс для оптимальных результатов.