Rule Intents(ルールインテント)
Rule Intentsを使用すると、高度なルールを使用して、ユーザーが何を望んでいるかを理解することができます。ユーザーの発言を理解するためにさまざまなMachine Learning(機械学習)テクニックを使用するMachine Learning Intents(機械学習インテント)を使用するだけで、多くの場合対応できます が、これ以上に強力な機能が必要な場合もあります。
たとえば、ユニバーサル言語を使用していて、特定のデータ入力にIntentをマッチさせたい場合や、Intentをトリガーする前に、コンテキストに特定のエントリがあることを確認したい場合などです。
概念
Rule Intentsは、Machine Learning Intents(機械学習インテント)と同じように、FlowエディタのNLUタブで作成します。Intentを作成したら、[Example Sentences(例文セクション)]のすぐ下にある[Rules(ルール)]セクションで、このIntentのルールを設定できます。Intentでルールを使用する場合、例文は必須ではなく、省略できます。ただし、ルールと組み合わせて例文を使用することもできますが、これについては後で詳しく説明します。
Rule Intentsには以下のものが必要です:
アイテム | 説明 |
Intent名 | Intentの一意の名前 |
ルール | このIntentに関する一連のルール(最低 1 つのルール) |
ルールの記述
各Intentには任意の数のルールをアタッチすることができます。ルールは Direct CognigyScript として記述されるため、CognigyScript タグは必要ありません。そのため、Inputオブジェクトまたは Contextオブジェクト(例えば input.text === “restart”)を使用してルールを記述し、自由形式のJavaScriptを使用することができます。ルールはいくつでも作成でき、どれか1つでもマッチすれば、Intentはスコア1で返されます。
![](https://cognigy.tdse.jp/wp/wp-content/uploads/2024/02/b23c4c5-rules-700x140.png)
Rule Intentの例
IntentはorderFoodで、ルールは以下を含みます。
・input.text === “I want to order pizza”
・input.slots.food[0].keyphrase === “pizza” && input.slots.food.length === 1
・input.text === `${input.slots.male_firstname[0].keyphrase} wants cake`
・input.text.split(” “)[0] === “Add” && input.text.match(“to favorites”)
どのルールが優先されるか
Rule IntentはML Intentより優先されます。つまり、Rule IntentとML Intentの両方がトリガーされるような文章をユーザーが発言した場合、Rule Intentが優先されます。
複数のIntentのルールが同時に適用される場合、FlowとそのアタッチFlow内のRule Intentの順序が、どのIntentが優先的にトリガーされるかの鍵を握ります。ルールを扱う際に覚えておくべき原則が3つあります:
- リストの下位にあるRule Intentsが最初に来る
- 子が2番目に来る
- アタッチFlowは、作成または配置された順に、3番目に来る
例として、異なる階層レベルに複数の Intentを持つ Flowを有するエージェントを考えてみましょう。また、このFlowには、それぞれ独自のIntentを持つ2つのFlowがアタッチされています:
Main Flow
├── Intent A
│ └── Intent A.1
│ └── Intent A.2
└── Intent B
Attached Flow 1
└── Intent C
└── Intent C.1
└── Intent C.2
Attached Flow 2
└── Intent D
1.リストの下位にあるRule Intentsが最初に来る
Intent A.2
と Intent B
の両方に、input.text.includes("foo bar")
というルールがあるとします。エージェントに 「This text includes foo bar」 というメッセージを送信すると、Intent のリストの最後にある Intent B
が優先され、トリガーされます。
2.子が2番目に来る
Intent A.1
と Intent A.2
の両方に、input.text.includes("foo bar")
というルールがあるとします。エージェントに「This text includes foo bar 」というメッセージを送信すると、階層で最も深い子である Intent A.2
が優先され、トリガーされます。
3.アタッチFlowは、作成または配置された順に、3番目に来る
Intent A
、Intent B
、Intent C
、Intent D
にそれぞれinput.text.includes("foo bar")
というルールがあるとします。2の原則を思い出してください。エージェントに「This text includes foo bar」というメッセージを送ると、リストの最後にある子が優先され、トリガーされます。
ここで、Intent A
と Intent B
のルールを削除するとします。エージェントに上記のメッセージを送信すると、Intent C
がトリガーされます。アタッチFlowのIntentを最後に考慮するためですが、対応する順序で考慮されます。もし、Intent D
がIntent C
より前に来るように、ユーザーインタフェースでIntent C
とIntent D
の場所を入れ替えたとすると、Intent D
がトリガーされます。
最後の例として、Intent C.2
とIntent D
の両方にinput.text.includes("foo bar")
というルールがあるとします。エージェントに「This text includes foo bar 」というメッセージを送信すると、Intent C.2
がトリガーされます。アタッチFlow1全体が、アタッチFlow2
のどのIntentよりも優先されるからです。
しきい値
Rule Intentは、マッチすれば常にスコア1となります。したがって、しきい値は適用されません。
Rule Intentsの良い使用例とは?
ある特定のトピックについて、一般的なレベルでユーザーに情報を提供したいとします。例えば、「糖尿病」のような特定の病気に関する情報です。この病名は、他のIntentの例文に表示される可能性は非常に低く、そのIntentのユーザー入力の大部分に表示されるはずです。
さらに、ユーザーが他の病気についての情報を求めているときに「糖尿病」が言及されることはほとんどありません。
良いRuleの例
このユースケースの場合、以下のルールで、さまざまなユーザー入力を十分にカバーできます。
ci.text.includes("diabetes")
このルールでは、” “で区切られていない単語の組み合わせであっても、”diabetes” という文字列を含むユーザー入力はIntentをトリガーします。
悪いRuleの例
以下のルールは、例文が1つしかないML Intentよりも悪くなります。
ci.text === "I want information about diabetes"
これはこの正確な文にのみ有効で、” “(半角スペース)の代わりに” “(全角スペース)を入れたり、最後に感嘆符を入れたりしても、Intentがトリガーされることはありません。
Rule Intentsの悪い使用例とは?
関連性が高く、多様な語彙で発話する複数のIntentがあるとします。適切な例は、医療チャットボットに症状を報告する場合です。「胸が痛い」と言うのか、「呼吸していると痛い」と言うのか、「呼吸が苦しい」と言うのかでは、大きな違いがあります。この場合、ML Intentを使う方が、適切なRule Intentを作成するよりも効果的です。