LoginSignup
9
11

More than 5 years have passed since last update.

Watson AssistantからIBM Cloud Functionsを呼び出す

Last updated at Posted at 2018-02-20

はじめに

この記事は、IBM Cloud Functionsで、日本語天気照会機能を実装するの続編です。
この記事でIBM Cloud上に作ったIBM Cloud Functionの機能をWatson Conversationから呼び出してみます。
完成後のアプリケーションイメージは下記のものとなります。
(天気しか答えてくれない単細胞なBOTです)

(2018-05-24 全面改定)

スクリーンショット 2018-05-24 14.17.15.png

参照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キーを取得し、テキストエディタなどに張り付けます。

conv-func-2.png

APIキーは xxxxxx:yyyyyyのようにコロンで区切られた形式となっています。
コロンより前がuser id、コロンより後がpasswordになります。

Conversationの実装

続いて、Conversationの構築を行います。

Assistantワークスペースの作成

通常の手順でAssistantワークスペースを作成します。
言語は日本語、名称はなんでもいいですが例えば「天気予報BOT」などとします。

インテントの作成

#weatherというインテントを作成します。例文は天気の問い合わせに関するものとします。
例えば、次のようなものを指定して下さい。
「天気を教えて」「天気を知りたい」「天気予報をお願い」「天気は?」「天気を教えて下さい」

ダイアログの作成

次の図のような3階層のダイアログノードを追加します。

スクリーンショット 2018-05-24 14.37.18.png

トップレベル

名称: weather
条件: #weather
メッセージ: どこの天気を知りたいですか

スクリーンショット 2018-05-24 14.30.28.png

2階層目

名称: query_weather
条件: ture
メッセージ: (設定なし)

スクリーンショット 2018-05-24 14.30.48.png

3階層目

名称: display_weather
条件: ture
メッセージ: $weather.city_jp の気温は $weather.c_temp 度。天気は $weather.cond_jp です。

スクリーンショット 2018-05-24 14.31.06.png

フロー設定

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は次の図のようになっているはずです。

スクリーンショット 2018-05-24 14.44.17.png

「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エディタは下の図のようになっているはずです。

スクリーンショット 2018-05-24 14.52.09.png

テスト

お疲れ様でした。これで天気の会話しかできない単能天気BOTは完成したはずです。
「Try it out」機能を呼出して動作することを確認してみましょう。
以下に会話サンプルを示します。

スクリーンショット 2018-05-24 14.57.37.png

解説

以上の手順で動くデモはあっという間にできたと思います。
どういう仕組みでこの機能を呼び出せているかを説明します。

「ようこそ」ノードでの設定

コンテキスト変数として"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の使い方で、特別なことは行っていません。

conv-func-6.png

9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11