Zarządzanie stanem

DOTYCZY: Zestaw SDK w wersji 4

Stan w botach podlega tym samym paradygmatom co w nowoczesnych aplikacjach internetowych, a zestaw Bot Framework SDK zapewnia abstrakcje ułatwiające zarządzanie stanami.

Tak jak aplikacje internetowe, bot jest z natury bezstanowy. Inne wystąpienie bota może obsłużyć dowolny przebieg konwersacji. W przypadku niektórych botów ta prostota jest preferowana — bot może działać bez dodatkowych informacji lub wymagane informacje są gwarantowane w wiadomości przychodzącej. W przypadku innych osób stan (taki jak miejsce, w którym konwersacja została przerwana lub dane wcześniej odebrane o użytkowniku) jest konieczne, aby bot miał przydatną rozmowę.

Dlaczego potrzebuję stanu?

Utrzymywanie stanu pozwala botowi na bardziej znaczące konwersacje, pamiętając pewne rzeczy o użytkowniku lub konwersacji. Jeśli na przykład rozmawiasz z użytkownikiem wcześniej, możesz zapisać poprzednie informacje o nich, aby nie trzeba było prosić o to ponownie. Stan przechowuje również dane przez dłuższy niż bieżący obrót, dzięki czemu bot przechowuje informacje w trakcie konwersacji wielowrotnej.

W odniesieniu do botów istnieje kilka warstw do używania stanu: warstwa magazynu, zarządzanie stanem (zawarte w stanie bota na poniższym diagramie) i metody dostępu właściwości stanu. Ten diagram przedstawia części sekwencji interakcji między tymi warstwami z solidnymi strzałkami reprezentującymi wywołanie metody i strzałkami przerywanymi reprezentującymi odpowiedź (z wartością zwracaną lub bez).

Diagram sekwencji ilustrujący sposób ładowania, buforowania i przechowywania każdego zwrotu stanu.

Przepływ tego diagramu wyjaśniono w poniższych sekcjach ze szczegółami każdej z tych warstw.

Warstwa magazynu

Począwszy od zaplecza, gdzie informacje o stanie są rzeczywiście przechowywane, to warstwa magazynu. Można to traktować jako magazyn fizyczny, taki jak w pamięci, platforma Azure lub serwer innej firmy.

Zestaw SDK platformy Bot Framework zawiera pewne implementacje warstwy magazynu:

  • Magazyn pamięci implementuje magazyn w pamięci na potrzeby testowania. Magazyn danych w pamięci jest przeznaczony tylko do testowania lokalnego, ponieważ ten magazyn jest niestabilny i tymczasowy. Dane są czyszczone za każdym razem, gdy bot zostanie ponownie uruchomiony.
  • Azure Blob Storage łączy się z bazą danych obiektów Azure Blob Storage.
  • Magazyn podzielony na partycje usługi Azure Cosmos DB łączy się z partycjonowaną bazą danych Cosmos DB NoSQL.

Ważne

Klasa magazynu usługi Cosmos DB została przestarzała. Kontenery utworzone pierwotnie za pomocą usługi CosmosDbStorage nie miały zestawu kluczy partycji i otrzymały domyślny klucz partycji "/_partitionKey".

Kontenery utworzone za pomocą magazynu usługi Cosmos DB mogą być używane z magazynem podzielonym na partycje usługi Cosmos DB. Aby uzyskać więcej informacji, przeczytaj artykuł Partitioning in Azure Cosmos DB (Partycjonowanie w usłudze Azure Cosmos DB ).

Należy również pamiętać, że w przeciwieństwie do starszego magazynu usługi Cosmos DB magazyn podzielony na partycje usługi Cosmos DB nie tworzy automatycznie bazy danych na koncie usługi Cosmos DB. Musisz ręcznie utworzyć nową bazę danych, ale pomiń ręcznie tworzenie kontenera, ponieważ usługa CosmosDbPartitionedStorage utworzy kontener.

Aby uzyskać instrukcje dotyczące nawiązywania połączenia z innymi opcjami magazynu, zobacz Zapisywanie bezpośrednio w magazynie.

Zarządzanie stanem

Zarządzanie stanem automatyzuje odczytywanie i zapisywanie stanu bota w bazowej warstwie magazynu. Stan jest przechowywany jako właściwości stanu, które są skutecznie parami klucz-wartość, które bot może odczytywać i zapisywać za pośrednictwem obiektu zarządzania stanem bez obaw o konkretną implementację bazową. Te właściwości stanu definiują sposób przechowywania tych informacji. Na przykład podczas pobierania właściwości zdefiniowanej jako określona klasa lub obiekt wiesz, jak te dane będą ustrukturyzowane.

