Watson Assistantはこちらの記事に記載の通り、IBM Cloud Function(ICF)経由で外部のサービスと連係することが可能です。本記事ではICF経由で Db2 on Cloudと連係する手順を紹介します。
前提
IBM Cloudで以下のサービスを作成しておきます。
- Watson Assistant
- Db2
作成したDb2の資格情報(Credential)を生成し、dsn をメモしておきます。
サンプル用のデータ CUSTOMER.csv をダウンロードして、Db2にロードします。
Open console をクリックし、Db2のコンソールを開きます。
左上のメニューから LOAD を選択し、ダウンロードしたCUSTOMER.csvをロードします。スキーマはデフォルトで作成されているスキーマ名を選択、テーブルは CUSTOMER を新規作成しています。その他設定はデフォルトのままロードします。
IBM Cloud Function で Actionの作成
今回は先ほど作成したCUSTOMER表をCODEをキーにQueryするActionを作成します。
IBM Cloud画面右上のメニューから Functions を選択します。
適当な 組織-スペース が選択されていことを確認し、作成の開始 を選択します。
アクション名を入力し、ランタイムで python 3 を選択して 作成 をクリックします。
以下のようにコードを入力し、保存します。(スキーマ名はDb2の環境に合わせて変更、connectの引数には先の手順で確認した dsn の値を使用します)
import sys
import ibm_db
def main(dict):
rows = []
conn = ibm_db.connect("DATABASE=BLUDB;HOSTNAME=dashdb-txn-sbox-yp-dal09-04.services.dal.bluemix.net;PORT=50000;PROTOCOL=TCPIP;UID=shw72782;PWD=xxxxxxxxx;","","")
sql = 'SELECT LAST_NAME, FIRST_NAME, STATUS FROM SHW72782.CUSTOMER WHERE CODE={}'.format(dict["code"])
stmt = ibm_db.exec_immediate(conn, sql)
row = ibm_db.fetch_tuple(stmt)
while (row):
rows.append(row)
row = ibm_db.fetch_tuple(stmt)
return { 'result': rows }
入力の変更 をクリックして、以下のようにテスト用の値を設定します。
起動 をクリックして、結果が返って来たら正しく設定されていることが確認できます。
Assistantの設定
ここでは、Assistantとの会話の開始時に、カスタマーID(CODE)が聞かれるので、入力するとDb2から該当のカスタマー情報を取得して応答する、という処理を実装します。
Entity @CustomerInfo を以下のように作成します。CustomerIDが4桁の数字であるとして、Patternで設定しています。
最初の ようこそ ノードで応答文を入力します。また、ICFに接続するためのCredentialをコンテキスト変数 $icf_cred に設定します。
{"user":"7cc67d8a-14fe-4285-8bee-ff73bf93c5b7","password":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
ICFのCredentialはDialogの中にハードコードしない方が望ましですが、ここでは簡単のため ようこそ ノードに設定することにします。
ICFのCredentialはICFの Namespace Settings タブで確認可能です。:(コロン)で区切られたAPIキーの前半がusername、後半がpasswordになります。
子ノードを作成し条件には @CustomerInfo:CustomerID を設定、JSONエディターでICFを呼び出すための設定をします。
{
"output": {
"generic": []
},
"actions": [
{
"name": "/scorg01_dev/Customer",
"type": "server",
"parameters": {
"code": "@CustomerInfo.literal"
},
"credentials": "$icf_cred",
"result_variable": "context.customer_result"
}
]
}
さらに子ノードを作成します。親ノードで Jump to を選択し、子ノードの Respond を選択します。
Db2からデータを取得し、Assistantで応答できることが確認できました。