Sdílet prostřednictvím


Blok dat a vektorizace podle rozložení nebo struktury dokumentu

Poznámka:

Tato funkce je v současné době ve verzi Public Preview. Tato verze Preview je poskytována bez smlouvy o úrovni služeb a nedoporučuje se pro produkční úlohy. Některé funkce se nemusí podporovat nebo mohou mít omezené možnosti. Další informace najdete v dodatečných podmínkách použití pro verze Preview v Microsoft Azure.

Strategie vytváření bloků textových dat hrají klíčovou roli při optimalizaci odpovědí RAG a výkonu. Pomocí nové dovednosti rozložení dokumentu, která je aktuálně ve verzi Preview, můžete obsah na základě struktury dokumentu zachytávat nadpisy a zachytávat text obsahu na základě sémantické soudržnosti, jako jsou odstavce a věty. Bloky dat se zpracovávají nezávisle. Vzhledem k tomu, že LLM pracují s několika bloky dat, jsou-li tyto bloky vysoce kvalitní a séanticky koherentní, je vylepšena celková důležitost dotazu.

Dovednost Rozložení dokumentu volá model rozložení v nástroji Document Intelligence. Model vyjadřuje strukturu obsahu ve formátu JSON pomocí syntaxe Markdownu (nadpisů a obsahu) s poli pro nadpisy a obsah uložený v indexu vyhledávání ve službě Azure AI Search. Prohledávatelný obsah vytvořený z dovednosti Rozložení dokumentu je prostý text, ale můžete použít integrovanou vektorizaci ke generování vkládání pro všechna pole ve zdrojových dokumentech, včetně obrázků.

V tomto článku se dozvíte, jak:

  • Rozpoznávání struktury dokumentu pomocí dovednosti rozložení dokumentu
  • Pomocí dovednosti Rozdělení textu omezte velikost bloků dat na jednotlivé oddíly markdownu.
  • Generování vkládání pro každý blok dat
  • Použití projekce indexů k mapování vkládání na pole v indexu vyhledávání

Pro ilustraci tento článek používá ukázkové soubory PDF plánu stavu nahrané do služby Azure Blob Storage a pak indexované pomocí Průvodce importem a vektorizací dat.

Požadavky

Příprava datových souborů

Nezpracované vstupy musí být v podporovaném zdroji dat a soubor musí být formátem, který dovednost rozložení dokumentu podporuje.

  • Mezi podporované formáty souborů patří: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.

  • Podporované indexery můžou být jakýkoli indexer, který dokáže zpracovat podporované formáty souborů. Mezi tyto indexery patří indexery objektů blob, indexery OneLake, indexery souborů.

  • Mezi podporované oblasti této funkce patří: USA – východ, USA – západ 2, Západní Evropa, USA – středosever. Nezapomeňte zkontrolovat, jestli tento seznam obsahuje aktualizace o dostupnosti v jednotlivých oblastech.

K vytvoření zdroje dat můžete použít Azure Portal, rozhraní REST API nebo balíček sady Azure SDK.

Tip

Nahrajte ukázkové soubory PDF plánu stavu do podporovaného zdroje dat a vyzkoušejte si dovednosti rozložení dokumentu a bloky dat s podporou struktury ve vaší vlastní vyhledávací službě. Průvodce importem a vektorizací dat je snadný přístup bez kódu pro vyzkoušení této dovednosti. Nezapomeňte vybrat výchozí režim analýzy pro použití bloků dat pracujících se strukturou. V opačném případě se místo toho použije režim analýzy Markdownu.

Vytvoření indexu pro indexování 1:N

Tady je příklad datové části jednoho vyhledávacího dokumentu navrženého kolem bloků dat. Pokaždé, když pracujete s bloky dat, potřebujete pole bloku dat a nadřazené pole, které identifikuje původ bloku dat. V tomto příkladu jsou nadřazená pole text_parent_id. Podřízená pole jsou vektorové a nevectorové bloky oddílu markdownu.

Dovednost Rozložení dokumentu vypisuje nadpisy a obsah. V tomto příkladu header_1 prostřednictvím header_3 ukládání nadpisů dokumentů, jak zjistí dovednost. Další obsah, například odstavce, je uložen v chunk. Pole text_vector je vektorové znázornění obsahu pole bloku.

K vytvoření indexu můžete použít Průvodce importem a vektorizací dat na webu Azure Portal, rozhraní REST API nebo sadě Azure SDK. Následující index je velmi podobný tomu, co průvodce ve výchozím nastavení vytvoří. Pokud přidáte vektorizaci obrázků, můžete mít více polí.

Pokud průvodce nepoužíváte, musí index existovat ve vyhledávací službě před vytvořením sady dovedností nebo spuštěním indexeru.

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

Definování sady dovedností pro bloky dat a vektorizaci s podporou struktury

