Példa alakzatokra és kivetítésekre egy tudástárban

Note

Azure AI Keresés a Azure portálon, REST API-kon és Azure SDK-k keresztül érhető el. Emellett a Foundry IQ-t is támogatja, amely a vállalati tartalmakat újrafelhasználható, engedélytudatos tudásbázisokká alakítja át az Microsoft Foundry portálon található ügynökök számára.

Note

A tudástárak olyan másodlagos tárolók, amelyek az Azure Storage-ban léteznek, és tartalmazzák az Azure AI Keresés-képességkészletek kimeneteit. Ezek különböznek a tudásforrásoktól és a tudásbázisoktól, amelyeket ügynöki lekéréses munkafolyamatokban használnak.

Ez a cikk részletes példát mutat be, amely kiegészíti a magas szintű fogalmakat és szintaxisalapú cikkeket azáltal, hogy végigvezeti az Azure Storage-beli tudástárakban található gazdag tudáskészlet kimenetének teljes kifejezéséhez szükséges formázási és leképezési lépéseken.

Ha az alkalmazáskövetelményei több szakértelmet és előrejelzést követelnek meg, ez a példa jobb képet ad az alakzatok és a kivetítések interakcióiról.

Mintaadatok beállítása

A mintadokumentumok nem szerepelnek a Projections gyűjteményben, de az AI-bővítési demó adatfájlok olyan szöveget és képeket tartalmaznak, amelyek az ebben a példában leírt kivetítésekkel működnek együtt. Ha ezeket a mintaadatokat használja, kihagyhatja a Microsoft Foundry-erőforrást csatoló lépést, mert az ingyenes bővítés napi indexelő korlátja alatt marad.

Hozzon létre egy blobtárolót az Azure Storage-ban, és töltse fel mind a 14 elemet.

Azure Storage használatakor másoljon egy kapcsolati karakterláncot.

A projections.rest fájl használatával futtathatja a cikkben szereplő példákat.

Példa készségkészlet

Az alakzatok és a kivetítések közötti függőség megértéséhez tekintse át a bővített tartalmat létrehozó alábbi készségkészletet. Ez a képességkészlet nyers képeket és szöveget is feldolgoz, és olyan kimeneteket hoz létre, amelyek alakzatokban és kivetítésekben lesznek hivatkozva.

Ügyeljen a képességkimenetekre (targetNames). A bővített dokumentumfára írt kimenetekre kivetítésekben és alakzatokban (Shaper-képességek segítségével) hivatkoznak.

{
    "name": "projections-demo-ss",
    "description": "Skillset that enriches blob data found in the merged_content field. 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": "A Foundry resource in the same region as Search.",
        "key": "{{cognitive-services-key}}"
    },
    "knowledgeStore": null
}

Note

Az indexelő naponta legfeljebb 20 tranzakciót képes díjmentesen feldolgozni. A példában szereplő mintaadatok a 20 tranzakciós korlát alatt maradnak, így ha a mintaadatokat használja, kihagyhatja a szakaszt cognitiveServices .

Példa a Shaper-képességre

A Shaper-képesség hasznos a meglévő gazdagított tartalommal való munkához, nem pedig új gazdagított tartalom létrehozásához. Az Alakzatkezelő képességkészlethez való hozzáadásával létrehozhat egy egyéni alakzatot, amelyet táblázatba vagy blobtárolóba vetíthet. Egyéni alakzat nélkül a vetítések egyetlen csomópontra (kimenetenként egy vetítésre) hivatkozhatnak, amely nem alkalmas táblákra. Az egyéni alakzatok létrehozása különböző elemeket összesít egy új logikai egészbe, amely egyetlen táblaként vetíthető ki, vagy szeletelhető és elosztható egy táblagyűjteményben.

Ebben a példában az egyéni alakzat a blob metaadatait és az azonosított entitásokat és kulcskifejezéseket egyesíti. Az egyéni alakzat neve projectionShape, és a szülő /document alatt van.

Az alakítás egyik célja annak biztosítása, hogy az összes bővítési csomópont jól formázott JSON-ban legyen kifejezve, ami a tudástárba való kivetítéshez szükséges. Ez különösen igaz akkor, amikor az enrichment fa olyan csomópontokat tartalmaz, amelyek nem megfelelően strukturáltak, mint JSON (például amikor egy bővítés egy primitívhoz, mint amilyen a sztring, van szülői viszonyban).

Figyelje meg az utolsó két csomópontot, KeyPhrases és Entities. Ezek egy érvényes JSON-objektumba vannak csomagolva a sourceContext. Ez azért szükséges, mert a keyphrases és entities bővítések a primitíveken alapulnak, és érvényes JSON formátumra kell konvertálni őket, mielőtt megjeleníthetők lennének.

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

Alakzatok hozzáadása egy készségkészlethez

A cikk elején bemutatott példa készségkészlet nem tartalmazza a Shaper-készséget, de a Shaper-készségek egy készségkészlethez tartoznak, és gyakran a vége felé kerülnek.

Egy képességkészleten belül egy Shaper-képesség a következőképpen nézhet ki:

