パーソナライズ 化への第一歩 Part1 〜 カスタム拡張機能 (Db2編)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/ffca2fef-bb7b-c7b2-eaf6-9becb8a4d45d.png)

ユーザーの**顧客情報** (名前、住所、電話番号)　や**これまでの取引内容**がわかれば、ユーザーに聞き返すことが不要になったり、場合によっては**レコメンド**や個人のステータスに合わせた**新たなサービス**を提供できる可能性があります。

**顧客情報を管理するシステム**と**バーチャル・アシスタント**が連携できれば、ユーザーに聞き返す項目が減らせたり、決まりきった回答だけでなく、**ユーザーの特性に合わせた回答やレコメンド**ができる可能性があり、バーチャル・アシスタントを適用するユースケースが広がりそうです。

# 外部システムと連携するバーチャル・アシスタント
外部システムと連携するバーチャル・アシスタントを作成する場合、外部システムと連携する機能の開発が前提になります。
連携機能の開発には、接続先システムの接続仕様を理解し、その仕様に沿った接続プログラムの開発が必要になります。
New Watson Assistant は、この開発作業を軽減できる**カスタム拡張機能**を提供しています。

このカスタム機能を使った外部システムとの連携方法の全体像を確認してみます。
今回は、仮の顧客テーブルを準備して、それをデータベースに登録するところから始めてみます。
手順として、4 つのステップを考えました。

1. [顧客テーブルの作成](https://qiita.com/yanagih/items/e63cef897011ec9679cf#%E9%A1%A7%E5%AE%A2%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)
1. [顧客テーブルを呼び出すファンクションの作成](https://qiita.com/yanagih/items/e63cef897011ec9679cf#%E9%A1%A7%E5%AE%A2%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%83%95%E3%82%A1%E3%83%B3%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90)
1. ファンクションを呼び出すカスタム拡張機能の構成
1. アクションの作成

今回の記事では、上記 **1** と **2** の内容を見てみます。
**残りの 2 つ**は明日の記事で見てみます。

# 顧客テーブルの作成

顧客テーブルの作成先として、Db2 を使用してみます。
IBM Cloud には、Db2 を無償で使用できる **Db2 on Cloud** Lite プランがあります。

## Db2 インスタンスの作成

IBM Cloud ダッシュボードの上の方にある検索窓に **Db2** と入力し、カタログ内で見つかった **Db2 サービス**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/45a37fe4-9546-a02a-c38b-fd37c0ad1d72.png)
**Lite プラン**が選択されていることを確認します。使用条件に同意し、作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/1306cd63-d0df-a640-0669-375b5f768241.png)
ダッシュボード画面に戻ると、**Db2 インスタンス**が作成されていますので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/2123014a-d266-53b1-15cf-ea77760ed430.png)
## 顧客テーブルを作成する
管理画面にアクセスするために **Go to UI** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/8c6dada2-8fa4-852c-5c8d-871ba37b0c2d.png)
Db2 管理画面が表示されました。まだ、テーブルが存在しないので、リソース使用量は **0** です。
ここで、バーチャルピザ屋の顧客情報と過去のオーダー履歴を含む、**(仮想)顧客テーブル**をアップロードします。テーブルの内容はこのような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/d23352c5-60eb-5a57-e7b0-e7c90f314bd5.png)

:::note info
**仮想顧客テーブル**は、[こちらの GitHub](https://github.com/Watson-bx-04/Db2) に置いてあります。
ファイル名: account_data.csv
:::

**データ**アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/9120d720-5933-6c11-cc0b-ac28a8999b97.png)
**account_data.csv** を ドラッグ & ドロップ でアプロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/4c53a117-89a3-1c41-8e25-5a869dbce71b.png)
ファイルがアップロードされたことを確認して、**次へ**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/68376b87-db7b-198d-db05-000851e63d44.png)
新規表を作成します。表名には **acount_data** を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/ca541eb2-6c6c-6f83-87bf-b1f91a97790b.png)
表が作成されたので、**次へ**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/75fc62d8-77aa-58d5-057d-ed7891612a3c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/9738985a-7416-8ef1-6767-0081b582334e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/d758f79a-c044-956a-8e3f-bcaa9bf8b5a4.png)
10秒から20秒程度で、Db2 にテーブルを作成できました。本当に簡単ですね。

