Durumu yönetme

ŞUNLAR IÇIN GEÇERLIDIR: SDK v4

Botun içindeki durum modern web uygulamalarıyla aynı paradigmalara uyar ve Bot Framework SDK’sı durum yönetimini kolaylaştırmak için bazı soyutlamalar sağlar.

Web uygulamaları gibi, botun da doğası gereği durum bilgisi yoktur; botunuzun farklı bir örneği konuşmanın herhangi bir devresini işleyebilir. Bazı botlar için bu basitlik tercih edilir; bot ek bilgi olmadan çalışabilir veya gerekli bilgilerin gelen iletide yer alacağı garanti edilir. Diğerleri için botta yararlı bir konuşma yapmak için durum bilgisi (konuşmanın kaldığı yer veya kullanıcı hakkında daha önce alınan veriler gibi) gereklidir.

Neden eyalete ihtiyacım var?

Durumu korumak, bir kullanıcı veya konuşmayla ilgili bazı şeyleri anımsayarak botunuzun daha anlamlı konuşmalar yapmasını sağlar. Örneğin, daha önce bir kullanıcıyla konuştuysanız, bir daha sormanız gerekmeyecek şekilde bu kullanıcı hakkındaki önceki bilgileri kaydedebilirsiniz. Durum ayrıca verileri geçerli dönüşten daha uzun süre tutarak botunuzun çok aşamalı konuşma boyunca bilgileri saklamasını sağlar.

Botlarla ilgili olarak, durumu kullanmak için birkaç katman vardır: depolama katmanı, durum yönetimi (aşağıdaki diyagramda bot durumunda yer alır) ve durum özelliği erişimcileri. Bu diyagramda, bir yöntem çağrısını temsil eden düz oklar ve yanıtı temsil eden kesikli oklar (dönüş değeri olan veya olmayan) ile bu katmanlar arasındaki etkileşim dizisinin bölümleri gösterilir.

Durumun her dönüşte nasıl yüklendiğini, önbelleğe alınıp depolandığını gösteren sıralı diyagram.

Bu diyagramın akışı, bu katmanların her birinin ayrıntılarıyla birlikte aşağıdaki bölümlerde açıklanmıştır.

Depolama katmanı

Durum bilgilerinin gerçekten depolandığı arka uçta başlayarak depolama katmanıdır. Bu, bellek içi, Azure veya üçüncü taraf sunucu gibi fiziksel depolama alanınız olarak düşünülebilir.

Bot Framework SDK'sı, depolama katmanı için bazı uygulamalar içerir:

  • Bellek depolama , test amacıyla bellek içi depolama uygular. Bellek içi veri depolama alanı yalnızca bu depolama geçici ve geçici olduğundan yerel test için tasarlanmıştır. Bot her yeniden başlatıldığında veriler temizlenir.
  • Azure Blob Depolama bir Azure Blob Depolama nesne veritabanına bağlanır.
  • Azure Cosmos DB bölümlenmiş depolama , bölümlenmiş cosmos DB NoSQL veritabanına bağlanır.

Önemli

Cosmos DB depolama sınıfı kullanım dışı bırakıldı. Başlangıçta CosmosDbStorage ile oluşturulan kapsayıcıların bölüm anahtarı kümesi yoktu ve "/_partitionKey" varsayılan bölüm anahtarı verildi.

Cosmos DB depolama alanıyla oluşturulan kapsayıcılar Cosmos DB bölümlenmiş depolama alanıyla kullanılabilir. Daha fazla bilgi için Azure Cosmos DB'de Bölümleme bölümünü okuyun.

Ayrıca, eski Cosmos DB depolama alanının aksine, Cosmos DB bölümlenmiş depolamanın Cosmos DB hesabınızda otomatik olarak bir veritabanı oluşturmadığını unutmayın. El ile yeni bir veritabanı oluşturmanız gerekir, ancak CosmosDbPartitionedStorage kapsayıcıyı sizin için oluşturacağı için el ile kapsayıcı oluşturmayı atlayın.

Diğer depolama seçeneklerine bağlanma yönergeleri için bkz. Doğrudan depolamaya yazma.

Durum yönetimi

Durum yönetimi , botunuzun durumunun temel depolama katmanına okunmasını ve yazmasını otomatikleştirir. Durum, botunuzun durum yönetim nesnesi aracılığıyla okuyup yazabileceği anahtar-değer çiftleri olan durum özellikleri olarak depolanır ve temel alınan belirli uygulama konusunda endişelenmenize gerek kalmaz. Bu durum özellikleri, bu bilgilerin nasıl depolandığını tanımlar. Örneğin, belirli bir sınıf veya nesne olarak tanımladığınız bir özelliği aldığınızda, bu verilerin nasıl yapılandırılacağını bilirsiniz.

Bu durum özellikleri, yalnızca bu özelliklerin düzenlenmesine yardımcı olacak koleksiyonlar olan kapsamlı "demetler" olarak birleştirilir. SDK şu üç "demet" içerir:

  • Kullanıcı durumu
  • Konuşma durumu
  • Özel konuşma durumu