{
    "name": "projections-demo-ss",
    "skills": [
        {
            <Shaper skill goes here>
            }
        ],
    "cognitiveServices":  "A key goes here",
    "knowledgeStore": []
}  

Táblákra való vetítés

A fenti példák alapján ismert mennyiségű bővítés és adatalakzat szerepel a táblázatvetítésekben. Az alábbi táblázatvetítésben három tábla van definiálva a , tableName és source a generatedKeyNametulajdonságok beállításával.

Mindhárom tábla a létrehozott kulcsok és a közös szülő /document/projectionShape által lesz összekapcsolva.

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

Teszteld a munkádat

A vetületdefiníciókat az alábbi lépések végrehajtásával ellenőrizheti:

  1. Állítsa be a tudástár tulajdonságát storageConnectionString érvényes V2 általános célú tárfiókhoz kapcsolati sztringre.

  2. Frissítse a készségkészletet a PUT-kérelem kiadásával.

  3. A készségkészlet frissítése után futtassa az indexelőt.

Most már rendelkezik egy három táblával rendelkező munkavetítéssel. Ha importálja ezeket a táblákat a Power BI-ba , a Power BI-nak meg kell találnia a kapcsolatokat.

Mielőtt továbblépnénk a következő példára, tekintsük át a táblavetítés szempontjait, hogy megismerjük a szeletelés és a kapcsolódó adatok mechanikáit.

Tábla szeletelése több gyermektáblába

A szeletelés egy olyan technika, amely egy egész konszolidált alakzatot alkotó részekre oszt. Az eredmény különálló, de egymáshoz kapcsolódó táblákból áll, amelyekkel önállóan dolgozhat.

A példában projectionShape a konszolidált alakzat (vagy bővítési csomópont) látható. A kivetítés definíciójában a projectionShape további táblákra szeleteljük, ami lehetővé teszi az alakzat egyes részeinek, valamint keyPhrases és Entities kivételét. A Power BI-ban ez akkor hasznos, ha az egyes dokumentumokhoz több entitás és keyPhrases van társítva, és további elemzéseket kaphat, ha kategorizált adatként láthatja az entitásokat és a keyPhrases-t.

A szeletelés implicit módon kapcsolatot hoz létre a szülő- és gyermektáblák között, és a generatedKeyName szülőtáblában lévő oszlop használatával létrehoz egy azonos nevű oszlopot a gyermektáblában.

Névadási kapcsolatok

A generatedKeyName tulajdonságok és referenceKeyName a tulajdonságok táblák vagy akár vetülettípusok adatainak összekapcsolására szolgálnak. A gyermektábla minden sorában van egy tulajdonság, amely a szülőre mutat. A gyermek oszlopának vagy tulajdonságának neve a referenceKeyName szülőtől származik. Ha a referenceKeyName nincs megadva, a szolgáltatás alapértelmezésként a szülőtől származó generatedKeyName értéket használja.

A Power BI ezeket a létrehozott kulcsokat használja a táblákon belüli kapcsolatok felderítéséhez. Ha a gyermektábla más néven elnevezett oszlopára van szüksége, állítsa be a referenceKeyName tulajdonságot a szülőtáblán. Például állítsd be a generatedKeyName mint ID-t a tblDocument táblán és a referenceKeyName mint DocumentID-t. Ez azt eredményezné, hogy a tblEntities és a tblKeyPhrases táblák oszlopa a DocumentID nevű dokumentumazonosítót tartalmazza.

Blobdokumentumok kivetítése

Az objektumvetítések a bővítési fa JSON-ábrázolásai, amelyek bármely csomópontból származhatnak. A táblavetületekkel összehasonlítva az objektumvetítések egyszerűbben definiálhatók és használhatók a teljes dokumentumok kivetítésekor. Az objektumvetítések egy tároló egyetlen vetületére korlátozódnak, és nem szeletelhetők.

Objektumvetítés definiálásához használja a objects tömböt a vetítések tulajdonságában.

A forrás a kijelzés gyökerét képező gazdagítófa csomópontjának elérési útja. Bár ez nem kötelező, a csomópont elérési útja általában egy Shaper-képesség kimenete. Ennek az az oka, hogy a legtöbb képesség önmagában nem ad ki érvényes JSON-objektumokat, ami azt jelenti, hogy valamilyen alakformálásra van szükség. Sok esetben ugyanaz a Shaper-képesség használható, amely táblavetítést hoz létre az objektumvetítés létrehozásához. Másik lehetőségként a forrás olyan csomópontra is beállítható, amely sorközi formázással biztosítja a struktúrát.

A cél mindig egy blobtároló.

Az alábbi példa az egyes szállodai dokumentumokat, blobonként egy szállodai dokumentumot egy úgynevezett hotelstárolóba veti be.

"knowledgeStore": {
  "storageConnectionString": "an Azure storage connection string",
  "projections" : [
    {
      "tables": [ ]
    },
    {
      "objects": [
        {
        "storageContainer": "hotels",
        "source": "/document/objectprojection",
        }
      ]
    },
    {
        "files": [ ]
    }
  ]
}

