🤖

botpressのセッションタイムアウト周り(1)

2022/05/18に公開

概要

botpressで作成したbotが、ユーザーとの対話中に得た情報を保存できるsessionメモリ周りの動きを追ったメモ(前半)です。 主に以下の事を調査します。

  • セッション有効期間の設定はどこを調整すればよいのか
  • セッションデータの保存先がどこか

botpressのバージョンはv12.27.0です
https://github.com/botpress/botpress/tree/v12.27.0

Botpressのメモリ

ボットがユーザーに回答を返すために、一連の会話の流れで得た情報を保存しておきた場合があります。 例えば以下のようなデータが、回答の生成に必要になったりします。

  • 一連のやりとりでユーザーの入力から得た情報
  • 対話中に外部サービスを呼び出した結果のデータ

4種類のメモリ

botpressではそのようなデータの保存に4種類のスコープでメモリを用意しています。

  • user
  • session
  • temp
  • bot

各メモリについては、Flow MemoryのVariablesに記載があります。

今回見ていきたい、sessionメモリーについては、「設定された期間データを保持」と説明があります。こちらの保存先、期間設定方法について見ていきます。

タイムアウトのハンドリング処理から追う

セッションタイムアウト時にボットに応答させたり、処理する方法は、 Flow LifecycleのSession Timeoutに3つ記載されています。
(タイムアウトフローによる動作は確認したが、それ以外は私は未確認)

  • timeoutという名称のノードをフローに作成する
  • タイムアウトフローを作成する(timeoutというフローを作成)して、エントリーノードに動作を設定
  • *.flow.jsonにtimeoutNodeとうプロパティと追加して、タイムアウト処理するノード名を記載

DialogJanitorクラス

「timeoutNode」を参照している箇所をソースから探すと、 processTimeoutというメソッドが見つかりそこから遡ると下記フローになり、 setIntervalで定期的によばれる形のようです。

シーケンス図

DialogJanitorクラスのrunTaskメソッドを見ると、このあたりが削除周りの処理を行なっていそうです。
https://github.com/botpress/botpress/blob/ea35dcf747756691f376d3b35a4f614c925d1b2b/packages/bp/src/core/dialog/janitor.ts#L49-L70

セッションの削除処理

runTaskメソッドから呼び出している、deleteExpiredSessionsメソッドでセッション削除を行なっていました。
https://github.com/botpress/botpress/blob/ea35dcf747756691f376d3b35a4f614c925d1b2b/packages/bp/src/core/dialog/sessions/session-repository.ts#L104-L109

dialog_sessionsテーブルのsession_expiryカラムが現在時刻より前のレコードを削除する処理のようです。(以下のようなSQLになる)

sql
delete from
	`dialog_sessions`
where
	session_expiry < '現在時刻’ 

ということは、セッションメモリの保存先はdialog_sessionsテーブルになりそうです。
また、session_expiryカラムに値をセットする処理追ってみると、どの設定をするとセッションの期限が設定できるのか特定できそうです。

まとめ

  • セッションメモリの保存先はdialog_sessionsテーブル
  • dialog_sessionsテーブルのsession_expiryカラムに有効期限が設定されている

後半

runTaskメソッドから呼び出している、getExpiredContextSessionIdsメソッドを追います。

参考

Discussion