Podrobný příklad obrazců a projekcí v úložišti znalostí
Tento článek obsahuje podrobný příklad, který doplňuje základní koncepty a články založené na syntaxi tím, že vás provede kroky tvarování a projekce potřebné k úplnému vyjádření výstupu bohaté sady dovedností v úložišti znalostí.
Pokud vaše požadavky na aplikaci volají pro více dovedností a projekcí, můžete v tomto příkladu lépe zjistit, jak se obrazce a projekce protínají.
Nastavení ukázkových dat
Ukázkové dokumenty nejsou součástí kolekce Projekce, ale ukázkové datové soubory pro rozšiřování AI obsahují text a obrázky, které pracují s projekcemi popsanými v tomto příkladu.
Vytvořte v Azure Storage kontejner objektů blob a nahrajte všechny 14 položek.
V Azure Storage zkopírujte připojovací řetězec.
Tento soubor můžete použít projections.rest
ke spuštění příkladů v tomto článku.
Příklad sady dovedností
Pokud chcete porozumět závislosti mezi obrazci a projekcemi, projděte si následující sadu dovedností, která vytváří obohacený obsah. Tato sada dovedností zpracovává nezpracované obrázky i text a vytváří výstupy, na které se budou odkazovat v obrazcích a projekcích.
Věnujte pozornost výstupům dovedností (targetNames). Výstupy napsané do rozšířeného stromu dokumentů se odkazují v projekcích a obrazcích (prostřednictvím dovedností Shaper).
{
"name": "projections-demo-ss",
"description": "Skillset that enriches blob data found in "merged_content". The enrichment granularity is a document.",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Text.V3.EntityRecognitionSkill",
"name": "#1",
"description": null,
"context": "/document/merged_content",
"categories": [
"Person",
"Quantity",
"Organization",
"URL",
"Email",
"Location",
"DateTime"
],
"defaultLanguageCode": "en",
"minimumPrecision": null,
"inputs": [
{
"name": "text",
"source": "/document/merged_content"
},
{
"name": "languageCode",
"source": "/document/language"
}
],
"outputs": [
{
"name": "persons",
"targetName": "people"
},
{
"name": "organizations",
"targetName": "organizations"
},
{
"name": "locations",
"targetName": "locations"
}
]
},
{
"@odata.type": "#Microsoft.Skills.Text.KeyPhraseExtractionSkill",
"name": "#2",
"description": null,
"context": "/document/merged_content",
"defaultLanguageCode": "en",
"maxKeyPhraseCount": null,
"inputs": [
{
"name": "text",
"source": "/document/merged_content"
},
{
"name": "languageCode",
"source": "/document/language"
}
],
"outputs": [
{
"name": "keyPhrases",
"targetName": "keyphrases"
}
]
},
{
"@odata.type": "#Microsoft.Skills.Text.LanguageDetectionSkill",
"name": "#3",
"description": null,
"context": "/document",
"inputs": [
{
"name": "text",
"source": "/document/merged_content"
}
],
"outputs": [
{
"name": "languageCode",
"targetName": "language"
}
]
},
{
"@odata.type": "#Microsoft.Skills.Text.MergeSkill",
"name": "#4",
"description": null,
"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_content"
}
]
},
{
"@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
"name": "#5",
"description": null,
"context": "/document/normalized_images/*",
"textExtractionAlgorithm": "printed",
"lineEnding": "Space",
"defaultLanguageCode": "en",
"detectOrientation": true,
"inputs": [
{
"name": "image",
"source": "/document/normalized_images/*"
}
],
"outputs": [
{
"name": "text",
"targetName": "text"
},
{
"name": "layoutText",
"targetName": "layoutText"
}
]
}
],
"cognitiveServices": {
"@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
"description": "An Azure AI services resource in the same region as Search.",
"key": "<Azure AI services All-in-ONE KEY>"
},
"knowledgeStore": null
}
Příklad dovednosti shaperu
Dovednost Shaper je nástroj pro práci s existujícím obohaceným obsahem místo vytváření nového rozšířeného obsahu. Přidáním Shaperu do sady dovedností můžete vytvořit vlastní obrazec, který můžete promítnout do úložiště tabulek nebo objektů blob. Bez vlastního obrazce jsou projekce omezené na odkazování na jeden uzel (jednu projekci na výstup), což není vhodné pro tabulky. Vytvoření vlastního obrazce agreguje různé prvky do nového logického celku, který lze promítnut jako jednu tabulku nebo rozdělit a distribuovat napříč kolekcí tabulek.
V tomto příkladu vlastní obrazec kombinuje metadata objektů blob a identifikované entity a klíčové fráze. Vlastní obrazec je volána projectionShape
a je nadřazena pod /document
.
Jedním z účelů tvarování je zajistit, aby se všechny uzly rozšiřování vyjadřovaly ve formátu JSON ve správném formátu, který je nutný pro promítání do úložiště znalostí. To platí zejména v případě, že strom rozšiřování obsahuje uzly, které nejsou ve správném formátu JSON (například když je rozšiřování nadřazené primitivnímu typu řetězce).
Všimněte si posledních dvou uzlů KeyPhrases
a Entities
. Tyto objekty jsou zabalené do platného objektu JSON s objektem sourceContext
. To je povinné, protože keyphrases
entities
se jedná o rozšiřování primitiv a před projektem je potřeba je převést na platný JSON.
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"name": "ShaperForTables",
"description": null,
"context": "/document",
"inputs": [
{
"name": "metadata_storage_content_type",
"source": "/document/metadata_storage_content_type",
"sourceContext": null,
"inputs": []
},
{
"name": "metadata_storage_name",
"source": "/document/metadata_storage_name",
"sourceContext": null,
"inputs": []
},
{
"name": "metadata_storage_path",
"source": "/document/metadata_storage_path",
"sourceContext": null,
"inputs": []
},
{
"name": "metadata_content_type",
"source": "/document/metadata_content_type",
"sourceContext": null,
"inputs": []
},
{
"name": "keyPhrases",
"source": null,
"sourceContext": "/document/merged_content/keyphrases/*",
"inputs": [
{
"name": "KeyPhrases",
"source": "/document/merged_content/keyphrases/*"
}
]
},
{
"name": "Entities",
"source": null,
"sourceContext": "/document/merged_content/entities/*",
"inputs": [
{
"name": "Entities",
"source": "/document/merged_content/entities/*/name"
}
]
}
],
"outputs": [
{
"name": "output",
"targetName": "projectionShape"
}
]
}
Přidání shaperů do sady dovedností
Ukázková sada dovedností představená na začátku tohoto článku neobsahuje dovednost Shaper, ale dovednosti Shaper patří do sady dovedností a často se umístí na konec.
V sadě dovedností může dovednost Shaper vypadat takto:
{
"name": "projections-demo-ss",
"skills": [
{
<Shaper skill goes here>
}
],
"cognitiveServices": "A key goes here",
"knowledgeStore": []
}
Promítání do tabulek
Na základě výše uvedených příkladů existuje známé množství rozšiřování a obrazců dat, na které lze odkazovat v projekcích tabulek. V projekci níže uvedených tabulek jsou definovány třemi tabulkami nastavením tableName
source
a generatedKeyName
vlastnostmi.
Všechny tři z těchto tabulek budou souviset prostřednictvím vygenerovaných klíčů a sdíleným nadřazeným objektem /document/projectionShape
.
"knowledgeStore" : {
"storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
"projections": [
{
"tables": [
{
"tableName": "tblDocument",
"generatedKeyName": "Documentid",
"source": "/document/projectionShape"
},
{
"tableName": "tblKeyPhrases",
"generatedKeyName": "KeyPhraseid",
"source": "/document/projectionShape/keyPhrases/*"
},
{
"tableName": "tblEntities",
"generatedKeyName": "Entityid",
"source": "/document/projectionShape/Entities/*"
}
],
"objects": [],
"files": []
}
]
}
Otestování práce
Definice projekce můžete zkontrolovat pomocí následujících kroků:
Nastavte vlastnost úložiště
storageConnectionString
znalostí na platný účet úložiště pro obecné účely verze 2 připojovací řetězec.Aktualizujte sadu dovedností vydáním požadavku PUT.
Po aktualizaci sady dovedností spusťte indexer.
Teď máte funkční projekci se třemi tabulkami. Import těchto tabulek do Power BI by měl vést ke zjištění relací v Power BI.
Než přejdeme k dalšímu příkladu, pojďme se vrátit k aspektům projekce tabulky, abychom pochopili mechaniku řezů a souvisejících dat.
Vytvoření řezu tabulky do několika podřízených tabulek
Řezy jsou technika, která rozděluje celý konsolidovaný tvar do složek. Výsledek se skládá z samostatných, ale souvisejících tabulek, se kterými můžete pracovat jednotlivě.
V tomto příkladu projectionShape
je sloučený obrazec (nebo uzel rozšiřování). V definici projectionShape
projekce je průřez do dalších tabulek, které umožňují vytáhnout části obrazce keyPhrases
a Entities
. V Power BI je to užitečné, protože ke každému dokumentu je přidruženo více entit a klíčových frází a získáte další přehledy, pokud uvidíte entity a klíčové fráze jako data zařazená do kategorií.
Vytváření řezů implicitně generuje relaci mezi nadřazenými a podřízenými tabulkami pomocí generatedKeyName
v nadřazené tabulce k vytvoření sloupce se stejným názvem v podřízené tabulce.
Vztahy pojmenování
Tyto generatedKeyName
vlastnosti referenceKeyName
se používají k relaci dat mezi tabulkami nebo dokonce napříč typy projekce. Každý řádek v podřízené tabulce má vlastnost odkazující zpět na nadřazenou položku. Název sloupce nebo vlastnosti v podřízené části je referenceKeyName
z nadřazeného objektu. referenceKeyName
Pokud není tato služba zadaná, nastaví ji jako generatedKeyName
výchozí z nadřazeného objektu.
Power BI využívá tyto vygenerované klíče ke zjišťování relací v tabulkách. Pokud potřebujete sloupec v podřízené tabulce s názvem jinak, nastavte referenceKeyName
vlastnost nadřazené tabulky. Jedním z příkladů by bylo nastavit generatedKeyName
jako ID v tabulce tblDocument a referenceKeyName
jako DocumentID. Výsledkem by byl sloupec v tabulkách tblEntities a tblKeyPhrases obsahující ID dokumentu s názvem DocumentID.
Projektování dokumentů objektů blob
Projekce objektů představují reprezentaci stromu rozšiřování JSON, který lze získat z libovolného uzlu. Ve srovnání s projekcemi tabulek jsou projekce objektů jednodušší definovat a používají se při promítání celých dokumentů. Projekce objektů jsou omezené na jednu projekci v kontejneru a nelze je rozdělit.
Chcete-li definovat projekci objektu, použijte objects
pole ve vlastnosti projekce.
Zdrojem je cesta k uzlu stromu rozšiřování, který je kořenem projekce. I když to není povinné, cesta k uzlu je obvykle výstupem dovednosti Shaper. Je to proto, že většina dovedností nevypíše vlastní výstup platných objektů JSON, což znamená, že je nutná určitá forma tvarování. V mnoha případech lze ke generování projekce objektu použít stejnou dovednost Shaper, která vytváří projekci tabulky. Případně je možné zdroj nastavit také na uzel s vloženým tvarováním , který poskytuje strukturu.
Cílem je vždy kontejner objektů blob.
Následující příklad projekty jednotlivé hotelové dokumenty, jeden hotelový dokument na objekt blob, do kontejneru s názvem hotels
.
"knowledgeStore": {
"storageConnectionString": "an Azure storage connection string",
"projections" : [
{
"tables": [ ]
},
{
"objects": [
{
"storageContainer": "hotels",
"source": "/document/objectprojection",
}
]
},
{
"files": [ ]
}
]
}
Zdrojem je výstup dovednosti Shaper s názvem "objectprojection"
. Každý objekt blob bude mít reprezentaci JSON každého vstupu pole.
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"name": "#3",
"description": null,
"context": "/document",
"inputs": [
{
"name": "HotelId",
"source": "/document/HotelId"
},
{
"name": "HotelName",
"source": "/document/HotelName"
},
{
"name": "Category",
"source": "/document/Category"
},
{
"name": "keyPhrases",
"source": "/document/HotelId/keyphrases/*"
},
],
"outputs": [
{
"name": "output",
"targetName": "objectprojection"
}
]
}
Promítání souboru obrázku
Projekce souborů jsou vždy binární, normalizované obrázky, kde normalizace označuje potenciální změnu velikosti a otočení pro použití při provádění sady dovedností. Projekce souborů, podobně jako projekce objektů, se vytvářejí jako objekty blob ve službě Azure Storage a obsahují obrázek.
Chcete-li definovat projekci souboru, použijte files
pole ve vlastnosti projekce.
Zdroj je vždy /document/normalized_images/*
. Projekce souborů fungují pouze s kolekcí normalized_images
. Indexery ani sada dovedností neprojdou původní nenormalizovaným obrázkem.
Cílem je vždy kontejner objektů blob s předponou složky kódované hodnotou base64 ID dokumentu. Projekce souborů nemůžou sdílet stejný kontejner jako projekce objektů a je potřeba je promítnout do jiného kontejneru.
Následující příklad projekty všechny normalizované obrázky extrahované z uzlu dokumentu rozšířeného dokumentu do kontejneru nazývaného myImages
.
"knowledgeStore" : {
"storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
"projections": [
{
"tables": [ ],
"objects": [ ],
"files": [
{
"storageContainer": "myImages",
"source": "/document/normalized_images/*"
}
]
}
]
}
Promítání na více typů
Složitější scénář může vyžadovat projektování obsahu napříč typy projekce. Například promítání klíčových frází a entit do tabulek, uložení výsledků OCR textu a rozložení textu jako objektů a následné promítání obrázků jako souborů.
Kroky pro více typů projekce:
- Vytvořte tabulku s řádkem pro každý dokument.
- Vytvořte tabulku související s tabulkou dokumentů s každou klíčovou frází označenou jako řádek v této tabulce.
- Vytvořte tabulku související s tabulkou dokumentů s každou entitou identifikovanou jako řádek v této tabulce.
- Vytvořte projekci objektu s textem rozložení pro každý obrázek.
- Vytvořte projekci souboru, která promítá každý extrahovaný obrázek.
- Vytvořte tabulku křížového odkazu, která obsahuje odkazy na tabulku dokumentu, projekci objektu s textem rozložení a projekcí souboru.
Data obrazce pro křížové projekce
Pokud chcete získat obrazce potřebné pro tyto projekce, začněte přidáním nové dovednosti Shaper, která vytvoří tvarovaný objekt s názvem crossProjection
.
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"name": "ShaperForCrossProjection",
"description": null,
"context": "/document",
"inputs": [
{
"name": "metadata_storage_name",
"source": "/document/metadata_storage_name",
"sourceContext": null,
"inputs": []
},
{
"name": "keyPhrases",
"source": null,
"sourceContext": "/document/merged_content/keyphrases/*",
"inputs": [
{
"name": "KeyPhrases",
"source": "/document/merged_content/keyphrases/*"
}
]
},
{
"name": "entities",
"source": null,
"sourceContext": "/document/merged_content/entities/*",
"inputs": [
{
"name": "Entities",
"source": "/document/merged_content/entities/*/name"
}
]
},
{
"name": "images",
"source": null,
"sourceContext": "/document/normalized_images/*",
"inputs": [
{
"name": "image",
"source": "/document/normalized_images/*"
},
{
"name": "layoutText",
"source": "/document/normalized_images/*/layoutText"
},
{
"name": "ocrText",
"source": "/document/normalized_images/*/text"
}
]
}
],
"outputs": [
{
"name": "output",
"targetName": "crossProjection"
}
]
}
Definování projekce tabulek, objektů a souborů
Z konsolidovaného objektu crossProjection rozdělte objekt do více tabulek, zachyťte výstup OCR jako objekty blob a pak uložte obrázek jako soubory (také v úložišti objektů blob).
"knowledgeStore" : {
"storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
"projections": [
{
"tables": [
{
"tableName": "crossDocument",
"generatedKeyName": "Id",
"source": "/document/crossProjection"
},
{
"tableName": "crossEntities",
"generatedKeyName": "EntityId",
"source": "/document/crossProjection/entities/*"
},
{
"tableName": "crossKeyPhrases",
"generatedKeyName": "KeyPhraseId",
"source": "/document/crossProjection/keyPhrases/*"
},
{
"tableName": "crossReference",
"generatedKeyName": "CrossId",
"source": "/document/crossProjection/images/*"
}
],
"objects": [
{
"storageContainer": "crossobject",
"generatedKeyName": "crosslayout",
"source": null,
"sourceContext": "/document/crossProjection/images/*/layoutText",
"inputs": [
{
"name": "OcrLayoutText",
"source": "/document/crossProjection/images/*/layoutText"
}
]
}
],
"files": [
{
"storageContainer": "crossimages",
"generatedKeyName": "crossimages",
"source": "/document/crossProjection/images/*/image"
}
]
}
]
}
Projekce objektů vyžadují pro každou projekci název kontejneru. Projekce objektů a projekce souborů nemůžou sdílet kontejner.
Relace mezi tabulkami, objekty a projekcemi souborů
Tento příklad také zvýrazňuje další funkci projekcí. Definováním více typů projekcí v rámci stejného objektu projekce existuje relace vyjádřená v různých typech (tabulky, objekty, soubory). To vám umožní začít řádkem tabulky pro dokument a najít veškerý text OCR pro obrázky v tomto dokumentu v projekci objektu.
Pokud nechcete, aby data souvisela, definujte projekce v různých skupinách projekce. Například následující fragment kódu způsobí, že tabulky souvisejí, ale bez relací mezi tabulkami a projekcemi objektu (text OCR).
Skupiny projekce jsou užitečné, když chcete promítnout stejná data v různých obrazcích pro různé potřeby. Například projekční skupina pro řídicí panel Power BI a další projekční skupina pro zachytávání dat používaných k trénování modelu strojového učení zabaleného do vlastní dovednosti.
Při vytváření projekcí různých typů se nejprve vygenerují projekce souborů a objektů a cesty se přidají do tabulek.
"knowledgeStore" : {
"storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
"projections": [
{
"tables": [
{
"tableName": "unrelatedDocument",
"generatedKeyName": "Documentid",
"source": "/document/projectionShape"
},
{
"tableName": "unrelatedKeyPhrases",
"generatedKeyName": "KeyPhraseid",
"source": "/document/projectionShape/keyPhrases"
}
],
"objects": [
],
"files": []
},
{
"tables": [],
"objects": [
{
"storageContainer": "unrelatedocrtext",
"source": null,
"sourceContext": "/document/normalized_images/*/text",
"inputs": [
{
"name": "ocrText",
"source": "/document/normalized_images/*/text"
}
]
},
{
"storageContainer": "unrelatedocrlayout",
"source": null,
"sourceContext": "/document/normalized_images/*/layoutText",
"inputs": [
{
"name": "ocrLayoutText",
"source": "/document/normalized_images/*/layoutText"
}
]
}
],
"files": []
}
]
}
Další kroky
Příklad v tomto článku ukazuje běžné vzory vytváření projekcí. Teď, když máte dobrou představu o konceptech, jste lépe vybaveni k vytváření projekcí pro váš konkrétní scénář.