Správa stavu
PLATÍ PRO: SDK v4
Stav v rámci robota se řídí stejnými paradigmaty jako moderní webové aplikace a sada Bot Framework SDK nabízí několik abstrakcí, které usnadňují správu stavu.
Stejně jako webové aplikace je robot ze své podstaty bezstavový a různé instance robota můžou zpracovávat jakékoli směrování konverzace. U některých robotů je tato jednoduchost upřednostňovaná – robot může buď pracovat bez dalších informací, nebo je zaručeno, že požadované informace budou v příchozí zprávě. Pro ostatní je stav (například místo, kde konverzace skončila nebo kdy byla přijata data o uživateli) nezbytný k tomu, aby robot mohl vést užitečnou konverzaci.
Proč potřebuji stát?
Udržování stavu umožňuje robotovi vést smysluplnější konverzace díky tomu, že si pamatuje určité věci o uživateli nebo konverzaci. Pokud jste například dříve mluvili s uživatelem, můžete si o něm uložit předchozí informace, abyste o ně nemuseli znovu žádat. State také uchovává data po dobu delší, než je aktuální obrat, takže robot uchovává informace v průběhu konverzace s více otočeními.
Vzhledem k tomu, že se jedná o roboty, existuje několik vrstev, které používají stav: vrstva úložiště, správa stavu (obsažená ve stavu robota v následujícím diagramu) a přístupové objekty vlastností stavu. Tento diagram znázorňuje části sekvence interakce mezi těmito vrstvami s plnými šipkami představujícími volání metody a přerušovanými šipkami představujícími odpověď (s návratovou hodnotou nebo bez).
Tok tohoto diagramu je vysvětlen v následujících částech s podrobnostmi o každé z těchto vrstev.
Vrstva úložiště
Počínaje back-endem, kde jsou informace o stavu skutečně uložené, je vrstva úložiště. Můžete si ho představit jako fyzické úložiště, například v paměti, Azure nebo server třetí strany.
Sada Bot Framework SDK obsahuje některé implementace pro vrstvu úložiště:
- Úložiště paměti implementuje úložiště v paměti pro účely testování. Úložiště dat v paměti je určené pouze pro místní testování, protože toto úložiště je nestálé a dočasné. Data se vymažou při každém restartování robota.
- Azure Blob Storage se připojí k databázi objektů Azure Blob Storage.
- Dělené úložiště Azure Cosmos DB se připojuje k dělené databázi Cosmos DB NoSQL.
Důležité
Třída úložiště Cosmos DB je zastaralá. Kontejnery původně vytvořené pomocí Služby CosmosDbStorage neměly nastavený žádný klíč oddílu a dostaly výchozí klíč oddílu "/_partitionKey".
Kontejnery vytvořené s úložištěm Cosmos DB je možné použít s děleným úložištěm Cosmos DB. Další informace najdete v tématu Dělení ve službě Azure Cosmos DB .
Všimněte si také, že na rozdíl od starší verze úložiště Cosmos DB nevytvoří dělené úložiště Cosmos DB automaticky databázi v rámci vašeho účtu Cosmos DB. Novou databázi musíte vytvořit ručně, ale přeskočte ruční vytváření kontejneru, protože CosmosDbPartitionedStorage vytvoří kontejner za vás.
Pokyny k připojení k dalším možnostem úložiště najdete v tématu Zápis přímo do úložiště.
Řízení stavu
Správa stavu automatizuje čtení a zápis stavu robota do podkladové vrstvy úložiště. Stav se ukládá jako vlastnosti stavu, což jsou vlastně páry klíč-hodnota, které robot může číst a zapisovat prostřednictvím objektu správy stavu, aniž by se museli starat o konkrétní základní implementaci. Tyto vlastnosti stavu definují způsob ukládání těchto informací. Když například načtete vlastnost, kterou jste definovali jako konkrétní třídu nebo objekt, víte, jak budou tato data strukturována.
Tyto vlastnosti stavu jsou sloučeny do vymezených "kbelíků", což jsou pouze kolekce, které pomáhají tyto vlastnosti uspořádat. Sada SDK obsahuje tři z těchto "kbelíků":
- Stav uživatele
- Stav konverzace
- Stav soukromé konverzace
Všechny tyto kontejnery jsou podtřídy třídy stavu robota , které lze odvodit a definovat další typy kontejnerů s různými obory.
Tyto předdefinované kontejnery jsou vymezeny na určitou viditelnost v závislosti na kontejneru:
- Stav uživatele je k dispozici v libovolném směru, kdy robot komunikuje s tímto uživatelem v daném kanálu, bez ohledu na konverzaci.
- Stav konverzace je k dispozici v libovolném směru v konkrétní konverzaci, bez ohledu na uživatele, například ve skupinových konverzacích.
- Stav soukromé konverzace je vymezený jak na konkrétní konverzaci, tak na konkrétního uživatele.
Tip
Stav uživatele i konverzace jsou vymezeny podle kanálu. Stejná osoba, která používá pro přístup k robotovi různé kanály, se zobrazí jako různí uživatelé, jeden pro každý kanál a každý s odlišným stavem uživatele.
Klíče použité pro každý z těchto předdefinovaných kbelíků jsou specifické pro uživatele a konverzaci, nebo obojí. Při nastavování hodnoty vlastnosti stavu se klíč definuje interně s informacemi obsaženými v kontextu otočení, aby se zajistilo, že se každý uživatel nebo konverzace umístí do správné kbelíku a vlastnosti. Konkrétně jsou klíče definovány následujícím způsobem:
- Stav uživatele vytvoří klíč pomocí ID kanálu a z ID. Například {Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
- Stav konverzace vytvoří klíč pomocí ID kanálu a ID konverzace. Například {Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName
- Stav soukromé konverzace vytvoří klíč pomocí ID kanálu, z ID a ID konverzace. Například {Activity.ChannelId}/conversations/{Activity.Conversation.Id}/users/{Activity.From.Id}#YourPropertyName
Kdy použít jednotlivé typy stavu
Stav konverzace je vhodný pro sledování kontextu konverzace, například:
- Jestli robot položil uživateli otázku a jaká otázka byla
- Jaké je aktuální téma konverzace nebo co bylo naposledy
Stav uživatele je vhodný pro sledování informací o uživateli, například:
- Nekritičtější informace o uživateli, jako je jméno a předvolby, nastavení budíku nebo předvolba upozornění
- Informace o poslední konverzaci s robotem
- Robot podpory produktů může například sledovat, na které produkty se uživatel zeptal.
Stav soukromé konverzace je vhodný pro kanály, které podporují skupinové konverzace, ale chcete sledovat informace specifické pro uživatele i konverzace. Pokud jste například měli klikací robota v učebně:
- Robot může agregovat a zobrazit odpovědi studentů na danou otázku.
- Robot může agregovat výkon každého studenta a soukromě ho předat zpět na konci relace.
Podrobnosti o používání těchto předdefinovaných kontejnerů najdete v článku s návody ke stavu.
Připojení k více databázím
Pokud se robot potřebuje připojit k více databázím, vytvořte pro každou databázi vrstvu úložiště. Pokud robot shromažďuje informace, které mají jiné požadavky na zabezpečení, souběžnost nebo umístění dat, můžete použít více databází.
Pro každou vrstvu úložiště vytvořte objekty správy stavu, které potřebujete k podpoře vlastností stavu.
Objekty state property accessors
Objekty state property accessors slouží ke skutečnému čtení nebo zápisu jedné z vlastností stavu a k poskytování metod get, set a delete pro přístup k vlastnostem stavu v rámci jednoho kroku. Pokud chcete vytvořit přistupující objekt, musíte zadat název vlastnosti, který se obvykle provádí při inicializaci robota. Pak můžete toto příslušenství použít k získání a manipulaci s vlastností stavu robota.
Doplňky umožňují sadě SDK získat stav z podkladového úložiště a aktualizovat mezipaměť stavu robota za vás. Mezipaměť stavu je místní mezipaměť udržovaná vaším robotem, která za vás ukládá objekt stavu a umožňuje operace čtení a zápisu bez přístupu k podkladovému úložišti. Pokud ještě není v mezipaměti, volání metody get příslušenství načte stav a také ho umístí do mezipaměti. Po načtení může být vlastnost state manipulována stejně jako s místní proměnnou.
Metoda odstranění příslušenství odebere vlastnost z mezipaměti a také ji odstraní z podkladového úložiště.
Důležité
Pro první volání metody get přístupového objektu musíte zadat metodu factory pro vytvoření objektu, pokud ještě ve vašem stavu neexistuje. Pokud není uvedena žádná metoda továrny, zobrazí se výjimka. Podrobnosti o tom, jak používat metodu továrny, najdete v článku s návody ke stavu.
Pokud chcete zachovat všechny změny, které provedete ve vlastnosti stavu, kterou jste získali od příslušenství, je nutné aktualizovat vlastnost v mezipaměti stavu. Můžete to provést voláním metody sady příslušenství, která nastaví hodnotu vlastnosti v mezipaměti a je k dispozici, pokud bude potřeba ji později přečíst nebo aktualizovat. Pokud chcete tato data skutečně zachovat v podkladovém úložišti (a zpřístupnit je tak po aktuálním otočení), musíte pak uložit svůj stav.
Jak fungují přístupové metody vlastnosti stavu
Metody přistupování představují primární způsob, jak robot může pracovat se stavem. Způsob fungování jednotlivých vrstev a interakce podkladových vrstev je následující:
- Metoda get příslušenství:
- Objekt Accessor požaduje vlastnost z mezipaměti stavu.
- Pokud je vlastnost v mezipaměti, vraťte ji. V opačném případě ho získejte z objektu správy stavu. (Pokud ještě není ve stavu, použijte metodu factory, která je uvedená v části Příslušenství get call.)
- Metoda nastavení příslušenství:
- Aktualizujte mezipaměť stavu pomocí nové hodnoty vlastnosti.
- Metoda save changes objektu správy stavu:
- Zkontrolujte změny vlastnosti v mezipaměti stavu.
- Zapište danou vlastnost do úložiště.
Stav v dialogových oknech
Knihovna dialogů používá vlastnost stavu dialogového okna definovanou ve stavu konverzace robota k zachování místa dialogového okna v konverzaci. Vlastnost stavu dialogového okna také umožňuje, aby každý dialog ukládaly přechodné informace mezi otočeními.
Adaptivní dialogy mají propracovanější strukturu rozsahu paměti, která mimo jiné usnadňuje přístup ke konfiguraci a výsledkům rozpoznávání. Správce dialogového okna používá k poskytování těchto oborů paměti objekty správy stavu uživatelů a konverzací.
Informace o knihovně dialogů najdete v článku o knihovně dialogových oken .
- Informace specifické pro tyto typy dialogových oken najdete v tématu o dialogových oknech komponent a vodopádových dialogových oknech.
- Informace specifické pro adaptivní dialogy najdete v článcích o úvodu k adaptivním dialogům a správě stavu v adaptivních dialogech .
Stav ukládání
Když zavoláte metodu sady příslušenství pro záznam aktualizovaného stavu, tato vlastnost stavu ještě nebyla uložena do trvalého úložiště a místo toho se uloží pouze do mezipaměti stavu robota. Chcete-li uložit všechny změny v mezipaměti stavu do trvalého stavu, musíte volat metodu save changes objektu správy stavu, která je k dispozici při implementaci výše uvedené třídy stavu robota (například stav uživatele nebo stav konverzace).
Volání metody save changes pro objekt správy stavu (například kontejnery uvedené výše) uloží všechny vlastnosti do mezipaměti stavu, kterou jste do tohoto okamžiku pro tento kbelík nastavili, ale ne pro žádné další kontejnery, které můžete mít ve stavu robota.
Tip
Stav robota implementuje chování "poslední zápis vyhrává", kdy poslední zápis orazítkuje předchozí stav zápisu. To může fungovat pro mnoho aplikací, ale má to důsledky, zejména ve scénářích se škálováním na více instancí, kde může být ve hře určitá úroveň souběžnosti nebo latence.
Pokud máte vlastní middleware, který může aktualizovat stav po dokončení obslužné rutiny otočení, zvažte zpracování stavu v middlewaru.