← Все статьи

Семантический контекст для ИИ: как LSP помогает модели понять код

Четвёртая часть серии про автодополнение: Language Server Protocol даёт типы, определения и ссылки — слой поверх текстового поиска по репозиторию.

Семантический контекст для ИИ: как LSP помогает модели понять код
Содержание

Коротко

Текстовый поиск по репозиторию находит похожие строки, но не отвечает, что за тип у переменной и где объявлен импорт. Заметка на Хабре показывает, как система автодополнения на LLM запрашивает у Language Server Protocol определения, типы и места использования — и собирает из ответов контекст для модели.

Что произошло

Автор продолжает серию про автодополнение: после текстового поиска BM25 по коду около курсора остаётся дыра. Импорт ссылается на конкретное объявление, у сервиса есть интерфейс, у метода — поля аргумента. Совпадение слов ReturnRequest ещё не означает связь в программе.

LSP стандартизирует обмен между редактором и языковым сервером через JSON-RPC: initialize, синхронизация документа, затем запросы вроде textDocument/definition, typeDefinition, references, hover. Сервер не «понимает TypeScript сам по себе» — качество даёт конкретный языковой сервер, а протокол задаёт формат. В IDE данные иногда приходят через PSI или API редактора, но смысл тот же: граф определений и типов вместо мешка строк.

На примере returnService цепочка такая: definition → объявление с типом → typeDefinition → интерфейс с submitdefinition аргумента SubmitReturnCommandreferences метода → реальный вызов в проекте, откуда брать requestedBy. Контракт API и привычный способ им пользоваться попадают в промпт вместе.

Почему это важно

LLM без семантики гадает по соседнему тексту. LSP даёт отбор по связям программы: что допустимо в позиции курсора — задача completion; что намерен разработчик написать — уже задача ранжирования кандидатов и сборки промпта заполнения середины (FIM). Для будущих агентов тот же слой станет навигацией по коду: семантические инструменты ведут по известным рёбрам, поиск по репозиторию — по смыслу и словам.

Качество подсказки складывается не только из модели: момент запуска генерации, состав контекста, ранжирование, размер в токенах и успеть до следующего нажатия клавиши.

На практике

  1. Для автодополнения запрашивайте definition и typeDefinition у символов около курсора до генерации.
  2. Добавляйте 1–2 живых references из прод-кода, а не только сигнатуру из интерфейса.
  3. Ранжируйте кандидаты: совпадение типов, свежесть файла, тест vs прод, стоимость токенов.
  4. Не путайте textDocument/completion (допустимые символы) с генерацией целого выражения — это разные задачи.
  5. Заложите таймаут: медленный языковой сервер хуже пустого контекста, если срывает интерактивность.

Итог

Семантический слой поверх BM25 превращает автодополнение из «угадай по строкам» в «опирайся на контракт проекта». LSP — не замена модели, а способ дать ей те же связи, которыми уже пользуется IDE.