Vytvoření vektorového indexu

Ve službě Azure AI Search má vektorové úložiště schéma indexu, které definuje vektorová a nevectorová pole, vektorovou konfiguraci pro algoritmy, které vytvářejí a komprimují vložený prostor a nastavení definic vektorových polí používaných v požadavcích dotazů.

Rozhraní API pro vytvoření nebo aktualizaci indexu vytvoří vektorové úložiště. Při indexování vektorových dat postupujte takto:

  • Definování schématu pomocí vektorových algoritmů a volitelné komprese
  • Přidání definic vektorových polí
  • Načtení předvectorizovaných dat jako samostatného kroku nebo použití integrované vektorizace pro bloky dat a kódování během indexování

Tento článek vysvětluje pracovní postup a používá rest pro ilustraci. Jakmile porozumíte základnímu pracovnímu postupu, pokračujte ukázkami kódu sady Azure SDK v úložišti azure-search-vector-samples , kde najdete pokyny k používání těchto funkcí v testovacím a produkčním kódu.

Tip

Pomocí webu Azure Portal vytvořte vektorový index a zkuste integrované blokování a vektorizaci dat.

Požadavky

  • Azure AI Search, v libovolné oblasti a na libovolné úrovni. Většina existujících služeb podporuje vektorové vyhledávání. Pro služby vytvořené před lednem 2019 existuje malá podmnožina, která nemůže vytvořit vektorový index. V takovém případě se musí vytvořit nová služba. Pokud používáte integrované vektorizace (sady dovedností, které volají Azure AI), musí být Azure AI Search ve stejné oblasti jako služby Azure OpenAI nebo Azure AI.

  • Před existující vektorové vkládání nebo použití integrované vektorizace, kde se volají vložené modely z indexovacího kanálu.

  • Měli byste znát omezení dimenzí modelu použitého k vytvoření vložených objektů. Platné hodnoty jsou 2 až 3072 dimenzí. V Azure OpenAI je délka číselného vektoru pro vkládání textu ada-002 1536. U text-embedding-3-small nebo text-embedding-3-large je délka vektoru 3072.

  • Měli byste také vědět, jaké jsou podporované metriky podobnosti. V případě Azure OpenAI se podobnost vypočítá pomocí cosine.

  • Měli byste být obeznámeni s vytvářením indexu. Schéma musí obsahovat pole pro klíč dokumentu, další pole, která chcete prohledávat nebo filtrovat, a další konfigurace chování potřebné při indexování a dotazech.

Příprava dokumentů pro indexování

Před indexováním sestavte datovou část dokumentu, která obsahuje pole vektorových a nevectorových dat. Struktura dokumentu musí odpovídat schématu indexu.

Ujistěte se, že vaše dokumenty:

  1. Zadejte pole nebo vlastnost metadat, která jednoznačně identifikuje každý dokument. Všechny indexy vyhledávání vyžadují klíč dokumentu. Aby bylo možné splnit požadavky na klíč dokumentu, musí mít zdrojový dokument jedno pole nebo vlastnost, které ho můžou jednoznačně identifikovat v indexu. Toto zdrojové pole musí být namapováno na pole indexu typu Edm.String a key=true v indexu vyhledávání.

  2. Zadejte vektorová data (pole čísel s plovoucí desetinnou čárkou s jednoduchou přesností) ve zdrojových polích.

    Vektorová pole obsahují pole vygenerované vložením modelů, jedno vložení na pole, kde pole je pole nejvyšší úrovně (nikoli součástí vnořeného nebo komplexního typu). Pro nejjednodušší integraci doporučujeme modely vkládání v Azure OpenAI, jako je vkládání textu ada-002 pro textové dokumenty nebo rozhraní REST API pro načítání obrázků.

    Pokud můžete využít závislost na indexerech a sadách dovedností, zvažte použití integrované vektorizace , která během indexování kóduje obrázky a alfanumerický obsah. Definice polí jsou určené pro vektorová pole, ale zdrojová data můžou být textová nebo obrázky s vektorovými poli vytvořenými během indexování.

  3. Poskytněte ostatním polím pro odpověď dotazu alfanumerický obsah čitelný pro člověka a scénáře hybridních dotazů, které ve stejném požadavku obsahují fulltextové vyhledávání nebo sémantické řazení.

