Delen via


Handleiding: Vaardigheidsgroepen in Azure AI Search

Meer informatie over het gebruik van de Azure SDK voor .NET om een AI-verrijkingspijplijn te maken voor inhoudextractie en transformaties tijdens het indexeren.

Vaardighedensets voegen AI-verwerking toe aan onbewerkte inhoud, waardoor deze uniformer en doorzoekbaarder wordt. Zodra u weet hoe vaardighedensets werken, kunt u een breed scala aan transformaties ondersteunen, van afbeeldingsanalyse tot verwerking van natuurlijke taal tot aangepaste verwerking die u extern levert.

In deze handleiding leert u:

  • Objecten definiëren in een verrijkingspijplijn.
  • Ontwikkel je vaardigheden. Roep OCR, taaldetectie, entiteitsherkenning en sleuteltermextractie aan.
  • Voer de pijplijn uit. Een zoekindex maken en laden.
  • Controleer de resultaten met behulp van zoeken in volledige tekst.

Overview

Deze zelfstudie maakt gebruik van C# en de clientbibliotheek Azure.Search.Documents om een gegevensbron, index, indexeerfunctie en vaardighedenset te maken.

De indexeerfunctie stuurt elke stap in de pijplijn aan, te beginnen met het ophalen van inhoud van voorbeeldgegevens (ongestructureerde tekst en afbeeldingen) in een blobcontainer in Azure Storage.

Zodra inhoud is geëxtraheerd, voert de vaardighedenset ingebouwde vaardigheden van Microsoft uit om informatie te vinden en te extraheren. Deze vaardigheden omvatten Optical Character Recognition (OCR) voor afbeeldingen, taaldetectie op tekst, sleuteltermextractie en entiteitsherkenning (organisaties). Nieuwe informatie die door het vaardighedenpakket is gegenereerd, wordt verzonden naar velden in een index. Zodra de index is ingevuld, kunt u de velden in query's, facetten en filters gebruiken.

Prerequisites

Note

U kunt een gratis zoekservice gebruiken voor deze zelfstudie. De gratis laag beperkt u tot drie indexen, drie indexeerfuncties en drie gegevensbronnen. In deze zelfstudie wordt er één exemplaar van elk gemaakt. Voordat u begint, moet u ervoor zorgen dat u ruimte hebt voor uw service om de nieuwe resources te accepteren.

Bestanden downloaden

Voorbeeldgegevens uploaden naar Azure Storage

  1. Maak in Azure Storage een nieuwe container en geef deze een naam voor gemengde inhoudstypen.

  2. Upload de voorbeeldgegevensbestanden.

  3. Verkrijg een opslagverbindingreeks om een verbinding te maken in Azure AI Search.

    1. Selecteer aan de linkerkant Toegangssleutels.

    2. Kopieer de verbindingsreeks voor sleutel één of twee. De verbindingsreeks is vergelijkbaar met het volgende voorbeeld:

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

Gieterei Gereedschappen

Ingebouwde AI-verrijking wordt ondersteund door Foundry Tools, waaronder Azure Language en Azure Vision voor natuurlijke taal en beeldverwerking. Voor kleine workloads, zoals deze handleiding, kunt u een gratis toewijzing van 20 transacties per indexer gebruiken. Voor grotere workloads koppelt u een Microsoft Foundry-resource aan een vaardighedenset voor het Standard-tarief.

Een URL en API-sleutel van een zoekservice kopiëren

Voor deze zelfstudie is voor verbindingen met Azure AI Search een eindpunt en een API-sleutel vereist. U kunt deze waarden ophalen uit Azure Portal.

  1. Meld u aan bij Azure Portal en selecteer uw zoekservice.

  2. Selecteer in het linkerdeelvenster Overzicht en kopieer het eindpunt. Deze moet de volgende indeling hebben: https://my-service.search.windows.net

  3. Selecteer inhet linkerdeelvenster> en kopieer een beheerderssleutel voor volledige rechten op de service. Er zijn twee uitwisselbare beheersleutels, bedoeld voor bedrijfscontinuïteit voor het geval u er een moet vervangen. U kunt één van beide sleutels gebruiken om objecten toe te voegen, wijzigen of verwijderen.

Uw omgeving instellen

Begin met het openen van Visual Studio en het maken van een nieuw console-app-project.

Azure.Search.Documents installeren

De Azure AI Search .NET SDK bestaat uit een clientbibliotheek waarmee u uw indexen, gegevensbronnen, indexeerfuncties en vaardighedensets kunt beheren, en documenten kunt uploaden en beheren en query's kunt uitvoeren, allemaal zonder dat u te maken hebt met de details van HTTP en JSON. Deze clientbibliotheek wordt gedistribueerd als een NuGet-pakket.

