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% обычно получают ценой замедления поиска. Проблема не в величине потери, а в её незаметности — без отдельной проверки на контрольном наборе вы не узнаете, что что-то потеряли.
Остальные термины — в глоссарии терминов ИИ.