Index vyhledávání by měl obsahovat pole a obsah pro všechny scénáře dotazů, které chcete podporovat. Předpokládejme, že chcete vyhledávat nebo filtrovat názvy produktů, verze, metadata nebo adresy. V tomto případě není hledání podobnosti užitečné. Hledání klíčových slov, geografické vyhledávání nebo filtry by bylo lepší volbou. Index vyhledávání, který obsahuje komplexní kolekci vektorových a nevectorových dat, poskytuje maximální flexibilitu pro vytváření dotazů a složení odpovědí.

Krátký příklad datové části dokumentů, která obsahuje pole vektoru a nevectoru, je v části s daty vektoru načítání tohoto článku.

Přidání konfigurace vektorového vyhledávání

Konfigurace vektoru určuje parametry použité při indexování k vytvoření informací o nejbližším sousedu mezi vektorovými uzly:

  • Hierarchický pohyblivý malý svět (HNSW)
  • Vyčerpávající síť KNN

Pokud v poli zvolíte HNSW, můžete se rozhodnout pro vyčerpávající síť KNN v době dotazu. Ale druhý směr nefunguje: pokud zvolíte vyčerpávající, nemůžete později požádat o hledání HNSW, protože další datové struktury, které umožňují přibližné hledání, neexistují.

Konfigurace vektoru také určuje kvantizační metody pro zmenšení velikosti vektoru:

  • Skalární
  • Binární soubor (k dispozici pouze v 7. 7. 2024 a v novějších balíčcích sady Azure SDK)

Pokyny k migraci na nejnovější verzi najdete v tématu Upgrade rozhraní REST API.

2024-07-01 je obecně k dispozici. Podporuje konfiguraci vektoru, která má:

  • vectorSearch.algorithms podpora sítě HNSW a vyčerpávající síť KNN.
  • vectorSearch.compressions podporuje skalární a binární kvantování, převzorkování a opětovné řazení pomocí původních vektorů.
  • vectorSearch.profiles poskytuje více kombinací konfigurací algoritmů a komprese.

Nezapomeňte mít strategii pro vektorizaci obsahu. Pro integrované kódování doporučujeme integrované vektorizace a vektorizátory doby dotazu.

  1. K vytvoření indexu použijte rozhraní API pro vytvoření nebo aktualizaci indexu .

  2. vectorSearch Do indexu přidejte oddíl, který určuje vyhledávací algoritmy použité k vytvoření prostoru pro vložení.

     "vectorSearch": {
         "compressions": [
             {
                 "name": "scalar-quantization",
                 "kind": "scalarQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
                     "scalarQuantizationParameters": {
                         "quantizedDataType": "int8"
                     }
             },
             {
                 "name": "binary-quantization",
                 "kind": "binaryQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
             }
         ],
         "algorithms": [
             {
                 "name": "hnsw-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "hnsw-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "hamming"
                 }
             },
             {
                 "name": "eknn",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "euclidean"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "vector-profile-hnsw-scalar",
             "compression": "scalar-quantization",
             "algorithm": "hnsw-1"
           }
         ]
     }
    

    Klíčové body:

    • Názvy pro každou konfiguraci komprese, algoritmu a profilu musí být jedinečné pro jeho typ v rámci indexu.

    • vectorSearch.compressions.kind může být scalarQuantization nebo binaryQuantization.

    • vectorSearch.compressions.rerankWithOriginalVectors používá původní nekomprimované vektory k přepočtu podobnosti a opětovnému seřazení nejlepších výsledků vrácených počátečním vyhledávacím dotazem. Nekomprimované vektory existují v indexu vyhledávání, i když stored jsou false. Tato vlastnost je nepovinná. Výchozí hodnota je true.

    • vectorSearch.compressions.defaultOversampling považuje širší sadu potenciálních výsledků k posunu snížení informací od kvantování. Vzorec pro potenciální výsledky se skládá z k dotazu s násobitelem převzorkování. Pokud například dotaz určuje k 5 a převzorkování je 20, dotaz efektivně požaduje 100 dokumentů pro použití při opětovném řazení pomocí původního nekomprimovaného vektoru pro tento účel. Vrátí se pouze nejlépe k seřazené výsledky. Tato vlastnost je nepovinná. Výchozí hodnota je 4.

    • vectorSearch.compressions.scalarQuantizationParameters.quantizedDataType musí být nastavena na int8hodnotu . V tuto chvíli se jedná o jediný primitivní datový typ podporovaný. Tato vlastnost je nepovinná. Výchozí hodnota je int8.

    • vectorSearch.algorithms.kind jsou buď "hnsw" nebo "exhaustiveKnn". Jedná se o přibližné algoritmy ANN (Nearest Neighbors) sloužící k uspořádání vektorového obsahu během indexování.

    • vectorSearch.algorithms.m je obousměrný počet propojení. Výchozí hodnota je 4. Rozsah je 4 až 10. Nižší hodnoty by měly ve výsledcích vracet méně šumu.

    • vectorSearch.algorithms.efConstruction je počet nejbližších sousedů použitých při indexování. Výchozí hodnota je 400. Rozsah je 100 až 1 000.

    • "vectorSearch.algorithms.fSearch je počet nejbližších sousedů použitých při hledání. Výchozí hodnota je 500. Rozsah je 100 až 1 000.

    • vectorSearch.algorithms.metric pokud používáte Azure OpenAI, měla by být kosinus, jinak použijte metriku podobnosti přidruženou k modelu vkládání, který používáte. Podporované hodnoty jsou cosine, dotProduct, euclidean, hamming (používá se pro indexování binárních dat).

    • vectorSearch.profiles přidejte vrstvu abstrakce pro zajištění širších definic. Profil je definován v vectorSearcha potom odkazuje podle názvu u každého vektorového pole. Jedná se o kombinaci komprese a konfigurace algoritmů. Toto je vlastnost, kterou přiřadíte k vektorovým polím, a určuje algoritmus a kompresi polí.

