Freigeben über


Strukturbewusste Datensegmentierung und -vektorisierung in Azure KI-Suche

Hinweis

Dieses Feature ist zurzeit als öffentliche Preview verfügbar. Diese Vorschau wird ohne Vereinbarung zum Servicelevel bereitgestellt und nicht für Produktionsworkloads empfohlen. Manche Features werden möglicherweise nicht unterstützt oder sind nur eingeschränkt verwendbar. Weitere Informationen finden Sie unter Zusätzliche Nutzungsbestimmungen für Microsoft Azure-Vorschauen.

Strategien für die Segmentierung von Textdaten spielen eine wichtige Rolle bei der Optimierung der RAG-Reaktion und -Leistung. Mithilfe der neuen Dokumentlayoutfähigkeit, die sich derzeit in der Vorschau befindet, können Sie Inhalte basierend auf Absätzen oder semantisch zusammenhängenden Fragmenten einer Satzdarstellung segmentieren. Diese Fragmente können dann unabhängig voneinander verarbeitet und als semantische Darstellungen ohne Verlust von Informationen, Interpretationen oder semantischer Relevanz neu kombiniert werden. Die inhärente Bedeutung des Texts wird als Leitfaden für den Blockbildungsprozess verwendet.

Die Dokumentlayoutfähigkeit verwendet Markdownsyntax (Überschriften und Inhalte), um die Dokumentstruktur im Suchdokument zu gliedern. Der aus dem Quelldokument abgerufene durchsuchbare Inhalt ist Nur-Text. Sie können jedoch eine integrierte Vektorisierung hinzufügen, um für jedes beliebige Feld Einbettungen zu generieren.

In diesem Artikel werden folgende Vorgehensweisen behandelt:

  • Verwenden der Dokumentlayoutfähigkeit zum Erkennen von Abschnitten und Ausgabe von Markdowninhalten
  • Verwenden der Textteilungsfähigkeit zum Einschränken der Segmentgröße für jeden Markdownabschnitt
  • Generieren von Einbettungen für jedes Segment
  • Verwenden von Indexprojektionen zum Zuordnen von Einbettungen zu Feldern in einem Suchindex

Voraussetzungen

Aufbereiten von Datendateien

Die Roheingaben müssen sich in einer unterstützten Datenquelle befinden, und die Datei muss ein Format sein, das die Dokumentlayoutfähigkeit unterstützt.

  • Unterstützte Dateiformate sind: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.

  • Ein unterstützte Indexer kann ein beliebiger Indexer sein, der die unterstützten Dateiformate verarbeiten kann. Dazu gehören Blob-Indexer, OneLake-Indexer, Dateiindexer.

  • Unterstützte Regionen für dieses Feature sind: USA, Osten; USA, Westen 2; Europa, Westen; USA, Norden-Mitte. Überprüfen Sie diese Liste auf Updates für die regionale Verfügbarkeit.

Zum Erstellen einer Datenquelle können Sie das Azure-Portal, REST-APIs oder ein Azure SDK-Paket verwenden.

Tipp

Laden Sie die PDF-Beispieldateien für den Integritätsplan in Ihre unterstützte Datenquelle hoch, um die Dokumentlayoutfähigkeit und strukturbewusste Segmentierung in Ihrem eigenen Suchdienst auszuprobieren. Der Assistent zum Importieren und Vektorisieren von Daten ist ein einfacher codefreier Ansatz, um diese Fähigkeit auszuprobieren. Stellen Sie sicher, dass Sie den Standardanalysemodus auswählen, um strukturbewusste Datensegmentierung zu verwenden. Andernfalls wird stattdessen der Markdownanalysemodus verwendet.

Erstellen eines Indexes für die 1:n-Indizierung

Hier ist eine Beispielnutzlast eines einzelnen Suchdokuments, das auf Datensegmenten basiert. In diesem Beispiel sind übergeordnete Felder „text_parent_id“. Untergeordnete Felder sind die Segmente mit und ohne Vektor aus dem Markdownabschnitts.

