フロー
フローは、タスクまたはユーザーが実行するタスクの一部を完了するためのユーザーとの対話を定義するスキル・ダイアログ・フローの一部です。
フローの一般的な例を次に示します。
- インテント駆動フロー。スキルで定義された各インテントには、'Order Pizza'、'Send Money'または'Create Expense'などのフローが関連付けられています。
- ユーザー承認、新規ユーザーのオンボーディング、ロギング、ユーザー支援の提供などのタスクのサポート・フローまたはユーティリティ・フロー。このようなフローは、複数のフローから起動できます。
たとえば、Order PizzaやSend Moneyなどのフローから呼び出す「Create Account(アカウントの作成)」サブフローを設定できます。
フロー・タイプ
一般的に、フローは次のタイプに分類されます。
- メイン・フロー
- インテント・フロー。
- 組込みイベントおよびシステム遷移のフロー。
- 最上位のフローで使用できるサブフロー。
メイン・フロー
ビジュアル・フロー・デザイナで作成されたダイアログ・フローでは、各ダイアログ・フローに、次の構成に使用される単一のメイン・フローがあります。
- イベントとフロー間のマッピング。
- スキルのすべてのフローで使用できるグローバル・コンテキスト変数。
Freemarker式を使用してそのような変数にアクセスする場合は、式で変数名の先頭に
skill.
を付けます。これらのスキル・レベルの変数は、ユーザー・セッションの期限が切れた後にクリアされます。セッションの有効期限はチャネル・レベルで構成されており、通常はデフォルトで24時間です。
メイン・フローは実際にはそのようなフローではありません。かわりに、これはスキルのコントロール・センターであり、ユーザーは、解決されたインテントにマップされる専用フローに転送されます。メイン・フロー構成には、インテントが解決されるたびにインテントおよびエンティティ一致の結果が移入される事前定義済のskill.system.nlpresult
変数が含まれており、これにより、制御を個々のフローに渡すことができます。
インテント・フロー
ビジュアル・フロー・デザイナを使用してダイアログ・フローを設計する場合は、インテントにマップするフローを作成します。すべての通常のインテント(回答インテントではないインテント)をフローにリンクする必要があります。
回答インテントでは、次のアプローチのいずれか(または組合せ)を使用できます。
- 単一のフローを作成し、Answer Intent組込みイベントにマップします。
- 特定の回答インテントの個別のフローを作成します。
このアプローチでは、特定のプロンプトまたは質問を各回答の前または後に置くことができます。
また、回答インテントのフローをまったく指定しないオプションもあります。その場合は、ダイアログ・フローが直接関与せずにユーザーに回答が与えられます。
変数とスコープ
ビジュアル・フロー・デザイナでは、次の2つのレベルで変数を定義できます。
- 個々の流れの中でこのレベルで定義された変数には、定義されているフロー内からのみアクセスできます。
フロースコープ変数は、サブフローや呼び出しフローからも、定義されるフローの外部から直接アクセスすることはできません。ただし、フローに定義された変数との間で値を渡す入出力パラメータを定義できます。
フローが終了すると、変数値はリセットされます。
ほとんどの変数は、このレベルで定義する必要があります。フロー変数を定期的に使用することで、フローをより自己完結型にします。これにより、フローの再利用が容易になり、分離テストが容易になり、他のフローのバグによって悪影響を受ける可能性が低くなります。
- メイン・フロー内。ここで定義される変数には、スキル全体(グローバル)のスコープがあり、これは、スキル内のすべてのフローからアクセスできます。
これらのグローバル変数の値は、ユーザーのセッションをスキルとともに継続します。変数は、スキルを持つユーザー・セッションが終了するとクリアされます。これは、次のいずれかが発生したときに発生します:
- ユーザーがチャット・ウィンドウを閉じます。
- セッションは、非アクティブ期間(チャネル・レベルで定義され、通常は24時間)後にタイムアウトします。
- デジタル・アシスタントのコンテキストでは、ユーザーはスキルを終了するか、別のスキルを直接呼び出す状態に到達します。
ノート
ユーザーがシーケンス入力以外の会話を割り込みし、一時的に別のスキルにルーティングされた場合、デジタル・アシスタントは元のスキルのコンテキストに残り、その変数は自動的にクリアされません。この場合、中断後にユーザーが元のスキルに戻ると、変数には値が保持されます。ユーザーが元のスキルに戻らないように選択した場合、元のスキルは終了し、変数はクリアされます。
これらのスキル・スコープ変数の使用は、共有コンテキストを必要とする変数に制限する必要があります。たとえば、食品配送スキルでは、ユーザーがセッションで行ったすべての注文のリストにスキルレベルの変数が必要になる場合があります。
共通レスポンス・コンポーネントおよび変数設定コンポーネントでは、ユーザーまたはプロファイル・スコープの変数を作成することもできます。このような場合、コンポーネントの「変数」プロパティに直接ドロップダウンを使用して変数を作成します(プロパティの横にある「作成」ボタンではなく)。「他の変数タイプ」を参照してください。
変数値は、変数に対して宣言された型と一致する必要があります。変数に宣言された型と一致しない値が割り当てられている場合、実行時エラーが発生します。
ビジュアル・フロー・デザイナでは、宣言時に変数に初期値を割り当てることができます。(これは、初期値を設定するために
System.SetVariable
コンポーネントを使用する必要があるYAMLベースのダイアログ・フローでは異なります。)
YAMLベースのダイアログ・フローに使用する開発者用ノート
OBotMLコード・エディタを使用してダイアログ・フローを設計する場合、ビジュアル・フロー・デザイナを使用して作成するフローについて次のことを知っておく必要があります。
- ビジュアル・フロー・デザイナで使用可能な
return
遷移はありません。フローの最後の状態に達すると、フローの変数は自動的にクリアされます(ただし、スキル・レベルの変数はセッションの最後までアクティブのままです)。
- 状態遷移は、
next
遷移または遷移アクションを介してのみ定義できます。デザイナを使用してフローに状態を挿入すると、適切な
next
遷移がその状態および前の状態に挿入されます。状態の順序に基づく暗黙的な遷移は許可されません。一致する遷移が見つからない場合は、ランタイム・エラーがスローされます。
- FreeMarker式を直接使用して、コンポーネント内の遷移のターゲット状態を条件付きで定義することはできません。ターゲットの状態を条件付きで指定するには、Switchコンポーネントをフローに挿入して式を保持し、式の結果に基づいてアクションの遷移を定義します。
フローの設計
フローの作成
トランザクション・フローのインテント・イベントであるか、ユーティリティ・フローの組込みイベントであるかに関係なく、任意のタイプのイベントをマップする前に、最初にフロー自体を作成する必要があります。フローに最終的に割り当てるマッピングによって、そのスコープがスキル全体に及ぶか、フローにのみ及ぶかが決まります。
フローを作成するには、「+フローの追加」をクリックします。
エディタには、フロー開始ノードが移入されます。ここから流れを作り出す。エディタには「イベント」ノードも含まれており、ダイアログ・エラー、順不同のユーザー・メッセージ、予期しないユーザー入力および認証を処理するシステム遷移イベントのサブフローを定義します。
図df-2-0-initial-flow.pngの説明
フローは、実際のエンド・フロー状態なしで(暗黙的に)終了できますが、必要な値を別のフローに渡す出力パラメータを定義した場合は、これらの出力パラメータを指定するエンド・フロー状態を追加する必要があります。
ヒント:
「検証」をクリックし、フローの作成時に結果を確認します。.
スキル・レベルの変数の作成
- 「メイン・フロー」→「スキル変数」を選択します。
- 「+変数の追加」をクリックし、ダイアログを完了します。
- 変数型をエンティティ、プリミティブ型、またはリスト(JSON配列)またはマップ(JSONオブジェクト)として選択します。変数がエンティティ(カスタムまたは組込み)を参照する場合は、選択したエンティティの変数に名前を付けてダイアログを完了します。
ノート
エンティティ・イベント・ハンドラまたはカスタム・コンポーネントで設定または作成される変数の変数を作成する必要があります。 - 必要に応じて、初期値(デフォルト)を入力します。これは、単一値(ブール値の場合は
false
、整数の場合は4
)、式(文字列の場合はlist.ManageAccounts.addAccount
など)、またはJSONオブジェクト(次のリスト・オブジェクトに示すように、キーと値を二重引用符("
)で囲むオブジェクト)です。
このスニペットは、配列内のリスト型変数のデフォルト値を示しています。[ { "pizzaType":"Veggie", "price":"10 USD" } ]
ヒント:
変数の初期値を設定する場合、フローに初期値を指定するために変数の設定状態を追加する必要はありません。
開始状態の指定