Přidání vektorového pole do kolekce polí

Kolekce polí musí obsahovat pole pro klíč dokumentu, vektorová pole a všechna další pole, která potřebujete pro scénáře hybridního vyhledávání.

Vektorová pole jsou charakterizována jejich datovým typem, dimensions vlastností založenou na modelu vkládání použitém k výstupu vektorů a profilu vektoru.

2024-07-01 je obecně k dispozici.

  1. K vytvoření indexu použijte funkci Vytvořit nebo aktualizovat index .

  2. Definujte vektorové pole s následujícími atributy. Pro každé pole můžete uložit jedno vygenerované vkládání. Pro každé vektorové pole:

    • typemusí být datovými typy vektorů. Collection(Edm.Single) je nejběžnější pro vkládání modelů.
    • dimensions je počet dimenzí vygenerovaných modelem vkládání. U text-embedding-ada-002 je to 1536.
    • vectorSearchProfile je název profilu definovaného jinde v indexu.
    • searchable musí být pravdivé.
    • retrievable může být true nebo false. True vrátí nezpracované vektory (1536 z nich) jako prostý text a spotřebovává úložný prostor. Pokud předáváte výsledek vektoru podřízené aplikaci, nastavte na hodnotu true.
    • stored může být true nebo false. Určuje, zda je pro načtení uložena další kopie vektorů. Další informace naleznete v tématu Zmenšení velikosti vektoru.
    • filterable, facetablesortable musí být false.
  3. Pokud chcete vyvolat předfiltrování nebo postfiltering v vektorovém dotazu, přidejte do kolekce filtrovatelná nevectorová pole, například "title" s filterable nastavenou hodnotou true.

  4. Přidejte další pole, která definují látku a strukturu textového obsahu, který indexujete. Minimálně potřebujete klíč dokumentu.

    Měli byste také přidat pole, která jsou užitečná v dotazu nebo v odpovědi. Následující příklad ukazuje vektorová pole pro název a obsah ("titleVector", "contentVector"), které jsou ekvivalentní vektorům. Poskytuje také pole pro ekvivalentní textový obsah ("title", "content") užitečný pro řazení, filtrování a čtení ve výsledku hledání.

    Následující příklad ukazuje kolekci polí:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2024-07-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "stored": true,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": false,
                "stored": false,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "hnsw-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "vector-profile-1",
                    "algorithm": "hnsw-1"
                }
            ]
        }
    }
    

Načtení vektorových dat pro indexování

