Sdílet prostřednictvím


Filtry v vektorových dotazech

Režimy vektorového filtru u vektorového dotazu můžete nastavit tak, aby bylo možné určit, jestli chcete filtrovat před nebo po spuštění dotazu.

Filtry určují rozsah vektorového dotazu. Filtry se nastavují a iterují nad nevectorovým řetězcem a číselnými poli, která jsou přiřazována jako filterable v indexu, ale účel filtru určuje , co vektorový dotaz provede: celý prohledávatelný prostor nebo obsah výsledku hledání.

Tento článek popisuje jednotlivé režimy filtru a poskytuje pokyny, kdy je použít.

Režim předfiltrování

Předfiltrování použije filtry před provedením dotazu, čímž se sníží plocha hledání, nad kterou algoritmus vektorového vyhledávání hledá podobný obsah. Ve vektorovém dotazu preFilter je výchozí hodnota.

Diagram of prefilters.

Režim postfiltru

Po spuštění dotazu se po filtrování použijí filtry, které zužují výsledky hledání.

Diagram of post-filters.

Srovnávací testování režimů filtru vektorů

Abychom pochopili podmínky, za kterých jeden režim filtru funguje lépe než druhý, spustili jsme řadu testů pro vyhodnocení výsledků dotazu v malých, středních a velkých indexech.

  • Malé (100 000 dokumentů, index 2,5 GB, 1536 dimenzí)
  • Střední (1 milion dokumentů, index 25 GB, 1536 dimenzí)
  • Velké (1 miliarda dokumentů, index 1,9 TB, 96 dimenzí)

Pro malé a střední úlohy jsme použili službu Standard 2 (S2) s jedním oddílem a jednou replikou. Pro velké úlohy jsme použili službu Standard 3 (S3) s 12 oddíly a jednou replikou.

Indexy měly identickou konstrukci: jedno klíčové pole, jedno vektorové pole, jedno textové pole a jedno číselné filtrovatelné pole. Následující index je definován pomocí syntaxe verze 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"}}
            ]
        }
    }

Vdotazch Pomocí jednoduchého filtru jsme zajistili, že varianty výkonu byly způsobené režimem filtrování, a ne složitostí filtrování.

Výsledky se měří v dotazech za sekundu (QPS).

Shrnutí

  • Předfiltrování je téměř vždy pomalejší než následné filtrování, s výjimkou malých indexů, kde je výkon přibližně stejný.

  • U větších datových sadjech

  • Proč je tedy výchozí nastavení předfiltrovat, pokud je téměř vždy pomalejší? Předfiltrování zaručuje, že k se výsledky vrátí, pokud existují v indexu, kde předsudky upřednostňují úplnost a přesnost při rychlosti.

  • Postfiltering je určený pro zákazníky, kteří:

    • rychlost hodnoty při výběru (postfiltering může vrátit méně než k výsledky)
    • použití filtrů, které nejsou příliš selektivní
    • mají indexy dostatečné velikosti, aby předfiltrování výkonu bylo nepřijatelné

Detaily

  • Když je datová sada s 100 000 vektory s 1536 rozměry:

    • Při filtrování více než 30 % datové sady bylo předfiltrování a pofiltrování srovnatelné.
    • Při filtrování menší než 0,1 % datové sady bylo předfiltrování přibližně o 50 % pomalejší než postfiltering.
  • Datová sada s 1 miliony vektorů s 1536 dimenzemi:

    • Při filtrování více než 30 % datové sady bylo předfiltrování přibližně o 30 % pomalejší.
    • Při filtrování menší než 2 % datové sady bylo předfiltrování asi sedmkrát pomalejší.
  • Datová sada s 1 miliardami vektorů s 96 dimenzemi:

    • Při filtrování více než 5 % datové sady bylo předběžné filtrování přibližně o 50 % pomalejší.
    • Při filtrování méně než 10 % datové sady bylo předfiltrování přibližně sedmkrát pomalejší.

Následující graf ukazuje předfiltrovaný relativní QPS vypočítaný jako předfiltrovaný QPS dělený postfilterem QPS.

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

Svislá osa je QPS předfiltrování přes QPS postfilteringu. Například hodnota 0,0 znamená, že předfiltrování je 100 % pomalejší, 0,5 na svislé ose znamená, že předfiltrování je 50 % pomalejší, 1,0 znamená, že předběžné filtrování a následné filtrování jsou ekvivalentní.

Vodorovná osa představuje míru filtrování nebo procento kandidátských dokumentů po použití filtru. Například znamená, 1.00% že jedno procento vyhledávacího korpusu bylo vybráno podle kritérií filtru.