Voor dit project installeert u versie 11 of hoger van het Azure.Search.Documents en de meest recente versie van Microsoft.Extensions.Configuration.

  1. Selecteer in Visual Studio achtereenvolgens Hulpprogramma's>NuGet-pakketbeheer>NuGet-pakketten beheren voor de oplossing ....

  2. Blader naar Azure.Search.Document.

  3. Selecteer de nieuwste versie en selecteer Vervolgens Installeren.

  4. Herhaal de vorige stappen voor het installeren van Microsoft.Extensions.Configuration en Microsoft.Extensions.Configuration.Json.

Verbindingsgegevens van de service toevoegen

  1. Klik met de rechtermuisknop op jouw project in Solution Explorer en selecteer Toevoegen>Nieuw item....

  2. Geef het bestand de naam appsettings.json en selecteer Toevoegen.

  3. Neem dit bestand op in de uitvoermap.

    1. Klik met de rechtermuisknop op appsettings.json en selecteer Eigenschappen.
    2. Wijzig de waarde van Naar uitvoermap kopiëren in Kopiëren indien nieuwer.
  4. Kopieer de onderstaande JSON in uw nieuwe JSON-bestand.

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

Voeg de gegevens van uw zoekservice en blob-opslagaccount toe. U kunt deze informatie ophalen via de stappen voor het inrichten van de service, zoals aangegeven in de vorige sectie.

Voer voor SearchServiceUri de volledige URL in.

Naamruimten toevoegen

Voeg in Program.cs de volgende naamruimten toe.

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

Client maken

Maak een instantie van een SearchIndexClient en een SearchIndexerClient onder 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

De clients maken verbinding met uw zoekservice. Als u wilt voorkomen dat er te veel verbindingen worden geopend, kunt u proberen één exemplaar in uw toepassing te delen, indien mogelijk. De methoden zijn thread-safe om dergelijk delen mogelijk te maken.

Een functie toevoegen om het programma af te sluiten tijdens een fout

Deze zelfstudie is bedoeld om u inzicht te geven in elke stap van de indexeringspijplijn. Als er een kritiek probleem is dat voorkomt dat het programma de gegevensbron, vaardighedenset, index of indexeerfunctie maakt, voert het programma het foutbericht uit en sluit het af, zodat het probleem kan worden begrepen en opgelost.

Voeg ExitProgram toe aan Main voor het afhandelen van scenario's waarvoor het programma moet worden afgesloten.

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

De pijplijn maken

In Azure AI Search vindt AI-verwerking plaats tijdens het indexeren (of gegevensopname). In dit deel van het scenario worden vier objecten gemaakt: gegevensbron, indexdefinitie, vaardighedenset, indexeerfunctie.

Stap 1: een gegevensbron maken

SearchIndexerClient heeft een eigenschap DataSourceName die u kunt instellen op een SearchIndexerDataSourceConnection-object. Dit object biedt alle methoden die u nodig hebt om Azure AI Search-gegevensbronnen te maken, weer te geven, bij te werken of te verwijderen.

Maak een nieuw SearchIndexerDataSourceConnection-exemplaar door indexerClient.CreateOrUpdateDataSourceConnection(dataSource) aan te roepen. Met de volgende code wordt een gegevensbron gemaakt van het type 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;
}

Voor een geslaagde aanvraag retourneert de methode de gegevensbron die is gemaakt. Als er een probleem is met de aanvraag, zoals een ongeldige parameter, genereert de methode een uitzondering.

Voeg nu een regel toe aan Main om de CreateOrUpdateDataSource-functie aan te roepen die u zojuist hebt toegevoegd.

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

Bouw de oplossing en voer deze uit. Omdat dit uw eerste aanvraag is, controleert u de Azure-portal om te bevestigen dat de gegevensbron is gemaakt in Azure AI Search. Controleer op de overzichtspagina van de zoekservice of de lijst Gegevensbronnen een nieuw item heeft. Mogelijk moet u enkele minuten wachten totdat de Azure Portal-pagina is vernieuwd.

Tegel Gegevensbronnen in de Azure-portal

Stap 2: een vaardighedenset maken

In deze stap definieert u een reeks verrijkingsstappen die u op uw gegevens wilt toepassen. Elke verrijkingsstap wordt een vaardigheid genoemd en de reeks verrijkingsstappen heet een vaardighedenset. In deze zelfstudie worden ingebouwde vaardigheden gebruikt voor de vaardighedenset:

  • Optical Character Recognition, voor het herkennen van gedrukte en handgeschreven tekst in afbeeldingsbestanden.

  • Tekstfusie om tekst van een verzameling velden samen te voegen in één veld 'samengevoegde inhoud'.

  • Taaldetectie om de taal van de inhoud vast te stellen.

  • Herkenning van entiteiten voor het extraheren van de namen van organisaties uit inhoud van de blobcontainer.

  • Tekst splitsen om grote inhoud in kleinere stukken op te delen voordat u de vaardigheid voor sleuteltermextractie en die voor entiteitsherkenning aanroept. Sleuteltermextractie en entiteitsherkenning accepteren een invoer van 50.000 tekens of minder. Enkele voorbeeldbestanden moeten worden opgesplitst om aan deze limiet te voldoen.

  • Sleuteltermextractie voor het ophalen van de belangrijkste sleuteltermen.