Bu demetlerin tümü, farklı kapsamlara sahip diğer demet türlerini tanımlamak için türetilebilen bot durum sınıfının alt sınıflarıdır.

Bu önceden tanımlanmış demetlerin kapsamı, demete bağlı olarak belirli bir görünürlük kapsamındadır:

  • Kullanıcı durumu, konuşmadan bağımsız olarak botun söz konusu kanaldaki kullanıcıyla yakınsandığını belirten herhangi bir sırayla kullanılabilir
  • Konuşma durumu, kullanıcıdan bağımsız olarak, grup konuşmalarında olduğu gibi belirli bir konuşmada herhangi bir sırayla kullanılabilir
  • Özel konuşma durumunun kapsamı hem belirli bir konuşma hem de belirli bir kullanıcı için belirlenmiştir

İpucu

Hem kullanıcı hem de konuşma durumunun kapsamı kanala göre belirlenmiş. Botunuza erişmek için farklı kanallar kullanan kişi, her kanal için bir tane ve her biri ayrı bir kullanıcı durumuna sahip farklı kullanıcılar olarak görünür.

Bu önceden tanımlanmış demetlerin her biri için kullanılan anahtarlar kullanıcıya ve konuşmaya veya her ikisine de özeldir. Durum özelliğinizin değerini ayarlarken anahtar, her kullanıcının veya konuşmanın doğru demet ve özelliğe yerleştirildiğinden emin olmak için dönüş bağlamında yer alan bilgilerle birlikte sizin için dahili olarak tanımlanır. Özellikle, anahtarlar aşağıdaki gibi tanımlanır:

  • Kullanıcı durumu , kanal kimliğini ve kimliği kullanarak bir anahtar oluşturur. Örneğin, {Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
  • Konuşma durumu , kanal kimliğini ve konuşma kimliğini kullanarak bir anahtar oluşturur. Örneğin, {Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName
  • Özel konuşma durumu, kimlik ve konuşmakimliğinden kanal kimliğini kullanarak bir anahtar oluşturur. Örneğin, {Activity.ChannelId}/conversations/{Activity.Conversation.Id}/users/{Activity.From.Id}#YourPropertyName

Her durum türü ne zaman kullanılır?

Konuşma durumu, konuşmanın bağlamını izlemek için iyidir, örneğin:

  • Bot kullanıcıdan bir soru sorup sormadığını ve hangi sorunun bu olduğunu
  • Konuşmanın geçerli konusu nedir veya son konu neydi?

Kullanıcı durumu, kullanıcı hakkındaki bilgileri izlemek için iyidir, örneğin:

  • Ad ve tercihler, alarm ayarı veya uyarı tercihi gibi kritik olmayan kullanıcı bilgileri
  • Botla yaptıkları son konuşma hakkında bilgi
    • Örneğin, bir ürün destek botu kullanıcının hangi ürünleri sorduğunu izleyebilir.

Özel konuşma durumu, grup konuşmalarını destekleyen, ancak hem kullanıcı hem de konuşmaya özgü bilgileri izlemek istediğiniz kanallar için iyidir. Örneğin, sınıf tıklayıcı botu varsa:

  • Bot belirli bir soru için öğrenci yanıtlarını toplayabilir ve görüntüleyebilir.
  • Bot, her öğrencinin performansını toplayabilir ve oturumun sonunda bu performansı özel olarak onlara geri aktarabilir.

Önceden tanımlanmış bu demetleri kullanma hakkında ayrıntılı bilgi için durum nasıl yapılır makalesine bakın.

Birden çok veritabanına bağlanma

Botunuzun birden çok veritabanına bağlanması gerekiyorsa her veritabanı için bir depolama katmanı oluşturun. Botunuz farklı güvenlik, eşzamanlılık veya veri konumu gereksinimlerine sahip bilgiler toplarsa birden çok veritabanı kullanmayı seçebilirsiniz.

Her depolama katmanı için, durum özelliklerinizi desteklemek için ihtiyacınız olan durum yönetimi nesnelerini oluşturun.

Durum özelliği erişimcileri

Durum özelliği erişimcileri , durum özelliklerinizden birini gerçekten okumak veya yazmak ve durum özelliklerinize bir tur içinde erişmek için alma, ayarlama ve silme yöntemleri sağlamak için kullanılır. Erişimci oluşturmak için, genellikle botunuzu başlatırken gerçekleşen özellik adını sağlamanız gerekir. Ardından, botunuzun durumunun bu özelliğini almak ve işlemek için bu erişimciyi kullanabilirsiniz.

Erişimciler, SDK'nın temel alınan depolama alanından durum almasına ve sizin için botunun durum önbelleğini güncelleştirmesine olanak sağlar. Durum önbelleği, botunuz tarafından tutulan ve durum nesnesini sizin için depolayan ve temel alınan depolamaya erişmeden okuma ve yazma işlemlerine izin veren yerel bir önbellektir. Henüz önbellekte değilse, erişimcinin get yöntemini çağırmak durumu alır ve aynı zamanda önbelleğe yerleştirir. Alındıktan sonra, state özelliği aynı yerel değişken gibi işlenebilir.

Erişimcinin delete yöntemi özelliği önbellekten kaldırır ve ayrıca temel alınan depolama alanından siler.

Önemli

Bir erişimcinin get yöntemine yapılan ilk çağrı için, nesne henüz sizin durumunuzda yoksa oluşturmak için bir fabrika yöntemi sağlamanız gerekir. Fabrika yöntemi belirtilmemişse bir özel durum alırsınız. Fabrika yönteminin nasıl kullanılacağına ilişkin ayrıntılar durum nasıl yapılır makalesinde bulunabilir.

Erişimciden alınan durum özelliğinde yaptığınız değişiklikleri kalıcı hale getirmek için durum önbelleğindeki özelliğin güncelleştirilmiş olması gerekir. Bunu, önbellekteki özelliğinizin değerini ayarlayan erişimciler kümesi yöntemini çağırarak yapabilirsiniz ve daha sonra okunması veya güncelleştirilmesi gerekiyorsa kullanılabilir. Bu verileri temel alınan depolama alanında kalıcı hale getirmek (ve dolayısıyla geçerli dönüşten sonra kullanılabilir hale getirmek) için durumunuzu kaydetmeniz gerekir.

Durum özelliği erişimci yöntemleri nasıl çalışır?

Erişimci yöntemleri, botunuzun durumuyla etkileşim kurmasının birincil yoludur. Her birinin nasıl çalıştığı ve temel alınan katmanların nasıl etkileşime geçtiğini aşağıda bulabilirsiniz:

  • Erişimcinin get yöntemi:
    • Durum önbelleğinden erişimci istekleri özelliği.
    • Özellik önbellekteyse, döndür. Aksi takdirde, durum yönetimi nesnesinden alın. (Henüz durum bilgisi yoksa erişimcilerin çağrı alma bölümünde sağlanan fabrika yöntemini kullanın.)
  • Erişimcinin set yöntemi:
    • Durum önbelleğini yeni özellik değeriyle güncelleştirin.
  • Durum yönetimi nesnesinin değişiklikleri kaydetme yöntemi:
    • Durum önbelleğindeki özelliğinde yapılan değişiklikleri denetleyin.
    • Bu özelliği depolama alanına yazın.

İletişim kutularındaki durum

İletişim kutuları kitaplığı, iletişim kutusunun konuşmadaki yerini korumak için botunun konuşma durumunda tanımlanan bir iletişim durumu özellik erişimcisi kullanır. İletişim kutusu durumu özelliği, her iletişim kutusunun dönüşümler arasında geçici bilgileri depolamasına da olanak tanır.

Uyarlamalı iletişim kutuları daha ayrıntılı bir bellek kapsamı yapısına sahiptir ve bu da yapılandırma ve tanıma sonuçlarına erişmeyi kolaylaştırır. İletişim kutusu yöneticisi, bu bellek kapsamlarını sağlamak için kullanıcı ve konuşma durumu yönetim nesnelerini kullanır.

İletişim kutusu kitaplığı hakkında bilgi için iletişim kutusu kitaplığı makalesine bakın.

Durum kaydediliyor

Güncelleştirilmiş durumu kaydetmek için erişimcinin küme yöntemini çağırdığınızda, bu durum özelliği henüz kalıcı depolama alanınıza kaydedilmemiştir ve bunun yerine yalnızca botunuzun durum önbelleğine kaydedilir. Durum önbelleğindeki değişiklikleri kalıcı durumunuzla kaydetmek için, durum yönetimi nesnesinin yukarıda belirtilen bot durum sınıfının (kullanıcı durumu veya konuşma durumu gibi) uygulanmasında kullanılabilen değişiklikleri kaydetme yöntemini çağırmanız gerekir.

Durum yönetimi nesnesi (yukarıda bahsedilen demetler gibi) için değişiklikleri kaydetme yöntemini çağırmak, söz konusu demet için bu noktaya ayarladığınız durum önbelleğindeki tüm özellikleri kaydeder, ancak botunuzun durumundaki diğer demetlerin hiçbiri için kaydetmez.

İpucu

Bot durumu, son yazma işleminin önceden yazılmış duruma göre damgalandığı bir "son yazma kazanır" davranışı uygular. Bu, birçok uygulama için işe yarayabilir, ancak özellikle de bazı eşzamanlılık düzeyi veya gecikme süresi olabilen ölçeklendirilmiş senaryolarda etkileri vardır.

Sıra işleyiciniz tamamlandıktan sonra durumu güncelleştirebilecek özel ara yazılımınız varsa ara yazılımda durumu işlemeyi göz önünde bulundurun.

Ek kaynaklar