Как работает Cursor ?В блоге Programmatic Engineer вышел классный технический разбор про начинку Курсора. Автора блога, вроде как, пообщался лично с техническим кофаундером стартапа Anysphere (оценка $10B) и расписал по частям интересные детали: от стека до скейла. Почитать
тут. В бесплатной версии доступна только половина статьи (а за фулл платить 10$ в месяц на подписку
🥲), но и в таком варианте полно интересных моментов. Читается легко, как будто старая добрая
книга Alex Xu по System Design. Самое то, если у вас вдруг собес в подобную компанию AI кодогенерации.
Работает примерно так.
1️⃣Проект пользователя сначала индексируется. Это значит следующее.
🔘Во-первых, каждый файл разбивается на кусочки (чанки) кода небольшого размера. Чанки улетают на сервер, где запускается эмбеддер модель компании. Модель эмбеддит чанки в вектора для последующего векторного поиска. Курсор говорит, что не хранит код на своих серверах, только эмбеддинги (но кто знает, что там происходит, код то вы свой все равно уже отправили им свой код
🙂). Извлечение эмбеддингов - довольно ресурснозатратный процесс, поэтому компания держит кластер GPU для инференса (думаю, что это капля в море по сравнению с стоимостью инференса LLM-ов).
Чтобы не просрать слить свои ключи и другую
чувстивтельную инфу, обязательно заполняйте .gitignore и .cursorignore, чтобы исключить какие-то ресурсы из индексации
🔘Во-вторых, курсор так же хранит структуру проекта пользователя в виде дерева. Конкретно используется Merkle Tree - дерево, где каждый лист - это хэш файла, а узлы - комбинация хэшей узлов-детей. Такое дерево хранится как локально, так и на серверах Курсора, и каждый раз, когда делается изменение в коде пользователя, локальные хэши сверяются с теми, что на сервере, и если есть различие, то они пересчитываются, а следовательно и обновляются некоторые эмбеддинги чанков.
2️⃣Теперь, когда индекс построен, можно пользоваться всеми фичами. Например, становится доступным чат с Курсором, где вы можете попросить курсор объяснить, как работает какая-то функция в вашем коде или попросить Курсор что-нибудь реализовать. В этом случае
Курсор просканирует индекс, найдет релевантные ID чанков кода с помощью векторного поиска, заберет исходнй код чанков с вашего проекта, и пойдет в LLM просить рассуждать и генерировать план действий. Ну а дальше все это интерактивно будет отображаться в IDE. Курсор может ваш код и не хранит, а вот LLM-провайдеры – может быть.
3️⃣ Автокомплит, или tab-подсказки (это когда вы пишите комментарий или сигнатуру функции, а Курсор предлагает ее реализацию), работает чуть проще из-за чувствительности к latency. Здесь просто локальный контекст уходит в LLM и та генерирует автокомплит.
4️⃣ По стеку используется Turbopuffer для векторного хранилища эмбеддингов чанков и дерева файловой системы. Rust для высоконагруженной части на сервере, TypeScript для клиента IDE.
Другие цифры и детали можно найти в самом блоге. У автора еще выходит регулярно подкаст с техническими людьми так же на тему систем дизайна – рекомендую.
Happy Learning!
@max_dot_sh