Te właściwości stanu są łączone w zakres "zasobniki", które są po prostu kolekcjami, które ułatwiają organizowanie tych właściwości. Zestaw SDK zawiera trzy z tych "zasobników":

  • Stan użytkownika
  • Stan konwersacji
  • Stan konwersacji prywatnej

Wszystkie te zasobniki to podklasy klasy stanu bota , które można uzyskać, aby zdefiniować inne typy zasobników z różnymi zakresami.

Te wstępnie zdefiniowane zasobniki są ograniczone do określonej widoczności, w zależności od zasobnika:

  • Stan użytkownika jest dostępny z kolei, że bot jest zbieżny z tym użytkownikiem w tym kanale, niezależnie od konwersacji
  • Stan konwersacji jest dostępny z kolei w określonej konwersacji, niezależnie od użytkownika, na przykład w konwersacjach grupowych
  • Stan konwersacji prywatnej jest określony zarówno dla określonej konwersacji, jak i dla określonego użytkownika

Porada

Zarówno użytkownik, jak i stan konwersacji są ograniczone według kanału. Ta sama osoba korzystająca z różnych kanałów w celu uzyskania dostępu do bota jest wyświetlana jako różni użytkownicy, jeden dla każdego kanału i każdy z odrębnym stanem użytkownika.

