Skillsetkonzepte in Azure Cognitive Search

Dieser Artikel richtet sich an Entwickler, die ausführlichere Informationen über die Konzepte und den Aufbau von Skillsets benötigen. Es wird vorausgesetzt, dass der Leser mit den allgemeinen Konzepten und Workflows der KI-Anreicherung vertraut ist.

Bei einem Skillset handelt es sich um eine wiederverwendbare Ressource in Azure Cognitive Search, die an einen Indexer angefügt ist. Es enthält mindestens einen Skill, also eine atomischen Vorgang, mit dem integrierte KI-Prozesse oder externe benutzerdefinierte Prozesse über Dokumente aufgerufen werden, die aus einer externen Datenquelle abgerufen wurden.

Skills werden während der gesamten Skillsetverarbeitung in einem angereicherten Dokument gelesen und dort hin geschrieben. Bei einem angereicherten Dokument handelt es sich anfänglich nur um den unformatierten Inhalt, der aus einer Datenquelle extrahiert wurde. Mit jeder Skillausführung gewinnt es jedoch an Struktur und Inhalt. Letztendlich werden Knoten in einem angereicherten Dokument Feldern in einem Suchindex oder Projektionen in einem Wissensspeicher zugeordnet, sodass der Inhalt entsprechend weitergeleitet werden kann, sodass er von anderen Apps abgefragt oder verwendet werden kann.

Pipeline with skillset

Definition von Qualifikationsgruppen

Bei einem Skillset handelt es sich um eine Reihe von Skills, die einen atomischen Anreicherungsvorgang darstellen, wie z. B. das Übersetzen von Text, das Extrahieren von Schlüsselausdrücken oder das Durchführen einer optischen Zeichenerkennung in einer Bilddatei. Bei Skills kann es sich um integrierte Skills von Microsoft handeln oder um benutzerdefinierte Skills, die die Modelle bzw. die Verarbeitungslogik enthalten, die Sie bereitstellen. Damit werden angereicherte Dokumente erstellt, die bei der Indizierung verwendet oder in einen Wissensspeicher projiziert werden.

Skills weisen einen Typ, einen Kontext und Eingaben und Ausgaben auf, die häufig miteinander verkettet werden. Im folgenden Beispiel sind zwei integrierte Skills dargestellt, die zusammen verwendet werden. Zudem wird ein Teil der Terminologie rund um die Definition von Skillsets vorgestellt.

  • Der erste Skill ist ein Skill zur Textaufteilung, der den Inhalt des Quellfelds „reviews_text“ als Eingabe akzeptiert und diesen Inhalt als Ausgabe in „Seiten“ mit 5000 Zeichen aufteilt. Die Aufteilung eines umfangreichen Texts in kleinere Abschnitte kann bei der Verarbeitung natürlicher Sprache zu besseren Ergebnissen führen.

  • Der zweite Skill ist ein Skill zur Stimmungserkennung, der „Seiten“ als Eingabe akzeptiert und ein neues Feld namens „Sentiment“ (Stimmung) als Ausgabe erstellt, das die Ergebnisse der Stimmungsanalyse enthält.

{
    "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"
                }
            ]
        }
. . . 
}

Wichtige Punkte, die beim obigen Beispiel zu beachten sind: Eingaben und Ausgaben sind Name/Wert-Paare, Sie können die Ausgaben eines Skills mit den Eingaben von nachgelagerten Skills abgleichen und alle Skills weisen einen Kontext auf, der bestimmt, an welcher Stelle in der Anreicherungsstruktur die Verarbeitung erfolgt.

Weitere Informationen zur Formulierung von Eingaben und Ausgaben finden Sie unter Verweisen auf Anmerkungen.

Anreicherungsstruktur

Bei einem angereicherten Dokument handelt es sich um eine temporäre baumähnliche Struktur, die während der Skillausführung erstellt wird und mit der alle über den Skill vorgenommenen Änderungen erfasst und in einer Hierarchie aus adressierbaren Knoten dargestellt werden. Knoten enthalten zudem auch alle nicht angereicherten Felder, von der externen Datenquelle unverändert übergeben werden. Ein angereichertes Dokument ist für die Dauer der Ausführung eines Skillsets vorhanden, kann jedoch zwischengespeichert oder in einem Wissensspeicher gespeichert werden.

Bei einem angereicherten Dokument handelt es sich anfänglich nur um den Inhalt, der bei der Dokumententschlüsselung aus der Datenquelle extrahiert wird. Dabei werden Texte und Bilder aus der Quelle extrahiert und für die Sprach- oder Bildanalyse verfügbar gemacht.

