Einsteinボットのインテント初級編（ややかしこいボットをつくる）

正直リファレンス読めばわかるぜ！っていうレベルではあるんですが
まだカレンダー3日ということでお手柔らかに、よろしおす。

個人的に遊んでいて楽しいので、例によってお題はEinsteinボットです。

##Einsteinボットとは？
LiveAgentもといチャット用の自動応答ボットです。ねんのため。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/1241df09-5546-06b3-62b0-cf6965944ce5.png)

チャットの設置自体は従来通りで、Einsteinボットを有効にしておくと
チャットのオペレータ接続前に、ボットが顧客と会話してくれます。
オムニチャネルの一環としてコミュニティに設置しておいたら、い～んでないかしら。





リリースの度にすくすく成長しているボットが、かわいくて仕方ないわけですが
今回は設定画面にカルーセルのガイダンスが登場してます。
より皆さんに親しみやすくなったのではないでしょうか！（リンク先のリファレンスは相変わらず英語ですががが。）

winter'20 リリースノート
https://releasenotes.docs.salesforce.com/ja-jp/winter20/release-notes/rn_einstein_bots_setup_carousel.htm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/8ae287e9-b810-30a1-5617-29706161ac1a.png)


##基本の会話パターンはダイアログ

ダイアログという単位でメッセージのまとまりをポチポチ作って
それをつなげれば、ロジカルに決まりきった会話はすぐ作れます。
解説不要というほどではないですが、以前スライドも作ったので今回は省略します。

拙LT
https://www.slideshare.net/ssuser123ee3/lt-einstein-bot


##より自然な会話に見せたいIntent

Einstein ボットの概要によると
>NLU によるインテリジェントな応答	NLU テクノロジに接続されているボットは、顧客への適切な応答方法を学習できるため、エージェントはより多くの複雑な作業に対応できるようになります。
https://trailhead.salesforce.com/ja/content/learn/modules/service_bots_basics/learn-about-einstein-bots

とのことなんですが、
今のところ日本語は未対応のようなんですよね。
>今回のリリースには、ベータバージョンの NLU (自然言語理解) が含まれています。機能の品質は高いですが、既知の制限があります。NLU は、Salesforce がドキュメント、プレスリリース、または公式声明で正式リリースを発表しない限り、正式リリースされません。特定期間内の正式リリースあるいはリリースの有無は保証できません。現在正式にリリースされている製品および機能に基づいて購入をご決定ください。NLU に関するフィードバックや提案は、Success コミュニティの IdeaExchange に投稿してください。

見逃し屋さんの自分なので
近年のリリースノートで掲載があっても気が付いてない！だったら申し訳ないですが
今のところ、対応のお知らせは**ない**認識です。

とはいえ、全く機能しないかというとそうでもなく。
summer'19で、インテリジェンスとは言わないまでも
決まった語句であれば反応するようになってくれています。

>ダイアログインテントで、いくつかのキーワードを入力し、顧客が使用した発言に完全一致で照合することを選択できます。
https://releasenotes.docs.salesforce.com/ja-jp/summer19/release-notes/rn_service_bots_setup.htm

手順は簡単
①「ダイアログインテントの有効化」ボタンを押して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/cf4b6c0f-c937-0c1d-13b5-9cf8dd461e64.png)
②「ダイアログのインテント」タブから単語を登録するだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/d2c9bb27-a9c5-0f56-1aca-d95bbda1669e.png)

右上はインテントの有効化後は「Einstein」の有効化スイッチに切り替わりますが、
これを押下できるようになるには発言を20個以上登録しなくてはなりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/c012b4b1-57e3-6163-4012-fb6df4b71b74.png)

>20 個の一意の発言を追加すると、Einstein を有効にすることができます。

「一意の」とはあるものの、同じものを複数登録して水増ししてもONにはできます。
ただ、発言数が少ないと判定の精度が悪いのか、
あるいは見かけONなだけで、その実OFFなのか…
結果、完全一致でしか動きません。
（いちおう英語で試しています）
というわけで、極力150以上の発言を登録すべきですが、まぁ骨が折れますよね。

##お手軽Intentセット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/6114223b-6305-7360-97b2-c32d80734729.png)

AppExchenge経由でIntentセットをインストールしておくと、
選ぶだけで追加することができます。
まとまった発言数のものがリリースされてますので、登録の手間が省けるのはステキですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/f0340746-13ec-669f-7f38-718e1a46cf5b.png)


さぁ今すぐApp Exchangeで検索・・・
と言いたいところですが、ひとまず英語で探すことをオススメします。
お試しで入れるなら、このあたり。
hello, thanks,　という基本の英単語が登録されています。
https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000FYDvHUAX

パッケージなので当然中身が見れないのですが、
`Hello`に対応するということは・・・よくある間違いの`hellow`や`hallo`でも
忖度して応答してくれるようになります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/97950610-a447-35af-ac3b-b7345dbd6332.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/0978d4bd-d92d-a00b-6013-82c81e86db30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/c9c454ef-2e41-b679-6225-2b3689518a88.png)