:::note info
もちろん、CSV ファイルのアップロードではなく、定番の SQL 文を使ってテーブルを作成する方法もあります。
@nishikyon さんの[こちらの記事](https://qiita.com/nishikyon/items/f13e376b00daaa71adeb)が参考になると思います。
:::

## 顧客テーブルの確認
作成した顧客テーブルを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/e004699b-efbd-bccc-d663-62c0362aa0af.png)
**スキーマ**にチェック、**account_data** をクリック、**テーブルの表示**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/335597eb-23ba-8544-9310-4f35c97babf4.png)
アップロードした CSV ファイルで作成された顧客テーブルの確認ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/a2d32a02-8bd0-d9bb-755f-6a2d0f31ef44.png)
テーブル項目に **ID** 列があります。この ID を使用して、バーチャル・アシスタントがテーブルから特定の情報を取得します。

# 顧客テーブルを呼び出すファンクションの作成

## IBM Cloud Functions の作成
IBM Cloud ダッシュボード画面から、**Functions** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c40ae7d0-bd30-fc2c-4e8a-cad2132a3ac6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/47b46ff0-22a6-d156-db3a-91e955a0bf42.png)
初めて、IBM Cloud Functions を作成する場合、最初に**名前空間**が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/98fb6d17-69d9-0319-c6cb-24ccfd1dcfa1.png)
名前は任意です。ここでは **VirtualPizza** としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/fa2399c5-7e30-abc0-08e9-dd0657848664.png)
**アクション**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/071eeea7-a1ef-7443-f0ed-010cac32f2ca.png)
アクション名は任意です。ここでは **acount_table** としています。
今回は、Python コードを使用するので、ランタイムに **Python 3.9** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/e0962843-f099-3e84-0f7f-4bfc231400cd.png)

エディター画面が表示されますので、Python コードを書き加えます。
```python:IBM Cloud Function: account_table
import sys
import ibm_db
import datetime

def main(dict):
    
    # ACCOUNT_TABLE テーブルにselect文を発行する
    if dict["action"] == "select":
        ssldsn = "DATABASE=BLUDB;HOSTNAME=***.databases.appdomain.cloud;PORT=32459;PROTOCOL=TCPIP;UID=***;PWD=***;Security=SSL"
        db_conn = ibm_db.connect(ssldsn,"","")
        sql = "SELECT * FROM ACCOUNT_DATA WHERE ID = ?"
        db_stmt = ibm_db.prepare(db_conn,sql)
        id = dict["id"]
        ibm_db.bind_param(db_stmt,1,id)
        ibm_db.execute(db_stmt)
        rows = ibm_db.fetch_tuple(db_stmt)
        ibm_db.close(db_conn)


        return {'result':
            {
                "id": rows[0],
                "name": rows[1],
                "age": rows[2],
                "sex": rows[3],
                "tel": rows[4],
                "address": rows[5],
                "pizza": rows[6],
                "size": rows[7],
                "drink": rows[8],
                "side": rows[9],
                "member": rows[10],
                "flag": rows[11]
            }
        }
```

:::note info
**Python コード**は、[こちらの GitHub](https://github.com/Watson-bx-04/Db2) に置いてあります。
ファイル名: account_data.py
:::

## 作成した Functions のテスト
テストを実施するために、パラメータをセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/cd51568e-a85a-bc80-8670-411e7d3b049d.png)
パラメータ欄にパラメータを指定します。

```JSON:パラメータ
{
    "id": 222,
    "action": "select"
}
```
**起動**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/4389fdb7-16ab-5c13-08f9-d85d05d31b30.png)
ID 222 に関する顧客テーブルの呼び出しが成功しました。
(実行結果イメージ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/63725b60-9b1e-04cd-f58c-f7f137b362db.png)

# いかがでしたでしょうか

カスタム拡張機能から呼び出す前提が揃いましたので、明日は、カスタム拡張機能を構成し、アクションから呼び出してみます。

# 参考情報

### 公式オンライン・マニュアル: 
https://cloud.ibm.com/docs/openwhisk?topic=openwhisk-getting-started&locale=ja

https://github.com/ibmdb/python-ibmdb/wiki/APIs#ibm_dbcallproc

### 役にたつ Qiita の記事

https://qiita.com/nishikyon/items/f13e376b00daaa71adeb

https://qiita.com/nishikyon/items/b3b60eb63c3701b4d7f8

https://qiita.com/testnin2/items/afbe5d151fdb0f6a73e0