Kurz: Sady dovedností ve službě Azure AI Vyhledávač

Note

Azure AI Vyhledávač je k dispozici prostřednictvím portálu Azure, rozhraní REST API a Sady Azure SDK. Podporuje také Foundry IQ, spravovanou znalostní vrstvu, která transformuje podnikový obsah na opakovaně použitelné znalostní báze s podporou oprávnění pro agenty na portálu Microsoft Foundry.

Zjistěte, jak pomocí sady Azure SDK pro .NET vytvořit kanál obohacení AI pro extrakci a transformace obsahu během indexování.

Sady dovedností přidávají zpracování umělé inteligence do nezpracovaného obsahu, což z něj dělá jednotnější a lépe prohledávatelné. Jakmile pochopíte, jak sady dovedností fungují, můžete podporovat širokou škálu transformací, od analýzy obrázků po zpracování přirozeného jazyka až po přizpůsobené zpracování, které poskytujete externě.

V tomto kurzu se naučíte:

  • Definujte objekty v kanálu obohacení.
  • Rozvíjejte dovednosti. Vyvolání OCR, rozpoznávání jazyka, rozpoznávání entit a extrakce klíčových frází
  • Spusťte potrubí. Vytvoření a načtení indexu vyhledávání
  • Zkontrolujte výsledky pomocí fulltextového vyhledávání.

Overview

Tento kurz používá jazyk C# a klientskou knihovnu Azure.Search.Documents k vytvoření zdroje dat, indexu, indexeru a sady dovedností.

Indexér řídí každý krok v pipeline, počínaje extrakcí obsahu ukázkových dat (nestrukturovaného textu a obrázků) v blob kontejneru na Azure Storage.

Po extrahování obsahu sada dovedností provede předdefinované dovednosti od Microsoftu a vyhledá a extrahuje informace. Mezi tyto dovednosti patří optické rozpoznávání znaků (OCR) na obrázcích, rozpoznávání jazyka u textu, extrakce klíčových frází a rozpoznávání entit (organizace). Nové informace vytvořené sadou dovedností se posílají do polí v indexu. Po naplnění indexu můžete použít pole v dotazech, fasetách a filtrech.

Prerequisites

Note

Pro účely tohoto kurzu můžete použít bezplatnou vyhledávací službu. Úroveň Free vás omezuje na tři indexy, tři indexery a tři zdroje dat. V tomto kurzu se vytváří jeden z každého typu. Než začnete, ujistěte se, že máte ve službě místo pro přijetí nových prostředků.

Stažení souborů

Nahrání ukázkových dat do Azure Storage

  1. Ve službě Azure Storage vytvořte nový kontejner a pojmenujte ho smíšenými typy obsahu.

  2. Nahrajte ukázkové datové soubory.

  3. Získejte připojovací řetězec úložiště, abyste mohli navázat připojení ve službě Azure AI Vyhledávač.

    1. Na levé straně vyberte Přístupové klávesy.

    2. Zkopírujte připojovací řetězec pro klíč jeden nebo dva. Připojovací řetězec se podobá následujícímu příkladu:

      DefaultEndpointsProtocol=https;AccountName=<your account name>;AccountKey=<your account key>;EndpointSuffix=core.windows.net

Nástroje slévárny

Integrované rozšiřování AI je podporováno nástroji Foundry, včetně jazyka Azure a Azure Vision pro zpracování přirozeného jazyka a obrázků. U malých úloh, jako je tento kurz, můžete použít bezplatné přidělení 20 transakcí na indexer. Pro větší úlohy připojte zdroj Microsoft Foundry k sadě dovedností za standardní ceny.

Zkopírujte adresu URL vyhledávací služby a klíč rozhraní API.

Pro účely tohoto kurzu vyžadují připojení ke službě Azure AI Vyhledávač koncový bod a klíč rozhraní API. Tyto hodnoty můžete získat z webu Azure Portal.

  1. Na webu Azure Portal přejděte do vyhledávací služby.

  2. V levém podokně vyberte Přehled a zkopírujte koncový bod. Měl by být v tomto formátu: https://my-service.search.windows.net

  3. V levém podokně vyberte Klíče nastavení> a zkopírujte klíč správce pro úplná práva ke službě. Existují dva zaměnitelné klíče správce, které jsou k dispozici pro zajištění kontinuity podnikových procesů v případě, že potřebujete jeden převést. Objekty můžete přidávat, upravovat nebo odstraňovat pomocí klíče u požadavků.

Nastavení prostředí

Začněte otevřením sady Visual Studio a vytvořením nového projektu konzolové aplikace.

Nainstalovat Azure.Search.Documents

Sada .NET SDK služby Azure AI Vyhledávač se skládá z klientské knihovny, která umožňuje spravovat indexy, zdroje dat, indexery a sady dovedností a také nahrávat a spravovat dokumenty a spouštět dotazy, a to vše bez nutnosti zabývat se podrobnostmi HTTP a JSON. Tato klientská knihovna se distribuuje jako balíček NuGet.

Pro tento projekt nainstalujte verzi 11 nebo novější Azure.Search.Documents a nejnovější verzi Microsoft.Extensions.Configuration.

  1. V sadě Visual Studio vyberte Nástroje>Správce balíčků NuGet>Spravovat balíčky NuGet pro řešení...

  2. Vyhledejte Azure.Search.Document.

  3. Vyberte nejnovější verzi a pak vyberte Nainstalovat.

  4. Opakujte předchozí kroky a nainstalujte Microsoft.Extensions.Configuration a Microsoft.Extensions.Configuration.Json.

Přidání informací o připojení služby

  1. Klikněte pravým tlačítkem na projekt v Průzkumník řešení a vyberte Přidat>novou položku... .

  2. Pojmenujte soubor appsettings.json a vyberte Přidat.

  3. Tento soubor zahrňte do výstupního adresáře.

    1. Klikněte pravým tlačítkem myši a appsettings.json vyberte Vlastnosti.
    2. Změňte hodnotu Kopírovat do výstupního adresáře na Kopírovat, pokud je novější.
  4. Do nového souboru JSON zkopírujte následující KÓD JSON.

    {
      "SearchServiceUri": "<YourSearchServiceUri>",
      "SearchServiceAdminApiKey": "<YourSearchServiceAdminApiKey>",
      "SearchServiceQueryApiKey": "<YourSearchServiceQueryApiKey>",
      "AzureAIServicesKey": "<YourMultiRegionAzureAIServicesKey>",
      "AzureBlobConnectionString": "<YourAzureBlobConnectionString>"
    }
    

Přidejte informace o vyhledávací službě a účtu úložiště blob. Vzpomeňte si, že tyto informace můžete získat z kroků zřizování služeb uvedených v předchozí části.

Do pole SearchServiceUri zadejte úplnou adresu URL.

Přidejte obory názvů

Do Program.cspole přidejte následující obory názvů.

using Azure;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;

namespace EnrichwithAI

Vytvoření klienta

Vytvořte instanci objektu SearchIndexClient a instanci objektu SearchIndexerClient pod Main.

