IBM Cloud Function で擬似システムエンティティを実装


はじめに

Watson Assistantの英語版では、sys-preson、sys-locationという辞書定義なしに、人名と地名を取得できるシステムエンティティがあります。
日本語版でできないのかとの質問が以前からあり、Cloud Functionを使えばある程度似たものができるのではと思って試してみた結果です。

前提

NLUを使ったCloud Functionの仕組みIBM Cloud FunctionからNLUを呼び出すが動いていることが前提です。
簡単にいうと、この機能をWatson Assistantから呼び出しているだけということになります。

できること

下の図を見るのがわかりやすいと思います。
裏でNLUを呼び出すことで、

オリックスの鈴木一郎です。名古屋から来ました。

という自然文から、人名に該当する部分、会社名に該当する部分、地名に該当する部分を抜き出して、返答文の中で使っています。

実装

では、実際にWatson Assistantの中でどのように定義したかを説明します。

ダイアログ定義

Cloud Functionの機能テストなので、下の図のような超単純なフローです。
デフォルトのダイアログで「ようこそ」に下に子と孫を一つづつ足しただけです。
子と孫の条件も単純な「true」です。
子の方は「Skip user input」を有効にして、ユーザー入力を待たずに即座に孫に制御が流れるようにしています。
Cloud Function呼出しは子のノードで行い、NLU解析結果の表示を孫のノードで行っている形になります。

JSON定義

親(ようこそ)、子、孫ぞれぞれのJSON定義は以下の通りです。

以下のような定義になっています。
context.private.my_credenyials配下のuser, passwordは、Cloud FunctionsのAPIキーです。
詳細はWatson AssistantからIBM Cloud Functionsを呼び出すを参考にして下さい。

{
  "context": {
    "private": {
      "my_credentials": {
        "user": "xxxx",
        "password": "yyyyy"
      }
    }
  },
  "output": {
    "text": {
      "values": [
        "どなたですか。"
      ],
      "selection_policy": "sequential"
    }
  }
}

「actions」の項目がCloud Functionの呼出し部分です。
それぞれの項目の意味は以下の通りです。

項目名 意味
name Cloud Functionの名前。org_nameとspace_nameは固有のものに置き換えて下さい。
type serverで固定。
parameters cloud functionの引数。今回の例ではtextのみです。
credentials Cloud FunctionのAPI Key。
result_variable Cloud Functionの戻りをどの変数にセットするかの指定。
{
  "output": {},
  "actions": [
    {
      "name": "/<org_name>_<space_name>/nlu-service",
      "type": "server",
      "parameters": {
        "text": "<? input.text ?>"
      },
      "credentials": "$private.my_credentials",
      "result_variable": "context.result"
    }
  ]
}

孫は、Cloud Function呼出しで context.result.xxx に戻された値を表示しているだけです。
JSONの内容は以下のとおりとなっています。

{
  "output": {
    "text": {
      "values": [
        "$result.location の $result.company から来られた$result.person さんですね。ようこそいらっしゃいました。"
      ],
      "selection_policy": "sequential"
    }
  }
}

終わりに

NLUの精度次第というところはあるのですが、ある程度sys-preson, sys-locationっぽいものはできたと思います。実装を見ていただければ分かるようにNLUで認識可能なエンティティなら、同じ方式でWatson Assistantの中で扱うことが可能です。
また、まだ試してはいないのですが、応用問題でNLU - Watson Knoledge Studio連携も行えば、Knowledge Studioのカスタム機械学習モデルで認識したEntiryも同じようにWatson Assistantから使うことができると思います。