2023-04-28
前回: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は自分のものに差し替えるとよい。
Python | watson_create_session.py | GitHub 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=太郎をセットして同時送信しているところ。
Python | watson_send_message_1.py | GitHub 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とは違い、ちゃんと名前で呼ばれて質問されている。
JSON | watson_recv_message_1.json | GitHub 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側のサーバーセッションで以降保持されるため、再送信の必要がない。
Python | watson_send_message_2.py | GitHub 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とは違い、今度は名乗っていないにかかわらずちゃんと名前で呼ばれて応えてくれた。
JSON | watson_recv_message_2.json | GitHub 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編)
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
Windowsのデスクトップ画面をそのまま配信するための下準備
WindowsでGPUの状態を確認するには(ASUS系監視ソフトの自動起動を停止する)
CORESERVER v1プランからさくらインターネットスタンダートプランへ引っ越しメモ
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Python】Spacyを使用して文章から出発地と目的地を抜き出す
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
Windows版Google Driveが使用中と言われアンインストールできない場合
VirtualBoxの仮想マシンをWindows起動時に自動起動し終了時に自動サスペンドする
【Apache】サーバーに同時接続可能なクライアント数を調整する
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
【Linux】iconv/libiconvをソースコードからインストール
Ubuntu Server 21.10でイーサリアムブロックチェーン【その5】