Állapot kezelése
A KÖVETKEZŐKRE VONATKOZIK: SDK v4
A robotokon belüli állapot ugyanazokat a paradigmákat követi, mint a modern webalkalmazások, és a Bot Framework SDK absztrakciókat biztosít az állapotkezelés megkönnyítésére.
A webalkalmazásokhoz hasonlóan a robotok is eredendően állapot nélküliek. A robot egy másik példánya a beszélgetés bármilyen kérdés–válasz párját kezelheti. Egyes robotok esetében ezt az egyszerűséget részesíti előnyben – a robot további információk nélkül is működhet, vagy a szükséges információk garantáltan a bejövő üzeneten belül lesznek. Mások esetében az állapotra (például a beszélgetés kikapcsolt állapotára vagy a felhasználóról korábban kapott adatokra) van szükség ahhoz, hogy a robot hasznos beszélgetést folytatjon.
Miért van szükségem állapotra?
Az állapot fenntartása lehetővé teszi, hogy a robot értelmesebb beszélgetéseket tartson, ha megjegyez bizonyos dolgokat egy felhasználóról vagy beszélgetésről. Ha például korábban már beszélt egy felhasználóval, mentheti róluk a korábbi információkat, hogy ne kelljen újra kérnie őket. Az állapot az aktuális fordulatnál hosszabb ideig tárolja az adatokat, így a robot egy többfordulós beszélgetés során is megőrzi az adatokat.
Mivel a robotokra vonatkozik, az állapot használatához van néhány réteg: a tárolási réteg, az állapotkezelés (az alábbi ábrán a robotállapotban található) és az állapottulajdonságok kiegészítői. Ez az ábra a rétegek közötti interakciós sorozat egyes részeit szemlélteti, a metódushívást jelképező folytonos nyilakkal, valamint a választ jelző szaggatott nyilakkal (visszatérési értékkel vagy anélkül).
A diagram menetét a következő szakaszok ismertetik, az egyes rétegek részleteivel.
Tárolási réteg
A háttérrendszertől kezdve, ahol az állapotinformációk ténylegesen tárolódnak, a tárolási réteg. Ez lehet a fizikai tároló, például a memóriában, az Azure-ban vagy egy harmadik féltől származó kiszolgáló.
A Bot Framework SDK néhány implementációt tartalmaz a tárolási réteghez:
- A memóriatároló tesztelési célokra a memórián belüli tárolást valósítja meg. A memóriabeli adattárolás csak helyi tesztelésre szolgál, mivel ez a tároló változékony és ideiglenes. A robot minden újraindításakor törlődnek az adatok.
- Azure Blob Storage egy Azure Blob Storage objektumadatbázishoz csatlakozik.
- Az Azure Cosmos DB particionált tárolója particionált Cosmos DB NoSQL-adatbázishoz csatlakozik.
Fontos
A Cosmos DB tárolási osztály elavult. Az eredetileg a CosmosDbStorage használatával létrehozott tárolók nem tartalmaztak partíciókulcs-készletet, és az alapértelmezett "/_partitionKey" partíciókulcsot kapták.
A Cosmos DB-tárolóval létrehozott tárolók a Cosmos DB particionált tárolóival használhatók. További információ: Particionálás az Azure Cosmos DB-ben .
Azt is vegye figyelembe, hogy az örökölt Cosmos DB-tárterülettől eltérően a Cosmos DB particionált tárolója nem hoz létre automatikusan adatbázist a Cosmos DB-fiókjában. Manuálisan kell létrehoznia egy új adatbázist, de hagyja ki a tároló manuális létrehozását, mivel a CosmosDbPartitionedStorage létrehozza a tárolót.
Az egyéb tárolási lehetőségekhez való csatlakozással kapcsolatos útmutatásért lásd: Írás közvetlenül a tárolóba.
Állapotkezelés
Az állapotkezelés automatizálja a robot állapotának olvasását és írását a mögöttes tárolási rétegbe. Az állapot állapottulajdonságokként van tárolva, amelyek hatékonyan kulcs-érték párok, amelyeket a robot az állapotkezelési objektumon keresztül tud olvasni és írni anélkül, hogy az adott mögöttes megvalósítás miatt kellene aggódnia. Ezek az állapottulajdonságok határozzák meg az információk tárolásának módját. Ha például egy adott osztályként vagy objektumként definiált tulajdonságot kér le, tudja, hogyan lesznek strukturálva az adatok.
Ezek az állapottulajdonságok hatókörön belüli gyűjtőkbe vannak rendezve, amelyek csak gyűjtemények, amelyek segítenek ezeknek a tulajdonságoknak a rendszerezésében. Az SDK három ilyen "gyűjtőt" tartalmaz:
- Felhasználói állapot
- Beszélgetés állapota
- Privát beszélgetés állapota
Ezek a gyűjtők a robotállapot-osztály alosztályai, amelyek más típusú, különböző hatókörű gyűjtők definiálásához származtathatók.
Az előre definiált gyűjtők hatóköre a gyűjtőtől függően egy bizonyos láthatóságra terjed ki:
- A felhasználói állapot minden olyan esetben elérhető, amikor a robot az adott csatornán a felhasználóval beszélget, függetlenül a beszélgetéstől
- A beszélgetés állapota minden esetben elérhető egy adott beszélgetésben, a felhasználótól függetlenül, például csoportos beszélgetésekben
- A privát beszélgetés állapota az adott beszélgetésre és az adott felhasználóra is kiterjed
Tipp
A felhasználó és a beszélgetés állapota csatorna szerint van hatókörben. Ugyanaz a személy, aki különböző csatornákat használ a robot eléréséhez, különböző felhasználókként jelenik meg, minden csatornához egy-egy, és mindegyikhez külön felhasználói állapottal.
Az egyes előre definiált gyűjtőkhöz használt kulcsok a felhasználóra és a beszélgetésre, vagy mindkettőre vonatkoznak. Az állapottulajdonság értékének beállításakor a rendszer belsőleg definiálja a kulcsot, és a turn környezetében található információk biztosítják, hogy az egyes felhasználók vagy beszélgetések a megfelelő gyűjtőbe és tulajdonságba kerüljenek. Pontosabban a kulcsok a következőképpen vannak definiálva:
- A felhasználói állapot létrehoz egy kulcsot a csatornaazonosító és az azonosító használatával. Például : {Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
- A beszélgetés állapota létrehoz egy kulcsot a csatornaazonosító és a beszélgetési azonosító használatával. Például : {Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName
- A privát beszélgetés állapota létrehoz egy kulcsot a csatornaazonosító és a beszélgetés azonosítója alapján. Például : {Activity.ChannelId}/conversations/{Activity.Conversation.Id}/users/{Activity.From.Id}#YourPropertyName
Mikor érdemes használni az egyes állapottípusokat?
A beszélgetés állapota alkalmas a beszélgetés kontextusának nyomon követésére, például:
- Azt, hogy a robot feltett-e egy kérdést a felhasználónak, és hogy melyik kérdés volt
- Mi az aktuális téma a beszélgetésben, vagy mi volt az utolsó?
A felhasználói állapot alkalmas a felhasználóval kapcsolatos információk nyomon követésére, például:
- Nem kritikus felhasználói adatok, például név és beállítások, riasztási beállítások vagy riasztási beállítások
- Információ a robottal folytatott legutóbbi beszélgetésükről
- Egy terméktámogatási robot például nyomon követheti, hogy a felhasználó mely termékekről érdeklődik.
A privát beszélgetés állapota jó a csoportos beszélgetéseket támogató csatornákhoz, de ahol a felhasználó- és a beszélgetésspecifikus információkat is nyomon szeretné követni. Ha például egy osztályterem-kattintási robottal rendelkezik:
- A robot összesítheti és megjelenítheti a diákok válaszait egy adott kérdésre.
- A robot összesítheti az egyes tanulók teljesítményét, és privát módon továbbíthatja őket a munkamenet végén.
Az előre definiált gyűjtők használatával kapcsolatos részletekért tekintse meg az állapottal kapcsolatos útmutatót ismertető cikket.
Csatlakozás több adatbázishoz
Ha a robotnak több adatbázishoz kell csatlakoznia, hozzon létre egy tárolási réteget az egyes adatbázisokhoz. Több adatbázist is használhat, ha a robot különböző biztonsági, egyidejűségi vagy adathelyre vonatkozó adatokat gyűjt.
Minden tárolási réteghez hozza létre az állapotkezelési objektumokat, amelyek az állapottulajdonságok támogatásához szükségesek.
Állapottulajdonságok tartozékai
Az állapottulajdonságok tartozékai az állapottulajdonságok tényleges olvasására vagy írására szolgálnak, valamint lekérési, beállítási és törlési módszereket biztosítanak az állapottulajdonságokhoz való hozzáféréshez. Tartozék létrehozásához meg kell adnia a tulajdonság nevét, amely általában a robot inicializálásakor történik. Ezután ezt a tartozékot használhatja a robot állapotának tulajdonságának lekérésére és módosítására.
A tartozékokkal az SDK lekérheti az állapotot a mögöttes tárolóból, és frissítheti a robot állapot-gyorsítótárát . Az állapotgyorsítótár a robot által karbantartott helyi gyorsítótár, amely az állapotobjektumot tárolja, így az alapul szolgáló tároló elérése nélkül teszi lehetővé az olvasási és írási műveleteket. Ha még nincs a gyorsítótárban, a tartozék get metódusának meghívása lekéri az állapotot, és a gyorsítótárba helyezi. A lekérés után az állapottulajdonság ugyanúgy kezelhető, mint egy helyi változó.
A tartozék törlési metódusa eltávolítja a tulajdonságot a gyorsítótárból, és azt is törli a mögöttes tárolóból.
Fontos
A tartozék get metódusának első hívásához meg kell adnia egy gyári metódust az objektum létrehozásához, ha még nem létezik az ön állapotában. Ha nem ad meg gyári metódust, kivételt kap. A gyármetódusok használatáról az állapotról szóló útmutatóban talál további információt.
A tartozéktól kapott állapottulajdonság módosításainak megőrzéséhez az állapot-gyorsítótárban lévő tulajdonságot frissíteni kell. Ezt egy hívással teheti meg a tartozékkészlet metódusával, amely beállítja a tulajdonság értékét a gyorsítótárban, és elérhető, ha ezt később be kell olvasni vagy frissíteni kell. Ahhoz, hogy az adatok ténylegesen megmaradjanak a mögöttes tárolóban (és így elérhetővé tegyék azokat az aktuális turn után), mentenie kell az állapotát.
Az állapottulajdonságok kiegészítő módszereinek működése
A kiegészítő módszerek az elsődleges módja annak, hogy a robot kommunikáljon az állapottal. Az egyes munka és a mögöttes rétegek működése a következő:
- A tartozék get metódusa:
- A tartozékkérések tulajdonsága az állapot-gyorsítótárból származik.
- Ha a tulajdonság a gyorsítótárban van, adja vissza. Ellenkező esetben kérje le az állapotkezelési objektumból. (Ha még nincs állapotban, használja a tartozék hívásában megadott gyári metódust. )
- A tartozék halmazmetódusa:
- Frissítse az állapot-gyorsítótárat az új tulajdonságértékkel.
- Az állapotkezelési objektum mentési módosítási metódusa:
- Ellenőrizze a tulajdonság módosításait az állapot-gyorsítótárban.
- Írja be ezt a tulajdonságot a tárolóba.
Állapot a párbeszédpaneleken
A párbeszédpaneltár a robot beszélgetési állapotában definiált párbeszédpanel-állapottulajdonság-tartozékot használja a párbeszédpanel helyének megtartásához a beszélgetésben. A párbeszédpanel állapot tulajdonsága lehetővé teszi, hogy minden párbeszédpanel átmeneti információkat tároljon a fordulás között.
Az adaptív párbeszédpanelek összetettebb memóriatartomány-struktúrával rendelkeznek, amely többek között megkönnyíti a konfigurációs és felismerési eredmények elérését. A párbeszédpanel-kezelő a felhasználói és beszélgetési állapotkezelési objektumokat használja a memória hatóköreinek biztosítására.
A párbeszédpaneltárról további információt a párbeszédpaneltár című cikkben talál.
- Az ilyen típusú párbeszédpanelekre vonatkozó információkért tekintse meg az összetevők és vízesések párbeszédpaneleit .
- Az adaptív párbeszédpanelekre vonatkozó információkért tekintse meg az adaptív párbeszédablakok bevezetését és az állapot adaptív párbeszédpanelekben való kezelését ismertető cikkeket.
Állapot mentése
Amikor meghívja a tartozék beállítási metódusát a frissített állapot rögzítéséhez, az állapottulajdonság még nem lett mentve a tárolt tárolóba, és ehelyett csak a robot állapot-gyorsítótáraba lesz mentve. Ahhoz, hogy az állapot-gyorsítótárban lévő módosításokat a megőrzött állapotba mentse, meg kell hívnia az állapotkezelő objektum mentési módosítási metódusát, amely a fent említett robotállapot-osztály implementációjában érhető el (például felhasználói vagy beszélgetési állapot).
Egy állapotkezelési objektum mentési módosítási metódusának meghívása (például a fent említett gyűjtők) az adott gyűjtőhöz beállított állapot-gyorsítótárban lévő összes tulajdonságot menti, de a robot állapotában lévő többi gyűjtőhöz nem.
Tipp
A robotállapot az "utolsó írás nyer" viselkedést valósítja meg, ahol az utolsó írás a korábban írt állapotra lesz bélyegzve. Ez számos alkalmazás esetében működhet, de kihatással van, különösen a horizontális felskálázási forgatókönyvekben, ahol bizonyos szintű egyidejűség vagy késés tapasztalható.
Ha rendelkezik olyan egyéni köztes szoftverekkel, amelyek a turn handler befejezése után frissíthetik az állapotot, fontolja meg a köztes szoftver állapotának kezelését.