public static void Main(string[] args)
{
    // Create service client
    IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
    IConfigurationRoot configuration = builder.Build();

    string searchServiceUri = configuration["SearchServiceUri"];
    string adminApiKey = configuration["SearchServiceAdminApiKey"];
    string azureAiServicesKey = configuration["AzureAIServicesKey"];

    SearchIndexClient indexClient = new SearchIndexClient(new Uri(searchServiceUri), new AzureKeyCredential(adminApiKey));
    SearchIndexerClient indexerClient = new SearchIndexerClient(new Uri(searchServiceUri), new AzureKeyCredential(adminApiKey));
}

Note

Klienti se připojují k vaší vyhledávací službě. Pokud chcete zabránit otevření příliš velkého počtu připojení, zkuste v aplikaci sdílet jednu instanci, pokud je to možné. Metody jsou bezpečné pro přístup z více vláken, aby umožnily takové sdílení.

Přidání funkce pro ukončení programu během selhání

Tento kurz vám pomůže porozumět jednotlivým krokům kanálu indexování. Pokud dojde k kritickému problému, který programu brání ve vytváření zdroje dat, sady dovedností, indexu nebo indexeru, program vypíše chybovou zprávu a ukončí, aby problém mohl být srozumitelný a vyřešený.

Přidejte ExitProgram do Main pro zpracování scénářů, které vyžadují ukončení programu.

private static void ExitProgram(string message)
{
    Console.WriteLine("{0}", message);
    Console.WriteLine("Press any key to exit the program...");
    Console.ReadKey();
    Environment.Exit(0);
}

Vytvoř potrubí

Ve službě Azure AI Vyhledávač probíhá zpracování AI během indexování (nebo příjmu dat). Tato část návodu vytvoří čtyři objekty: zdroj dat, definice indexu, sada dovedností, indexer.

Krok 1: Vytvoření zdroje dat

SearchIndexerClient má vlastnost DataSourceName, kterou můžete nastavit na objekt SearchIndexerDataSourceConnection. Tento objekt poskytuje všechny metody, které potřebujete k vytvoření, výpisu, aktualizaci nebo odstranění zdrojů dat Azure AI Vyhledávač.

Vytvořte novou SearchIndexerDataSourceConnection instanci voláním indexerClient.CreateOrUpdateDataSourceConnection(dataSource). Následující kód vytvoří zdroj dat typu AzureBlob.

private static SearchIndexerDataSourceConnection CreateOrUpdateDataSource(SearchIndexerClient indexerClient, IConfigurationRoot configuration)
{
    SearchIndexerDataSourceConnection dataSource = new SearchIndexerDataSourceConnection(
        name: "demodata",
        type: SearchIndexerDataSourceType.AzureBlob,
        connectionString: configuration["AzureBlobConnectionString"],
        container: new SearchIndexerDataContainer("mixed-content-type"))
    {
        Description = "Demo files to demonstrate Azure AI Search capabilities."
    };

    // The data source does not need to be deleted if it was already created
    // since we are using the CreateOrUpdate method
    try
    {
        indexerClient.CreateOrUpdateDataSourceConnection(dataSource);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Failed to create or update the data source\n Exception message: {0}\n", ex.Message);
        ExitProgram("Cannot continue without a data source");
    }

    return dataSource;
}

Pro úspěšný požadavek vrátí metoda vytvořený zdroj dat. Pokud dojde k problému s požadavkem, například neplatným parametrem, vyvolá metoda výjimku.

Teď přidejte řádek Main pro volání CreateOrUpdateDataSource funkce, kterou jste právě přidali.

// Create or Update the data source
Console.WriteLine("Creating or updating the data source...");
SearchIndexerDataSourceConnection dataSource = CreateOrUpdateDataSource(indexerClient, configuration);

Sestavte a spusťte řešení. Vzhledem k tomu, že se jedná o váš první požadavek, zkontrolujte web Azure Portal a ověřte, že se zdroj dat vytvořil ve službě Azure AI Vyhledávač. Na stránce přehledu vyhledávací služby ověřte, že seznam Zdrojů dat obsahuje novou položku. Možná budete muset několik minut počkat, než se stránka webu Azure Portal aktualizuje.

Dlaždice Zdroje dat na webu Azure Portal

Krok 2: Vytvoření sady dovedností

V této části definujete sadu kroků rozšiřování, které chcete použít pro vaše data. Každý krok rozšiřování se nazývá dovednost a sada kroků rozšiřování, sada dovedností. Tento kurz používá integrované dovednosti pro sadu dovedností:

  • Optické rozpoznávání znaků pro rozpoznávání tištěného a rukou psaného textu v souborech obrázků.

  • Sloučení textu pro konsolidaci textu ze sbírky polí do jediného pole "sloučený obsah".

  • Rozpoznávání jazyka, které identifikuje jazyk obsahu

  • Rozpoznávání entit pro extrahování názvů organizací z obsahu kontejneru objektu blob

  • Text Split k rozložení velkého obsahu na menší části před použitím dovednosti extrakce klíčových frází a rozpoznávání entit. Extrakce klíčových frází a rozpoznávání entit přijímají vstupy o 50 000 znaménky nebo méně. Některé ze zdrojových souborů je nutné rozdělit, aby se do tohoto limitu vešly.

  • Extrakce klíčových frází, která získává hlavní klíčové fráze

Během počátečního zpracování azure AI Search prolomí každý dokument a extrahuje obsah z různých formátů souborů. Text pocházející ze zdrojového souboru se umístí do vygenerovaného content pole, jedno pro každý dokument. Proto nastavte vstup tak, aby "/document/content" používal tento text. Obsah obrázku se umístí do vygenerovaného normalized_images pole určeného v sadě dovedností jako /document/normalized_images/*.

Výstupy se dají namapovat na index, použít jako vstup do podřízené dovednosti, nebo využít oběma způsoby tak, jak se to dělá s kódem jazyka. V indexu je kód jazyka užitečný při filtrování. Kód jazyka se při analýze textu používá k tomu, aby poskytl jazykovým pravidlům informace o dělení slov.

Další informace o základních principech sady dovedností najdete v článku o definování sady dovedností.

Dovednost OCR

To OcrSkill extrahuje text z obrázků. Tato dovednost předpokládá, že existuje pole normalized_images. Chcete-li toto pole vygenerovat, v pozdějším kroku kurzu nastavíme konfiguraci "imageAction" v definici indexeru na "generateNormalizedImages".

private static OcrSkill CreateOcrSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("image")
    {
        Source = "/document/normalized_images/*"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("text")
    {
        TargetName = "text"
    });

    OcrSkill ocrSkill = new OcrSkill(inputMappings, outputMappings)
    {
        Description = "Extract text (plain and structured) from image",
        Context = "/document/normalized_images/*",
        DefaultLanguageCode = OcrSkillLanguage.En,
        ShouldDetectOrientation = true
    };

    return ocrSkill;
}

Sloučit dovednosti

V této části vytvoříte MergeSkill, které spojuje pole obsahu dokumentu s textem vytvořeným dovedností OCR.

private static MergeSkill CreateMergeSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/content"
    });
    inputMappings.Add(new InputFieldMappingEntry("itemsToInsert")
    {
        Source = "/document/normalized_images/*/text"
    });
    inputMappings.Add(new InputFieldMappingEntry("offsets")
    {
        Source = "/document/normalized_images/*/contentOffset"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("mergedText")
    {
        TargetName = "merged_text"
    });

    MergeSkill mergeSkill = new MergeSkill(inputMappings, outputMappings)
    {
        Description = "Create merged_text which includes all the textual representation of each image inserted at the right location in the content field.",
        Context = "/document",
        InsertPreTag = " ",
        InsertPostTag = " "
    };

    return mergeSkill;
}

