← Все инструкции

РУКОВОДСТВО · ОБНОВЛЕНО 2026-11-09

Косинусное расстояние в pgvector для поиска по эмбеддингам

Как использовать косинусное расстояние в pgvector. Отличие от similarity, выбор vector_cosine_ops, нулевые векторы и проверка качества выдачи.

Оператор <=> в pgvector возвращает косинусное расстояние. При поиске ближайших векторов сортируйте его по возрастанию. Косинусное сходство можно вывести отдельным полем как 1 минус расстояние. Это значение не является вероятностью релевантности. Для индексированного поиска метрика, оператор запроса и класс операторов индекса должны соответствовать друг другу.

1. Согласуйте эмбеддинги запроса и документов

Запрос и документы должны быть представлены совместимыми эмбеддингами. Совпадение размерности само по себе не делает разные модели совместимыми. Сохраните версию модели и правила обработки текста для обеих сторон. Проверьте нулевые векторы отдельно, поскольку угол для них не определён и косинусный индекс pgvector их не включает. Нулевое значение можно отметить как ошибку извлечения и повторить получение вектора по правилам приложения.

2. Проверьте направление сортировки

Для проверки возьмите векторы [1,0], [0,1] и [−1,0] и запрос [1,0]. Расстояния составят 0, 1 и 2. При выводе 1 минус расстояние получатся 1, 0 и −1. Этот пример показывает, почему шкала сходства не обязательно лежит от нуля до единицы. Если интерфейс хочет показывать проценты, определите смысл шкалы явно и не представляйте пересчёт как вероятность правильного ответа.

3. Используйте индекс нужной метрики

Для косинусного поиска используйте класс vector_cosine_ops у индекса, если выбранная схема хранения и версия расширения его поддерживают. Запрос к ближайшим соседям должен сортировать само расстояние по возрастанию и задавать LIMIT. Сходство можно вычислить в списке выдачи. Сортировка по преобразованному выражению способна помешать применению индекса. Проверьте план выполнения и сравните результат с точным поиском на контрольных запросах, особенно при дополнительных фильтрах. Минимальная форма запроса выглядит так. SELECT id, embedding <=> $1::vector AS distance FROM items ORDER BY embedding <=> $1::vector LIMIT 10. Передайте вектор параметром. Если план выбирает последовательное сканирование на маленькой таблице, сравните планы на репрезентативном объёме данных.

4. Выберите порог по примерам вашей выдачи

Не переносите один порог на любую модель и коллекцию. Соберите релевантные и нерелевантные примеры из вашей задачи и проверьте, какие документы теряются при разных значениях порога. Разделите ошибки метрики, приближённого индекса и представления документов. Например, если нужного фрагмента нет в точной выдаче, настройка индекса сама по себе его не вернёт. При смене модели, фильтров или коллекции повторите проверку и сохраните версию порога.

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

Какой оператор возвращает косинусное расстояние?

В pgvector это <=>. Для других метрик применяются другие операторы и классы индекса.

Почему similarity бывает отрицательной?

Для противоположных направлений косинус отрицателен. При расстоянии больше единицы выражение 1 минус расстояние также отрицательно.

Зачем проверять точную выдачу?

Она помогает отделить пропуски приближённого индекса от ошибок метрики и самих эмбеддингов.

Подходит ли порог 0,8 для любого корпуса?

Универсального порога нет. Оцените его на размеченных запросах с выбранной моделью и коллекцией.

Источники

Калькулятор стоимости →