Sdílet prostřednictvím


Přidání filtru ve vektorovém dotazu ve službě Azure AI Search

Můžete definovat požadavek vektorového dotazu, který obsahuje výraz filtru pro přidání kritérií zahrnutí nebo vyloučení do dotazů. V tomto článku se dozvíte, jak:

Tento článek používá rest pro ilustraci. Ukázky kódu v jiných jazycích najdete v úložišti GitHubu azure-search-vector-samples pro ucelená řešení, která zahrnují vektorové dotazy.

Průzkumníka služby Search můžete také použít na webu Azure Portal k dotazování na obsah vektoru. Pokud používáte zobrazení JSON, můžete přidat filtry a určit režim filtru.

Jak funguje filtrování v vektorovém dotazu

Filtry se vztahují na filterable nevectorová pole , buď řetězcové pole, nebo číselné, aby zahrnovaly nebo vyloučily vyhledávací dokumenty na základě kritérií filtru. I když se pole vektoru nedá filtrovat, filtry se dají použít u jiných polí ve stejném indexu, včetně nebo vyloučení dokumentů, které obsahují také vektorová pole.

Filtry se použijí před nebo po spuštění dotazu na základě parametru vectorFilterMode .

Definování filtru

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í.

Pokud nemáte zdrojová pole s textovými nebo číselnými hodnotami, zkontrolujte metadata dokumentu, jako jsou vlastnosti LastModified nebo CreatedBy, které můžou být užitečné ve filtru metadat.

2024-07-01 je stabilní verze tohoto rozhraní API. Má:

V následujícím příkladu je vektor reprezentací tohoto řetězce dotazu: "jaké služby Azure podporují fulltextové vyhledávání". Dotaz cílí na contentVector pole. Skutečný vektor má 1536 vkládání, takže je v tomto příkladu oříznutý kvůli čitelnosti.

Kritéria filtru se použijí u filtrovatelného textového pole (category v tomto příkladu) před spuštěním vektorového dotazu vyhledávacím webem.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "filter": "category eq 'Databases'",
    "vectorFilterMode": "preFilter",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Nastavení vectorFilterMode

Parametr dotazu vectorFilterMode určuje, zda je filtr použit před nebo po provedení vektorového dotazu.

Použití předfiltračního režimu

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 předfiltrovaných filtrů

Použití režimu postfilteru

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

Diagram 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 2023-11-03.

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,
              "vectorSearchProfile": "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": {
        "algorithms": [
            {
              "name": "defaulthnsw",
              "kind": "hnsw",
              "hnswParameters": { "metric": "euclidean" }
            }
          ],
          "profiles": [
            {
              "name": "defaulthnsw",
              "algorithm": "defaulthnsw"
            }
        ]
      }
    }

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.

Graf znázorňující výkon QPS pro malé, střední a velké indexy pro relativní 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.