アプリケーション開発ポータルサイト
ServerNote.NET
ServerNote.NET厳選キャンペーン・クーポンはこちら!
カテゴリー【IBM WatsonPython
Watson AssistantをGUIで作成しAPIから呼び出す(Python編)
POSTED BY
2020-04-29

前回:Watson AssistantをGUIで作成しAPIから呼び出す(準備編)の続き

アシスタントを作成したので、いよいよ外の自前のサーバーからAPIで呼び出す。まずはPythonで呼んでみる。
最新版Pythonのインストールなどはこちら

まずは、APIを呼ぶとき必要なパラメータとなる情報を集める。

呼び出すアシスタントのIDとAPI Keyを取得

左上「IBM Watson Assistant」で、アシスタント画面トップに戻る。
アシスタント一覧でさきほど作成した「てすと」が居るので、右端メニュー「Setting」を選び、左メニュー「API Details」を表示する。
ここにある
「Assistant ID」例:aaaaaaaa-bbbbbbb-cccccc-ddddddd
「API Key」例:GGGGGG-KKKKKKKK-VVVVVV-XXXXXX
が必要になるので、メモする。

接続先URLを取得

以下、APIのドキュメント

https://cloud.ibm.com/apidocs/assistant/assistant-v2

に、「Service Endpoint」一覧があり、東京があるので

https://gateway-tok.watsonplatform.net/assistant/api

であることがわかる。

APIのバージョンを取得

以下、リリースノートを見る。

https://cloud.ibm.com/docs/assistant?topic=assistant-release-notes&locale=ja

V2 の現行バージョンは 2019-02-28 です。

とあるので、2019-02-28 をメモする。

以上でAPI接続するための値は得られたので、Pythonでwatsonを使えるようにする。
↑の「APIのドキュメント」に全部書いてはあるのだが。

Watson SDK for Pythonをインストール

pip3.7 install --upgrade "ibm-watson>=4.0.2"

当方環境Debian Buster + ソースからPythonインストール3.7ではエラーは無く完了した。

API接続しセッションIDを取得

さきほどの旅行アシスタント「てすと」に接続しセッションIDを得る。以下のコードを書いた。
Assistant ID,API Keyは自分のものに差し替えるとよい。

Pythonwatson_create_session.pyGitHub Source
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

authenticator = IAMAuthenticator('GGGGGG-KKKKKKKK-VVVVVV-XXXXXX')
assistant = AssistantV2(
    version='2019-02-28',
    authenticator=authenticator
)

assistant.set_service_url('https://gateway-tok.watsonplatform.net/assistant/api')

response = assistant.create_session(
    assistant_id='aaaaaaaa-bbbbbbb-cccccc-ddddddd'
).get_result()

print(json.dumps(response, indent=2))

python3.7 watson_create_session.py

結果、セッションIDがJSONで返るので、以降これを指定し会話する。
無料版(ライトプラン)だとセッションIDの有効時間が非常に短く使い物になるのか疑問ではある。

{
  "session_id": "b2553333-2ace-4999-855c-da8cb666f39f"
}

会話してみる

作成編のTry itと同じように、「旅行に行きたい」と言ってみる。Try itとの違いは、
コンテキスト変数として自分の名前=username=太郎をセットして同時送信しているところ。

Pythonwatson_send_message_1.pyGitHub Source
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

authenticator = IAMAuthenticator('GGGGGG-KKKKKKKK-VVVVVV-XXXXXX')
assistant = AssistantV2(
    version='2019-02-28',
    authenticator=authenticator
)

assistant.set_service_url('https://gateway-tok.watsonplatform.net/assistant/api')

response = assistant.message(
    assistant_id='aaaaaaaa-bbbbbbb-cccccc-ddddddd',
    session_id='b2553333-2ace-4999-855c-da8cb666f39f',
    input={
        'message_type': 'text',
        'text': '旅行に行きたい',
        'options': {
            'return_context': True
        }
    },
    context={
        "skills": {
            "main skill": {
                "user_defined": {
                    "username": "太郎"
                }
            }
        }
    }
).get_result()

print(json.dumps(response, indent=2))

python3.7 watson_send_message_1.py

結果、さきほどのTry itとは違い、ちゃんと名前で呼ばれて質問されている。

JSONwatson_recv_message_1.jsonGitHub Source
{
  "output": {
    "generic": [
      {
        "response_type": "text",
        "text": "太郎さん、国内ですか?海外ですか?"
      }
    ],
    "intents": [
      {
        "intent": "旅行",
        "confidence": 0.9467347621917725
      }
    ],
    "entities": []
  },
  "context": {
    "skills": {
      "main skill": {
        "user_defined": {
          "username": "太郎"
        },
        "system": {}
      }
    },
    "global": {
      "system": {
        "turn_count": 1
      }
    }
  }
}

質問に答えてみる

海外か国内か問われたので、今度は「海外ですね。」と答えてみる。
最大のポイントは今度はコンテキスト変数=自分の名前=を送信していないところ。
Watson API v2では、一度アシスタントに送信した変数はWatson側のサーバーセッションで以降保持されるため、再送信の必要がない

Pythonwatson_send_message_2.pyGitHub Source
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

authenticator = IAMAuthenticator('GGGGGG-KKKKKKKK-VVVVVV-XXXXXX')
assistant = AssistantV2(
    version='2019-02-28',
    authenticator=authenticator
)

assistant.set_service_url('https://gateway-tok.watsonplatform.net/assistant/api')

response = assistant.message(
    assistant_id='aaaaaaaa-bbbbbbb-cccccc-ddddddd',
    session_id='b2553333-2ace-4999-855c-da8cb666f39f',
    input={
        'message_type': 'text',
        'text': '海外ですね。',
        'options': {
            'return_context': True
        }
    }
).get_result()

print(json.dumps(response, indent=2))

python3.7 watson_send_message_2.py

結果、さきほどのTry itとは違い、今度は名乗っていないにかかわらずちゃんと名前で呼ばれて応えてくれた。

JSONwatson_recv_message_2.jsonGitHub Source
{
  "output": {
    "generic": [
      {
        "response_type": "text",
        "text": "そうですか、海外に行きたいんですね太郎さん"
      }
    ],
    "intents": [],
    "entities": [
      {
        "entity": "旅行の種類",
        "location": [
          0,
          2
        ],
        "value": "海外",
        "confidence": 1
      }
    ]
  },
  "context": {
    "global": {
      "system": {
        "turn_count": 3
      }
    },
    "skills": {
      "main skill": {
        "user_defined": {
          "username": "太郎",
          "traveltype": "海外"
        },
        "system": {}
      }
    }
  }
}

以上、Watson Assistant GUI画面で登録したAssistantを外部APIから呼び出すサンプルでした。最後は以下、Node.js版となります。

Watson AssistantをGUIで作成しAPIから呼び出す(Node.js編)

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【webmaster/管理人】
自営業プログラマー
ご連絡は以下アドレスまで★

☆ServerNote.NETショッピング↓
ShoppingNote
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】