Dovednost rozpoznávání jazyka

Rozpozná LanguageDetectionSkill jazyk vstupního textu a hlásí jeden kód jazyka pro každý dokument odeslaný na žádost. Výstup dovednosti rozpoznávání jazyka používáme jako součást vstupu dovednosti Rozdělení textu.

private static LanguageDetectionSkill CreateLanguageDetectionSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/merged_text"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("languageCode")
    {
        TargetName = "languageCode"
    });

    LanguageDetectionSkill languageDetectionSkill = new LanguageDetectionSkill(inputMappings, outputMappings)
    {
        Description = "Detect the language used in the document",
        Context = "/document"
    };

    return languageDetectionSkill;
}

Dovednost rozdělení textu

Následující SplitSkill text rozdělí podle stránek a omezí délku stránky na 4 000 znaků měřených podle String.Length. Algoritmus se pokusí rozdělit text na bloky, které mají největší maximumPageLength velikost. V tomto případě algoritmus nejlépe rozdělí větu na hranici věty, takže velikost bloku dat může být o něco menší než maximumPageLength.

private static SplitSkill CreateSplitSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/merged_text"
    });
    inputMappings.Add(new InputFieldMappingEntry("languageCode")
    {
        Source = "/document/languageCode"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("textItems")
    {
        TargetName = "pages",
    });

    SplitSkill splitSkill = new SplitSkill(inputMappings, outputMappings)
    {
        Description = "Split content into pages",
        Context = "/document",
        TextSplitMode = TextSplitMode.Pages,
        MaximumPageLength = 4000,
        DefaultLanguageCode = SplitSkillLanguage.En
    };

    return splitSkill;
}

Dovednost rozpoznávání entit

Tato EntityRecognitionSkill instance je nastavena na rozpoznávání typu organizationkategorie . EntityRecognitionSkill může také rozpoznat typy kategorií person a location.

Všimněte si, že pole "context" je nastaveno na "/document/pages/*" s hvězdičkou, což znamená, že krok obohacení se volá pro každou stránku pod "/document/pages".

