筆者が自社インターンシップで学生向けにWatson Assistantを使ったチャットボット開発のレクチャーを行った経験から、調べたり試してみたことを紹介する。
1.Watson Assistantについて
Watson Assistantは、IBM Watson製品が提供する構築済みサービスのうち、チャットボットをはじめとするユーザーとコンピューターが自然言語で対話するためのアプリケーションを簡単に開発することができるサービスです。
2.事前準備
2-1. IBM Cloudアカウントを作成
IBM Cloudのサイトから、アカウントを作成する。
https://cloud.ibm.com
2-2. Watson Assistantを起動
カタログより、「Watson Assistant」を検索し、使用条件を確認の上、作成する。
※まずは、無料で使える料金プランの「ライト」で進めます
リソースの作成が完了したら、「Watson Assistantの起動」を押下し、Watson Assistantを起動する。
「Create assistant」を押下し、任意の名前でAssistantを作成する。
以上、事前準備は終了。
3.Dialogスキルで作るチャットボット ※Liteプラン(無料)編
Watson Assistantのご利用開始に必要なすべてのものを、お客様が必要な限り無料でご利用いただけます。
とあるように、料金プランのLiteプランの範囲でも、基本的なチャットボットを作成するための十分な機能が提供されている。
以降、Liteプランでチャットボットを開発する手順を説明する。
3-1. Skill作成
事前準備で作成したWatson Assistantサービスを使って、
Liteプランでは、上の「Add an actions or dialog skill」からskillを作成する。
次に、skillに名前を付け、言語設定にLanguage:Japaneseを指定し、「Create skill」を押下する。
skill typeは「Actions」と「Dialog」を選べるようになっている。 ※今回はDialogでスキルを選択して進めます
それぞれのスキルの違いについては、ざっくり以下のように理解している。
- Actions
- ・クイックにシンプルな会話を構成できる。
- ・以前はbeta版として提供されていたが、Watson Assistant-b4→Watson Assistant-5bで正式版として提供されるようになった模様。
- Dialog
- ・グラフィカルなツリー構造で会話を構築できる。
- ・Actionsよりも、きめ細やかな設定ができる。
ActionsとDialogの違いについては、こちら(スキルの選択)を参照。
Create an actions or dialog skillの「Use sample skill」からサンプルスキルをそのまま試したり、「Upload skill」で他の人が作成したスキル(jsonファイル、インターネット上にもいくつか公開されている)を取り込んで使用することができます。
スキル作成後は、以下の3つを定義することになる。
(この3つは重要な概念なので、十分に理解した上で開発を進められたい)
ユーザーのインプットを認識するための条件
- Intent
- ユーザーの入力に表現されるユーザーの意図・目的・目標のこと。
- 「北海道でおすすめのランチを教えて」であれば、”ランチを教えて”の部分。
- Watson Assistantは機械学習により、自然文での問い合わせ内容をIntentに分類する。
- Intentについての詳しい説明は、こちらを参照。
- Entity
- ユーザーの目的に関連した、ユーザー入力の情報。目的語にあたるもの。
- 「北海道でおすすめのランチを教えて」であれば、”北海道”・”おすすめ”の部分。
- Watson Assistantは、内部にEntity辞書を保有し、自然文からEntityを抽出する。
- Entityについての詳しい説明は、こちらを参照。
ユーザーへの回答に関する条件式とアウトプットフレーズ
- Dialog
- Intent/Entityから回答を導くための条件と、それに対するアプトプットフレーズ(回答文)
- 「北海道でおすすめのランチを教えて」であれば、以下のような条件の解釈と回答を行う。
- 条件式 : #Intent:”ランチを教えて” + @Entity:”北海道” AND "おすすめ"
- 回答文 : 「スープカレーはいかがでしょうか?」
- Dialogについての詳しい説明は、こちらを参照。
以降、Intent/Entity/Dialogを定義する方法を説明する。
3-2. Intent作成
「北海道でおすすめのランチを教えて」のうち、”ランチを教えて”にあたる部分を「#Intent:ランチ問い合わせ」に設定する。
「Create intent」と「Upload intents」の設定方法があり、違いは以下の通り。
- Create intent:画面で1件ずつ登録する。
- Upload intents:CSVファイルで一括登録する。{例文,Intent}のシンプルな形式で登録でき、既存Intentのダウンロードも提供されているため、この機能を使って他者との共有も簡単にできる。
※Upload intentsは非常に便利で、慣れた方はそちらを使うと思うが、まずは基本を押さえるためにCreate intentから手動で登録をする。
まず、Intentに名前を付けて(Intentの先頭には「#」が自動的に付く)、「Create intent」を押下。
次に、Intentで検知したい例文をUser Exampleに入力し、Add exampleで登録する。
(なるべく想定できるものをたくさん入れておいた方がWatsonが賢くなる、実運用上での目標は20件程度が目安らしい)
以上で、Intentの作成は完了。
3-3. Entity作成
「北海道でおすすめのランチを教えて」のうち、”北海道”・"おすすめ"にあたる部分を「@Entity:地域」・「@Entity:おすすめ」として設定する。
それぞれのEntityで検知したいキーワードを事前に考えておく。
- @地域・・北海道、東京 etc..
- @おすすめ・・おすすめ、美味しい etc..
EntityもIntentと設定方法は、ほとんど同じ。(Entityの先頭には「@」が自動的に付く)
ここで1点ポイントとして、特に日本語に多い”Synonyms(シノニム、異音同義語のこと)”を定義することで、異音同義語の解釈や表記方法を標準化できる。
(例えば、「母・ママ・お母さん・お袋」など音や表記は違うけど同じ意味となるもの)
Recommend Synonymsというサポート機能が提供されているのでそちらを使い、Recommendされないものは手動で登録する。
”おすすめ”でRecommendされたものから、Entityで使用するものを選択し、Add selectedでSynonymsとして登録する。
Recommendで足りないキーワードは手動で追加し、Add valueで登録する。
以上で、Entityの作成は完了。
3-4. Dialog作成
Intent/Entityが準備できたら、会話フローをDialogで構築する。
始めにDialogを開くと、デフォルトのWelcomeメッセージとAssistantが解釈できなかった場合のノードが事前に定義されている。
Dialogフローは「IBM Cloud資料:ダイアログの概要」の通り、ツリーにノードを定義して、ブランチへの分岐やフロー制御を行い、Assinstantにユーザーとの会話を構築する。
今回は、Welcomeメッセージ後に、ランチの問い合わせに回答するためのノードを追加する。
画面上部「Add node」を押すと、新しいノードがGUI上に追加され、右側のビューからノードの定義を行う。
追加したノードに名前を付け、以下の3つを定義する。
-
If assistant recognizes・・このノードが検知する条件(Intent/Entity)
→「#ランチ問い合わせ」 and 「@地域:北海道 and @おすすめ」 -
Assistant responds・・ユーザーへの回答(Text、選択肢、画像 etc..)
→Text:「スープカレーはいかがでしょうか?」 -
Then assistant should・・このノードが指定された応答を返した後の次の処理
→Welcomeメッセージ(最初)に戻る(Jump to - Respond)
以上で、Dialogで会話フロー定義が完了。
3-5. 動作確認
Intent/Entity/Dialogが揃ったので、チャットボットを動かす準備ができた。
開発したAssistantは、画面右上の「Try it」ボタンから動作を確認することができる。
4.応用編
クラウド(IBMCloud)のサービスを利用するメリットとしては、他サービスや自作アプリとの連携の容易性が挙げられる。
Watson Assistant単体で作ったチャットボットは少し寂しい気もするため、IBMCloudが提供する他のサービスとの連携を試してみる。
簡単に連携できそうな翻訳サービスのWatson Language Translatorと繋いで、チャットボット経由でユーザーに翻訳機能を提供するサービスを作ってみる。
Watson Assistant~Watson Language Translator間には、FaaS(Function-as-a-Service)のIBM Cloud Functions(ICF)で定義したActionを経由してサービスを連携する形とした。
4-1. 概要
4-2. Language Translatorの準備
Language Translatorはサービスを作成するだけ。
資格情報に表示される以下2点は、IBM Cloud Functions(ICF)で使用するため控えておく。
- API鍵(API KEY)
- URL
※手順はこちらが参考になる。
4-3. IBM Cloud Functions(ICF)の準備
IBM Cloud Functions(ICF)からLanguage TranslatorのAPIを呼び出すようにする。
”Functions”をキーワードにサービスカタログから検索し、「作成の開始」を押下。
アクション名に任意の名前、ランタイムはNode.js 12を選択し、作成を押下。
エディター画面に遷移し、Node.jsの実行するコードを記述する。
/**
*
* main() このアクションを呼び出すときに実行されます
*
* @param Cloud Functions アクションは 1 つのパラメーターを受け入れます。このパラメーターは JSON オブジェクトでなければなりません。
*
* @return このアクションの出力。この出力は、JSON オブジェクトでなければなりません。
*
*/
const LanguageTranslatorV3 = require("ibm-watson/language-translator/v3");
const { IamAuthenticator } = require("ibm-watson/auth");
const languageTranslator = new LanguageTranslatorV3({
version: "2018-05-01",
authenticator: new IamAuthenticator({
apikey: "{4-2のAPI鍵(API KEY)}",
}),
serviceUrl:
"{4-2のURL}",
});
var translateParams = {
text: "Hello.",
modelId: "en-ja",
};
const tanslateFunc = (x) => {
return new Promise((resolve) => {
languageTranslator
.translate(x)
.then((translationResult) => {
resolve(translationResult);
})
.catch((err) => {
reject("error:", err);
});
});
};
async function main(params) {
if (params.word) {
translateParams.text = params.word;
}
var x = await tanslateFunc(translateParams);
return x;
}
作成したコードは画面からテストできる。
「パラメータを付けて起動」でパラメータを指定し、「起動」でレスポンスを確認する。
結果にレスポンスが表示され、「I'm hungry → お腹が空いた」の翻訳に成功していることが分かる。
"result": {
"character_count": 11,
"translations": [
{
"translation": "お腹が空いた。"
}
],
"word_count": 4
},
"status": 200,
"statusText": "OK"
最後に、作成したActionをAPIとしてAssistantから呼び出しできるように設定しておく。
認証を含めるかどうかなど、いくつかの設定方法があるが、今回は動作を手っ取り早く確認するために、Webアクションを有効にして行う。
(※IBM Cloud FunctionsでAPIを作成するを参考にさせていただきました)
「エンドポイント」のメニューにある「Webアクションとして有効化」にチェック(ON)し、保存する。(表示されたURLは後で使うので控えておく)
URLを知っていれば誰でも実行アクセスできてしまうので、使わないときは無効化するか、API認証を使うようにしましょう
4-4. Assistantの設定
Watson AssistantからDialogsスキルを作成し、Intent/Entityなしで簡単な翻訳ボットを作る。
まず、デフォルトのWelcomeメッセージの文言をそれっぽく直しておく。
次に、Welcomeメッセージのノードの下に翻訳するノードを追加し、基本的な設定を入れる。
- 名前・・”翻訳(英語→日本語)”など任意の名前でOK
- If assistant recognizes・・「anything else」 ※何が入力されてもノードが検知されるようにしておく
- Then assistant should・・「Jump to ようこそ(Evaluate responses)」 ※翻訳した後は最初に戻るようにする
以降は、AssistantからIBM Cloud Functions(ICF)の翻訳APIを呼び出す設定を行う。
(参考:IBM Cloud資料:ダイアログからのプログラマチック呼び出しの実行)
メニュー左のOptions > Webhooksを選択 → URL欄に4-3.最後に表示されたWebアクションのURLをペーストし、URL末尾に「.json」を付ける。
ノードの名前(”翻訳(英語→日本語)”)の右隣にある「Customize」から、Callout to webhooksを有効にする。
これでAPIを使う設定はできたので、最後にユーザー入力・ユーザーへの回答(翻訳結果)を設定する。
「Then call out to my webhook」に、翻訳APIをコールするパラメータを設定する。
- Parameters-Key・・word (IBM Cloud Functions(ICF)に実装したAPIパラメータキー
- Parameters-Value・・" input.text ?>" (ユーザーの入力内容)
「Assistant responds」には、以下を設定する。※Webhookを有効にした際に、$webhook_result_1とanything_elseが自動的に用意されます
- $webhook_result_1・・翻訳結果: $webhook_result_1.result.translations[0].translation ?> (レスポンスJSONから翻訳結果を取得)
- anything_else・・”翻訳に失敗しました” (API呼び出しに失敗した場合の任意メッセージ)
以上で、Assistantの設定は完了。
最後に動作確認。
「Try it」から動かしてみると、翻訳結果が意図した通りに返ってきたことが分かる。
外部APIをAssistantから呼び出して、チャットボットに翻訳機能を導入できた。
5.有料プランでできること
Plus/Enterpriseプランでは月額の料金が発生するが、電話等のより多くのチャネル統合や、アクティブユーザー数や登録スキル数の上限も多く、自動学習などもサポートされ、より実用的な環境向けのプランとなっている。(詳細は、料金プランを参照)
Plusプランに関しては、30日間のfree trial期間があるので、その期間内で有料プランの機能を試すことができます。
6.Searchスキルお試し ※Plusプラン(有料)編
Plusプランから使用できる代表的な機能のSearchスキルを試してみる。
北海道でおすすめのランチとしてスープカレーを紹介し、ユーザーの希望をヒアリングして、Searchスキルを使ったWebサイトの情報を提供する簡単なチャットサービスを作ってみる。
※3.Dialogスキルで作るチャットボット Liteプラン(無料)編で作成したDialogスキルに、Searchスキルを追加するカスタマイズを加えます。
6-1. Searchスキル準備
Plus(有料)プランに変更を求められる。※画面はfreetrialの場合のイメージ
そのまま進めていくと、元の画面に戻ってくる。
ボタンが「Add search skill」に変わっているので、こちらからスキルを追加する。
6-2. Watson Discovery準備
Searchスキルでは、Watson Discoveryのサービスが裏側でルーティングされているため、Watson Discoveryのインスタンスを作る必要がある。
[Watson Discovery参考]
Watson Discovery
IBM Cloud資料:Watson Discoveryの概要
こちらの手順同様に、Searchスキルで使用するDiscoveryの外部データソースコレクションを準備する。
※バージョンによって、若干ユーザーインターフェースが異なります
今回は、「北海道 スープカレー ランキング」でGoogle検索の上位に出てくる以下のサイトをDiscoveryにWebクローラで読み込ませている。
【2021年最新!】北海道のスープカレーで今年人気のおすすめ30店
【2021】札幌でスープカレーの人気店をランキング16!おすすめ穴場の名店も
6-3. Searchスキル作成
Discoveryを設定後、「Back to Watson Assistant」でAssistantの画面に戻ってくるので、作成したDiscoveryを選択して「Next」→次の画面もそのまま「Create」。
6-4. Dialogスキルの会話フロー
まず、「Add an actions or dialog skill」で3.Dialogスキルで作るチャットボット Liteプラン(無料)編で作成したDialogスキルを追加しておく。
Dialogスキルにいくつか会話フローを準備する。
- (User)北海道のランチのおすすめ教えて → (Bot)スープカレーはいかがでしょうか? → (User)はい or いいえ
- はい:(Bot)要望内容を聞く
- (User)要望を伝える → (Bot)Searchスキルが検索結果を応答する
- (Bot)希望に沿った回答か確認する → (User)はい or いいえ
- はい:終了
- いいえ:再度、要望を聞き直す
- (Bot)希望に沿った回答か確認する → (User)はい or いいえ
- (User)要望を伝える → (Bot)Searchスキルが検索結果を応答する
- いいえ:(Bot)終了
- はい:(Bot)要望内容を聞く
6-5. Dialogスキル→Searchスキル呼び出し
ユーザーの要望を入力後に、Searchスキルを呼び出すノードの設定は以下となる。
- Assistant respondsに「Search skill」を選択
- 「Customize」リンクを押下すると、Queryの入力欄が表示される
- Query: input.text ?>でユーザーの入力をSearchスキルに渡す
6-6. 動作確認
チャットボットの動作確認は、AssistantのPreviewから行う。
※DialogスキルのTry itからはSearchスキルが呼び出せない
ダイレクトに欲しい情報だけ回答されなかったり、学習したWebサイト内の関係ない情報がノイズとして拾われてたりするが、Searchスキルを使ったチャットボットの雰囲気は伝わるかと思います。
7.まとめ・感想
Watson Assistantについては、プロジェクトでの開発経験は無かったが、IBMCloud資料を中心に、ネット記事を参考にすることで、自学でもそこそこのチャットボットが作れることが分かった。(いくつか紹介できなかった機能がありますが)
Watson Assistantは、AIやWatsonの自然言語処理に触れるには、あまりハードル高くなく(ノンプログラミングで)トライすることができ、無料プランでも十分な機能が提供されているため、インターンシップや勉強会のネタとして適しているサービスだという印象を持った。
とはいえ、実運用レベルでの構築ノウハウや、Slack/LINE/電話との統合、Searchスキルをより高い精度で使うためのWatson Discoveryの理解(カスタマイズ等)については、今後引き続き学習が必要であると感じた。
サービスも日々進化を続けているので、アップデートにも注目しつつ、他社クラウドで提供されている同類サービスとの違いを比較したり、日々の業務で役立つ活用方法(問い合わせボットなど)も見出していきたい。