Obsah, který zadáte pro indexování, musí odpovídat schématu indexu a obsahovat jedinečnou řetězcovou hodnotu klíče dokumentu. Předvectorizovaná data se načtou do jednoho nebo více vektorových polí, která mohou existovat společně s jinými poli obsahujícími alfanumerický obsah.

K příjmu dat můžete použít metodologie nabízených oznámení nebo přijetí změn.

Použití dokumentů – Index k načtení vektorových a nevectorových dat do indexu. Rozhraní API nabízených oznámení pro indexování jsou stejná napříč všemi stabilními verzemi a verzemi Preview. K načtení dokumentů použijte některá z následujících rozhraní API:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2024-07-01

{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

Kontrola obsahu vektoru v indexu

Pro účely ověřování můžete dotazovat index pomocí Průzkumníka služby Search na webu Azure Portal nebo volání rozhraní REST API. Protože Azure AI Search nemůže převést vektor na čitelný text, zkuste vrátit pole ze stejného dokumentu, který poskytuje důkaz shody. Pokud například vektorový dotaz cílí na pole "titleVector", můžete pro výsledky hledání vybrat "title".

Pole musí být atributem "retrievable", aby byla zahrnuta do výsledků.

  • Zkontrolujte indexy v indexech správy>vyhledávání a zobrazte velikost indexu all-up a vector index. Velikost indexu kladného vektoru označuje, že jsou přítomny vektory.

  • K dotazování indexu použijte Průzkumníka služby Search. Průzkumník služby Search má dvě zobrazení: zobrazení dotazu (výchozí) a zobrazení JSON.

    • Nastavte možnosti>dotazu Skrýt vektorové hodnoty ve výsledcích hledání pro čitelnější výsledky.

    • Použití zobrazení JSON pro vektorové dotazy. Můžete vložit definici JSON vektorového dotazu, který chcete provést, nebo použít předdefinovaný převod textu na vektor nebo převod obrázku na vektor, pokud má index přiřazení vektorizátoru. Další informace o hledání obrázků najdete v tématu Rychlý start: Hledání obrázků v Průzkumníku služby Search.

    • Pro rychlé potvrzení, že index obsahuje vektory, použijte výchozí zobrazení dotazu. Zobrazení dotazu je určené pro fulltextové vyhledávání. I když ho nemůžete použít pro vektorové dotazy, můžete odeslat prázdné vyhledávání (search=*) a zkontrolovat obsah. Obsah všech polí, včetně vektorových polí, se vrátí jako prostý text.

    • Další podrobnosti najdete v tématu Vytvoření vektorového dotazu .

Aktualizace úložiště vektorů

Pokud chcete aktualizovat úložiště vektorů, upravte schéma a v případě potřeby znovu načtěte dokumenty, aby se naplnila nová pole. Rozhraní API pro aktualizace schématu zahrnují rozhraní REST (Create or Update Index), CreateOrUpdateIndex v sadě Azure SDK pro .NET, create_or_update_index v sadě Azure SDK pro Python a podobné metody v jiných sadách Azure SDK.

Standardní pokyny pro aktualizaci indexu jsou popsané v aktualizaci nebo opětovném sestavení indexu.

Mezi klíčové body patří:

  • Odstranění a opětovné sestavení se často vyžaduje pro aktualizace a odstranění existujících polí.

  • Existující schéma však můžete aktualizovat pomocí následujících úprav bez nutnosti opětovného sestavení:

    • Přidejte nová pole do kolekce polí.
    • Přidejte nové konfigurace vektorů přiřazené k novým polím, ale ne existujícím polím, která již byla vektorizována.
    • Změňte "retrievable" (hodnoty jsou true nebo false) u existujícího pole. Vektorová pole musí být prohledávatelná a načístelná, ale pokud chcete zakázat přístup k vektorovým polím v situacích, kdy přetažení a opětovné sestavení není možné, můžete nastavit načtení na false.

Další kroky

Jako další krok doporučujeme použít vektorová data dotazu v indexu vyhledávání.

Ukázky kódu v úložišti azure-search-vector ukazují kompletní pracovní postupy, které zahrnují definici schématu, vektorizaci, indexování a dotazy.

Existuje ukázkový kód pro Python, C# a JavaScript.