Технологии

Что такое KNN и приближённый поиск соседей

Точный поиск ближайших векторов перебирает все. Приближённый — быстрее, но молча теряет часть результатов. Считаем, при каком объёме личного архива он вообще нужен.

KNN (k nearest neighbours) — найти k векторов, ближайших к заданному. Способ прямой: сравнить запрос с каждым вектором в базе и отобрать лучшие. Результат точный по определению, время растёт линейно с числом записей.

ANN (approximate nearest neighbours) — то же самое, но с построенным заранее индексом, который позволяет не смотреть на большую часть базы. Быстрее на порядки. Расплата — приближённость: часть настоящих соседей индекс не найдёт и не сообщит об этом.

#Когда точного поиска достаточно

Посчитаем на конкретном личном архиве. Пусть в нём 100 000 фрагментов, эмбеддер выдаёт 768 чисел по 4 байта:

100 000 × 768 × 4 байта ≈ 300 МБ

Полный перебор — это последовательное чтение 300 МБ из памяти и простая арифметика над ними. На современной машине речь идёт о десятках-сотнях миллисекунд, и укладывается это в бюджет одного ответа ассистента, где сама модель думает секунды.

Число векторов Точный перебор Нужен ли индекс
до 50 000 десятки мс нет
50 000 – 500 000 сотни мс по ощущениям, зависит от железа
500 000 – 5 млн секунды как правило, да
больше 5 млн неприемлемо да

Порядки величин, а не гарантии: цифры зависят от размерности, типа чисел и памяти. Но вывод устойчив: для личного архива на десятки тысяч записей приближённый индекс не нужен. Он добавит время построения, память, зависимость от библиотеки и потерю полноты — в обмен на выигрыш, которого вы не заметите. Практическая реализация точного поиска прямо в SQLite описана в разборе sqlite-vec.

#Как устроен приближённый индекс

Два распространённых подхода:

  • HNSW — многослойный граф. Верхние слои разрежены и позволяют быстро «перепрыгнуть» в нужный район, нижние уточняют. Быстрый поиск, дорогое построение, значительный расход памяти.
  • IVF — база заранее разбита на кластеры, поиск идёт только в нескольких ближайших. Дешевле по памяти, качество зависит от того, сколько кластеров просматривать.

У обоих есть параметр, регулирующий компромисс: сколько кандидатов просматривать при поиске. Больше — точнее и медленнее. Именно этим параметром управляют, когда говорят «настроить recall».

#Где путают

Заблуждение первое: векторная база нужна с первого дня. При нескольких тысячах заметок она не даёт ничего, кроме дополнительной движущейся детали. Что даёт и чего стоит отдельная база, разобрано в обзоре векторных баз данных.

Заблуждение второе: приближённый поиск возвращает то же самое, только быстрее. Он молча пропускает часть настоящих соседей. При полноте 95% каждый двадцатый релевантный фрагмент не попадёт в выдачу — и в ответе ассистента это будет выглядеть не как ошибка поиска, а как «он про это не знает».

Заблуждение третье: ANN — это про экономию памяти. Наоборот: индекс занимает память дополнительно к самим векторам, иногда сравнимо с ними. Экономят память квантизацией векторов, а не индексом.

Заблуждение четвёртое: ближайший вектор — это правильный ответ. Близость — не релевантность. У этой границы своя справка: косинусная близость объясняет, почему высокая оценка означает «та же тема», а не «ответ на вопрос».

#Частые вопросы

#Что такое k в KNN?

Число возвращаемых соседей. Для подмешивания в контекст обычно берут от трёх до двадцати, потом отсеивают лишнее переранжированием. Большое k само по себе качество не улучшает, а окно контекста расходует.

#Как понять, что пора переходить на приближённый индекс?

По замеру, а не по числу записей. Замерьте время поиска на реальном объёме и сравните с общим временем ответа. Пока поиск занимает единицы процентов от него, менять нечего.

#Можно ли совмещать векторный поиск с обычным текстовым?

Не только можно, но и нужно: они ошибаются по-разному. Точные совпадения — сильная сторона текстового поиска, синонимы и перифразы — векторного. Что представляют собой сами векторы, разобрано в тексте про эмбеддинги простыми словами.

#Насколько сильно ANN теряет в качестве?

Настраивается: полноту 95–99% обычно получают ценой замедления поиска. Проблема не в величине потери, а в её незаметности — без отдельной проверки на контрольном наборе вы не узнаете, что что-то потеряли.

Остальные термины — в глоссарии терминов ИИ.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт