LoginSignup
4
6

More than 3 years have passed since last update.

Watson AssistantとDb2を外部連係する

Last updated at Posted at 2019-05-23

Watson Assistantはこちらの記事に記載の通り、IBM Cloud Function(ICF)経由で外部のサービスと連係することが可能です。本記事ではICF経由で Db2 on Cloudと連係する手順を紹介します。

前提

IBM Cloudで以下のサービスを作成しておきます。

  • Watson Assistant
  • Db2

作成したDb2の資格情報(Credential)を生成し、dsn をメモしておきます。
image.png
image.png

サンプル用のデータ CUSTOMER.csv をダウンロードして、Db2にロードします。
Open console をクリックし、Db2のコンソールを開きます。
image.png

左上のメニューから LOAD を選択し、ダウンロードしたCUSTOMER.csvをロードします。スキーマはデフォルトで作成されているスキーマ名を選択、テーブルは CUSTOMER を新規作成しています。その他設定はデフォルトのままロードします。

image.png

image.png

image.png

IBM Cloud Function で Actionの作成

今回は先ほど作成したCUSTOMER表をCODEをキーにQueryするActionを作成します。

IBM Cloud画面右上のメニューから Functions を選択します。
image.png

適当な 組織-スペース が選択されていことを確認し、作成の開始 を選択します。
image.png

アクションの作成 をクリックします。
image.png

アクション名を入力し、ランタイムで python 3 を選択して 作成 をクリックします。
image.png

以下のようにコードを入力し、保存します。(スキーマ名はDb2の環境に合わせて変更、connectの引数には先の手順で確認した dsn の値を使用します)
image.png

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 }

入力の変更 をクリックして、以下のようにテスト用の値を設定します。
image.png

起動 をクリックして、結果が返って来たら正しく設定されていることが確認できます。
image.png

Assistantの設定

ここでは、Assistantとの会話の開始時に、カスタマーID(CODE)が聞かれるので、入力するとDb2から該当のカスタマー情報を取得して応答する、という処理を実装します。

Entity @CustomerInfo を以下のように作成します。CustomerIDが4桁の数字であるとして、Patternで設定しています。
image.png

最初の ようこそ ノードで応答文を入力します。また、ICFに接続するためのCredentialをコンテキスト変数 $icf_cred に設定します。
image.png

$icf_cred
{"user":"7cc67d8a-14fe-4285-8bee-ff73bf93c5b7","password":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}

ICFのCredentialはDialogの中にハードコードしない方が望ましですが、ここでは簡単のため ようこそ ノードに設定することにします。
 

  

ICFのCredentialはICFの Namespace Settings タブで確認可能です。:(コロン)で区切られたAPIキーの前半がusername、後半がpasswordになります。
image.png

子ノードを作成し条件には @CustomerInfo:CustomerID を設定、JSONエディターでICFを呼び出すための設定をします。

image.png

{
  "output": {
    "generic": []
  },
  "actions": [
    {
      "name": "/scorg01_dev/Customer",
      "type": "server",
      "parameters": {
        "code": "@CustomerInfo.literal"
      },
      "credentials": "$icf_cred",
      "result_variable": "context.customer_result"
    }
  ]
}

さらに子ノードを作成します。親ノードで Jump to を選択し、子ノードの Respond を選択します。
image.png
image.png

以下のように応答文を入力します。
image.png

Try it でテストします。
image.png

Db2からデータを取得し、Assistantで応答できることが確認できました。

4
6
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
4
6