開始状態は、フロー内で最初に実行される状態です。開始状態より前にある他の状態がある場合、フローはそれらの状態をスキップし、それらの状態は実行されません。
状態の追加
図df-2-0-initial-flow.pngの説明
フロー開始ノードから、まずメニューをクリックし、「状態の追加」ダイアログで選択した状態を挿入して、「開始状態の追加」をクリックして状態を構築できます。
図df-2-0-add-state-dialog.pngの説明
状態間の状態の挿入
- 2つの状態を接続する遷移線をクリックし、
をクリックして「状態の追加」メニューを開きます。遷移行には、状態間の遷移のタイプ(
next
など)が示されています。 - 「次の遷移」メニューから「状態の追加」を選択するか、アクションの「遷移先」メニューを選択して、その場で状態を作成します。
状態のプロパティの編集
状態をクリックすると、プロパティ・エディタが開き、コンポーネントの構成と遷移が設定されます。
図df-2-0-start-state-properties.pngの説明
出力状態のプロパティ・エディタは、文字列を出力するための送信メッセージ・コンポーネントです。
図df-2-0-start-state-component-page.pngの説明
状態の削除
状態を削除するには、そのタイルにカーソルを置き、をクリックして「削除」を選択します。
警告:
状態を削除すると、意図しない結果になる可能性があります。状態を削除すると、その状態はフローに表示されるすべての場所から完全に削除されます。間違った状態を削除すると、復元できます。- メニューから「状態の削除」を選択します。
- 確認ダイアログで、「削除」をクリックします。
エラーの状態を削除した場合は、「元に戻す」をクリックします。
ヒント:
フロー内の状態の1つの出現のみを削除する場合は、遷移の値を前の状態から変更することで、フローのその部分から切断できます。削除済状態のリストア
誤って状態を削除してから、状態を元に戻したいことに気付いた場合は、ビジュアル・フロー・デザイナに残り、他の変更を行っていないかぎり、状態を復元できます。手順は次のとおりです:
- 状態が削除されたことを確認するダイアログを見つけます。これは画面の左下に表示され、次のスクリーンショットのようになります。
- 「元に戻す」をクリックします。
「Disconnected」状態の再接続
開発の過程で、遷移を変更することによって状態間の休憩を引き起こす可能性があります。この時点で、フローから分割されたフローの部分は、「切断済」という名前のタイル内にパークされ、「イベント」タイルの下に表示されます。
切断されたフローの一部を作業フローに再接続するには、作業フローの遷移として切断された状態の名前を指定します。手順は次のとおりです:
- 切断された状態が不明な場合は、「切断済」タイルをダブルクリックして、フローから切断された状態を表示します。
- プロパティ・インスペクタを開くために、現在切断されている状態に移行する状態のタイルを選択します。
- プロパティ・インスペクタで、「トランジション」タブを選択します。
- 次の遷移を使用している場合は、「次の遷移」ドロップダウンから切断状態を選択します。
- アクション遷移を使用している場合は、状態に使用する遷移の「編集」(
)をクリックし、「遷移先」の値を接続先の状態に変更します。
新しい最初の状態の挿入

- 起動ノードの状態にマウス・ポインタを重ねると、メニュー
が起動します。
- 「前の状態の追加」を選択します。
- 「状態の追加」ダイアログからテンプレートを選択します。デフォルトの
Next
遷移を選択するか、遷移アクションを作成できます。遷移アクションは、後でプロパティ・エディタで構成できます。 - 前の状態を挿入した後、メニューから「起動状態にする」を選択して、開始ノードとして割り当てることができます。
状態のコピー
- コピーする状態のメニュー
をクリックし、「状態のコピー」を選択します。状態の位置および他の状態との関係に応じて、1つの状態またはブランチ全体を選択できます。
- ターゲット・フロー(現在のフローまたはスキル内の別のフロー)を選択します。次に、「コピー」をクリックします。個別のフローを選択する場合、選択に関連付けられている変数はそのフローにコピーされます。
- 切断されたノードを開き、状態をフローに接続する遷移を設定します。コピーされた状態に基づいて新しいフローを作成する場合は、選択した状態に対して「開始状態にする」を選択します。ノート
現在のフローにコピーされた状態は、1の元の状態と区別されます。たとえば、cancelOrder
のコピーはcancelOrder1
です。