Der Ausgangsinhalt ist der Wurzelknoten (document\content) und ist in der Regel ein ganzes Dokument oder ein normalisiertes Bild, das beim Cracken des Dokuments aus einer Datenquelle extrahiert wird. Die Art, wie der Inhalt in einer Anreicherungsstruktur formuliert wird, variiert je nach Datenquellentyp. In der folgenden Tabelle wird für verschiedene unterstützte Datenquellen der Zustand eines Dokuments gezeigt, das in die Anreicherungspipeline wechselt:

Datenquelle\Analysemodus Standard JSON, JSON-Zeilen & CSV
Blob Storage /document/content
/document/normalized_images/*
/document/{key1}
/document/{key2}
Azure SQL /document/{column1}
/document/{column2}
Cosmos DB /document/{key1}
/document/{key2}

Beim Ausführen von Skills wird der Anreicherungsstruktur die Ausgabe in Form von neuen Knoten hinzugefügt. Diese Knoten können als Eingabe für nachgelagerte Skills verwendet werden und werden schließlich in einen Wissensspeicher projiziert oder Indexfeldern zugeordnet. Skills, die Inhalte wie übersetzte Zeichenfolgen erstellen, schreiben ihre Ausgabe in das angereicherte Dokument. Entsprechend lesen Skills, die die Ausgabe von vorgelagerten Skills verwenden, im angereicherten Dokument, um die erforderlichen Eingaben abzurufen.

Skills read and write from enrichment tree

Eine Anreicherungsstruktur besteht aus extrahiertem Inhalt und Metadaten, die aus der Quelle abgerufen werden, sowie aus allen neuen Knoten, die von einem Skill erstellt werden, z. B.translated_text aus dem Skill Textübersetzung, locations aus dem Skill Entitätserkennung oder keyPhrases aus dem Skill Schlüsselbegriffserkennung. Obwohl Sie eine Anreicherungsstruktur über einen visuellen Editor visualisieren und damit arbeiten können, handelt es sich größtenteils um eine interne Struktur.

Anreicherungen sind nicht änderbar: Die Knoten können nach der Erstellung nicht bearbeitet werden. Mit steigender Komplexität Ihrer Qualifikationen wird auch Ihre Anreicherungsstruktur komplexer, aber nicht alle Knoten in der Anreicherungsstruktur müssen in den Index oder Wissensspeicher aufgenommen werden. Sie können nur eine Teilmenge der Anreicherungsausgaben selektiv speichern, sodass Sie nur die Elemente erhalten bleiben, die Sie verwenden möchten.

Da die Eingaben und Ausgaben eines Skills aus Anreicherungsstrukturen gelesen und in diese geschrieben werden, besteht eine der Aufgaben beim Skillsetentwurf darin, Ausgabefeldzuordnungen zu erstellen, mit denen Inhalte aus der Anreicherungsstruktur in ein Feld in einem Suchindex verschoben werden. Entsprechend können Sie beim Erstellen eines Wissensspeichers Ausgaben Formen zuordnen, die Projektionen zugewiesen sind.

Hinweis

Das Anreicherungsstrukturformat ermöglicht es der Anreicherungspipeline, selbst primitiven Datentypen Metadaten anzufügen. Die Metadaten sind keine gültigen JSON-Objekte, können jedoch in Projektionsdefinitionen in einem Wissensspeicher in ein gültiges JSON-Format projiziert werden. Weitere Informationen hierzu finden Sie unter Der Skill „Shaper“.

Kontext

Jeder Skill verfügt über einen Kontext, bei dem es sich um das gesamte Dokument (/document) oder einen Knoten weiter unten in der Struktur (/document/countries/*) handeln kann. Ein Kontext bestimmt Folgendes:

  • Die Anzahl der Skillausführungen für einen einzelnen Wert (einmal pro Feld, pro Dokument) oder für Kontextwerte vom Typ Sammlung, wobei das Hinzufügen von /* dazu führt, dass einmal für jede Instanz in der Sammlung ein Skill aufgerufen wird.

  • Ausgabedeklaration oder die Stelle, an der in der Anreicherungsstruktur die Skillausgaben hinzugefügt werden. Ausgaben werden der Struktur immer als untergeordnete Elemente des Kontextknotens hinzugefügt.

  • Form der Eingaben. Bei Sammlungen mit mehreren Ebenen hat das Festlegen des Kontexts auf die übergeordnete Sammlung Auswirkungen auf die Form der Eingabe für den Skill. Wenn Sie beispielsweise über eine Anreicherungsstruktur mit einer Liste mit Ländern/Regionen verfügen, von denen jedes Land bzw. jede Region mit einer Liste mit Bundesländern/Kantonen angereichert ist, die wiederum jeweils eine Liste mit Postleitzahlen enthalten, bestimmt die Art, wie Sie den Kontext festlegen, die Art, wie die Eingabe interpretiert wird.

Kontext Eingabe Form der Eingabe Aufruf einer Qualifikation
/document/countries/* /document/countries/*/states/*/zipcodes/* Eine Liste aller Postleitzahlen im Land oder der Region Einmal pro Land oder Region
/document/countries/*/states/* /document/countries/*/states/*/zipcodes/* Eine Liste aller Postleitzahlen im Bundesland Einmal pro Kombination aus Land oder Region und Bundesland/Kanton

Beispiel für eine Anreicherung

In diesem Beispiel wird anhand des Skillsets für Hotelbewertungen als Bezugspunkt erläutert, wie sich eine Anreicherungsstruktur mithilfe von konzeptionellen Diagrammen durch die Ausführung von Skills weiterentwickelt.

Anhand dieses Beispiels wird zudem Folgendes erläutert:

  • Die Funktionsweise des Kontexts und der Eingaben eines Skills, um zu bestimmen, wie oft ein Skill ausgeführt wird
  • Die Form der Eingabe in Abhängigkeit vom Kontext

In diesem Beispiel enthalten Quellfelder aus einer CSV-Datei Kundenbewertungen zu Hotels („reviews_text“) und Bewertungen („reviews_rating“). Über den Indexer werden Metadatenfelder aus Blob Storage hinzugefügt und über Skills übersetzte Texte, Stimmungsbewertungen und die Schlüsselbegriffserkennung.

Im Beispiel für Hotelbewertungen stellt ein „Dokument“ innerhalb des Anreicherungsprozesses eine einzelne Hotelbewertung dar.

Tipp

Im Azure-Portal oder über Postman und die REST-APIs können Sie einen Suchindex und einen Wissensspeicher für diese Daten erstellen. Sie können auch Debugsitzungen verwenden, um Informationen über Zusammensetzung, Abhängigkeiten und Auswirkungen von Skillsets auf eine Anreicherungsstruktur zu erhalten. Die Bilder in diesem Artikel stammen von Debugsitzungen.

Konzeptionell sieht die anfängliche Anreicherungsstruktur wie folgt aus:

enrichment tree after document cracking

Der Stammknoten für alle Anreicherungen ist "/document". Wenn Sie Blob-Indexer verwenden, verfügt der "/document"-Knoten über die untergeordneten Knoten "/document/content" und "/document/normalized_images". Wenn Sie, wie in diesem Beispiel, CSV-Daten verwenden, werden die Spaltennamen den Knoten unter "/document" zugeordnet.

Qualifikation 1: Qualifikation „Aufteilung“

Wenn der Quellinhalt aus großen Textblöcken besteht, ist es hilfreich, ihn in kleinere Komponenten zu zerlegen, um eine größere Genauigkeit bei der Erkennung von Sprache, Stimmung und Schlüsselbegriffen zu erreichen. Es stehen zwei Einheiten zur Verfügung: Seiten und Sätze. Eine Seite besteht aus ungefähr 5.000 Zeichen.

Ein Skill zur Textaufteilung erfolgt normalerweise an erster Stelle in einem Skillset.

"@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"
}

Mit dem Skillkontext "/document/reviews_text" wird der Skill „Aufteilung“ einmal für reviews_text ausgeführt. Die Qualifikationsausgabe ist eine Liste, in der reviews_text in 5000-Zeichen-Segmente aufgeteilt ist. Die Ausgabe des Skills „Aufteilung“ wird pages benannt und der Anreicherungsstruktur hinzugefügt. Mit dem Feature targetName können Sie eine Qualifikationsausgabe umbenennen, bevor sie der Anreicherungsstruktur hinzugefügt wird.

Die Anreicherungsstruktur verfügt jetzt über einen neuen Knoten, der unter den Kontext der Qualifikation platziert wird. Dieser Knoten ist für alle Qualifikationen, Projektionen oder Ausgabefeldzuordnungen verfügbar.

enrichment tree after skill #1

Um auf eine der Anreicherungen zuzugreifen, die einem Knoten durch eine Qualifikation hinzugefügt wurden, ist der vollständige Pfad für die Anreicherung erforderlich. Wenn Sie z.B. den Text aus dem Knoten pages als Eingabe für eine andere Qualifikation verwenden möchten, müssen Sie ihn als "/document/reviews_text/pages/*" angeben. Weitere Informationen zu Pfaden finden Sie unter Verweisen auf Anmerkungen.

Qualifikation 2: Sprachenerkennung

Dokumente zur Hotelbewertung enthalten Kundenfeedback in mehreren Sprachen. Der Skill zur Spracherkennung bestimmt, welche Sprache verwendet wird. Das Ergebnis wird dann an die Extraktion von Schlüsselbegriffen und die Erkennung von Stimmungen (nicht dargestellt) weitergeleitet, wobei die Sprache bei der Erkennung von Stimmungen und Begriffen berücksichtigt wird.

Die Qualifikation „Spracherkennung“ ist zwar die dritte in der Qualifikationsgruppe definierte Qualifikation (Qualifikation 3), sie wird aber als nächste Qualifikation ausgeführt. Da keine Eingaben erforderlich sind, wird sie nicht blockiert und parallel mit der vorherigen Qualifikation ausgeführt. Genau wie die Qualifikation „Aufteilung“ wird die Qualifikation „Spracherkennung“ auch einmal für jedes Dokument aufgerufen. Die Anreicherungsstruktur verfügt jetzt über einen neuen Knoten für die Sprache.

enrichment tree after skill #2

Skills 3 und 4 (Stimmungsanalyse und Schlüsselbegriffserkennung)

Kundenfeedback spiegelt eine Reihe von positiven und negativen Erfahrungen wider. Mit dem Skill „Stimmungsanalyse“ wird das Feedback analysiert und entlang eines Kontinuums eine Bewertung von negativen zu positiven Werten oder bei einer unbestimmten Stimmung neutral zugewiesen. Parallel zur Stimmungsanalyse werden mit der Schlüsselbegriffserkennung folgerichtig erscheinende Wörter und kurze Ausdrücke identifiziert und extrahiert.

Im Kontext von /document/reviews_text/pages/* werden die beiden Skills „Stimmungsanalyse“ und „Schlüsselbegriffserkennung“ einmal für jedes Element in der Sammlung pages aufgerufen. Die Ausgabe der Qualifikation ist ein Knoten unter dem zugeordneten page-Element.

Wenn Sie sich jetzt die restlichen Qualifikationen in der Qualifikationsgruppe anschauen, sollten Sie sich vorstellen können, wie die Anreicherungsstruktur mit der Ausführung jeder weiteren Qualifikation weiter wächst. Einige Qualifikationen, wie z.B. die Qualifikation „Zusammenführen“ und die Qualifikation „Shaper“, erstellen auch neue Knoten, verwenden jedoch nur Daten aus vorhandenen Knoten und erstellen keine eigenen neuen Anreicherungen.

enrichment tree after all skills

Die Farben der Connectors in der Struktur oben zeigen an, dass die Anreicherungen durch unterschiedliche Qualifikationen erstellt wurden, und die Knoten müssen einzeln adressiert werden und sind nicht Teil des Objekts, das bei der Auswahl des übergeordneten Knotens zurückgegeben wird.

Skill 5: Skill „Shaper“

Wenn die Ausgabe einen Wissensspeicher enthält, fügen Sie in einem letzten Schritt den Skill „Shaper“ hinzu. Mit dem Skill „Shaper“ werden aus Knoten in einer Anreicherungsstruktur Formen erstellt. Es kann beispielsweise vorkommen, dass Sie mehrere Knoten in einer einzelnen Form konsolidieren möchten. Dann können Sie diese Form als Tabelle projizieren (aus den Knoten werden die Spalten einer Tabelle) und anhand des Namens an eine Tabellenprojektion übergeben.

Der Skill „Shaper“ erleichtert die Arbeit, da er sich auf die Strukturierung unter einem Skill konzentriert. Alternativ können Sie die Inlinestrukturierung innerhalb einzelner Projektionen verwenden. Mit dem Skill „Shaper“ wird einer Anreicherungsstruktur weder etwas hinzugefügt noch etwas weggenommen, er wird also nicht visualisiert. Der Skill „Shaper“ ist vielmehr ein Mittel, mit dem sich eine bereits vorhandene Anreicherungsstruktur neu formulieren lässt. Vom Konzept her ist dies vergleichbar mit der Erstellung von Sichten aus Tabellen in einer Datenbank.

{
  "@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"
    }
  ]
}

Nächste Schritte

Nach der Einführung und einem Beispiel erstellen Sie als Nächstes Ihr erstes Skillset mithilfe von integrierten Skills.