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 keyphrasesentities 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 tableNamesource 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ů:

  1. Nastavte vlastnost úložiště storageConnectionString znalostí na platný účet úložiště pro obecné účely verze 2 připojovací řetězec.

  2. Aktualizujte sadu dovedností vydáním požadavku PUT.

  3. 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:

  1. Vytvořte tabulku s řádkem pro každý dokument.
  2. Vytvořte tabulku související s tabulkou dokumentů s každou klíčovou frází označenou jako řádek v této tabulce.
  3. Vytvořte tabulku související s tabulkou dokumentů s každou entitou identifikovanou jako řádek v této tabulce.
  4. Vytvořte projekci objektu s textem rozložení pro každý obrázek.
  5. Vytvořte projekci souboru, která promítá každý extrahovaný obrázek.
  6. 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ář.