Фильтры в векторных запросах

Можно задать режимы векторного фильтра в векторном запросе , чтобы указать, требуется ли фильтрация до или после выполнения запроса.

Фильтры определяют область векторного запроса. Фильтры задаются и итерируются по строке невектора и числовым полям, атрибутируемым как filterable в индексе, но назначение фильтра определяет , что выполняется векторный запрос: все пространство, доступное для поиска, или содержимое результата поиска.

В этой статье описываются все режимы фильтрации и приводятся рекомендации по использованию каждого из них.

Режим префикса

Префиксирование применяет фильтры перед выполнением запроса, уменьшая область поверхности поиска, по которой алгоритм векторного поиска ищет аналогичное содержимое. В векторном запросе preFilter используется значение по умолчанию.

Diagram of prefilters.

Режим postfilter

После фильтрации фильтры применяются после выполнения запроса, сужая результаты поиска.

Diagram of post-filters.

Тестовая проверка режимов векторного фильтра

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

  • Small (100 000 документов, индекс 2,5 ГБ, 1536 измерений)
  • Средний (1 миллион документов, индекс 25 ГБ, 1536 измерений)
  • Большой (1 миллиард документов, 1,9-ТБ индекс, 96 измерений)

Для небольших и средних рабочих нагрузок мы использовали службу Standard 2 (S2) с одной секцией и одной реплика. Для большой рабочей нагрузки мы использовали службу Standard 3 (S3) с 12 секциями и одной реплика.

Индексы имели идентичное построение: одно ключевое поле, одно векторное поле, одно текстовое поле и одно числовое фильтруемое поле. Следующий индекс определяется с помощью синтаксиса 2023-07-01-preview.

def get_index_schema(self, index_name, dimensions):
    return {
        "name": index_name,
        "fields": [
            {"name": "id", "type": "Edm.String", "key": True, "searchable": True},
            {"name": "content_vector", "type": "Collection(Edm.Single)", "dimensions": dimensions,
              "searchable": True, "retrievable": True, "filterable": False, "facetable": False, "sortable": False,
              "vectorSearchConfiguration": "defaulthnsw"},
            {"name": "text", "type": "Edm.String", "searchable": True, "filterable": False, "retrievable": True,
              "sortable": False, "facetable": False},
            {"name": "score", "type": "Edm.Double", "searchable": False, "filterable": True,
              "retrievable": True, "sortable": True, "facetable": True}
        ],
        "vectorSearch":
        {
            "algorithmConfigurations": [
                {"name": "defaulthnsw", "kind": "hnsw", "hnswParameters": {"metric": "euclidean"}}
            ]
        }
    }

В запросах мы использовали идентичный фильтр для операций префильтратора и postfilter. Мы использовали простой фильтр, чтобы гарантировать, что изменения производительности были вызваны режимом фильтрации, а не сложностью фильтрации.

Результаты измерялись в запросах в секунду (QPS).

Общие выводы

  • Префильтрация почти всегда медленнее, чем послефильтровка, за исключением небольших индексов, где производительность приблизительно равна.

  • При более крупных наборах данных префильтровка значительно медленнее.

  • Поэтому почему префильтруйте значение по умолчанию, если это почти всегда медленнее? Префиксирование гарантирует, что k результаты возвращаются, если они существуют в индексе, где предвзятость благоприятствует отзыву и точности по скорости.

  • Postfiltering предназначен для клиентов, которые:

    • скорость выделения значений (послефильтровка может возвращать меньше k результатов)
    • используйте фильтры, которые не являются чрезмерно выборочными
    • имеют индексы достаточного размера, чтобы производительность префильтрации неприемлема

Сведения

  • Учитывая набор данных с 100 000 векторами в 1536 измерениях:

    • При фильтрации более 30% набора данных префиксирование и послефильтровка были сопоставимыми.
    • При фильтрации менее 0,1% набора данных префильтровка составила около 50 % медленнее, чем послефильтровка.
  • Учитывая набор данных с 1 миллионами векторов на 1536 измерениях:

    • При фильтрации более 30% набора данных префиксирование составило около 30 % медленнее.
    • При фильтрации менее 2% набора данных префильтровка составила около семи раз медленнее.
  • Учитывая набор данных с 1 миллиардами векторов на 96 измерениях:

    • При фильтрации более 5% набора данных предварительная фильтрация составила около 50 % медленнее.
    • При фильтрации менее 10% набора данных предварительная фильтрация была примерно в семь раз медленнее.

На следующем графике показан относительный QPS префильтратора, вычисляемый как префильтратор QPS, разделенный на QPS послефильтратора.

Chart showing QPS performance for small, medium, and large indexes for relative QPS.

Вертикальная ось — это QPS префильтрации по протоколу QPS после фильтрации. Например, значение 0,0 означает, что префильтровка составляет 100 % медленнее, 0,5 на вертикальной оси означает, что префильтровка составляет 50 % медленнее, 1,0 означает, что префильтровка и после фильтрации эквивалентны.

Горизонтальная ось представляет частоту фильтрации или процент кандидатов документов после применения фильтра. Например, означает, 1.00% что один процент корпуса поиска был выбран критериями фильтра.