Dialogflowを使用して、「住所証明のためにHRから手紙を取得する必要があります」などのアクションアイテムでさまざまなタイプのユーザークエリに応答するエージェント/ボットを作成しています。これには、ボットが会社のデータベースから情報を取得し、人事部が提供するテンプレート化されたレターファイルに取得した情報を取り込むことでドキュメント/レターを生成する必要があります。このアクションを実行するロジックは、すでにpythonファイルに記述されています。データベースの統合はWebhookを使用して行われます。
問題は、ユーザーのリクエストを解釈し、データベースを開き、必要な情報を取得するこの完全なプロセスに5秒以上かかることです。これは、Dialogflowエージェントの応答タイムアウト制限です。これについていくつか調査を行ったところ、この制限を増やすことはできませんが、非同期呼び出しを介してセッションを維持することができます。答えを提供する適切なリソースを見つけることができません。
だから、私の質問は
Dialogflowで非同期呼び出しを行うことはできますか?
はいの場合、jsonを介してDailogflowエージェントに非同期データを送信する方法を教えてください。
この5秒の応答タイムアウト制限に対処する他の方法はありますか?
前もって感謝します!
Googleドキュメントのアクション および フルフィルメントドキュメント ページを確認しましたが、実際には5秒のタイムアウト制限があります。
これは最も良い解決策ではなく、あなたのケースに合わないかもしれませんが、与えられた厳密な5秒のウィンドウを考慮してください(ユーザーがあまりに長く待つことなく動的な会話を確実にしたいです)
最初のインテントで計算を非同期で開始し、ユーザーに戻って、数秒で結果を要求するよう指示します。その間に計算が完了します。ユーザーのプライベートスペースに保存されます。この時点で、ユーザーは2番目のインテントをトリガーし、その間に結果が事前に計算されているので、取得して返すことができます。
複数のフォローアップイベントを設定することにより、5秒のインテント制限を最大15秒まで延長できます。現在、次の3つのフォローアップイベントのみを設定できます(タイムアウトを最大15秒まで延長できます)。
フルフィルメントセンターでそれを行う方法の例を次に示します。
function function1(agent){
//This function handles your intent fulfillment
//you can initialize your db query here.
//When data is found, store it in a separate table for quick search
//get current date
var currentTime = new Date().getTime();
while (currentTime + 4500 >= new Date().getTime()) {
/*waits for 4.5 seconds
You can check every second if data is available in the database
if not, call the next follow up event and do the
same while loop in the next follow-up event
(up to 3 follow up events)
*/
/*
if(date.found){
agent.add('your data here');//Returns response to user
}
*/
}
//add a follow-up event
agent.setFollowupEvent('customEvent1');
//add a default response (in case there's a problem with the follow-up event)
agent.add("This is function1");
}
let intentMap = new Map();
intentMap.set('Your intent name here', function1);;
agent.handleRequest(intentMap);
カスタムイベントの詳細については、次のページをご覧ください。 https://dialogflow.com/docs/events/custom-events