Как измерять дистанцию между двумя эмбеддингами
Что проверяют
Понимаете ли вы, что метрика выбирается не по вкусу, а по тому, как обучалась модель эмбеддингов, и как этот выбор связан с векторным поиском. Следом обычно просят объяснить, почему после нормализации косинус и евклидово расстояние дают одинаковый порядок соседей.
Как отвечать
Назовите три рабочие метрики и связь между ними:
- косинусное сходство:
a·b / (|a|·|b|), учитывает только угол между векторами. Косинусное расстояние равно1 - cosи лежит в диапазоне от 0 до 2; - скалярное произведение:
a·b, учитывает и угол, и длину. Нужно, если модель обучали именно на нём и норма несёт смысл, например популярность объекта в рекомендациях; - евклидово расстояние (L2): длина разности векторов, чувствительно к масштабу.
Ключевой факт: для векторов единичной длины |a - b|² = 2 - 2·cos(a, b). Поэтому после L2-нормализации все три метрики ранжируют соседей одинаково, и на практике векторы нормализуют один раз при записи, а дальше считают дешёвое скалярное произведение.
Затем привяжите к инструментам. В FAISS косинус получают через IndexFlatIP или HNSW по скалярному произведению на нормализованных векторах. В pgvector есть операторы <-> (L2), <#> (отрицательное скалярное произведение) и <=> (косинусное расстояние), а индекс HNSW строится под конкретный класс операторов, например vector_cosine_ops. Правильность выбора проверяют не рассуждением, а на размеченных парах: recall@k или nDCG на своей выборке.
Где спотыкаются
Берут метрику, отличную от той, на которой училась модель. В карточке модели обычно указано, какой функцией сходства её пользоваться, и игнорирование этого заметно портит поиск.
Строят индекс под одну метрику, а запрос пишут с другим оператором. В pgvector такой запрос индекс не использует и уходит в полный перебор.
Сравнивают эмбеддинги разных моделей или разных версий одной модели. Их пространства несовместимы, и расстояние между такими векторами ничего не значит.