Tijdens de initiële verwerking analyseert Azure AI Search elk document om inhoud uit verschillende bestandsformaten te extraheren. Tekst uit het bronbestand wordt in een gegenereerd veld content geplaatst, één voor elk document. Stel de invoer als "/document/content" in om deze tekst te gebruiken. Afbeeldingsinhoud is in een gegenereerd veld normalized_images geplaatst, opgegeven in een vaardighedenset als /document/normalized_images/*.

Uitkomsten kunnen aan een index worden toegewezen, als invoer worden gebruikt voor een downstream-vaardigheid, of beide, zoals bij de taalcode. Een taalcode is in de index handig om te filteren. Taalcode wordt als invoer door vaardigheden voor tekstanalyse gebruikt om de taalregels voor woordafbreking in te stellen.

Zie How to define a skillset (Een set vaardigheden definiëren) voor meer informatie over de grondbeginselen van vaardigheden.

Vaardigheid OCR

Hiermee OcrSkill wordt tekst uit afbeeldingen geëxtraheerd. Bij deze vaardigheid wordt ervan uitgegaan dat er een veld normalized_images bestaat. Om dit veld te genereren, stellen we verderop in de zelfstudie de "imageAction" configuratie in de definitie van de indexeerfunctie in op "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;
}

Vaardigheden combineren

In deze sectie maakt u een MergeSkill veld dat het veld voor documentinhoud samenvoegt met de tekst die is geproduceerd door de OCR-vaardigheid.

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;
}

Taaldetectievaardigheid

Hiermee LanguageDetectionSkill wordt de taal van de invoertekst gedetecteerd en wordt één taalcode gerapporteerd voor elk document dat op de aanvraag is ingediend. We gebruiken de uitvoer van de vaardigheid Taaldetectie als onderdeel van de invoer voor de vaardigheid Tekst splitsen .

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;
}

Tekstsplitsvaardigheid

De onderstaande SplitSkill splitst tekst op pagina's en beperkt de paginalengte tot 4000 tekens, zoals gemeten door String.Length. Het algoritme probeert de tekst te splitsen in segmenten die maximaal maximumPageLength in grootte zijn. In dit geval doet het algoritme het beste om de zin op een zinsgrens te verbreken, zodat de grootte van het segment iets minder kan zijn dan 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;
}

Vaardigheid Entiteitsherkenning

Dit EntityRecognitionSkill-exemplaar is ingesteld om categorietype organization te herkennen. De EntityRecognitionSkill kan ook categorietypen person herkennen en location.

U ziet dat het 'contextveld' is ingesteld op "/document/pages/*" met een asterisk, wat betekent dat de verrijkingsstap wordt aangeroepen voor elke pagina onder "/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;
}

Sleutelwoordextractievaardigheid

Net als het EntityRecognitionSkill exemplaar dat zojuist is gemaakt, wordt de KeyPhraseExtractionSkill aangeroepen voor elke pagina van het document.

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;
}

De vaardigheden opbouwen en ontwikkelen

Bouw de SearchIndexerSkillset met behulp van de vaardigheden die u hebt gemaakt.

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;
}

Voeg de volgende regels toe aan 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);

Stap 3: Een index maken

In dit gedeelte kunt u het indexschema definiëren door op te geven welke velden in de doorzoekbare index moeten worden opgenomen en de zoekkenmerken voor elk veld op te geven. Velden hebben een type en kunnen kenmerken opnemen die bepalen hoe het veld wordt gebruikt (doorzoekbaar, sorteerbaar enzovoort). Veldnamen in een index hoeven niet identiek te zijn aan de veldnamen in de bron. In een latere stap voegt u veldtoewijzingen in een indexer toe om bron-doelvelden te verbinden. Definieer voor deze stap de index met behulp van veldnaamconventies die relevant zijn voor uw zoektoepassing.

In deze oefening worden de volgende velden en veldtypen gebruikt:

Veldnamen Veldtypen
id Edm.String
content Edm.String
languageCode Edm.String
keyPhrases Lijst<Edm.String>
organizations Lijst<Edm.String>

Klasse DemoIndex maken

De velden voor deze index worden gedefinieerd met behulp van een modelklasse. Elke eigenschap van de modelklasse heeft kenmerken die het zoekgedrag van het bijbehorende indexveld bepalen.

De modelklasse wordt toegevoegd aan een nieuw C#-bestand. Selecteer met de rechtermuisknop op uw project en selecteer >, selecteer 'Klasse' en geef het bestand een naam en selecteer DemoIndex.cs

Geef aan dat u typen wilt gebruiken van de naamruimten Azure.Search.Documents.Indexes en System.Text.Json.Serialization.

Voeg de onderstaande modelklassedefinitie toe aan DemoIndex.cs en neem deze op in dezelfde naamruimte waarin u de index maakt.

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; }
    }
}

Nu u een modelklasse hebt gedefinieerd, kunt u in Program.cs vrij eenvoudig een indexdefinitie maken. De naam voor deze index wordt demoindex. Als er al een index met die naam bestaat, wordt deze verwijderd.

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;
}

Tijdens het testen is het mogelijk dat u de index meer dan één keer probeert te maken. Controleer daarom of de index die u gaat maken al bestaat voordat u deze wilt maken.

Voeg de volgende regels toe aan Main.

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

Voeg de volgende 'using' regel toe om de onduidelijke verwijzing op te lossen.

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

Zie Index maken (REST API) voor meer informatie over indexconcepten.

Stap 4: Een indexeerfunctie maken en uitvoeren

Tot nu toe hebt u een gegevensbron, een set vaardigheden en een index gemaakt. Deze drie onderdelen gaan deel uitmaken van een indexeerfunctie die de onderdelen combineert in één meervoudige bewerking. Als u deze in een indexeerfunctie wilt combineren, moet u veldtoewijzingen definiëren.

  • De fieldMappings worden vóór de vaardighedenset verwerkt, waarbij bronvelden van de gegevensbron worden toegewezen aan de doelvelden in een index. Als veldnamen en -typen gelijk zijn aan beide kanten, is mapping niet vereist.

  • De outputFieldMappings worden verwerkt na de vaardighedenset en verwijzen naar sourceFieldNames die niet bestaan totdat het document wordt gekraakt of verrijkt. De targetFieldName is een veld in een index.

Naast het koppelen van invoer aan uitvoer kunt u ook veldtoewijzingen gebruiken om gegevensstructuren te vereenvoudigen. Zie Verrijkte velden toewijzen aan een doorzoekbare index voor meer informatie.

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;
}

Voeg de volgende regels toe aan 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);

Verwacht dat het verwerken door de indexeerfunctie enige tijd zal duren. De gegevensset is klein, maar analytische vaardigheden zijn berekeningsintensief. Sommige vaardigheden, zoals afbeeldingsanalyse, zijn langlopend.

Tip

Het maken van een indexeerfunctie roept de pijplijn aan. Als er problemen zijn met het bereiken van de gegevens, het koppelen van invoer en uitvoer, of de volgorde van bewerkingen, komen ze naar voren in deze fase.

Onderzoek het maken van de indexeerder

De code wordt ingesteld "maxFailedItems" op -1, waarmee de indexeringsengine fouten tijdens het importeren van gegevens negeert. Dit is nuttig omdat de demo-gegevensbron maar een paar documenten bevat. Voor een grotere gegevensbron zou u de waarde op groter dan 0 instellen.

U ziet ook dat de "dataToExtract" is ingesteld op "contentAndMetadata". Deze instructie geeft de indexeerfunctie de opdracht om automatisch de inhoud van verschillende bestandsindelingen te extraheren, evenals metagegevens voor elk bestand.

Wanneer inhoud wordt uitgepakt, kunt u instellen dat imageAction tekst ophaalt uit afbeeldingen die in de gegevensbron worden gevonden. Met de configuratie waarbij "imageAction" is ingesteld op "generateNormalizedImages", in combinatie met de vaardigheid OCR en de vaardigheid Tekst samenvoegen, krijgt de indexeerfunctie de opdracht om tekst uit de afbeeldingen te extraheren (bijvoorbeeld het woord 'stop' van een Stop-verkeersbord) en deze in te sluiten als onderdeel van het inhoudsveld. Dit gedrag is van toepassing op zowel de afbeeldingen die zijn ingesloten in de documenten (zoals een afbeelding in een pdf-bestand) als afbeeldingen die zijn gevonden in de gegevensbron, zoals een JPG-bestand.

Indexering controleren

Nadat de indexeerfunctie is gedefinieerd, wordt deze automatisch uitgevoerd wanneer u de aanvraag verzendt. Afhankelijk van de vaardigheden die u hebt gedefinieerd, kan het indexeren langer duren dan verwacht. Als u wilt weten of de indexeerfunctie nog steeds wordt uitgevoerd, gebruikt u de methode 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);
    }
}

Met demoIndexerExecutionInfo wordt de huidige status en de uitvoeringsgeschiedenis van een indexeerfunctie aangegeven.

Waarschuwingen zijn gebruikelijk bij een aantal combinaties van bronbestanden en vaardigheden en geven niet altijd een probleem aan. In deze zelfstudie zijn de waarschuwingen onschadelijk (bijvoorbeeld geen tekstinvoer uit de JPEG-bestanden).

Voeg de volgende regels toe aan Main.

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

In azure AI Search-zelfstudieconsole-apps voegen we doorgaans een vertraging van 2 seconden toe voordat query's worden uitgevoerd die resultaten retourneren, maar omdat verrijking enkele minuten duurt, sluiten we de console-app en gebruiken we in plaats daarvan een andere benadering.

De eenvoudigste optie is Search Explorer in Azure Portal. U kunt eerst een lege query uitvoeren waarmee alle documenten worden geretourneerd, of een gerichte zoekopdracht uitvoeren waarmee nieuwe veldinhoud wordt geretourneerd die is gemaakt via de pijplijn.

  1. In het Azure-portaal, op de pagina's van de zoekservice, vouw Zoekbeheer>Indexen uit.

  2. Zoek demoindex in de lijst. Het resultaat moet 14 documenten bevatten. Als het aantal documenten nul is, is de Indexeerfunctie nog actief of is de pagina nog niet vernieuwd.

  3. Selecteer demoindex. Search Explorer is het eerste tabblad.

  4. Inhoud is doorzoekbaar zodra het eerste document is geladen. Als u wilt controleren of inhoud bestaat, voert u een niet-opgegeven query uit door te klikken op Zoeken. Met deze query worden alle momenteel geïndexeerde documenten geretourneerd, waardoor u een idee krijgt van wat de index bevat.

  5. Voor meer beheerbare resultaten schakelt u over naar de JSON-weergave en stelt u parameters in om de velden te selecteren:

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

Opnieuw instellen en uitvoeren

In de vroege experimentele ontwikkelingsfasen is de meest praktische benadering voor het ontwerpen van iteratie het verwijderen van de objecten uit Azure AI Search en het mogelijk maken van uw code om ze opnieuw te bouwen. Resourcenamen zijn uniek. Na het verwijderen van een object kunt u het opnieuw maken met dezelfde naam.

In de voorbeeldcode voor deze zelfstudie wordt gecontroleerd op bestaande objecten. Deze worden verwijderd, zodat u de code opnieuw kunt uitvoeren. U kunt azure Portal ook gebruiken om indexen, indexeerfuncties, gegevensbronnen en vaardighedensets te verwijderen.

Takeaways

In deze zelfstudie zijn de basisstappen voor het bouwen van een pijplijn voor verrijkte indexering gedemonstreerd via het maken van onderdelen: een gegevensbron, een vaardighedenset, een index en een indexeerfunctie.

Ingebouwde vaardigheden zijn geïntroduceerd, samen met de definitie van de vaardighedenset en het mechanisme voor het koppelen van vaardigheden via in- en uitvoer. U hebt ook geleerd dat outputFieldMappings in de definitie van de indexeerfunctie is vereist voor het routeren van verrijkte waarden uit de pijplijn naar een doorzoekbare index op een Azure AI-Search-service.

Tot slot hebt u geleerd hoe u resultaten kunt testen en het systeem opnieuw kunt instellen voor verdere iteraties. U hebt geleerd dat het uitvoeren van query's op de index de uitvoer retourneert die is gemaakt door de pijplijn voor verrijkte indexering. U hebt ook geleerd hoe u de status van de indexeerfunctie kunt controleren en welke objecten u moet verwijderen voordat u een pijplijn opnieuw uitvoert.

De hulpbronnen opschonen

Wanneer je in je eigen abonnement werkt, is het aan het einde van een project een goed idee om de resources die je niet meer nodig hebt te verwijderen. Ressources die actief blijven draaien, kunnen geld kosten. U kunt resources afzonderlijk verwijderen, maar u kunt ook de resourcegroep verwijderen als u de volledige resourceset wilt verwijderen.

U kunt resources vinden en beheren in de Azure-portal met behulp van de koppeling Alle resources, of resourcegroepen in het linkerpaneel.

Volgende stappen

Nu u bekend bent met alle objecten in een AI-verrijkingspijplijn, laten we eens nader kijken naar vaardigheidsetdefinities en individuele vaardigheden.

Meer informatie over het aanroepen van REST API's die een AI-verrijkingspijplijn maken voor inhoudextractie en transformaties tijdens het indexeren.

Vaardighedensets voegen AI-verwerking toe aan onbewerkte inhoud, waardoor deze uniformer en doorzoekbaarder wordt. Zodra u weet hoe vaardighedensets werken, kunt u een breed scala aan transformaties ondersteunen, van afbeeldingsanalyse tot verwerking van natuurlijke taal tot aangepaste verwerking die u extern levert.

In deze handleiding leert u:

  • Objecten definiëren in een verrijkingspijplijn.
  • Ontwikkel je vaardigheden. Roep OCR, taaldetectie, entiteitsherkenning en sleuteltermextractie aan.
  • Voer de pijplijn uit. Een zoekindex maken en laden.
  • Controleer de resultaten met behulp van zoeken in volledige tekst.

Overview

In deze zelfstudie worden een REST-client en de REST API's van Azure AI Search gebruikt om een gegevensbron, index, indexeerfunctie en vaardighedenset te maken.

De indexeerfunctie stuurt elke stap in de pijplijn aan, te beginnen met het ophalen van inhoud van voorbeeldgegevens (ongestructureerde tekst en afbeeldingen) in een blobcontainer in Azure Storage.

Zodra inhoud is geëxtraheerd, voert de vaardighedenset ingebouwde vaardigheden van Microsoft uit om informatie te vinden en te extraheren. Deze vaardigheden omvatten Optical Character Recognition (OCR) voor afbeeldingen, taaldetectie op tekst, sleuteltermextractie en entiteitsherkenning (organisaties). Nieuwe informatie die door het vaardighedenpakket is gegenereerd, wordt verzonden naar velden in een index. Zodra de index is ingevuld, kunt u de velden in query's, facetten en filters gebruiken.

Prerequisites

Note

U kunt een gratis zoekservice gebruiken voor deze zelfstudie. De gratis laag beperkt u tot drie indexen, drie indexeerfuncties en drie gegevensbronnen. In deze zelfstudie wordt er één exemplaar van elk gemaakt. Voordat u begint, moet u ervoor zorgen dat u ruimte hebt voor uw service om de nieuwe resources te accepteren.

Bestanden downloaden

Download een zip-bestand van de opslagplaats met voorbeeldgegevens en pak de inhoud uit. Meer informatie.

Voorbeeldgegevens uploaden naar Azure Storage

  1. Maak in Azure Storage een nieuwe container en geef deze de naam cog-search-demo.

  2. Upload de voorbeeldgegevensbestanden.

  3. Verkrijg een opslagverbindingreeks om een verbinding te maken in Azure AI Search.

    1. Selecteer aan de linkerkant Toegangssleutels.

    2. Kopieer de verbindingsreeks voor sleutel één of twee. De verbindingsreeks is vergelijkbaar met het volgende voorbeeld:

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

Gieterei Gereedschappen

Ingebouwde AI-verrijking wordt ondersteund door Foundry Tools, waaronder Azure Language en Azure Vision voor natuurlijke taal en beeldverwerking. Voor kleine workloads zoals deze zelfstudie kunt u de gratis toewijzing van twintig transacties per indexeerfunctie gebruiken. Voor grotere workloads koppelt u een Microsoft Foundry-resource aan een vaardighedenset voor het Standard-tarief.

Een URL en API-sleutel van een zoekservice kopiëren

Voor deze zelfstudie is voor verbindingen met Azure AI Search een eindpunt en een API-sleutel vereist. U kunt deze waarden ophalen uit Azure Portal.

  1. Meld u aan bij Azure Portal en selecteer uw zoekservice.

  2. Selecteer in het linkerdeelvenster Overzicht en kopieer het eindpunt. Deze moet de volgende indeling hebben: https://my-service.search.windows.net

  3. Selecteer inhet linkerdeelvenster> en kopieer een beheerderssleutel voor volledige rechten op de service. Er zijn twee uitwisselbare beheersleutels, bedoeld voor bedrijfscontinuïteit voor het geval u er een moet vervangen. U kunt één van beide sleutels gebruiken om objecten toe te voegen, wijzigen of verwijderen.

    Schermopname van de URL- en API-sleutels in Azure Portal.

Uw REST-bestand instellen

  1. Start Visual Studio Code en open het bestand skillset-tutorial.rest . Zie Quickstart: Zoeken in volledige tekst als u hulp nodig hebt bij de REST-client.

  2. Geef waarden op voor de variabelen: zoekservice-eindpunt, api-sleutel voor zoekservicebeheerder, een indexnaam, een verbindingsreeks voor uw Azure Storage-account en de naam van de blobcontainer.

De pijplijn maken

AI-verrijking is gebaseerd op indexeerfuncties. In dit deel van het scenario worden vier objecten gemaakt: gegevensbron, indexdefinitie, vaardighedenset, indexeerfunctie.

Stap 1: een gegevensbron maken

Roep Create Data Source aan om de verbindingsreeks voor de blobcontainer met de voorbeeldgegevensbestanden in te stellen.

### Create a data source
POST {{baseUrl}}/datasources?api-version=2025-09-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
    }

Stap 2: een vaardighedenset maken

Roep Maak een vaardighedenpakket aan om de verrijkingsstappen te specificeren die op uw inhoud worden toegepast. Vaardigheden worden parallel uitgevoerd, tenzij er een afhankelijkheid is.

### Create a skillset
POST {{baseUrl}}/skillsets?api-version=2025-09-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"
                }
            ]
            }
        ]
    }

Belangrijkste punten:

  • De hoofdtekst van de aanvraag geeft de volgende ingebouwde vaardigheden op:

    Skill Description
    Optische tekenherkenning Herkent tekst en getallen in afbeeldingsbestanden.
    Tekst samenvoegen Hiermee maakt u 'samengevoegde inhoud' die eerder gescheiden inhoud opnieuw samenvoegt, handig voor documenten met ingesloten afbeeldingen (PDF, DOCX, enzovoort). Afbeeldingen en tekst worden gescheiden tijdens de fase van het kraken van documenten. Met de samenvoegvaardigheid worden ze opnieuw samengevoegd door herkende tekst, bijschriften van afbeeldingen of tags in te voegen die tijdens de verrijking zijn gemaakt op dezelfde locatie waar de afbeelding uit het document is geëxtraheerd.

    Wanneer u met samengevoegde inhoud in een vaardighedenset werkt, bevat dit knooppunt alle tekst in het document, inclusief alleen-tekstdocumenten die nooit OCR- of afbeeldingsanalyse ondergaan.
    Taaldetectie Detecteert de taal en voert een taalnaam of code uit. In meertalige gegevenssets kan een taalveld handig zijn voor filters.
    Entiteitsherkenning Extraheert de namen van personen, organisaties en locaties uit samengevoegde inhoud.
    Tekst splitsen Hiermee wordt grote samengevoegde inhoud opgesplitst in kleinere segmenten voordat u de vaardigheid voor sleuteltermextractie aanroept. Sleuteltermextractie accepteert invoeren van 50.000 tekens of minder. Enkele voorbeeldbestanden moeten worden opgesplitst om aan deze limiet te voldoen.
    Sleutelfrase-extractie Belangrijke kernzinnen worden eruit gehaald.
  • Elke vaardigheid wordt uitgevoerd voor de inhoud van het document. Tijdens de verwerking scheurt Azure AI Search elk document om inhoud uit verschillende bestandsindelingen te lezen. Gevonden tekst uit het bronbestand wordt in een gegenereerd content-veld geplaatst, één voor elk document. Als zodanig wordt de invoer "/document/content".

  • Voor het extraheren van sleuteltermen is de context voor de vaardigheid sleuteltermextractie "document/pages/*" (voor elke pagina in het document) in plaats van "/document/content", omdat de vaardigheid Tekst splitsen wordt gebruikt om grotere bestanden in pagina's op te splitsen.

Note

Uitkomsten kunnen aan een index worden toegewezen, als invoer worden gebruikt voor een downstream-vaardigheid, of beide, zoals bij de taalcode. Een taalcode is in de index handig om te filteren. Zie How to define a skillset (Een set vaardigheden definiëren) voor meer informatie over de grondbeginselen van vaardigheden.

Stap 3: Een index maken

Roep Index maken aan om het schema op te geven dat wordt gebruikt voor het maken van omgekeerde indexen en andere constructies in Azure AI Search.

Het grootste onderdeel van een index is de verzameling velden, waarbij gegevenstype en kenmerken inhoud en gedrag bepalen in Azure AI Search. Zorg ervoor dat u velden hebt voor de zojuist gegenereerde uitvoer.

### Create an index
POST {{baseUrl}}/indexes?api-version=2025-09-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
            }
        ]
    }

Stap 4: Een indexeerfunctie maken en uitvoeren

Roep de functie Maak Indexeerder aan om de pijplijn aan te sturen. De drie onderdelen die u tot nu toe hebt gemaakt (gegevensbron, vaardighedenset, index) zijn invoer naar een indexeerfunctie. Het maken van de indexeerfunctie in Azure AI Search is de gebeurtenis waarmee de hele pijplijn in beweging wordt gebracht.

Deze stap kan enkele minuten in beslag nemen. De gegevensset is klein, maar analytische vaardigheden zijn berekeningsintensief.

### Create and run an indexer
POST {{baseUrl}}/indexers?api-version=2025-09-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"
            }
        }
    }

Belangrijkste punten:

  • De hoofdtekst van de aanvraag bevat verwijzingen naar de vorige objecten, configuratie-eigenschappen die vereist zijn voor de verwerking van afbeeldingen en twee typen veldtoewijzingen.

  • "fieldMappings" worden verwerkt vóór de vaardighedenset, waarbij inhoud van de gegevensbron naar doelvelden in een index wordt verzonden. U gebruikt veldtoewijzingen om bestaande, ongewijzigde inhoud naar de index te verzenden. Als veldnamen en -typen gelijk zijn aan beide kanten, is mapping niet vereist.

  • "outputFieldMappings" zijn voor velden die zijn gemaakt door vaardigheden, na uitvoering van de vaardighedenset. De verwijzingen naar sourceFieldName in outputFieldMappings worden pas gecreëerd door het document te analyseren of te verrijken. targetFieldName is een veld in een index dat in het indexschema is gedefinieerd.

  • De "maxFailedItems" parameter is ingesteld op -1, waarmee de indexeringsengine fouten tijdens het importeren van gegevens negeert. Dit is acceptabel omdat de demo-gegevensbron maar een paar documenten bevat. Voor een grotere gegevensbron zou u de waarde op groter dan 0 instellen.

  • De "dataToExtract":"contentAndMetadata" instructie vertelt de indexeerfunctie dat de waarden automatisch moeten worden geëxtraheerd uit de inhoudseigenschap van de blob en de metagegevens van elk object.

  • De imageAction parameter vertelt de indexeerfunctie om tekst te extraheren uit afbeeldingen die in de gegevensbron zijn gevonden. De configuratie van "imageAction":"generateNormalizedImages", OCR Skill en Text Merge Skill geeft de indexeerfunctie de opdracht om tekst uit de afbeeldingen te extraheren (bijvoorbeeld het woord 'stop' van een Stop-verkeersbord) en deze in te sluiten als onderdeel van het inhoudsveld. Dit gedrag is van toepassing op zowel ingesloten afbeeldingen (denk aan een afbeelding in een PDF) als zelfstandige afbeeldingsbestanden, bijvoorbeeld een JPG-bestand.

Note

Het maken van een indexeerfunctie roept de pijplijn aan. Als er problemen zijn met het bereiken van de gegevens, het koppelen van invoer en uitvoer, of de volgorde van bewerkingen, komen ze naar voren in deze fase. Mogelijk moet u eerst objecten verwijderen om de pijplijn opnieuw uit te voeren met code- of scriptwijzigingen. Zie Reset and re-run (Opnieuw instellen en uitvoeren) voor meer informatie.

Indexering controleren

Het indexeren en verrijken begint zodra u de aanvraag Indexeerfunctie maken hebt verzonden. Afhankelijk van de complexiteit en bewerkingen van vaardigheden kan het indexeren enige tijd duren.

Om te ontdekken of de indexeerfunctie nog steeds actief is, roept u Get Indexer Status aan om de status van de indexeerfunctie te controleren.

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

Belangrijkste punten:

  • Waarschuwingen zijn gebruikelijk in sommige scenario's en geven niet altijd een probleem aan. Als een blobcontainer bijvoorbeeld afbeeldingsbestanden bevat en de pijplijn geen afbeeldingen verwerkt, krijgt u een waarschuwing dat afbeeldingen niet zijn verwerkt.

  • In dit voorbeeld is er een PNG-bestand dat geen tekst bevat. Alle vijf de op tekst gebaseerde vaardigheden (taaldetectie, entiteitsherkenning van locaties, organisaties, personen en sleuteltermextractie) kunnen niet worden uitgevoerd op dit bestand. De resulterende melding wordt weergegeven in de uitvoeringsgeschiedenis.

Resultaten controleren

Nu u een index hebt gemaakt die door AI gegenereerde inhoud bevat, roept u Zoekdocumenten aan om enkele query's uit te voeren om de resultaten te bekijken.

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

Filters kunnen u helpen de resultaten te beperken tot interessante items:

### Filter by organization
POST {{baseUrl}}/indexes/cog-search-demo-idx/docs/search?api-version=2025-09-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
  }

Deze query's illustreren een aantal manieren waarop u met querysyntaxis en filters kunt werken voor nieuwe velden die zijn gemaakt door Azure AI Search. Voor meer voorbeelden van query's, zie Voorbeelden in de Search Documents REST API, Voorbeelden van query's met eenvoudige syntaxis, en Voorbeelden van volledige Lucene-query's.

Opnieuw instellen en uitvoeren

Tijdens een vroeg stadium van ontwikkeling is iteratie over het ontwerp gebruikelijk. Opnieuw instellen en opnieuw uitvoeren helpt bij iteratie.

Takeaways

In deze zelfstudie ziet u de basisstappen voor het gebruik van de REST API's voor het maken van een AI-verrijkingspijplijn: een gegevensbron, vaardighedenset, index en indexeerfunctie.

Ingebouwde vaardigheden zijn geïntroduceerd, samen met de definitie van de vaardighedenset die de mechanica laat zien van het koppelen van vaardigheden via invoer en uitvoer. U hebt ook geleerd dat outputFieldMappings in de definitie van de indexeerfunctie is vereist voor het routeren van verrijkte waarden uit de pijplijn naar een doorzoekbare index op een Azure AI-Search-service.

Tot slot hebt u geleerd hoe u resultaten kunt testen en het systeem opnieuw kunt instellen voor verdere iteraties. U hebt geleerd dat het uitvoeren van query's op de index de uitvoer retourneert die is gemaakt door de pijplijn voor verrijkte indexering.

De hulpbronnen opschonen

Wanneer je in je eigen abonnement werkt, is het aan het einde van een project een goed idee om de resources die je niet meer nodig hebt te verwijderen. Ressources die actief blijven draaien, kunnen geld kosten. U kunt resources afzonderlijk verwijderen, maar u kunt ook de resourcegroep verwijderen als u de volledige resourceset wilt verwijderen.

U kunt resources vinden en beheren in de Azure-portal met behulp van de koppeling Alle resources, of resourcegroepen in het linkerpaneel.

Volgende stappen

Nu u bekend bent met alle objecten in een AI-verrijkingspijplijn, gaat u dieper in op definities van vaardighedensets en afzonderlijke vaardigheden.