Message API を使用すると、プロバイダーとの間でメッセージを送受信できます。これにより、コンテキストを追跡したり、フローの実行をトリガーしたりすることができます。 また、エクスプレッションを分析し、そのエクスプレッションに対するプロバイダーの応答を取得するためのメソッドも用意されています。
これらは Chatbot モジュールのメソッドです。
プロバイダーでエクスプレッションを評価するには、Chatbot.Message.Analyze メソッドを使用します。
その署名は次のようになります:
parm(in:&Instance, in:&UserMessage, inout:&AnalyzeResponse, out:&Messages)
入力値の説明
- &Instance は Conversational Flows オブジェクトの名前です。
- &UserMessage はユーザーのメッセージを表す varchar(256) です。
- &AnalyzeResponse はプロバイダーの応答を表す SDT です。これは入出力パラメーターです。つまり、前回の応答 (会話のコンテキストを含む) を渡して、ユーザーのメッセージとともにプロバイダーで評価できます。詳細については、このドキュメントで後述しています。
- &Messages は Messages データタイプの出力パラメーターです。これを使用して、プロバイダーからスローされたエラーを取得できます。
&Instance = !"Citizen"
&UserMessage = !"Hello"
Chatbot.Message.Analyze(&Instance, &UserMessage, &AnalyzeResponse, &Messages)
&BotResponse = &AnalyzeResponse.GXOutputCollection.toJson() (2)
&Intent = &AnalyzeResponse.Intents.Item(1).Intent
&Confidence = &AnalyzeResponse.Intents.Item(1).Confidence
このメソッドの目的は、エクスプレッション (ユーザーのメッセージ) を分析し、さらに該当する Flow に定義されたビジネスロジックを実行することです。つまり、Flow に定義されたリダイレクション(1) を行い、ユーザー入力の検証を実行して、Conversational オブジェクトを呼び出します。
その署名は次のようになります:
parm(in:&Instance, in:&UserMessage, in:&Image, inout:&AnalyzeResponse, out:&Messages)
入力値の説明
- &Instance は Conversational Flows オブジェクトの名前です。
- &UserMessage はユーザーのメッセージを表す varchar(256) です。
- &Image は Image データタイプです。
- &AnalyzeResponse はプロバイダーの応答を表す SDT です。
- &Messages は Messages データタイプの出力パラメーターです。これを使用して、プロバイダーからスローされたエラーを取得できます。
1.Chatbot.Message.SendMessage メソッドを (間接的に) 呼び出すものの例として、Chatbot ジェネレーターのリソースである PanelChatWeb オブジェクトと PanelChatSD オブジェクトがあります。これらにより CommonChatbots.SendMessage プロシージャーが呼び出され、このプロシージャーにより Chatbot.Message.SendMessage が呼び出されます。
2.この API のもう 1 つの用途として、Chatbot のテストケースの構築があります。プロバイダーに対するダイアログをバッチモードでプログラムし、応答を確認できます。Chatbot コンテキストは、(ほかの情報とともに) コンテキストを含む入出力パラメーター &AnalyzeResponse に基づいて追跡されます。
&Instance = !"Citizen"
&UserMessage = !"Hi"
do "ProcessMessageSend"
&UserMessage = !"I'd like to make a complaint"
do "ProcessMessageSend"
&UserMessage = !"About traffic"
do "ProcessMessageSend"
&UserMessage = !"There's a car parked in front of a garage"
do "ProcessMessageSend"
Sub "ProcessMessageSend"
msg(format(!"User: %1",&UserMessage), status)
Chatbot.Message.SendMessage(&Instance,&UserMessage,&Image,&AnalyzeResponse,&Messages)
msg(format(!"Bot: %1", &AnalyzeResponse.GXOutput), status)
if &Messages.Count > 0
msg(format(!"%1 (%2)",&Messages.Item(1).Description,&Messages.Item(1).Id), status)
endif
EndSub
このテストプロシージャーを実行すると、次のように出力されます:
User: Hi
Bot: Hello! I'm your Citizen Assistant! User: I'd like to make a complaint
Bot: What's the topic of your complaint? It can be about Lighting, Traffic, or Green Spaces
User: About traffic
Bot: Please describe the problem
User: There's a car parked in front of a garage
Bot: Thanks for your feedback.Your claim is 655.
Context: コンテキストの標準パラメーターの定義を含むサブ構造です。 CustomContext: Chatbot のモデルに固有のパラメーターを表すキー/値のコレクションです。 GXOutput: 最後の応答メッセージを表します。 Intents: 検出された意図とその確度を含むコレクションです。 GXOutputCollection: クエリに対する Chatbot の応答メッセージのコレクションです。
(1) ケースによって異なります。リダイレクションをサーバー側で実行する場合は、SendMessage メソッドを使用する必要があります (DialogFlow のケース)。リダイレクションをプロバイダー側で実行する場合は、Analyze メソッドを使用します (Watson のケース)。
(2) GXOutputCollection は、回答が複数存在する場合に役立ちます。GXOutput には最後のメッセージが格納されるのに対し、リダイレクションにおいて Chatbot の回答が 2 つ存在する場合などには、GXOutputCollection にその 2 つが格納されます。
GeneXus 16 Upgrade 4 以降で利用できます。
|