Concepten voor vaardighedensets in Azure Cognitive Search

Dit artikel is bedoeld voor ontwikkelaars die meer inzicht nodig hebben in de concepten en samenstelling van vaardighedensets en die vertrouwd zijn met de concepten en werkstromen van AI-verrijkingop hoog niveau.

Een vaardighedenset is een herbruikbare resource in Azure Cognitive Search die is gekoppeld aan een indexer. Het bevat een of meer vaardigheden. Dit zijn atomische bewerkingen die ingebouwde AI of externe aangepaste verwerking aanroepen voor documenten die zijn opgehaald uit een externe gegevensbron.

Lees en schrijf naar een verrijkt document vanaf het begin van de verwerking van vaardighedensets tot de conclusie. Een verrijkt document is in eerste instantie alleen de onbewerkte inhoud die is geëxtraheerd uit een gegevensbron, maar bij elke vaardigheidsuitvoering krijgt het structuur en de structuur. Uiteindelijk worden knooppunten uit een verrijkt document vervolgens aan velden in een zoekindex, of aan projecties in een kennisopslag, zodat de inhoud op de juiste wijze kan worden gerouteerd, waar deze wordt opgevraagd of gebruikt door andere apps.

Pijplijn met vaardighedenset

Definitie set vaardigheden

Een vaardighedenset is een matrix van een of meer vaardigheden die een atomische verrijkingsbewerking vertegenwoordigen, zoals het vertalen van tekst, het extraheren van sleuteltermen of het uitvoeren van optische tekenherkenning uit een afbeeldingsbestand. Vaardigheden kunnen de ingebouwde vaardigheden van Microsoft zijn, of aangepaste vaardigheden die modellen of verwerkingslogica bevatten die u op maat maakt. Het produceert verrijkte documenten die worden gebruikt tijdens het indexeren of worden geprojecteerd in een kennisopslag.

Vaardigheden hebben een type, context en in- en uitvoer die vaak aan elkaar zijn vastgeketend. In het volgende voorbeeld worden twee ingebouwde vaardigheden gedemonstreerd die samenwerken en een aantal termen van de definitie van vaardighedensets introduceren.

  • Vaardigheid 1 is een vaardigheid Tekst splitsen die de inhoud van het bronveld 'reviews_text' als invoer accepteert en die inhoud splitst in 'pagina's' van 5000 tekens als uitvoer. Het splitsen van grote tekst in kleinere segmenten kan betere resultaten opleveren tijdens de verwerking van natuurlijke taal.

  • Vaardigheid 2 is een vaardigheid Gevoelsdetectie die 'pagina's' als invoer accepteert en een nieuw veld met de naam Gevoel produceert als uitvoer die de resultaten van sentimentanalyse bevat.

