In-memory движок векторного поиска: что важно в реализации
Нужно устно спроектировать простой in-memory векторный поиск: add, search top-K, cosine similarity, stats. На что обратить внимание?
Ответить самому
Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.
Короткий ответ
Хранить id -> vector, нормализовать vectors для cosine, проверять размерность, искать top-K через heap или сортировку, отдельно вести stats и ошибки контракта.
Полный разбор
Для маленького in-memory search достаточно словаря id -> vector и линейного скана по всем векторам. Если cosine similarity используется часто, vectors лучше нормализовать при добавлении, тогда score превращается в dot product. Нужно проверять одинаковую размерность, пустой индекс, duplicate id и top_k больше размера индекса.
Для top-K на малом N можно отсортировать все scores. Для большого N лучше держать min-heap размера K. Если требования растут, линейный in-memory поиск заменяется ANN-индексом: HNSW, FAISS, ScaNN или vector DB.
Stats лучше не смешивать с бизнес-логикой: count vectors, dimension, number of searches, average latency, maybe top score distribution. Важно явно определить, что возвращает search: ids, scores, metadata, порядок и поведение при равных score.
Теория
Даже простая Python-задача про векторный поиск проверяет контракт, edge cases и понимание cosine/top-K.
Типичные ошибки
- Не нормализовать vectors и получить неверный cosine.
- Не проверять dimension mismatch.
- Сортировать весь индекс там, где нужен bounded heap.