今日はちょっとしたTipsを。
最近、チャットボットはDialogflowで作ることが多くなっています。Trial版でかなりのことができますし、特に有効期限があるわけでもありません。そこで、Dialogflowで会話の流れを作り、それを他のシステムからAPIで呼び出すということをしています。
Dialogflowは、デフォルトのGlobalリージョンのほか、例えば東京リージョンもあるので、日本のユーザーは東京を選びがちですよね。もちろん、それは理由あってのことなのですが。(レイテンシを気にしたりとか、データを海外に置きたくないとか。)
ただ、APIで呼び出すときにGlobal以外を選んでいる場合にどうやって呼び出したら良いのかが公式のリファレンスを読んでもよく分からなくて、結構迷ってしまったので、その方法を書いておきます。
JSONキーの取得
これは東京リージョンだからという話ではないのですが、API接続時には必要なので、まずはそこから書いておきます。
Dialogflow ES(またはTrial)でチャットボットを作る分には、特にGCPのユーザー登録は不要です。ただ、APIで呼び出したいということになると、GCPにユーザー登録する必要がでてきます。
GCP上にそのチャットボット用のプロジェクトが作成されるので、そのプロジェクトを使うためのJSONキーを取得します。
Dialogflowのフローの歯車アイコンから設定画面に入り、Generalタブの中にGoogle ProjectのProject IDが表示されています。これをクリックすると、GCPのプロジェクトの画面に遷移します。
このプロジェクトはデフォルトでDialogflow APIは有効になっているので、あとはJSONキーを発行すればOKです。
GCPのプロジェクトのメニューから、APIとサービス>認証情報の画面を開き、さらにサービスアカウントを管理画面を開いて、サービスアカウントの作成をクリックします。
適当なサービスアカウント名を付けた後、「このサービスアカウントにプロジェクトへのアクセスを許可する」でロール>オーナーを選択して完了ボタンをクリックすると、サービスカウントが作成されます。
ここで、ロールの設定をしないと、いざAPIを呼び出したときに権限エラーになるので注意しましょう。
次に、作成したサービスアカウントの画面を開き、キータブから鍵を追加>新しい鍵を追加>JSONと選択すると、JSONキーが作成されて、自動的にダウンロード画面が開きます。
NotebookでAPIを呼び出し
ここではJupyter Notebookを開いて、APIの呼び出しを試します。
まず、Dialogflow SDKをインストールします。これで、必要な依存パッケージを含め、すべてインストールされます。
!pip install google-cloud-dialogflow
いよいよDialogflow APIを呼び出します。
ここで、東京リージョンだとasia-northeast1
となりますが、SessionClient作成時にclient_optionsとしてリージョンを指定したURLを指定します。また、セッションパス作成時のプロジェクトIDにもリージョンを含めます。
この2点が今回のTipsの神髄。(それ以外は単純にDialogflow APIを呼び出すまでの手順でしたね。)
ちなみに、asia-northeast1
の代わりにglobal
と指定するとGlobalにもアクセスできるようです。
from google.oauth2 import service_account
from google.cloud import dialogflow_v2beta1 as dialogflow
import json
import uuid
dialogflow_credential_path ='<ダウンロードしたJSONキーファイルパス>'
# 東京リージョン
location = 'asia-northeast1'
# セッションを識別するためUUIDでセッションIDを作成
session_id = uuid.uuid4()
with open(dialogflow_credential_path, 'r') as f:
service_account_info = json.load(f)
credential = service_account.Credentials.from_service_account_info(service_account_info)
session_client = dialogflow.SessionsClient(
credentials=credential,
client_options={
'api_endpoint': '%s-dialogflow.googleapis.com:443' % (location,)
}
)
project_id = '%s/locations/%s' % (service_account_info['project_id'], location,)
session_path = session_client.session_path(project_id, session_id)
query_input = dialogflow.QueryInput(event=dialogflow.EventInput(name='WELCOME', language_code='ja'))
res = session_client.detect_intent(session=session_path, query_input=query_input)
response = res.query_result
print(response)
最初に書いたように、最近はDialogflowをよく使っているので、何かTipsがあればまた書いてみたいと思います。