Vzhledem k tomu, že dovednost rozložení dokumentu je ve verzi Preview, musíte pro tento krok použít rozhraní REST API create Skillset 2024-11-01-preview . Můžete také použít Azure Portal.

Tato část ukazuje příklad definice sady dovedností, která zakážou jednotlivé oddíly markdownu, bloky dat a jejich vektorové ekvivalenty jako pole v indexu vyhledávání. Používá dovednost Rozložení dokumentu k detekci nadpisů a naplnění pole obsahu na základě sémanticky koherentních odstavců a vět ve zdrojovém dokumentu. Pomocí dovednosti Rozdělení textu rozdělí obsah Markdownu na bloky dat. Využívá dovednost Vkládání Azure OpenAI k vektorizaci bloků dat a jakéhokoli jiného pole, pro které chcete vložit.

Kromě dovedností zahrnuje indexProjections sada dovedností a cognitiveServices:

  • indexProjections se používají pro indexy obsahující blokované dokumenty. Projekce určují, jak se obsah nadřazený-podřízený mapuje na pole v indexu vyhledávání pro index 1:N. Další informace naleznete v tématu Definování projekce indexu.

  • cognitiveServicespřipojí víceslužný účet Azure AI pro účely fakturace (dovednost rozložení dokumentu je k dispozici prostřednictvím cen průběžných plateb).

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

Konfigurace a spuštění indexeru

Jakmile vytvoříte zdroj dat, index a sadu dovedností, budete připraveni vytvořit a spustit indexer. Tento krok převede kanál do spuštění.

Při použití dovednosti Rozložení dokumentu nezapomeňte pro definici indexeru nastavit následující parametry:

  • Parametr allowSkillsetToReadFileData by měl být nastaven na truehodnotu .
  • parametr parsingMode by měl být nastaven na defaulthodnotu .

outputFieldMappings v tomto scénáři není potřeba nastavit, protože indexProjections se staráte o zdrojové pole pro přidružení polí vyhledávání. Projekce indexů zpracovávají přidružení polí pro dovednost Rozložení dokumentu a také pravidelné blokování dat s rozdělenou dovedností pro importované a vektorizované datové úlohy. Mapování výstupních polí jsou stále nezbytná pro transformace nebo komplexní mapování dat s funkcemi, které platí v jiných případech. Pro n-bloky na dokument však projekce indexu zpracovávají tuto funkci nativně.

Tady je příklad požadavku na vytvoření indexeru.

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

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

Když odešlete požadavek do vyhledávací služby, spustí se indexer.

Ověření výsledků

Po dokončení zpracování můžete dotazovat index vyhledávání a otestovat řešení.

Pokud chcete zkontrolovat výsledky, spusťte dotaz na index. Průzkumníka služby Search použijte jako klienta vyhledávání nebo jakýkoli nástroj, který odesílá požadavky HTTP. Následující dotaz vybere pole, která obsahují výstup oddílu markdownu bezvectoru a jeho vektor.

V Průzkumníku služby Search můžete zkopírovat jenom JSON a vložit ho do zobrazení JSON pro provedení dotazu.

POST /indexes/[index name]/docs/search?api-version=[api-version]
{
  "search": "copay for in-network providers",
  "count": true,
  "searchMode": "all",
  "vectorQueries": [
    {
      "kind": "text",
      "text": "*",
      "fields": "text_vector,image_vector"
    }
  ],
  "queryType": "semantic",
  "semanticConfiguration": "healthplan-doc-layout-test-semantic-configuration",
  "captions": "extractive",
  "answers": "extractive|count-3",
  "queryLanguage": "en-us",
  "select": "header_1, header_2, header_3"
}

Pokud jste k otestování této dovednosti použili soubory PDF plánu stavu, výsledky Průzkumníka služby Search pro ukázkový dotaz by měly vypadat podobně jako výsledky na následujícím snímku obrazovky.

  • Dotaz je hybridní dotaz nad textem a vektory, takže se zobrazí @search.rerankerScore výsledky seřazené podle daného skóre. searchMode=all znamená, že všechny termíny dotazu musí být považovány za shodu (výchozí hodnota je libovolná).

  • Dotaz používá sémantické řazení, takže se zobrazí captions (má answerstaké , ale ty se na snímku obrazovky nezobrazují). Výsledky jsou nejvíce sémanticky relevantní pro vstup dotazu podle sémantického rankeru.

  • Příkaz select (není zobrazený na snímku obrazovky) určuje pole záhlaví, která dovednost rozložení dokumentu rozpozná a naplní. Do klauzule select můžete přidat další pole pro kontrolu obsahu bloků dat, názvu nebo jakéhokoli jiného čitelného pole člověka.

Snímek obrazovky s výsledky hybridních dotazů, které obsahují výstupní pole dovedností rozložení dokumentu

Viz také