Zum Erstellen eines Indexes können Sie das Azure-Portal, REST-APIs oder ein Azure SDK verwenden.

Ein Index muss für den Suchdienst vorhanden sein, bevor Sie das Skillset erstellen oder den Indexer ausführen.

{
  "name": "my_consolidated_index",
  "fields": [
    {
      "name": "chunk_id",
      "type": "Edm.String",
      "searchable": true,
      "filterable": false,
      "retrievable": true,
      "stored": true,
      "sortable": true,
      "facetable": false,
      "key": true,
      "analyzer": "keyword"
    },
    {
      "name": "text_parent_id",
      "type": "Edm.String",
      "searchable": false,
      "filterable": true,
      "retrievable": true,
      "stored": true,
      "sortable": false,
      "facetable": false,
      "key": false
    },
    {
      "name": "chunk",
      "type": "Edm.String",
      "searchable": true,
      "filterable": false,
      "retrievable": true,
      "stored": true,
      "sortable": false,
      "facetable": false,
      "key": false
    },
    {
      "name": "title",
      "type": "Edm.String",
      "searchable": true,
      "filterable": false,
      "retrievable": true,
      "stored": true,
      "sortable": false,
      "facetable": false,
      "key": false
    },
    {
      "name": "header_1",
      "type": "Edm.String",
      "searchable": true,
      "filterable": false,
      "retrievable": true,
      "stored": true,
      "sortable": false,
      "facetable": false,
      "key": false
    },
    {
      "name": "header_2",
      "type": "Edm.String",
      "searchable": true,
      "filterable": false,
      "retrievable": true,
      "stored": true,
      "sortable": false,
      "facetable": false,
      "key": false
    },
    {
      "name": "header_3",
      "type": "Edm.String",
      "searchable": true,
      "filterable": false,
      "retrievable": true,
      "stored": true,
      "sortable": false,
      "facetable": false,
      "key": false
    },
    {
      "name": "text_vector",
      "type": "Collection(Edm.Single)",
      "searchable": true,
      "filterable": false,
      "retrievable": true,
      "stored": true,
      "sortable": false,
      "facetable": false,
      "key": false,
      "dimensions": 1536,
      "stored": false,
      "vectorSearchProfile": "profile"
    }
  ],
  "vectorSearch": {
    "profiles": [
      {
        "name": "profile",
        "algorithm": "algorithm"
      }
    ],
    "algorithms": [
      {
        "name": "algorithm",
        "kind": "hnsw"
      }
    ]
  }
}

Definieren des Skillsets für die strukturbewusste Datensegmentierung und -vektorisierung

Da sich die Dokumentlayoutfähigkeit in der Vorschau befindet, müssen Sie für diesen Schritt die REST-API zum Erstellen der Skillset 2024-11-01-Vorschau verwenden.

Hier ein Beispiel für eine Fähigkeitsdefinition, um einzelne Markdownabschnitte und ihre Vektorausgaben als Dokumente in den Suchindex mithilfe der Dokumentlayoutfähigkeit und der Azure OpenAI-Einbettungsfähigkeit zu projizieren.

POST {endpoint}/skillsets?api-version=2024-11-01-preview