Klucze używane dla każdego z tych wstępnie zdefiniowanych zasobników są specyficzne dla użytkownika i konwersacji lub obu tych zasobników. Podczas ustawiania wartości właściwości stanu klucz jest definiowany wewnętrznie z informacjami zawartymi w kontekście kolei, aby upewnić się, że każdy użytkownik lub konwersacja zostaną umieszczone w odpowiednim zasobniku i właściwości. W szczególności klucze są definiowane w następujący sposób:

  • Stan użytkownika tworzy klucz przy użyciu identyfikatora kanału i identyfikatora. Na przykład {Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
  • Stan konwersacji tworzy klucz przy użyciu identyfikatora kanału i identyfikatora konwersacji. Na przykład {Activity.ChannelId}/conversation/{Activity.Conversation.Id}#YourPropertyName
  • Stan konwersacji prywatnej tworzy klucz przy użyciu identyfikatora kanału, z identyfikatora i identyfikatora konwersacji. Na przykład {Activity.ChannelId}/conversation/{Activity.Conversation.Id}/users/{Activity.From.Id}#YourPropertyName

Kiedy należy używać każdego typu stanu

Stan konwersacji jest dobry do śledzenia kontekstu konwersacji, na przykład:

  • Czy bot zadał użytkownikowi pytanie i jakie pytanie było
  • Jaki jest bieżący temat konwersacji lub jaki był ostatni

Stan użytkownika jest dobry do śledzenia informacji o użytkowniku, takich jak:

  • Niekrytyczne informacje o użytkowniku, takie jak nazwa i preferencje, ustawienie alarmu lub preferencja alertu
  • Informacje o ostatniej rozmowie z botem
    • Na przykład bot pomocy technicznej produktu może śledzić, o które produkty zapytał użytkownik.

Stan konwersacji prywatnej jest dobry dla kanałów, które obsługują konwersacje grupowe, ale gdzie chcesz śledzić zarówno informacje specyficzne dla użytkownika, jak i konwersacji. Jeśli na przykład masz bota klikniętego na potrzeby zajęć:

  • Bot może agregować i wyświetlać odpowiedzi uczniów dla danego pytania.
  • Bot może agregować wydajność każdego ucznia i prywatnie przekazać je z powrotem na koniec sesji.

Aby uzyskać szczegółowe informacje na temat używania tych wstępnie zdefiniowanych zasobników, zobacz artykuł z instrukcjami dotyczącymi stanu.

Nawiązywanie połączenia z wieloma bazami danych

Jeśli bot musi nawiązać połączenie z wieloma bazami danych, utwórz warstwę magazynu dla każdej bazy danych. Możesz użyć wielu baz danych, jeśli bot zbiera informacje o różnych wymaganiach dotyczących zabezpieczeń, współbieżności lub lokalizacji danych.

Dla każdej warstwy magazynu utwórz obiekty zarządzania stanami potrzebne do obsługi właściwości stanu.

Metody dostępu właściwości stanu

Metody dostępu właściwości stanu są używane do faktycznego odczytu lub zapisu jednej z właściwości stanu i zapewniają metody pobierania, ustawiania i usuwania na potrzeby uzyskiwania dostępu do właściwości stanu z kolei. Aby utworzyć metodę dostępu, należy podać nazwę właściwości, która zwykle odbywa się podczas inicjowania bota. Następnie możesz użyć tego metody dostępu, aby uzyskać i manipulować właściwością stanu bota.

Metody dostępu umożliwiają zestawowi SDK uzyskanie stanu z magazynu bazowego i zaktualizowanie pamięci podręcznej stanu bota. Pamięć podręczna stanu to lokalna pamięć podręczna przechowywana przez bota, która przechowuje obiekt stanu, umożliwiając operacje odczytu i zapisu bez uzyskiwania dostępu do bazowego magazynu. Jeśli jeszcze nie znajduje się w pamięci podręcznej, wywołanie metody get metody get metody dostępu pobiera stan, a także umieszcza je w pamięci podręcznej. Po pobraniu właściwość stanu może być manipulowana tak samo jak zmienna lokalna.

Metoda usuwania metody metody dostępu usuwa właściwość z pamięci podręcznej, a także usuwa ją z magazynu bazowego.

Ważne

W przypadku pierwszego wywołania metody get metody dostępu należy podać metodę fabryki, aby utworzyć obiekt, jeśli jeszcze nie istnieje w stanie. Jeśli nie podano metody fabryki, otrzymasz wyjątek. Szczegółowe informacje na temat używania metody fabryki można znaleźć w artykule z instrukcjami dotyczącymi stanu.

Aby utrwały wszelkie zmiany wprowadzone we właściwości stanu uzyskiwanej z metody dostępu, należy zaktualizować właściwość w pamięci podręcznej stanu. Można to zrobić za pomocą metody zestawu akcesoriów wywołania, która ustawia wartość właściwości w pamięci podręcznej i jest dostępna, jeśli trzeba je odczytać lub zaktualizować w dalszej części tego roku. Aby rzeczywiście utrwalać te dane w magazynie bazowym (a tym samym udostępnić je po bieżącej kolei), należy następnie zapisać stan.

Jak działają metody dostępu właściwości stanu

Metody dostępu są podstawowym sposobem interakcji bota ze stanem. Jak działają poszczególne warstwy i jak działają podstawowe warstwy, są następujące:

  • Metoda get metody dostępu:
    • Właściwość Żądania dostępu z pamięci podręcznej stanu.
    • Jeśli właściwość znajduje się w pamięci podręcznej, zwróć ją. W przeciwnym razie pobierz go z obiektu zarządzania stanem. (Jeśli nie jest jeszcze w stanie, użyj metody fabrycznej podanej w metodzie get accessors get call).
  • Metoda zestawu metod dostępu:
    • Zaktualizuj pamięć podręczną stanu przy użyciu nowej wartości właściwości.
  • Metoda zapisywania zmian obiektu zarządzania stanem:
    • Sprawdź zmiany właściwości w pamięci podręcznej stanu.
    • Zapisz właściwość w magazynie.

Stan w oknach dialogowych

Biblioteka okien dialogowych używa metody dostępu do właściwości stanu okna dialogowego zdefiniowanego w stanie konwersacji bota, aby zachować miejsce okna dialogowego w konwersacji. Właściwość stanu okna dialogowego umożliwia również każdemu okno dialogowemu przechowywanie przejściowych informacji między kolei.

Okna dialogowe adaptacyjne mają bardziej rozbudowaną strukturę zakresu pamięci, co ułatwia między innymi dostęp do wyników konfiguracji i rozpoznawania. Menedżer okien dialogowych używa obiektów zarządzania stanem konwersacji i użytkownika w celu zapewnienia tych zakresów pamięci.

Aby uzyskać informacje o bibliotece okien dialogowych, zobacz artykuł dotyczący biblioteki okien dialogowych .

Zapisywanie stanu

Gdy wywołasz metodę zestawu metod dostępu w celu zarejestrowania zaktualizowanego stanu, ta właściwość stanu nie została jeszcze zapisana w magazynie utrwalonego i zamiast tego zostanie zapisana tylko w pamięci podręcznej stanu bota. Aby zapisać zmiany w pamięci podręcznej stanu w stanie utrwalonego, należy wywołać metodę zapisywania zmian obiektu zarządzania stanem, która jest dostępna w implementacji klasy stanu bota wymienionej powyżej (np. stanu użytkownika lub stanu konwersacji).

Wywołanie metody zapisywania zmian dla obiektu zarządzania stanem (na przykład zasobników wymienionych powyżej) zapisuje wszystkie właściwości w pamięci podręcznej stanu skonfigurowanej do tego punktu dla tego zasobnika, ale nie dla żadnego z innych zasobników, które mogą znajdować się w stanie bota.

Porada

Stan bota implementuje zachowanie "ostatniego zapisu wygrywa", w którym ostatni zapis będzie stemplować nad wcześniej zapisanym stanem. Może to działać w przypadku wielu aplikacji, ale ma to wpływ, szczególnie w scenariuszach skalowanych w poziomie, gdzie może wystąpić pewien poziom współbieżności lub opóźnienia w grze.

Jeśli masz niestandardowe oprogramowanie pośredniczące, które może aktualizować stan po zakończeniu obsługi kolei, rozważ obsługę stanu w programie pośredniczącym.

Dodatkowe zasoby