Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
URČENO 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 pracovat bez dalších informací nebo požadované informace jsou zaručené, že budou v příchozí zprávě. Pro ostatní je nutné, aby bot měl k dispozici informace (například kde konverzace skončila nebo data dříve přijatá o uživateli), aby mohl vést užitečný rozhovor.
Proč potřebuji stát?
Udržování stavu umožňuje robotovi mít smysluplnější konverzace tím, že si zapamatuje určité věci o uživateli nebo konverzaci. Pokud jste například dříve mluvili s uživatelem, můžete o něm uložit předchozí informace, abyste je nemuseli znovu žádat. Stav také uchovává data po delší dobu, než je aktuální tah, aby robot uchovával informace v průběhu víceotáčkové konverzace.
Vzhledem k tomu, že se týká robotů, existuje několik vrstev použití stavu: vrstva úložiště, správa stavu (obsažená ve stavu robota v diagramu níže) 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é šipky představující 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 se informace o stavu skutečně ukládají, je vrstva úložiště. Můžete si to představit jako fyzické úložiště, jako je například v paměti, Azure nebo server třetí strany.
Sada SDK služby Bot Framework zahrnuje některé implementace vrstvy ú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é pro místní testování pouze v případě, že je toto úložiště nestálé a dočasné. Data se vymažou při každém restartování robota.
- Azure Blob Storage se připojuje k objektové databázi služby Azure Blob Storage.
- Dělené úložiště Azure Cosmos DB se připojuje k dělené databázi NoSQL služby Cosmos DB.
Důležité
Třída úložiště Cosmos DB je zastaralá. Kontejnery původně vytvořené pomocí CosmosDbStorage neměly nastavený klíč oddílu a byl jim přidělen výchozí klíč oddílu "/_partitionKey".
Kontejnery vytvořené s úložištěmCosmos DB je možné použít s děleným úložištěm Cosmos DB. Další informace najdete v článku 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 se dělené úložiště Cosmos DB automaticky nevytvoří databázi v rámci vašeho účtu Cosmos DB. Potřebujete vytvořit novou databázi ručně, ale přeskočit ruční vytvoření kontejneru, protože CosmosDbPartitionedStorage za vás kontejner vytvoří.
Pokyny k připojení k jiným možnostem úložiště najdete napsat přímo do úložiště.
Správa 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 efektivně 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 uložení 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.
Stavové vlastnosti jsou seskupeny do definovaných "bloků", které slouží k uspořádání těchto vlastností. Sada SDK obsahuje tři z těchto částí.
- Stav uživatele
- Stav konverzace
- Soukromý stav konverzace
Všechny tyto kbelíky jsou podtřídy třídy stav bota, které lze odvodit k definování jiných typů kbelíků s různými obory.
Tyto předdefinované kontejnery jsou vymezeny na určitou viditelnost v závislosti na kontejneru:
- Stav uživatele je dostupný v každém okamžiku, kdy robot komunikuje s tímto uživatelem na daném kanálu, bez ohledu na konkrétní konverzaci.
- Stav konverzace je k dispozici v jakékoli konverzaci bez ohledu na uživatele, například ve skupinových konverzacích.
- Stav soukromé konverzace je vymezený na konkrétní konverzaci i na konkrétního uživatele.
Návod
Stav uživatele i konverzace jsou vymezeny podle kanálu. Stejná osoba, která používá různé kanály pro přístup k robotovi, 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žívané pro každý z těchto předdefinovaných kontejnerů jsou specifické pro uživatele a konverzaci nebo obojí. Při nastavování hodnoty stavové vlastnosti je klíč interně definován s informacemi obsaženými v kontextu konverzace, aby se zajistilo, že každý uživatel nebo konverzace je umístěn do správného sektoru a vlastnosti. Konkrétně jsou klíče definovány takto:
- Stav uživatele vytvoří klíč pomocí ID kanálu a ID zdroje. 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
- Soukromý stav konverzace vytvoří klíč pomocí ID kanálu, ID a ID konverzace. Například {Activity.ChannelId}/conversations/{Activity.Conversation.Id}/users/{Activity.From.Id}#YourPropertyName
Kdy použít každý typ stavu
Stav konverzace je vhodný pro sledování kontextu konverzace, například:
- Jestli robot požádal uživatele o otázku a o jakou otázku se jedná
- Jaké je aktuální téma konverzace nebo jaké bylo to poslední.
Stav uživatele je vhodný pro sledování informací o uživateli, například:
- Nekritické informace o uživateli, například jméno a předvolby, nastavení alarmu nebo předvolba upozornění
- Informace o poslední konverzaci, kterou měli s robotem
- Robot podpory produktu může například sledovat, o kterých produktech se uživatel zeptal.
Soukromý stav konverzace je vhodný pro kanály, které podporují skupinové konverzace, ale tam, kde chcete sledovat informace specifické pro uživatele i konverzace. Například kdybyste měli klikacího robota do třídy:
- Robot může agregovat a zobrazovat odpovědi studentů na danou otázku.
- Robot by mohl shrnout výkon každého studenta a soukromě mu sdělit informace současně s koncem hodiny.
Podrobnosti o používání těchto předdefinovaných kontejnerů najdete v návodu, jak používat stavové články.
Připojení k více databázím
Pokud se váš 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 o různých potřebách zabezpečení, souběžnosti nebo umístění dat, můžete se rozhodnout 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.
Metody přístupu ke vlastnostem státu
Přístupové objekty vlastností stavu se používají ke skutečnému čtení nebo zápisu jedné z vlastností stavu a poskytují metody get, set a delete pro přístup k vlastnostem stavu v rámci turnu. Pokud chcete vytvořit přístupové objekty, musíte zadat název vlastnosti, který se obvykle provádí při inicializaci robota. Tento přístupový prvek pak můžete použít k získání a manipulaci s danou vlastností stavu vašeho robota.
Přistupovací prvky umožňují sadě SDK získat stav ze základního úložiště a za vás aktualizovat mezipaměť stavu robota. Mezipaměť stavu je místní mezipaměť udržovaná vaším robotem, který ukládá objekt stavu za vás 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řístupového objektu načte stav a umístí ho také do mezipaměti. Po načtení může být vlastnost stavu manipulována stejně jako s místní proměnnou.
Metoda delete přístupového objektu odebere vlastnost z mezipaměti a také ji odstraní z podkladového úložiště.
Důležité
Při prvním volání metody get přístupového objektu musíte poskytnout tovární metodu, která vytvoří objekt, pokud ještě neexistuje ve vašem objektu. Pokud není uvedena žádná tovární metoda, zobrazí se výjimka. Podrobnosti o použití tovární metody naleznete v návodu, jak pracovat se stavem.
Chcete-li zachovat všechny změny provedené ve vlastnosti stavu, kterou získáte z přístupového objektu, musí být vlastnost v mezipaměti stavu aktualizována. Můžete to provést voláním metody set přístupových objektů, která nastaví hodnotu vaší vlastnosti v mezipaměti a zůstane k dispozici pro případné pozdější přečtení nebo aktualizaci. Pokud chcete tato data skutečně zachovat v podkladovém úložišti (a zpřístupnit je tak po aktuálním turnu), musíte pak uložit svůj stav.
Jak fungují metody pro přístup k vlastnostem stavu
Metody přístupu představují primární způsob, jak váš bot interaguje se stavem. Jak jednotlivé vrstvy fungují a jak interagují podkladové vrstvy, jsou následující:
- Metoda get přístupového objektu:
- Accessor žádá o vlastnost z mezipaměti stavu.
- Pokud je vlastnost v mezipaměti, vraťte ji. Jinak ho získejte z objektu správy stavu. (Pokud ještě není v požadovaném stavu, použijte tovární metodu poskytnutou v akcesorech při volání get.)
- Metoda nastavení přístupových objektů:
- Aktualizujte mezipaměť stavu novou hodnotou vlastnosti.
- Metoda uložení změn objektu správy stavu:
- Zkontrolujte změny vlastnosti v mezipaměti stavu.
- Zapište atribut do úložiště.
Stav v dialogových oknech
Knihovna dialogů používá přístupový objekt vlastnosti stavu dialogu, který je definován ve stavu konverzace bota, aby udržela místo dialogu v konverzaci. Vlastnost stavu dialogového okna také umožňuje každému dialogovému okně ukládat přechodné informace mezi jednotlivými otočeními.
Adaptivní dialogy mají složitější strukturu rozsahu paměti, která mimo jiné usnadňuje přístup k výsledkům konfigurace a rozpoznávání. Správce dialogových oken používá objekty správy stavu uživatelů a konverzací k poskytování těchto oborů paměti.
Informace o knihovně dialogů najdete v článku knihovny dialogů.
- Informace specifické pro tyto typy dialogů najdete v dialogových oknech komponent a vodopádů .
- Informace specifické pro adaptivní dialogy najdete v článcích o úvodu do adaptivních dialogů a o správě stavu v adaptivních dialozích.
Uložení stavu
Když zavoláte metodu nastavení přístupového objektu k zaznamenání aktualizovaného stavu, tato vlastnost stavu ještě nebyla uložena do vašeho trvalého úložiště a místo toho je uložena pouze do mezipaměti stavu robota. Chcete-li uložit všechny změny v mezipaměti stavu do trvalého stavu, je nutné volat metodu save changes objektu správy stavu, která je k dispozici při implementaci třídy stavu robota uvedené výše (například stav uživatele nebo stav konverzace).
Volání metody save changes pro objekt správy stavu (například kontejnery uvedené výše) ukládá všechny vlastnosti do mezipaměti stavu, kterou jste pro tento bod nastavili, ale ne pro žádný z ostatních kontejnerů, které můžete mít ve stavu robota.
Návod
Stav robota implementuje chování "poslední zápis vyhrává", kde poslední zápis přepíše dříve uložený stav. To může fungovat pro mnoho aplikací, ale má to vliv, zejména ve scénářích se škálováním na více instancí, kde může existovat určitá úroveň souběžnosti nebo latence.
Pokud máte nějaký vlastní middleware, který může po dokončení obslužné rutiny otáčení aktualizovat stav, zvažte zpracování stavu v middlewaru.