Сравниваем векторы, не названия
Для ненулевых q,d cosine=qᵀd/(||q||₂||d||₂). Поиск вычисляет score для каждого кандидата и сортирует по убыванию; при одинаковых scores используем ID как детерминированный tie-break. Сам запрос исключается из списка соседей.
В ручном fixture «кот»=[1,0,0], «пёс»=[.9,.1,0], «рыба»=[0,0,1]. Cosine кот/пёс=.9/√.82≈.993884, кот/рыба=0. Это заданная геометрия, не доказательство того, что модель самостоятельно выучила близость животных.
Эксперимент. Измените третью координату одного кандидата, наблюдая полный3Dscore. Затем переключите 2D-проекцию графика. Ranking не должен тайно пересчитываться по двум видимым координатам. Для нулевого вектора cosine не определён; такой кандидат помечается отдельно, не получает выдуманный0.
Длина q может содержать информацию, которую cosine удаляет. В некоторых задачах используется dot, Euclidean distance или обученная metric. Нельзя считать cosine универсальным определением смысла. Полный перебор здесь точен и дешёв; ANN-индекс для большого корпуса — отдельное инженерное решение будущего RAG-блока.