private static EntityRecognitionSkill CreateEntityRecognitionSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/pages/*"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("organizations")
    {
        TargetName = "organizations"
    });

    // Specify the V3 version of the EntityRecognitionSkill
    var skillVersion = EntityRecognitionSkill.SkillVersion.V3;

    var entityRecognitionSkill = new EntityRecognitionSkill(inputMappings, outputMappings, skillVersion)
    {
        Description = "Recognize organizations",
        Context = "/document/pages/*",
        DefaultLanguageCode = EntityRecognitionSkillLanguage.En
    };
    entityRecognitionSkill.Categories.Add(EntityCategory.Organization);
    return entityRecognitionSkill;
}

Dovednost extrakce klíčových frází

Podobně jako instance EntityRecognitionSkill , která byla právě vytvořena, KeyPhraseExtractionSkill se volá pro každou stránku dokumentu.

private static KeyPhraseExtractionSkill CreateKeyPhraseExtractionSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/pages/*"
    });
    inputMappings.Add(new InputFieldMappingEntry("languageCode")
    {
        Source = "/document/languageCode"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("keyPhrases")
    {
        TargetName = "keyPhrases"
    });

    KeyPhraseExtractionSkill keyPhraseExtractionSkill = new KeyPhraseExtractionSkill(inputMappings, outputMappings)
    {
        Description = "Extract the key phrases",
        Context = "/document/pages/*",
        DefaultLanguageCode = KeyPhraseExtractionSkillLanguage.En
    };

    return keyPhraseExtractionSkill;
}

Rozvíjet a vytvářet sadu dovedností

Pomocí dovedností, které jste vytvořili, vybudujte SearchIndexerSkillset.

private static SearchIndexerSkillset CreateOrUpdateDemoSkillSet(SearchIndexerClient indexerClient, IList<SearchIndexerSkill> skills,string azureAiServicesKey)
{
    SearchIndexerSkillset skillset = new SearchIndexerSkillset("demoskillset", skills)
    {
        // Foundry Tools was formerly known as Cognitive Services.
        // The APIs still use the old name, so we need to create a CognitiveServicesAccountKey object.
        Description = "Demo skillset",
        CognitiveServicesAccount = new CognitiveServicesAccountKey(azureAiServicesKey)
    };

    // Create the skillset in your search service.
    // The skillset does not need to be deleted if it was already created
    // since we are using the CreateOrUpdate method
    try
    {
        indexerClient.CreateOrUpdateSkillset(skillset);
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine("Failed to create the skillset\n Exception message: {0}\n", ex.Message);
        ExitProgram("Cannot continue without a skillset");
    }

    return skillset;
}

Přidejte následující řádky do Main.

// Create the skills
Console.WriteLine("Creating the skills...");
OcrSkill ocrSkill = CreateOcrSkill();
MergeSkill mergeSkill = CreateMergeSkill();
EntityRecognitionSkill entityRecognitionSkill = CreateEntityRecognitionSkill();
LanguageDetectionSkill languageDetectionSkill = CreateLanguageDetectionSkill();
SplitSkill splitSkill = CreateSplitSkill();
KeyPhraseExtractionSkill keyPhraseExtractionSkill = CreateKeyPhraseExtractionSkill();

// Create the skillset
Console.WriteLine("Creating or updating the skillset...");
List<SearchIndexerSkill> skills = new List<SearchIndexerSkill>();
skills.Add(ocrSkill);
skills.Add(mergeSkill);
skills.Add(languageDetectionSkill);
skills.Add(splitSkill);
skills.Add(entityRecognitionSkill);
skills.Add(keyPhraseExtractionSkill);

SearchIndexerSkillset skillset = CreateOrUpdateDemoSkillSet(indexerClient, skills, azureAiServicesKey);

Krok 3: Vytvoření indexu

V tomto oddílu definujete schéma indexu, a to tak, že zadáte, která pole se mají zahrnout do prohledávatelného indexu, a pro jednotlivá pole poskytnete atributy vyhledávání. Pole mají typ a můžou přijímat argumenty, které určují, jak se pole používá (prohledávatelné, seřaditelné apod.). Názvy polí v indexu se nevyžadují, aby se shodovaly s názvy polí ve zdroji. V pozdějším kroku přidáte v indexeru mapování polí, pomocí kterých propojíte zdrojová a cílová pole. Pro tento krok definujte index pomocí konvencí pojmenování relevantních pro vaši vyhledávací aplikaci.

V tomto cvičení použijeme následující pole a jejich typy:

Názvy polí Typy polí
id Edm.String
content Edm.String
languageCode Edm.String
keyPhrases List<Edm.String>
organizations List<Edm.String>

Vytvořit třídu DemoIndex

Pole pro tento index jsou definována pomocí třídy modelu. Každá vlastnost třídy modelu má atributy, které určují chování související s vyhledáváním odpovídajícího pole indexu.

Třídu modelu přidáme do nového souboru C#. Pravým tlačítkem myši vyberte projekt a vyberte Přidat>novou položku..., vyberte "Třída" a pojmenujte soubor DemoIndex.csa pak vyberte Přidat.

Ujistěte se, že chcete používat typy z oborů názvů Azure.Search.Documents.Indexes a System.Text.Json.Serialization.

Přidejte následující definici třídy modelu do DemoIndex.cs a zahrňte ji do stejného oboru názvů, ve kterém vytvoříte index.

using Azure.Search.Documents.Indexes;
using System.Text.Json.Serialization;

namespace EnrichwithAI
{
    // The SerializePropertyNamesAsCamelCase is currently unsupported as of this writing. 
    // Replace it with JsonPropertyName
    public class DemoIndex
    {
        [SearchableField(IsSortable = true, IsKey = true)]
        [JsonPropertyName("id")]
        public string Id { get; set; }

        [SearchableField]
        [JsonPropertyName("content")]
        public string Content { get; set; }

        [SearchableField]
        [JsonPropertyName("languageCode")]
        public string LanguageCode { get; set; }

        [SearchableField]
        [JsonPropertyName("keyPhrases")]
        public string[] KeyPhrases { get; set; }

        [SearchableField]
        [JsonPropertyName("organizations")]
        public string[] Organizations { get; set; }
    }
}

Teď, když jste definovali třídu modelu, se můžete vrátit k Program.cs a poměrně snadno vytvořit definici indexu. Název tohoto indexu bude demoindex. Pokud už index s tímto názvem existuje, odstraní se.

private static SearchIndex CreateDemoIndex(SearchIndexClient indexClient)
{
    FieldBuilder builder = new FieldBuilder();
    var index = new SearchIndex("demoindex")
    {
        Fields = builder.Build(typeof(DemoIndex))
    };

    try
    {
        indexClient.GetIndex(index.Name);
        indexClient.DeleteIndex(index.Name);
    }
    catch (RequestFailedException ex) when (ex.Status == 404)
    {
        //if the specified index not exist, 404 will be thrown.
    }

    try
    {
        indexClient.CreateIndex(index);
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine("Failed to create the index\n Exception message: {0}\n", ex.Message);
        ExitProgram("Cannot continue without an index");
    }

    return index;
}

Během testování můžete zjistit, že se pokoušíte vytvořit index více než jednou. Z tohoto důvodu zkontrolujte, jestli index, který se chystáte vytvořit, již existuje, než se ho pokusíte vytvořit.

Přidejte následující řádky do Main.

// Create the index
Console.WriteLine("Creating the index...");
SearchIndex demoIndex = CreateDemoIndex(indexClient);

Přidejte následující příkaz using k vyřešení nejednoznačného odkazu.

using Index = Azure.Search.Documents.Indexes.Models;

Další informace o konceptech indexu najdete v tématu Vytvoření indexu (REST API).

Krok 4: Vytvoření a spuštění indexeru

Do této chvíle jste vytvořili zdroj dat, sadu dovedností a index. Tyto tři komponenty se stanou součástí indexeru, který jednotlivé části sestaví do jediné operace s více fázemi. Pokud je chcete sloučit do indexeru, musíte nadefinovat mapování polí.

  • Mapování polí ze zdroje dat na cílová pole v indexu se zpracovává před zpracováním sady dovedností. Pokud jsou názvy polí a typy na obou koncích stejné, nevyžaduje se žádné mapování.

  • Mapování výstupních polí se zpracovává po sadě dovedností a odkazuje na názvy zdrojových polí, které neexistují, dokud je nevytvoří dekompozice nebo obohacení dokumentu. TargetFieldName je pole v indexu.

Kromě připojení vstupů k výstupům můžete také použít mapování polí pro zploštěné datové struktury. Další informace naleznete v tématu Jak mapovat rozšířená pole na prohledávatelný index.

private static SearchIndexer CreateDemoIndexer(SearchIndexerClient indexerClient, SearchIndexerDataSourceConnection dataSource, SearchIndexerSkillset skillSet, SearchIndex index)
{
    IndexingParameters indexingParameters = new IndexingParameters()
    {
        MaxFailedItems = -1,
        MaxFailedItemsPerBatch = -1,
    };
    indexingParameters.Configuration.Add("dataToExtract", "contentAndMetadata");
    indexingParameters.Configuration.Add("imageAction", "generateNormalizedImages");

    SearchIndexer indexer = new SearchIndexer("demoindexer", dataSource.Name, index.Name)
    {
        Description = "Demo Indexer",
        SkillsetName = skillSet.Name,
        Parameters = indexingParameters
    };

    FieldMappingFunction mappingFunction = new FieldMappingFunction("base64Encode");
    mappingFunction.Parameters.Add("useHttpServerUtilityUrlTokenEncode", true);

    indexer.FieldMappings.Add(new FieldMapping("metadata_storage_path")
    {
        TargetFieldName = "id",
        MappingFunction = mappingFunction

    });
    indexer.FieldMappings.Add(new FieldMapping("content")
    {
        TargetFieldName = "content"
    });

    indexer.OutputFieldMappings.Add(new FieldMapping("/document/pages/*/organizations/*")
    {
        TargetFieldName = "organizations"
    });
    indexer.OutputFieldMappings.Add(new FieldMapping("/document/pages/*/keyPhrases/*")
    {
        TargetFieldName = "keyPhrases"
    });
    indexer.OutputFieldMappings.Add(new FieldMapping("/document/languageCode")
    {
        TargetFieldName = "languageCode"
    });

    try
    {
        indexerClient.GetIndexer(indexer.Name);
        indexerClient.DeleteIndexer(indexer.Name);
    }
    catch (RequestFailedException ex) when (ex.Status == 404)
    {
        //if the specified indexer not exist, 404 will be thrown.
    }

    try
    {
        indexerClient.CreateIndexer(indexer);
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine("Failed to create the indexer\n Exception message: {0}\n", ex.Message);
        ExitProgram("Cannot continue without creating an indexer");
    }

    return indexer;
}

Přidejte následující řádky do Main.

// Create the indexer, map fields, and execute transformations
Console.WriteLine("Creating the indexer and executing the pipeline...");
SearchIndexer demoIndexer = CreateDemoIndexer(indexerClient, dataSource, skillset, demoIndex);

Očekáváme, že dokončení zpracování indexeru nějakou dobu trvá. I když je sada dat malá, analytické dovednosti jsou výpočetně náročné. Některé dovednosti, třeba analýza obrazu, trvají dlouho.

Tip

Vytvoření indexeru vyvolá zpracovatelský řetězec. Pokud dojde k nějakému problému při komunikaci s daty, při mapování vstupů a výstupů nebo s pořadím operací, zobrazí se v této fázi.

Prozkoumání vytváření indexeru

Kód nastaví "maxFailedItems" na -1, což dává modulu indexování pokyn, aby při importu dat ignoroval chyby. To je užitečné, protože v ukázkovém zdroji dat je velmi málo dokumentů. Pro větší zdroje dat by tato hodnota byla větší než 0.

Všimněte si také, že "dataToExtract" je nastavena na "contentAndMetadata". Tento příkaz dává indexeru pokyn, aby automaticky extrahoval obsah z různých formátů souborů, stejně jako metadata, která s jednotlivými soubory souvisí.

Když se extrahuje obsah, můžete nastavit imageAction, aby se z obrázků nalezených ve zdroji dat extrahoval text. Sada "imageAction" na "generateNormalizedImages" konfiguraci v kombinaci s dovedností OCR a dovedností při slučování textu říká indexeru, aby extrahoval text z obrázků (například slovo "stop" z znaménka zastavení provozu) a vložil ho jako součást pole obsahu. Toto chování platí jak pro obrázky vložené do dokumentů (třeba obrázek v souboru PDF), tak pro obrázky nalezené ve zdroji dat, např. soubor JPG.

Monitorování indexování

Po definování indexeru se automaticky spustí při odeslání požadavku. V závislosti na tom, které dovednosti jste definovali, může indexování trvat déle, než očekáváte. Pokud chcete zjistit, jestli je indexer stále spuštěný, použijte metodu GetStatus .

private static void CheckIndexerOverallStatus(SearchIndexerClient indexerClient, SearchIndexer indexer)
{
    try
    {
        var demoIndexerExecutionInfo = indexerClient.GetIndexerStatus(indexer.Name);

        switch (demoIndexerExecutionInfo.Value.Status)
        {
            case IndexerStatus.Error:
                ExitProgram("Indexer has error status. Check the Azure portal to further understand the error.");
                break;
            case IndexerStatus.Running:
                Console.WriteLine("Indexer is running");
                break;
            case IndexerStatus.Unknown:
                Console.WriteLine("Indexer status is unknown");
                break;
            default:
                Console.WriteLine("No indexer information");
                break;
        }
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine("Failed to get indexer overall status\n Exception message: {0}\n", ex.Message);
    }
}

demoIndexerExecutionInfo představuje aktuální stav a historii spuštění indexeru.

Upozornění jsou běžná u některých kombinací zdrojových souborů a dovedností a ne vždy značí problém. V tomto kurzu jsou upozornění neškodná (např. v souboru JPEG nejsou žádné textové vstupy).

Přidejte následující řádky do Main.

// Check indexer overall status
Console.WriteLine("Check the indexer overall status...");
CheckIndexerOverallStatus(indexerClient, demoIndexer);

V konzolových aplikacích Azure AI Vyhledávač obvykle přidáváme 2sekundové zpoždění před spuštěním dotazů, které vrací výsledky, ale protože dokončení rozšiřování trvá několik minut, zavřeme konzolovou aplikaci a místo toho použijeme jiný přístup.

Nejjednodušší možností je Průzkumník služby Search na webu Azure Portal. Nejprve můžete spustit prázdný dotaz, který vrátí všechny dokumenty, nebo cílenější hledání, které vrací nový obsah pole vytvořený kanálem.

  1. V Azure portálu, na stránkách vyhledávací služby, rozbalte Správa vyhledávání>Indexy.

  2. Najděte demoindex v seznamu. Mělo by mít 14 dokumentů. Pokud je počet dokumentů nulový, indexer je stále spuštěný nebo se stránka ještě neaktualizovala.

  3. Vyberte možnost demoindex. Search Explorer je první karta.

  4. Obsah je možné prohledávat hned po načtení prvního dokumentu. Pokud chcete ověřit, jestli obsah existuje, spusťte nespecifikovaný dotaz kliknutím na Tlačítko Hledat. Tento dotaz vrátí všechny aktuálně indexované dokumenty a poskytne vám představu o tom, co index obsahuje.

  5. Pokud chcete lépe spravovatelné výsledky, přepněte do zobrazení JSON a nastavte parametry pro výběr polí:

    {
        "search": "*",
        "count": true,
        "select": "id, languageCode, organizations"
    }
    

Resetování a opětovné spuštění

V počátečních experimentálních fázích vývoje je nejproktičtějším přístupem k iteraci návrhu odstranit objekty z Azure AI Vyhledávač a umožnit kódu jejich opětovné sestavení. Názvy prostředků jsou jedinečné. Když se objekt odstraní, je možné ho znovu vytvořit se stejným názvem.

Vzorový kód pro tento kurz zkontroluje existující objekty a odstraní je, abyste mohli znovu spustit kód. Pomocí webu Azure Portal můžete také odstranit indexy, indexery, zdroje dat a sady dovedností.

Takeaways

V tomto kurzu jsme si ukázali základní kroky pro vytvoření rozšířeného kanálu indexování prostřednictvím vytváření součástí součástí: zdroje dat, sady dovedností, indexu a indexeru.

Předdefinované dovednosti byly zavedeny spolu s definicí sady dovedností a mechanikou zřetězování dovedností prostřednictvím vstupů a výstupů. Také jste se dozvěděli, že outputFieldMappings v definici indexeru je nezbytné pro směrování obohacených hodnot z pipeline do prohledávatelného indexu ve službě Azure AI Vyhledávač.

Nakonec jste se dozvěděli, jak testovat výsledky a resetovat systém pro další iterace. Zjistili jste, že zasílání dotazů na index vrací výstup vytvořený kanálem rozšířeného indexování. K tomu všemu jste se naučili, jak zkontrolovat stav indexeru a které objekty se mají před opětovným spuštěním kanálu odstranit.

Vyčistěte zdroje

Když pracujete ve vlastním předplatném, je na konci projektu vhodné odebrat prostředky, které už nepotřebujete. Prostředky ponechané v provozu mohou způsobit výdaje. Prostředky můžete odstranit jednotlivě nebo odstranit skupinu prostředků a odstranit tak celou sadu prostředků.

Prostředky můžete najít a spravovat na webu Azure Portal pomocí odkazu Všechny prostředky nebo skupiny prostředků v levém navigačním podokně.

Další kroky

Teď, když jste obeznámeni se všemi objekty v rozšiřovacím potrubí AI, podíváme se podrobněji na definici sady dovedností a individuální dovednosti.

Zjistěte, jak volat rozhraní REST API, která během indexování vytvářejí kanál rozšiřování AI pro extrakci a transformace obsahu.

Sady dovedností přidávají zpracování umělé inteligence do nezpracovaného obsahu, což z něj dělá jednotnější a lépe prohledávatelné. Jakmile pochopíte, jak sady dovedností fungují, můžete podporovat širokou škálu transformací, od analýzy obrázků po zpracování přirozeného jazyka až po přizpůsobené zpracování, které poskytujete externě.

V tomto kurzu se naučíte:

  • Definujte objekty v kanálu obohacení.
  • Rozvíjejte dovednosti. Vyvolání OCR, rozpoznávání jazyka, rozpoznávání entit a extrakce klíčových frází
  • Spusťte potrubí. Vytvoření a načtení indexu vyhledávání
  • Zkontrolujte výsledky pomocí fulltextového vyhledávání.

Overview

Tento kurz používá klienta REST a rozhraní REST API služby Azure AI Search k vytvoření zdroje dat, indexu, indexeru a sady dovedností.

Indexér řídí každý krok v pipeline, počínaje extrakcí obsahu ukázkových dat (nestrukturovaného textu a obrázků) v blob kontejneru na Azure Storage.

Po extrahování obsahu sada dovedností provede předdefinované dovednosti od Microsoftu a vyhledá a extrahuje informace. Mezi tyto dovednosti patří optické rozpoznávání znaků (OCR) na obrázcích, rozpoznávání jazyka u textu, extrakce klíčových frází a rozpoznávání entit (organizace). Nové informace vytvořené sadou dovedností se posílají do polí v indexu. Po naplnění indexu můžete použít pole v dotazech, fasetách a filtrech.

Prerequisites

Note

Pro účely tohoto kurzu můžete použít bezplatnou vyhledávací službu. Úroveň Free vás omezuje na tři indexy, tři indexery a tři zdroje dat. V tomto kurzu se vytváří jeden z každého typu. Než začnete, ujistěte se, že máte ve službě místo pro přijetí nových prostředků.

Stažení souborů

Stáhněte si soubor ZIP ukázkového úložiště dat a extrahujte obsah. Zjistěte, jak na to.

Nahrání ukázkových dat do Azure Storage

  1. Ve službě Azure Storage vytvořte nový kontejner a pojmenujte ho cog-search-demo.

  2. Nahrajte ukázkové datové soubory.

  3. Získejte připojovací řetězec úložiště, abyste mohli navázat připojení ve službě Azure AI Vyhledávač.

    1. Na levé straně vyberte Přístupové klávesy.

    2. Zkopírujte připojovací řetězec pro klíč jeden nebo dva. Připojovací řetězec se podobá následujícímu příkladu:

      DefaultEndpointsProtocol=https;AccountName=<your account name>;AccountKey=<your account key>;EndpointSuffix=core.windows.net

Nástroje slévárny

Integrované rozšiřování AI je podporováno nástroji Foundry, včetně jazyka Azure a Azure Vision pro zpracování přirozeného jazyka a obrázků. U malých úloh, jako je tento kurz, můžete použít bezplatné přidělení dvaceti transakcí na indexer. Pro větší úlohy připojte zdroj Microsoft Foundry k sadě dovedností za standardní ceny.

Zkopírujte adresu URL vyhledávací služby a klíč rozhraní API.

Pro účely tohoto kurzu vyžadují připojení ke službě Azure AI Vyhledávač koncový bod a klíč rozhraní API. Tyto hodnoty můžete získat z webu Azure Portal.

  1. Na webu Azure Portal přejděte do vyhledávací služby.

  2. V levém podokně vyberte Přehled a zkopírujte koncový bod. Měl by být v tomto formátu: https://my-service.search.windows.net

  3. V levém podokně vyberte Klíče nastavení> a zkopírujte klíč správce pro úplná práva ke službě. Existují dva zaměnitelné klíče správce, které jsou k dispozici pro zajištění kontinuity podnikových procesů v případě, že potřebujete jeden převést. Objekty můžete přidávat, upravovat nebo odstraňovat pomocí klíče u požadavků.

    Snímek obrazovky s adresou URL a klíči rozhraní API na webu Azure Portal

Nastavení souboru REST

  1. Spusťte Visual Studio Code a otevřete soubor skillset-tutorial.rest . Viz Rychlý start: Fulltextové vyhledávání , pokud potřebujete pomoc s klientem REST.

  2. Zadejte hodnoty proměnných: koncový bod vyhledávací služby, klíč rozhraní API správce vyhledávací služby, název indexu, připojovací řetězec k vašemu účtu služby Azure Storage a název kontejneru objektů blob.

Vytvoř potrubí

Rozšiřování AI je řízené indexerem. Tato část návodu vytvoří čtyři objekty: zdroj dat, definice indexu, sada dovedností, indexer.

Krok 1: Vytvoření zdroje dat

Voláním příkazu Vytvořit zdroj dat nastavte připojovací řetězec do kontejneru objektů blob obsahujícího ukázkové datové soubory.

### Create a data source
POST {{baseUrl}}/datasources?api-version=2026-04-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}

    {
        "name": "cog-search-demo-ds",
        "description": null,
        "type": "azureblob",
        "subtype": null,
        "credentials": {
            "connectionString": "{{storageConnectionString}}"
        },
        "container": {
            "name": "{{blobContainer}}",
            "query": null
        },
        "dataChangeDetectionPolicy": null,
        "dataDeletionDetectionPolicy": null
    }

Krok 2: Vytvoření sady dovedností

Zavolejte Create Skillset k určení, které kroky rozšiřování se použijí pro váš obsah. Dovednosti se provádějí paralelně, pokud není závislost.

### Create a skillset
POST {{baseUrl}}/skillsets?api-version=2026-04-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}

    {
        "name": "cog-search-demo-ss",
        "description": "Apply OCR, detect language, extract entities, and extract key-phrases.",
        "cognitiveServices": null,
        "skills":
        [
            {
            "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
            "context": "/document/normalized_images/*",
            "defaultLanguageCode": "en",
            "detectOrientation": true,
            "inputs": [
                {
                    "name": "image",
                    "source": "/document/normalized_images/*"
                }
            ],
            "outputs": [
                {
                    "name": "text"
                }
            ]
            },
            {
            "@odata.type": "#Microsoft.Skills.Text.MergeSkill",
            "description": "Create merged_text, which includes all the textual representation of each image inserted at the right location in the content field. This is useful for PDF and other file formats that supported embedded images.",
            "context": "/document",
            "insertPreTag": " ",
            "insertPostTag": " ",
            "inputs": [
                {
                    "name":"text", 
                    "source": "/document/content"
                },
                {
                    "name": "itemsToInsert", 
                    "source": "/document/normalized_images/*/text"
                },
                {
                    "name":"offsets", 
                    "source": "/document/normalized_images/*/contentOffset" 
                }
            ],
            "outputs": [
                {
                    "name": "mergedText", 
                    "targetName" : "merged_text"
                }
            ]
            },
            {
            "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
            "textSplitMode": "pages",
            "maximumPageLength": 4000,
            "defaultLanguageCode": "en",
            "context": "/document",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/merged_text"
                }
            ],
            "outputs": [
                {
                    "name": "textItems",
                    "targetName": "pages"
                }
            ]
            },
            {
            "@odata.type": "#Microsoft.Skills.Text.LanguageDetectionSkill",
            "description": "If you have multilingual content, adding a language code is useful for filtering",
            "context": "/document",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/merged_text"
                }
            ],
            "outputs": [
                {
                    "name": "languageName",
                    "targetName": "language"
                }
            ]
            },
            {
            "@odata.type": "#Microsoft.Skills.Text.KeyPhraseExtractionSkill",
            "context": "/document/pages/*",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/pages/*"
                }
            ],
            "outputs": [
                {
                    "name": "keyPhrases",
                    "targetName": "keyPhrases"
                }
            ]
            },
            {
            "@odata.type": "#Microsoft.Skills.Text.V3.EntityRecognitionSkill",
            "categories": ["Organization"],
            "context": "/document",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/merged_text"
                }
            ],
            "outputs": [
                {
                    "name": "organizations",
                    "targetName": "organizations"
                }
            ]
            },
            {
            "@odata.type": "#Microsoft.Skills.Text.V3.EntityRecognitionSkill",
            "categories": ["Location"],
            "context": "/document",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/merged_text"
                }
            ],
            "outputs": [
                {
                    "name": "locations",
                    "targetName": "locations"
                }
            ]
            },
            {
            "@odata.type": "#Microsoft.Skills.Text.V3.EntityRecognitionSkill",
            "categories": ["Person"],
            "context": "/document",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/merged_text"
                }
            ],
            "outputs": [
                {
                    "name": "persons",
                    "targetName": "persons"
                }
            ]
            }
        ]
    }

Klíčové body:

  • Text požadavku určuje následující předdefinované dovednosti:

    Skill Description
    Optické rozpoznávání znaků Rozpozná text a čísla v souborech obrázků.
    Sloučení textu Vytvoří "sloučený obsah", který rekombinuje dříve oddělený obsah, užitečný pro dokumenty s vloženými obrázky (PDF, DOCX atd.). Obrázky a text jsou odděleny během fáze prolomení dokumentu. Dovednost sloučení je rekombinuje tím, že vloží rozpoznaný text, titulky obrázků nebo značky vytvořené při obohacování na stejné místo, odkud byl obrázek z dokumentu extrahován.

    Když pracujete se sloučeným obsahem v sadě dovedností, tento uzel zahrnuje veškerý text v dokumentu, včetně textových dokumentů, které nikdy neprošly analýzou OCR nebo obrázků.
    Rozpoznávání jazyka Rozpozná jazyk a výstup buď název jazyka, nebo kód. Ve vícejazyčných datových sadách může být pole jazyka užitečné pro filtry.
    Rozpoznávání entit Extrahuje jména lidí, organizací a umístění ze sloučeného obsahu.
    Rozdělení textu Před voláním dovednosti extrakce klíčových frází rozdělí velký sloučený obsah na menší bloky dat. Extrakce klíčových frází přijímá vstup složený z 50 000 znaků nebo méně. Některé ze zdrojových souborů je nutné rozdělit, aby se do tohoto limitu vešly.
    Extrakce klíčových frází Vytáhne hlavní klíčové fráze.
  • Každá dovednost se aplikuje na obsah dokumentu. Během zpracování azure AI Search prolomí každý dokument tak, aby četl obsah z různých formátů souborů. Nalezený text, který pochází ze zdrojového souboru, se umístí do vygenerovaného pole content, jednoho pro každý dokument. Tak se z vstupu stane "/document/content".

  • Pro extrakci klíčových frází používáme dovednost rozdělovače textu k rozdělení větších souborů na stránky, kontext dovednosti extrakce klíčových frází je "document/pages/*" (pro každou stránku v dokumentu) místo "/document/content".

Note

Výstupy se dají namapovat na index, použít jako vstup do podřízené dovednosti, nebo využít oběma způsoby tak, jak se to dělá s kódem jazyka. V indexu je kód jazyka užitečný při filtrování. Další informace o základních principech sady dovedností najdete v článku o definování sady dovedností.

Krok 3: Vytvoření indexu

Voláním vytvořit index zadejte schéma použité k vytvoření invertovaných indexů a dalších konstruktorů ve službě Azure AI Vyhledávač.

Největší součástí indexu je kolekce polí, kde datový typ a atributy určují obsah a chování ve službě Azure AI Vyhledávač. Ujistěte se, že máte pole pro nově vygenerovaný výstup.

### Create an index
POST {{baseUrl}}/indexes?api-version=2026-04-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}

    {
        "name": "cog-search-demo-idx",
        "defaultScoringProfile": "",
        "fields": [
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "sortable": false,
                "filterable": false,
                "facetable": false
            },
            {
                "name": "text",
                "type": "Collection(Edm.String)",
                "facetable": false,
                "filterable": true,
                "searchable": true,
                "sortable": false
            },
            {
                "name": "language",
                "type": "Edm.String",
                "searchable": false,
                "sortable": true,
                "filterable": true,
                "facetable": false
            },
            {
                "name": "keyPhrases",
                "type": "Collection(Edm.String)",
                "searchable": true,
                "sortable": false,
                "filterable": true,
                "facetable": true
            },
            {
                "name": "organizations",
                "type": "Collection(Edm.String)",
                "searchable": true,
                "sortable": false,
                "filterable": true,
                "facetable": true
            },
            {
                "name": "persons",
                "type": "Collection(Edm.String)",
                "searchable": true,
                "sortable": false,
                "filterable": true,
                "facetable": true
            },
            {
                "name": "locations",
                "type": "Collection(Edm.String)",
                "searchable": true,
                "sortable": false,
                "filterable": true,
                "facetable": true
            },
            {
                "name": "metadata_storage_path",
                "type": "Edm.String",
                "key": true,
                "searchable": true,
                "sortable": false,
                "filterable": false,
                "facetable": false
            },
            {
                "name": "metadata_storage_name",
                "type": "Edm.String",
                "searchable": true,
                "sortable": false,
                "filterable": false,
                "facetable": false
            }
        ]
    }

Krok 4: Vytvoření a spuštění indexeru

Voláním Create Indexer se řídí pipeline. Dosud vytvořené tři komponenty (zdroj dat, sada dovedností, index) jsou vstupy indexeru. Vytvoření indexeru ve službě Azure AI Vyhledávač je událostí, která spustí celý proces.

Buďte připravení na to, že může trvat i několik minut, než se tento krok dokončí. I když je sada dat malá, analytické dovednosti jsou výpočetně náročné.

### Create and run an indexer
POST {{baseUrl}}/indexers?api-version=2026-04-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}

    {
        "name": "cog-search-demo-idxr",
        "description": "",
        "dataSourceName" : "cog-search-demo-ds",
        "targetIndexName" : "cog-search-demo-idx",
        "skillsetName" : "cog-search-demo-ss",
        "fieldMappings" : [
            {
                "sourceFieldName" : "metadata_storage_path",
                "targetFieldName" : "metadata_storage_path",
                "mappingFunction" : { "name" : "base64Encode" }
            },
            {
                "sourceFieldName": "metadata_storage_name",
                "targetFieldName": "metadata_storage_name"
            }
        ],
        "outputFieldMappings" : 
        [
            {
                "sourceFieldName": "/document/merged_text",
                "targetFieldName": "content"
            },
            {
                "sourceFieldName" : "/document/normalized_images/*/text",
                "targetFieldName" : "text"
            },
            {
                "sourceFieldName" : "/document/organizations", 
                "targetFieldName" : "organizations"
            },
            {
                "sourceFieldName": "/document/language",
                "targetFieldName": "language"
            },
            {
                "sourceFieldName" : "/document/persons", 
                "targetFieldName" : "persons"
            },
            {
                "sourceFieldName" : "/document/locations", 
                "targetFieldName" : "locations"
            },
            {
                "sourceFieldName" : "/document/pages/*/keyPhrases/*", 
                "targetFieldName" : "keyPhrases"
            }
        ],
        "parameters":
        {
        "batchSize": 1,
        "maxFailedItems":-1,
        "maxFailedItemsPerBatch":-1,
        "configuration": 
            {
                "dataToExtract": "contentAndMetadata",
                "imageAction": "generateNormalizedImages"
            }
        }
    }