まぁ1単語あたり150語ほど登録してると思うと、学習なのか？パターン網羅なのか？ってちょっとだけ思っちゃいますけどね。
気合と根性で登録できるなら、難しい知識なしに自分でも作れるかもしれません笑
とにかく無料で入れられるので、存分にお戯れください。

実際に業務用ってなると、まだまだAppExchengeにはないのかな…？見逃してる？

##Intent一括登録

ヘルプにはCSVを用意してオブジェクトへ登録する方法が載っています。
https://help.salesforce.com/articleView?id=bots_service_train_bot.htm&type=5
>データローダで、CSV ファイルの列と MlDomainName、MlIntentName、Utterance の間の対応付けを作成します。これらの項目はそれぞれ、[インテントセット名]、[インテント名]、[発言] に対応します。Intent Utterance (MLIntentUtterance) オブジェクトにアップロードします。

が、今回は個人的に楽だと思うやり方として
SFDXでのやり方を少し掲載しておきます。

SFDXの詳しい使い方は、他に詳しい記事があるので割愛しますが、
ボットもご多分に漏れずメタデータをXML形式でretrieveしたり
編集したものをdeployしたりできます。

複雑なダイアログを編集するのでなければ、こちらでも十分編集できます。
何より軽い。コピペしやすい。
フロー呼んだり、分岐増やすとちょっと面倒になりますけどね。

```example.bot
<?xml version="1.0" encoding="UTF-8" ?>
<Bot xmlns="http://soap.sforce.com/2006/04/metadata">
    <botMlDomain>
        <label>Dr</label>
        <mlIntents>
            <relatedMlIntents>
                <relatedMlIntent>hogehoge.hello</relatedMlIntent>
            </relatedMlIntents>
        </mlIntents>
        <name>example</name>
    </botMlDomain>
    <botVersions>
        <fullName>v1</fullName>
        <botDialogs>
            <botSteps>
                <botMessages>
                    <message>こんにちは、ようこそ僕！</message>
                </botMessages>
                <type>Message</type>
            </botSteps>
            <botSteps>
                <botNavigation>
                    <botNavigationLinks>
                        <targetBotDialog>Main_Menu</targetBotDialog>
                    </botNavigationLinks>
                    <type>Redirect</type>
                </botNavigation>
                <type>Navigation</type>
            </botSteps>
            <developerName>Welcome</developerName>
            <label>ようこそ</label>
            <showInFooterMenu>false</showInFooterMenu>
        </botDialogs>
        <botDialogs>
            <botSteps>
　　　　　　　～中略～
            </botSteps>
            <developerName>Main_Menu</developerName>
            <label>メインメニュー</label>
            <showInFooterMenu>false</showInFooterMenu>
        </botDialogs>
        <entryDialog>Welcome</entryDialog>
        <mainMenuDialog>Main_Menu</mainMenuDialog>
        <responseDelayMilliseconds>200</responseDelayMilliseconds>
    </botVersions>
    <label>exampleBotくん</label>
</Bot>
```


###インテントはmlIntentUtterancesタグとutteranceタグ

```exampleIntent.bot
        <mlIntents>
            <developerName>EinsteinEn</developerName>
            <label>Einsteinのテスト（En）</label>
            <mlIntentUtterances>
                <utterance>How is the weather today.</utterance>
            </mlIntentUtterances>
        </mlIntents>
```

囲んで羅列でOKです。

たとえば登録前はこんな感じだったとして。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/05a61c2d-566d-b221-7775-cc3435b1a96e.png)

ここに足したい項目を、みんな大好きExcelコーディング（勝手に命名）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/3e9d2a1f-e86a-c74e-a635-682fc42d1d6e.png)

xmlに貼る。
VSCodeなら自動で整形もしてくれますし。
末尾のタグとかは掃除しておこうね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/cdb49bc8-3689-efaa-59cb-518376ca4257.png)

あとはdeployのおまじないを唱えるだけ。

```
sfdx force:mdapi:deploy -d  C:\hoge\manifest\unpackaged\  -u hogeorg
```

すると、ほらー。
入った入った。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/2aae4f50-c5d4-029e-9194-794c6815f198.png)

とりあえずパターン愚直に入れたので、今回の例がイマイチなのはご愛敬。
大文字小文字は区別しないそうですが、
半角・全角スペースなどは別物として認識するそうです。

さすがに100個超えるとちょっと学習の片鱗が見えます。
「元気やな」は登録してないのですが、さんざん「元気？」の変化形を登録したので学習したようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/fee7de48-8be5-79cf-2453-b0822936f553.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/1574cda1-0a9c-a1ee-e2cc-9b73674014e0.png)



Excelとはいえ、100個も200個も値を量産するのは、さすがにだるかったので
やっぱり効率よく学習させたり、既存のインテントをどんどん登録したりできる方がいいのでしょうね。
近い将来、日本語インテントも続々と増えるとよいのですが。

そのうち、みんなでインテント登録大喜利でもやりますかねー。
ご興味ある方はDMください。


ではでは、お粗末さまでした。
みなさまも、ぜひボットくんとなかよくしてね！