Содержание
Коротко
Текстовый поиск по репозиторию находит похожие строки, но не отвечает, что за тип у переменной и где объявлен импорт. Заметка на Хабре показывает, как система автодополнения на LLM запрашивает у Language Server Protocol определения, типы и места использования — и собирает из ответов контекст для модели.
Что произошло
Автор продолжает серию про автодополнение: после текстового поиска BM25 по коду около курсора остаётся дыра. Импорт ссылается на конкретное объявление, у сервиса есть интерфейс, у метода — поля аргумента. Совпадение слов ReturnRequest ещё не означает связь в программе.
LSP стандартизирует обмен между редактором и языковым сервером через JSON-RPC: initialize, синхронизация документа, затем запросы вроде textDocument/definition, typeDefinition, references, hover. Сервер не «понимает TypeScript сам по себе» — качество даёт конкретный языковой сервер, а протокол задаёт формат. В IDE данные иногда приходят через PSI или API редактора, но смысл тот же: граф определений и типов вместо мешка строк.
На примере returnService цепочка такая: definition → объявление с типом → typeDefinition → интерфейс с submit → definition аргумента SubmitReturnCommand → references метода → реальный вызов в проекте, откуда брать requestedBy. Контракт API и привычный способ им пользоваться попадают в промпт вместе.
Почему это важно
LLM без семантики гадает по соседнему тексту. LSP даёт отбор по связям программы: что допустимо в позиции курсора — задача completion; что намерен разработчик написать — уже задача ранжирования кандидатов и сборки промпта заполнения середины (FIM). Для будущих агентов тот же слой станет навигацией по коду: семантические инструменты ведут по известным рёбрам, поиск по репозиторию — по смыслу и словам.
Качество подсказки складывается не только из модели: момент запуска генерации, состав контекста, ранжирование, размер в токенах и успеть до следующего нажатия клавиши.
На практике
- Для автодополнения запрашивайте
definitionиtypeDefinitionу символов около курсора до генерации. - Добавляйте 1–2 живых
referencesиз прод-кода, а не только сигнатуру из интерфейса. - Ранжируйте кандидаты: совпадение типов, свежесть файла, тест vs прод, стоимость токенов.
- Не путайте
textDocument/completion(допустимые символы) с генерацией целого выражения — это разные задачи. - Заложите таймаут: медленный языковой сервер хуже пустого контекста, если срывает интерактивность.
Итог
Семантический слой поверх BM25 превращает автодополнение из «угадай по строкам» в «опирайся на контракт проекта». LSP — не замена модели, а способ дать ей те же связи, которыми уже пользуется IDE.