Klíčové body:

  • Tělo požadavku obsahuje odkazy na předchozí objekty, vlastnosti konfigurace vyžadované ke zpracování obrázku a dva typy mapování polí.

  • "fieldMappings" se zpracovávají před sadou dovedností, přičemž obsah je přenesen ze zdroje dat do cílových polí v indexu. Mapování polí slouží k odesílání existujícího nemodifikovaného obsahu do indexu. Pokud jsou názvy polí a typy na obou koncích stejné, nevyžaduje se žádné mapování.

  • "outputFieldMappings" jsou určena pro pole vytvořená dovednostmi po spuštění sady dovedností. Odkazy na sourceFieldName v outputFieldMappings neexistují, dokud je rozčlenění dokumentu nebo obohacení nevytvoří. Jedná se targetFieldName o pole v indexu definovaném ve schématu indexu.

  • Parametr "maxFailedItems" je nastaven na hodnotu -1, což dává modulu indexování pokyn, aby při importu dat ignoroval chyby. To je přijatelné, protože v ukázkovém zdroji dat je tak málo dokumentů. Pro větší zdroje dat by tato hodnota byla větší než 0.

  • Příkaz "dataToExtract":"contentAndMetadata" říká indexeru, aby automaticky extrahoval hodnoty z vlastnosti obsahu blobu a metadata každého objektu.

  • Parametr imageAction říká indexeru, aby extrahovali text z obrázků nalezených ve zdroji dat. Konfigurace "imageAction":"generateNormalizedImages" v kombinaci s dovednostmi OCR Skill and Text Merge Skill říká indexeru, aby extrahoval text z obrázků (například slovo "stop" z znaménka zastavení provozu) a vložil ho jako součást pole obsahu. Toto chování platí pro vložené obrázky (představte si obrázek uvnitř PDF) i samostatné soubory obrázků, například soubor JPG.

