Как LLM-автодополнение выбирает фрагменты кода: разбор алгоритма BM25

Как LLM-автодополнение выбирает фрагменты кода: разбор алгоритма BM25

Автодополнению на основе языковой модели мало просто найти в репозитории фрагменты с похожими словами. В реальном проекте потенциально полезных файлов слишком много: десятки и сотни модулей, утилит и конфигов, среди которых встречаются и те, что касаются текущей задачи, и те, что попались лишь из-за случайного совпадения терминов. Поэтому после поиска встаёт второй, не менее важный вопрос — какие из найденных кусков действительно стоит отправить в контекст модели.

Один из классических ответов на этот вопрос — алгоритм BM25. Его логика построена на простой и наглядной идее: редкие идентификаторы весят больше, чем популярные слова. Частый термин, который встречается в половине файлов репозитория, почти ничего не говорит о содержании конкретного фрагмента. Редкое имя или специализированное обозначение, наоборот, с высокой вероятностью указывает на нужную тему — и кусок кода, где такое имя встретилось, заслуживает более высокой оценки.

Учитывает алгоритм и размер файла. Если длинный модуль упоминает искомое слово вскользь, среди массы постороннего кода, вклад такого совпадения размывается, и ценность фрагмента падает. Компактный файл, где искомое занимает заметное место, напротив, оказывается полезнее. Отдельно разбирается, почему десять одинаковых совпадений не должны быть в десять раз полезнее одного: повторения не усиливают сигнал линейно, иначе алгоритм заваливался бы в пользу файлов, где одни и те же слова идут подряд.

Для тех, кто пользуется автодополнением кода каждый день, вся эта кухня интересна не сама по себе, а как объяснение, почему подсказки иногда попадают в точку, а иногда уводят мысль в сторону. Качество ответа модели во многом определяется тем, что попало в контекст: удачно выбранный фрагмент даёт точную и полезную подсказку, а лишний шум превращается в ошибки и странные продолжения.

Заметка продолжает цикл материалов о том, как система автодополнения собирает контекст для LLM. Показательно, что в основу решения здесь легла не экзотическая новинка, а BM25 — проверенная техника из области поиска и ранжирования, знакомая по классическим поисковым системам. Её адаптация к коду показывает: идеи, на которых построен обычный полнотекстовый поиск, переносятся на работу с репозиториями почти без изменений.