A forrás a ""objectprojection"" nevű Shaper-képesség eredménye. Minden blob JSON-ábrázolású lesz az egyes mezőbemenetek esetében.

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

Képfájl kivetítése

A fájlvetítések mindig bináris, normalizált képek, ahol a normalizálás a képességkészletek végrehajtásához használható lehetséges átméretezést és forgatást jelenti. Az objektumvetítésekhez hasonló fájlvetítések blobokként jönnek létre az Azure Storage-ban, és tartalmazzák a képet.

Fájlvetítés definiálásához használja a files tömböt a vetítések tulajdonságában.

A forrás mindig /document/normalized_images/*. A fájlvetítések csak a normalized_images gyűjteményen működnek. Sem az indexelők, sem a képességkészletek nem haladnak át az eredeti nem normalizált képen.

A cél mindig egy blobtároló, amely a dokumentumazonosító base64 kódolású értékének mappaelőtagjával rendelkezik. A fájlvetítések nem oszthatják meg ugyanazt a tárolót, mint az objektumvetítések, ezért egy másik tárolóba kell kivetíteni.

Az alábbi példa egy bővített dokumentum dokumentumcsomópontjából kinyert összes normalizált lemezképet egy úgynevezett myImagestárolóba alakítja.

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
        {
            "tables": [ ],
            "objects": [ ],
            "files": [
                {
                    "storageContainer": "myImages",
                    "source": "/document/normalized_images/*"
                }
            ]
        }
    ]
}

Kivetítés több típusra

Egy összetettebb forgatókönyv esetén előfordulhat, hogy a tartalmat vetítési típusok szerint kell kivetíteni. Például a kulcskifejezések és entitások táblákba való kivetítése, a szöveg és az elrendezés szövegének OCR-eredményeinek mentése objektumként, majd a képek fájlként való kivetítése.

Lépések több vetítéstípushoz:

  1. Hozzon létre egy táblázatot, amely minden dokumentumhoz tartalmaz egy sort.
  2. Hozzon létre egy táblázatot, amely a dokumentumtáblához kapcsolódik, úgy, hogy minden kulcskifejezés egy-egy sorban szerepeljen ebben a táblázatban.
  3. Hozzon létre egy táblázatot a dokumentummal kapcsolatos táblához, amelyben minden entitás sorként szerepel ebben a táblázatban.
  4. Hozzon létre egy objektumvetítést az egyes képek elrendezési szövegével.
  5. Hozzon létre egy fájlvetítést, és kivetítse az egyes kinyert képeket.
  6. Hozzon létre egy kereszthivatkozási táblázatot, amely a dokumentumtáblára, az objektumvetítésre és az elrendezés szövegére és a fájlvetítésre mutató hivatkozásokat tartalmaz.

Alakzatadatok keresztvetítéshez

A vetítésekhez szükséges alakzatok beszerzéséhez először adjon hozzá egy új Shaper-képességet, amely létrehoz egy formázott objektumot.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"
        }
    ]
}

Tábla-, objektum- és fájlvetítések definiálása

Az összevont crossProjection objektumból szeletelje az objektumot több táblára, rögzítse az OCR-kimenetet blobként, majd mentse a képet fájlként (blobtárolóban is).

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

Az objektumvetítések mindegyik vetülethez tárolónevet igényelnek. Az objektumvetítések és a fájlvetítések nem oszthatnak meg tárolót.

Táblák, objektumok és fájlvetítések közötti kapcsolatok

Ez a példa a kivetítések egy másik jellemzőjét is kiemeli. Ha több vetítéstípust határoz meg ugyanabban a vetítési objektumban, akkor a különböző típusok (táblák, objektumok, fájlok) között és azon belül is kifejezve van egy kapcsolat. Ez lehetővé teszi, hogy egy dokumentum táblázatsorával kezdje, és megkeresse a dokumentumon belüli képek teljes OCR-szövegét az objektumvetítésben.

Ha nem szeretné, hogy az adatok kapcsolódni tudjanak, definiálja a vetítéseket különböző vetítési csoportokban. A következő kódrészlet például azt eredményezi, hogy a táblák kapcsolódnak egymáshoz, de a táblák és az objektum (OCR-szöveg) vetületei közötti kapcsolatok nélkül.

A vetítési csoportok akkor hasznosak, ha ugyanazokat az adatokat különböző alakzatokban szeretné kivetíteni különböző igények szerint. Például a Power BI-irányítópult kivetítési csoportja, valamint egy másik, egyéni képességbe csomagolt gépi tanulási modell betanítása során használt adatok rögzítésére szolgáló kivetítési csoport.

A különböző típusú kivetítések létrehozásakor a rendszer először fájl- és objektumvetítéseket hoz létre, és az útvonalakat hozzáadja a táblákhoz.

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

Következő lépések

A cikkben szereplő példa bemutatja az előrejelzések létrehozásának gyakori mintáit. Most, hogy már jól ismeri a fogalmakat, jobban fel van készülve az adott forgatókönyvre vonatkozó előrejelzések készítésére.