Note

Vytvoření indexeru vyvolá zpracovatelský řetězec. Pokud dojde k nějakému problému při komunikaci s daty, při mapování vstupů a výstupů nebo s pořadím operací, zobrazí se v této fázi. Pokud chcete znovu spustit pipeline s pozměněným kódem nebo skriptem, může být nejdříve nutné zahodit objekty. Další informace najdete v článku o resetování a opětovném spuštění.

Monitorování indexování

Indexování a rozšiřování se zahájí, jakmile odešlete žádost o vytvoření indexeru. V závislosti na složitosti sady dovedností a operací může indexování chvíli trvat.

Pokud chcete zjistit, jestli je indexer stále spuštěný, zavolejte Načíst stav indexeru a zkontrolujte stav indexeru.

### Get Indexer Status (wait several minutes for the indexer to complete)
GET {{baseUrl}}/indexers/cog-search-demo-idxr/status?api-version=2026-04-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}

Klíčové body:

  • Upozornění jsou v některých scénářích běžná a ne vždy značí problém. Pokud například kontejner objektů blob obsahuje soubory obrázků a kanál nezpracuje obrázky, zobrazí se upozornění, že se nezpracovaly obrázky.

  • V této ukázce je soubor PNG, který neobsahuje žádný text. Všech pět dovedností založených na textu (rozpoznávání jazyka, rozpoznávání entit umístění, organizací, lidí a extrakce klíčových frází) se v tomto souboru nepodaří provést. Výsledné oznámení se zobrazí v historii provádění.