{
  "name": "my_skillset",
  "description": "A skillset for structure-aware chunking and vectorization with a index projection around markdown section",
  "skills": [
    {
      "@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
      "name": "my_document_intelligence_layout_skill",
      "context": "/document",
      "outputMode": "oneToMany",
      "inputs": [
        {
          "name": "file_data",
          "source": "/document/file_data"
        }
      ],
      "outputs": [
        {
          "name": "markdown_document",
          "targetName": "markdownDocument"
        }
      ],
      "markdownHeaderDepth": "h3"
    },
    {
      "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
      "name": "my_markdown_section_split_skill",
      "description": "A skill that splits text into chunks",
      "context": "/document/markdownDocument/*",
      "inputs": [
        {
          "name": "text",
          "source": "/document/markdownDocument/*/content",
          "inputs": []
        }
      ],
      "outputs": [
        {
          "name": "textItems",
          "targetName": "pages"
        }
      ],
      "defaultLanguageCode": "en",
      "textSplitMode": "pages",
      "maximumPageLength": 2000,
      "pageOverlapLength": 500,
      "unit": "characters"
    },
    {
      "@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
      "name": "my_azure_openai_embedding_skill",
      "context": "/document/markdownDocument/*/pages/*",
      "inputs": [
        {
          "name": "text",
          "source": "/document/markdownDocument/*/pages/*",
          "inputs": []
        }
      ],
      "outputs": [
        {
          "name": "embedding",
          "targetName": "text_vector"
        }
      ],
      "resourceUri": "https://<subdomain>.openai.azure.com",
      "deploymentId": "text-embedding-3-small",
      "apiKey": "<Azure OpenAI api key>",
      "modelName": "text-embedding-3-small"
    }
  ],
  "cognitiveServices": {
    "@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
    "key": "<Cognitive Services api key>"
  },
  "indexProjections": {
    "selectors": [
      {
        "targetIndexName": "my_consolidated_index",
        "parentKeyFieldName": "text_parent_id",
        "sourceContext": "/document/markdownDocument/*/pages/*",
        "mappings": [
          {
            "name": "text_vector",
            "source": "/document/markdownDocument/*/pages/*/text_vector"
          },
          {
            "name": "chunk",
            "source": "/document/markdownDocument/*/pages/*"
          },
          {
            "name": "title",
            "source": "/document/title"
          },
          {
            "name": "header_1",
            "source": "/document/markdownDocument/*/sections/h1"
          },
          {
            "name": "header_2",
            "source": "/document/markdownDocument/*/sections/h2"
          },
          {
            "name": "header_3",
            "source": "/document/markdownDocument/*/sections/h3"
          }
        ]
      }
    ],
    "parameters": {
      "projectionMode": "skipIndexingParentDocuments"
    }
  }
}

Ausführen des Indexers

Nachdem Sie eine Datenquelle, einen Index und ein Skillset erstellt haben, können Sie den Indexer erstellen und ausführen. In diesem Schritt wird die Pipeline ausgeführt.

Wenn Sie die Dokumentlayoutfähigkeit verwenden, müssen Sie die folgenden Parameter für die Indexerdefinition festlegen:

  • Der allowSkillsetToReadFileData-Parameter sollte auf true festgelegt werden.
  • Der parsingMode-Parameter sollte auf default festgelegt werden.

Hier ist eine Beispielnutzlast

{
  "name": "my_indexer",
  "dataSourceName": "my_blob_datasource",
  "targetIndexName": "my_consolidated_index",
  "skillsetName": "my_skillset",
  "parameters": {
    "batchSize": 1,
    "configuration": {
        "dataToExtract": "contentAndMetadata",
        "parsingMode": "default",
        "allowSkillsetToReadFileData": true
    }
  },
  "fieldMappings": [
    {
      "sourceFieldName": "metadata_storage_path",
      "targetFieldName": "title"
    }
  ],
  "outputFieldMappings": []
}

Überprüfen der Ergebnisse

Sie können den Suchindex nach Abschluss der Verarbeitung abfragen, um Ihre Lösung zu testen.

Um die Ergebnisse zu überprüfen, führen Sie eine Abfrage für den Index aus. Verwenden Sie den Such-Explorer als Suchclient oder ein beliebiges Tool, das HTTP-Anforderungen sendet. Die folgende Abfrage wählt Felder aus, die die Ausgabe des Markdownabschnittinhalts ohne Vektor und dessen Vektor enthalten.

Für den Such-Explorer können Sie nur den JSON-Code kopieren und in die JSON-Ansicht für die Abfrageausführung einfügen.

POST /indexes/[index name]/docs/search?api-version=[api-version]
{
    "search": "*",
    "select": "metadata_storage_path, markdown_section, vector"
}

Siehe auch