{
    "skills": [
        {
            "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
            "name": "#1",
            "description": null,
            "context": "/document/reviews_text",
            "defaultLanguageCode": "en",
            "textSplitMode": "pages",
            "maximumPageLength": 5000,
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/reviews_text"
                }
            ],
            "outputs": [
                {
                    "name": "textItems",
                    "targetName": "pages"
                }
            ]
        },
        {
            "@odata.type": "#Microsoft.Skills.Text.SentimentSkill",
            "name": "#2",
            "description": null,
            "context": "/document/reviews_text/pages/*",
            "defaultLanguageCode": "en",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/reviews_text/pages/*",
                }
            ],
            "outputs": [
                {
                    "name": "score",
                    "targetName": "Sentiment"
                }
            ]
        }
. . . 
}

Belangrijke punten om op te merken in het bovenstaande voorbeeld zijn dat invoer en uitvoer naam-waardeparen zijn, dat u de uitvoer van één vaardigheid kunt koppelen aan de invoer van downstreamvaardigheden en dat alle vaardigheden context hebben die bepaalt waar in de verrijkingsstructuur de verwerking plaatsvindt.

Zie How to reference annotations(Verwijzen naar aantekeningen) voor meer informatie over hoe invoer en uitvoer worden geformuleerd.

Verrijkingsstructuur

Een verrijkt document is een tijdelijke structuurachtige gegevensstructuur die wordt gemaakt tijdens het uitvoeren van vaardighedensets, die alle wijzigingen verzamelt die zijn geïntroduceerd via vaardigheden en deze vertegenwoordigt in een hiërarchie van adresseerbare knooppunten. Knooppunten bevatten ook niet-verrijkte velden die verbatim worden doorgegeven vanuit de externe gegevensbron. Er bestaat een verrijkt document voor de duur van de uitvoering van de vaardighedenset, maar kan in de cache worden opgeslagen of opgeslagen in een kennisopslag.

In eerste instantie is een verrijkt document gewoon de inhoud die is geëxtraheerd uit een gegevensbron tijdens het kraken van het document,waarbij tekst en afbeeldingen worden geëxtraheerd uit de bron en beschikbaar worden gesteld voor taal- of afbeeldingsanalyse.

De initiële inhoud is het hoofd-knooppunt ( ) en is meestal een volledig document of een genormaliseerde afbeelding die uit een gegevensbron wordt geëxtraheerd tijdens het kraken van document\content het document. Hoe deze wordt verwoord in een verrijkingsstructuur, is afhankelijk van het type gegevensbron. In de volgende tabel ziet u de status van een document dat in de verrijkingspijplijn binnenkomt voor verschillende ondersteunde gegevensbronnen:

Gegevensbron\Parseringsmodus Standaard JSON, JSON Lines & CSV
Blob Storage /document/inhoud
/document/normalized_images/*
/document/{key1}
/document/{key2}
Azure SQL /document/{column1}
/document/{column2}
N.v.t.
Cosmos DB /document/{key1}
/document/{key2}
N.v.t.

Terwijl vaardigheden worden uitgevoerd, wordt uitvoer als nieuwe knooppunten toegevoegd aan de verrijkingsstructuur. Deze knooppunten kunnen vervolgens worden gebruikt als invoer voor downstreamvaardigheden en worden uiteindelijk geprojecteerd in een kennisopslag of aan indexvelden. Vaardigheden voor het maken van inhoud, zoals vertaalde tekenreeksen, schrijven hun uitvoer naar het verrijkte document. Op dezelfde manier worden vaardigheden die de uitvoer van upstreamvaardigheden gebruiken, uit het verrijkte document gelezen om de benodigde invoer te krijgen.

Vaardigheden lezen en schrijven vanuit verrijkingsstructuur

Een verrijkingsstructuur bestaat uit geëxtraheerde inhoud en metagegevens die uit de bron worden gehaald, plus nieuwe knooppunten die zijn gemaakt door een vaardigheid, zoals uit de vaardigheid Tekstomtaling, uit vaardigheid Entiteitsherkenning of uit de translated_text vaardigheid Sleuteltermextractie locations keyPhrases . Hoewel u een verrijkingsstructuur kunt visualiseren en gebruiken via een visuele editor, is het voornamelijk een interne structuur.

Verrijkingen zijn niet veranderlijk: nadat de knooppunten zijn gemaakt, kunnen ze niet meer worden bewerkt. Naarmate uw vaardighedensets complexer worden, moet uw verrijkingsstructuur ook worden gebruikt, maar niet alle knooppunten in de verrijkingsstructuur moeten de index of het kennisopslag halen. U kunt selectief slechts een subset van de verrijkingsuitvoer behouden, zodat u alleen behoudt wat u wilt gebruiken.

Omdat de in- en uitvoer van een vaardigheid worden gelezen van en geschreven naar verrijkingsstructuur, is het maken van uitvoerveldtoewijzingen die inhoud verplaatsen van de verrijkingsstructuur naar een veld in een zoekindex een van de taken die u gaat uitvoeren als onderdeel van het ontwerp van vaardigheden. En als u een kennisopslag maakt, kunt u uitvoer ook in vormen die zijn toegewezen aan projecties.

Notitie

Met de verrijkingsstructuurindeling kan de verrijkingspijplijn metagegevens koppelen aan zelfs primitieve gegevenstypen. De metagegevens zijn geen geldig JSON-object, maar kunnen worden geprojecteerd in een geldige JSON-indeling in projectiedefinities in een kennisopslag. Zie Shaper-vaardigheid voor meer informatie.

Context

Elke vaardigheid heeft een context. Dit kan het hele document ( ) zijn of een /document knooppunt lager in de structuur ( /document/countries/ ). Een context bepaalt het volgende:

  • Het aantal keer dat de vaardigheid wordt uitgevoerd, via één waarde (eenmaal per veld, per document) of voor contextwaarden van het type verzameling, waarbij het toevoegen van resultaten in het aanroepen van vaardigheden één keer voor elk exemplaar in de /* verzameling.

  • Uitvoerdeclaratie, of waar in de verrijkingsstructuur de vaardigheidsuitvoer wordt toegevoegd. Uitvoer wordt altijd aan de structuur toegevoegd als kinderen van het context-knooppunt.

  • Vorm van de invoer. Voor verzamelingen op meerdere niveaus heeft het instellen van de context op de bovenliggende verzameling invloed op de vorm van de invoer voor de vaardigheid. Als u bijvoorbeeld een verrijkingsstructuur hebt met een lijst met landen/regio's, elk verrijkt met een lijst met staten met een lijst met postcodes, bepaalt u hoe de context wordt geïnterpreteerd.

Context Invoer Vorm van invoer Vaardigheid aanroepen
/document/countries/* /document/countries/*/states/*/zipcodes/* Een lijst met alle postcodes in het land/de regio Eenmaal per land/regio
/document/countries/*/states/* /document/countries/*/states/*/zipcodes/* Een lijst met postcodes met de status Eenmaal per combinatie van land/regio en staat

Verrijkingsvoorbeeld

Met behulp van de vaardighedenset hotelbeoordelingen als referentiepunt wordt in dit voorbeeld uitgelegd hoe een verrijkingsstructuur zich ontwikkelt door het uitvoeren van vaardigheden met behulp van conceptuele diagrammen.

In dit voorbeeld ziet u ook:

  • Hoe de context en invoer van een vaardigheid werken om te bepalen hoe vaak een vaardigheid wordt uitgevoerd
  • Wat de vorm van de invoer is op basis van de context

In dit voorbeeld bevatten bronvelden uit een CSV-bestand klantbeoordelingen over hotels ('reviews_text') en beoordelingen ('reviews_rating'). De indexer voegt metagegevensvelden toe uit Blob Storage en vaardigheden voegen vertaalde tekst, gevoelsscores en sleuteltermdetectie toe.

In het voorbeeld van hotelbeoordelingen vertegenwoordigt een 'document' binnen het verrijkingsproces één hotelbeoordeling.

Tip

U kunt een zoekindex en kennisopslag voor deze gegevens maken in Azure Portal of via Postman en de REST API's. U kunt ook Foutopsporingssessies gebruiken voor inzicht in de samenstelling van vaardighedensets, afhankelijkheden en effecten op een verrijkingsstructuur. Afbeeldingen in dit artikel zijn afkomstig uit Foutopsporingssessies.

Conceptueel gezien ziet de initiële verrijkingsstructuur er als volgt uit:

verrijkingsstructuur na het gekraakte document

Het hoofd-knooppunt voor alle verrijkingen is "/document" . Wanneer u met blobindexeringen werkt, "/document" heeft het knooppunt onderliggende knooppunten "/document/content" van en "/document/normalized_images" . Wanneer u met CSV-gegevens werkt, zoals in dit voorbeeld, worden de kolomnamen onder aan knooppunten "/document" weergegeven.

Vaardigheid #1: Vaardigheid splitsen

Wanneer broninhoud uit grote stukken tekst bestaat, is het handig om deze op te delen in kleinere onderdelen voor een grotere nauwkeurigheid van de taal, het sentiment en de detectie van sleuteltermen. Er zijn twee grains beschikbaar: pagina's en zinnen. Een pagina bestaat uit ongeveer 5000 tekens.

Een vaardigheid voor het splitsen van tekst is doorgaans het eerste in een vaardighedenset.

"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "#1",
"description": null,
"context": "/document/reviews_text",
"defaultLanguageCode": "en",
"textSplitMode": "pages",
"maximumPageLength": 5000,
"inputs": [
{
    "name": "text",
    "source": "/document/reviews_text"
}
],
"outputs": [
{
    "name": "textItems",
    "targetName": "pages"
}

Met de vaardigheidscontext "/document/reviews_text" van wordt de vaardigheid splitsen eenmaal uitgevoerd voor de reviews_text . De uitvoer van de vaardigheid is een lijst waarin reviews_text de wordt gesegmenteerd in 5000 tekensegmenten. De uitvoer van de splitsingsvaardigheden heeft de naam pages en wordt toegevoegd aan de verrijkingsstructuur. Met targetName de functie kunt u de naam van de uitvoer van een vaardigheid wijzigen voordat deze wordt toegevoegd aan de verrijkingsstructuur.

In de verrijkingsstructuur is nu een nieuw knooppunt geplaatst in de context van de vaardigheid. Dit knooppunt is beschikbaar voor elke vaardigheid, projectie of toewijzing van uitvoerveld.

verrijkingsstructuur na vaardigheid 1

Voor toegang tot een van de verrijkingen die door een vaardigheid aan een knooppunt zijn toegevoegd, is het volledige pad voor de verrijking nodig. Als u bijvoorbeeld de tekst van het knooppunt wilt gebruiken als invoer voor een andere vaardigheid, moet u pages deze opgeven als "/document/reviews_text/pages/*" . Zie Referentieaantekeningen voor meer informatie over paden.

Vaardigheid #2 Taaldetectie

Hotelbeoordelingsdocumenten bevatten feedback van klanten, uitgedrukt in meerdere talen. De vaardigheid taaldetectie bepaalt welke taal wordt gebruikt. Het resultaat wordt vervolgens doorgegeven aan sleuteltermextractie en sentimentdetectie (niet weergegeven), waarbij rekening wordt gehouden met taal bij het detecteren van gevoel en zinnen.

Hoewel de vaardigheid taaldetectie de derde vaardigheid (vaardigheid #3) is die in de vaardighedenset is gedefinieerd, is dit de volgende vaardigheid die moet worden uitgevoerd. Omdat deze niet wordt geblokkeerd door invoer te vereisen, wordt deze parallel uitgevoerd met de vorige vaardigheid. Net als de splitsingsvaardigheden die eraan vooraf zijn gegaan, wordt de vaardigheid taaldetectie ook één keer aangeroepen voor elk document. De verrijkingsstructuur heeft nu een nieuw knooppunt voor taal.

verrijkingsstructuur na vaardigheid #2

Skills #3 en #4 (sentimentanalyse en detectie van sleuteltermen)

Feedback van klanten weerspiegelt een scala aan positieve en negatieve ervaringen. De vaardigheid sentimentanalyse analyseert de feedback en wijst een score toe langs een continuum van negatieve tot positieve getallen, of neutraal als het sentiment onbepaald is. Parallel aan sentimentanalyse identificeert en extraheert sleuteltermdetectie woorden en korte woordgroepen die consequentieel lijken.

Gezien de context van worden zowel sentimentanalyse als sleuteltermvaardigheden eenmaal aangeroepen voor elk van de /document/reviews_text/pages/* items in de pages verzameling. De uitvoer van de vaardigheid is een knooppunt onder het bijbehorende pagina-element.

U moet nu de rest van de vaardigheden in de vaardighedenset kunnen bekijken en visualiseren hoe de structuur van verrijkingen blijft groeien bij het uitvoeren van elke vaardigheid. Sommige vaardigheden, zoals de vaardigheid samenvoegen en de shaper-vaardigheid, maken ook nieuwe knooppunten, maar gebruiken alleen gegevens van bestaande knooppunten en maken geen net nieuwe verrijkingen.

verrijkingsstructuur na alle vaardigheden

De kleuren van de connectors in de bovenstaande structuur geven aan dat de verrijkingen zijn gemaakt door verschillende vaardigheden en dat de knooppunten afzonderlijk moeten worden aangepakt en geen deel uitmaken van het object dat wordt geretourneerd bij het selecteren van het bovenliggende knooppunt.

Vaardigheid #5 Shaper-vaardigheid

Als de uitvoer een kennisopslag bevat,voegt u een Shaper-vaardigheid toe als laatste stap. Met de vaardigheid Shaper worden gegevensvormen gemaakt van knooppunten in een verrijkingsstructuur. U kunt bijvoorbeeld meerdere knooppunten samenvoegen in één vorm. U kunt deze vorm vervolgens projecteren als een tabel (knooppunten worden de kolommen in een tabel) en de vorm op naam doorgeven aan een tabelprojectie.

De Shaper-vaardigheid is eenvoudig om mee te werken, omdat deze zich richt op vormgeving onder één vaardigheid. U kunt ook kiezen voor in-line vormgeving binnen afzonderlijke projecties. De Shaper-vaardigheid voegt geen verrijkingsstructuur toe of doet deze af, zodat deze niet wordt gevisualiseerd. In plaats daarvan kunt u een Shaper-vaardigheid zien als de manier waarop u de verrijkingsstructuur die u al hebt, opnieuw verwoordt. Conceptueel gezien is dit vergelijkbaar met het maken van weergaven uit tabellen in een database.

{
  "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
  "name": "#5",
  "description": null,
  "context": "/document",
  "inputs": [
    {
      "name": "name",
      "source": "/document/name"
    },
    {
      "name": "reviews_date",
      "source": "/document/reviews_date"
    },
    {
      "name": "reviews_rating",
      "source": "/document/reviews_rating"
    },
    {
      "name": "reviews_text",
      "source": "/document/reviews_text"
    },
    {
      "name": "reviews_title",
      "source": "/document/reviews_title"
    },
    {
      "name": "AzureSearch_DocumentKey",
      "source": "/document/AzureSearch_DocumentKey"
    },
    {
      "name": "pages",
      "sourceContext": "/document/reviews_text/pages/*",
      "inputs": [
        {
          "name": "Sentiment",
          "source": "/document/reviews_text/pages/*/Sentiment"
        },
        {
          "name": "LanguageCode",
          "source": "/document/Language"
        },
        {
          "name": "Page",
          "source": "/document/reviews_text/pages/*"
        },
        {
          "name": "keyphrase",
          "sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
          "inputs": [
            {
              "name": "Keyphrases",
              "source": "/document/reviews_text/pages/*/Keyphrases/*"
            }
          ]
        }
      ]
    }
  ],
  "outputs": [
    {
      "name": "output",
      "targetName": "tableprojection"
    }
  ]
}

Volgende stappen

Nu u een inleiding en voorbeeld achter de hand hebt, kunt u uw eerste vaardighedenset maken met behulp van ingebouwde vaardigheden.