Kontrola výsledků

Teď, když jste vytvořili index, který obsahuje obsah vygenerovaný pomocí umělé inteligence, zavolejte vyhledávací dokumenty a spusťte některé dotazy, aby se zobrazily výsledky.

### Query the index\
POST {{baseUrl}}/indexes/cog-search-demo-idx/docs/search?api-version=2026-04-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}
  
  {
    "search": "*",
    "select": "metadata_storage_name,language,organizations",
    "count": true
  }

Filtry vám můžou pomoct zúžit výsledky na položky, které vás zajímají:

### Filter by organization
POST {{baseUrl}}/indexes/cog-search-demo-idx/docs/search?api-version=2026-04-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}
  
  {
    "search": "*",
    "filter": "organizations/any(organizations: organizations eq 'Microsoft')",
    "select": "metadata_storage_name,organizations",
    "count": true
  }

Tyto dotazy ilustrují několik způsobů, jak můžete pracovat se syntaxí dotazů a filtry na nových polích vytvořených službou Azure AI Vyhledávač. Další příklady dotazů najdete v tématu Příklady v rozhraní REST API pro vyhledávání dokumentů, příklady jednoduchých syntaxí dotazů a úplné příklady dotazů Lucene.

Resetování a opětovné spuštění

V počátečních fázích vývoje je běžná iterace návrhu. Obnovení a opětovné spuštění pomáhá s iterací.

