はじめに
この記事は、IBM Cloud Functionsで、日本語天気照会機能を実装するの続編です。
この記事でIBM Cloud上に作ったIBM Cloud Functionの機能をWatson Conversationから呼び出してみます。
完成後のアプリケーションイメージは下記のものとなります。
(天気しか答えてくれない単細胞なBOTです)
(2018-05-24 全面改定)
参照URL Create and invoke Actions
前提
前の記事で書いた日本語天気照会サービスが、自分のIBM Cloud環境上で動いている必要があります。
また、Watson Assistantを使うので、同じ環境でWatson Assistantが利用可能な状態であることとします。
事前準備
認証などで必要な情報を事前に取得します。
Action名の取得
Action名の取得に関しては、前の記事で確認方法を示したとおり、
$ bx wsk action list
のコマンドで取得します。
/<org_name>_<space_name>/weather-jp
の形式になっているはずです。
API Keyの取得
IBM Cloud Functionsの管理画面から下の図のように「開始」->「APIキー」をクリックします。APIキーの画面が表示されたら、画面右下のクリップボードへのコピーのアイコンをクリックして、APIキーを取得し、テキストエディタなどに張り付けます。
APIキーは xxxxxx:yyyyyy
のようにコロンで区切られた形式となっています。
コロンより前がuser id、コロンより後がpasswordになります。
Conversationの実装
続いて、Conversationの構築を行います。
Assistantワークスペースの作成
通常の手順でAssistantワークスペースを作成します。
言語は日本語、名称はなんでもいいですが例えば「天気予報BOT」などとします。
インテントの作成
#weather
というインテントを作成します。例文は天気の問い合わせに関するものとします。
例えば、次のようなものを指定して下さい。
「天気を教えて」「天気を知りたい」「天気予報をお願い」「天気は?」「天気を教えて下さい」
ダイアログの作成
次の図のような3階層のダイアログノードを追加します。
トップレベル
名称: weather
条件: #weather
メッセージ: どこの天気を知りたいですか
2階層目
名称: query_weather
条件: ture
メッセージ: (設定なし)
3階層目
名称: display_weather
条件: ture
メッセージ: $weather.city_jp の気温は $weather.c_temp 度。天気は $weather.cond_jp です。
フロー設定
2階層目から3階層目にJump to (Evaluate Responses)の設定を行います。
JSON設定
「ようこそ」ノードと、「query_weather」ノードの2箇所でJSON設定を行います。
###「ようこそ」ノード
ノード編集画面からJSONエディタを開いて、次のような設定を追加して下さい。
ユーザーIDとパスワードは事前に調べたCloud FunctionsのユーザーAPIキーで置き換えます。
"context": {
"private": {
"my_credentials": {
"user": "your_user_id",
"password": "your_password"
}
}
}
設定後のJSONは次の図のようになっているはずです。
###「query_weather」ノード
ノード編集画面からJSONエディタを開いて次のような項目を追加します。
nameは事前に調べたaction名で置き換えて下さい。
"actions": [
{
"name": "/your_space_your_dev/weather-jp",
"type": "server",
"parameters": {
"city": "<? input.text ?>"
},
"credentials": "$private.my_credentials",
"result_variable": "context.weather"
}
],
設定後のJSONエディタは下の図のようになっているはずです。
テスト
お疲れ様でした。これで天気の会話しかできない単能天気BOTは完成したはずです。
「Try it out」機能を呼出して動作することを確認してみましょう。
以下に会話サンプルを示します。
解説
以上の手順で動くデモはあっという間にできたと思います。
どういう仕組みでこの機能を呼び出せているかを説明します。
「ようこそ」ノードでの設定
コンテキスト変数として"private.my_credentials"という変数を設定しました。
この変数は、Cloud Function呼出し時に認証情報として利用します。
手順を簡略化するため、認証情報をワークスペースにハードコードしていますが、実際にはアプリケーションサーバー側で持たせて、初期設定でコンテキストにいれるようにとのガイドが、リファレンス Create and invoke Actionsに記載されています。
「天気照会」ノード(weather_query)での設定
Cloud Functionsの呼出しを実際に行う、一番肝となるノードです。
actionsという項目をjsonに含めることで、Cloud Function呼出しが行われます。
具体的な設定項目の意味は以下の通りです。
name: Action名を指定します
type: server か clientを指定します。今回の使い方の場合は serverになります。
parameters: Cloud Function呼出し時のパラメータの指定をjson形式で行います。今回作ったパラメータはcityという変数のみ使うので、この変数を指定します。
本当はエンティティとマッチングするところなのですが、辞書の整備が面倒なので、入力がまるごと都市名になるような会話設計にして、入力値をまるごとパラメータで渡すようにしています。
credentials: Action呼出し時の認証情報を指定します。
result_variable: Cloud Functionの戻り値をどの変数に保存するかを指定します。
{
"output": {},
"actions": [
{
"name": "/xxxxxxxxx_yyy/weather-jp",
"type": "server",
"parameters": {
"city": "<? input.text ?>"
},
"credentials": "$private.my_credentials",
"result_variable": "context.weather"
}
]
}
##「天気表示」(weather_display)ノードの設定
「天気照会」ノードの子ノードとして「天気表示」ノードを作り、ここでCloud Functionの照会結果を表示します。
このノードは、通常のConversation Nodeの使い方で、特別なことは行っていません。