Takeaways

Tento kurz ukazuje základní kroky pro použití rozhraní REST API k vytvoření kanálu rozšiřování AI: zdroj dat, sada dovedností, index a indexer.

Předdefinované dovednosti byly zavedeny spolu s definicí sady dovedností, která ukazuje mechanismus řetězení dovedností prostřednictvím vstupů a výstupů. Také jste se dozvěděli, že outputFieldMappings v definici indexeru je nezbytné pro směrování obohacených hodnot z pipeline do prohledávatelného indexu ve službě Azure AI Vyhledávač.

Nakonec jste se dozvěděli, jak testovat výsledky a resetovat systém pro další iterace. Zjistili jste, že zasílání dotazů na index vrací výstup vytvořený kanálem rozšířeného indexování.

Vyčistěte zdroje

Když pracujete ve vlastním předplatném, je na konci projektu vhodné odebrat prostředky, které už nepotřebujete. Prostředky ponechané v provozu mohou způsobit výdaje. Prostředky můžete odstranit jednotlivě nebo odstranit skupinu prostředků a odstranit tak celou sadu prostředků.

Prostředky můžete najít a spravovat na webu Azure Portal pomocí odkazu Všechny prostředky nebo skupiny prostředků v levém navigačním podokně.

Další kroky

Teď, když znáte všechny objekty v kanálu rozšiřování AI, se podrobněji podíváme na definice sady dovedností a individuální dovednosti.