SAP CoPilotで独自スキルを作ってみた

# はじめに
みなさん、SAP CoPilotをご存知でしょうか？

SAP CoPilotとは、SAPによるエンタープライズ向けのデジタルアシスタントです。コンシューマ向けのデジタルアシスタント（Google Assistant、Amazon Alexa、Apple Siriなど）には、触れる機会が多いと思いますが、今回は少しレアかも知れないエンタープライズ向けのデジタルアシスタントをご紹介したいと思います。

2018年10月に開催された[SAP TechEd](https://events.sap.com/teched-2018-usa/en/home)に参加し、SAP CoPilotのハンズオンセッションを受講してきました。この記事は、そのセッション内容がベースとなっています。また、この記事は[SAPアドベントカレンダー](https://adventar.org/calendars/3262)企画に参加して書いています。ぜひ他の記事も読んでみてください！

### 前提条件
SAP CoPilotを使用するためには、SAP Cloud Platformのサブスクリプションが必要となります（この前提条件が、一番高いハードルかも知れませんね）。詳細は、[こちら](https://www.sap.com/products/digital-assistant.html#product-overview)をご参照ください。
![subscription.png](https://qiita-image-store.s3.amazonaws.com/0/319241/9d46bc9f-1a91-1c3b-85d7-336ece162966.png)
SAP CoPilotサブスクリプションを有効化し、適切に設定を行う（これがまた難儀なのですのが、それはまた別の機会に）と、SAP Cloud Platform上にあるCoPilot（コアのサービス）と、スキルを作るために必要なSkill Builderというツールが使えるようになります（AWSでのAmazon Lexのようなものです）。今回は、2018年10月時点で最新のものを使用しています。

### 最初に覚えておきたい3要素
SAP CoPilotスキルを作り始める前に、言葉の整理をしておきましょう。スキルを作る上で、**『Skill』『Intent』『Utterance』**という3要素がとても重要になります。

|要素|意味|
|:--:|:---|
|**Skill**|Intentをバンドルしたもの。いわゆるスキル。|
|**Intent**|ユーザーのやりたいこと。意志/意図/目的。|
|**Utterance**|Intentをトリガーするための合言葉。発言/発声/発話。|

表だけだと分かりにくいと思いますので、具体例を挙げてみましょう。「製品管理」というSkill、製品を「登録したい/読込したい/変更したい/照会したい」というIntent、そして一例として照会（Query）したい場合のUtteranceです。
![elements.png](https://qiita-image-store.s3.amazonaws.com/0/319241/b0d10c8c-eea1-02e0-7dd7-f6c19ea86efb.png)
Intentの動詞を眺めると分かるように、ODataオペレーション（Create/Read/Update/Query）と一致していますよね？ このように、ODataオペレーションをベースとしてIntentが構成されているというのが、SAP CoPilotの特徴のひとつです。

# SAP CoPilotで独自スキルを作ってみた
さて、前置きが長くなりましたが、いよいよ独自スキルを作ってみましょう。ところで、「独自」と明記していることにも意味があります。SAP CoPilotは、SAP標準のデジタルアシスタントなので、わざわざ独自スキルを作成しなくても、膨大な標準スキルを提供してくれるようになります。今回は、ハンズオンそのものが目的だったため、独自スキルを作成しています。

### スキル作成編
まず、Skill Builderにログインして、「New Skill」をクリックします。
![skillbuilder01.png](https://qiita-image-store.s3.amazonaws.com/0/319241/46544ef8-f532-582f-ae8c-d1f43cc84b51.png)

スキル名を入力して、Intentを追加します。
![skillbuilder02.png](https://qiita-image-store.s3.amazonaws.com/0/319241/d30e9d22-e0f6-30e0-104d-5c34e5f81c17.png)

ODataサービスのエンドポイントを直接指定するか、「Browse」をクリックします。
![skillbuilder03.png](https://qiita-image-store.s3.amazonaws.com/0/319241/92a07c8c-9576-b363-b87c-3e9a16f77286.png)

「Browse」をクリックした場合は、ODataサービスを選択し、「Import Service」をクリックします。
![skillbuilder04.png](https://qiita-image-store.s3.amazonaws.com/0/319241/fe50c512-ac65-c58c-3eeb-877bcf2163cb.png)

選択したODataサービスのオブジェクト（エンティティ）を選択します。
![skillbuilder05.png](https://qiita-image-store.s3.amazonaws.com/0/319241/19da55f2-1591-939a-9b5c-704c2f1c7d57.png)

オブジェクト（エンティティ）を選択したら、それに対するオペレーションを有効化します。今回は、一覧を取得するQueryオペレーションを選択します。
![skillbuilder06.png](https://qiita-image-store.s3.amazonaws.com/0/319241/d2fca631-2aac-97fc-5734-be721b6356e7.png)

選択したオペレーションに必要なパラメータを選択します。ここまでで、Intentの基本設定は完了です。いったん「Save」をクリックして保存します（保存後、スキル一覧画面に戻ります）。
![skillbuilder07.png](https://qiita-image-store.s3.amazonaws.com/0/319241/c90f226e-380d-0614-5ac0-3de619b683ea.png)

設定に残があると、『！』マークがつきます。再びIntentを選択して、内容を確認してみましょう。
![skillbuilder08.png](https://qiita-image-store.s3.amazonaws.com/0/319241/08d2c26a-22f7-0345-da74-4399ee18023a.png)

**UI Display**（UI表示設定）が未完了なようです。また、**Utterance**には黄色い『！』マークがついていますが、これは警告です。
![skillbuilder09.png](https://qiita-image-store.s3.amazonaws.com/0/319241/5b50aeca-53b0-ac29-1a24-a4a20affd787.png)

UI表示設定のTitleとSubtitleとImageを設定します。これにて設定完了です。
![skillbuilder10.png](https://qiita-image-store.s3.amazonaws.com/0/319241/fc9f3a29-3e6f-6c95-1e97-5f3760741c08.png)

続いて、警告が出ていたUtteranceを確認します。ヒントが未設定のため、警告となっているようです。質問の仕方、例えば "Show me products from ABC." といった「このように聞いて欲しい」というUtteranceをヒントとして追加します。このヒントがあるおかげで、始めてこのスキルを利用する人も、迷わずに利用できるようになります。
![skillbuilder11.png](https://qiita-image-store.s3.amazonaws.com/0/319241/02d4c13b-3e81-eab2-8bfd-4d95e07b238b.png)

必要な設定がすべて完了したら、「Build」をクリックします。ビルドが完了するまで、しばらく待ちます。
![skillbuilder13.png](https://qiita-image-store.s3.amazonaws.com/0/319241/e5c0cbdc-785f-ecc2-0b6a-91bb3921918a.png)
以上でSAP CoPilotスキルが作成できました。

### スキル実行編
さて、いよいよ実際に作ったスキルを実行してみます。ハンズオンでは、SAP CoPilotのスタンドアロン版で動作確認しました。会話の流れは以下の通りです。

* わたし：Could you show me products of supplier 'AVANTEL'?
* SAP CoPilot：Here's what I found products with supplier AVANTEL.
* わたし：show me a price of second one
* SAP CoPilot：The prise per unit for the product "ITelO Vault SAT" is 149.00 USD.

最初に「サプライヤーAVANTELの製品を見せて」とお願いすると、「見つかりました」と言って写真付きの製品リストを返してくれました。次に「二番目の値段は？」と聞くと、「ITelO Vault SAPの単価は149ドルです」と答えてくれました。
![copilot.png](https://qiita-image-store.s3.amazonaws.com/0/319241/f5685661-b067-a506-67f8-7a13b69bbb51.png)

説明を簡単にするため、Queryオペレーションだけをご紹介しましたが、もちろん "I would like to create ..." と言えばCreateオペレーションを実行することができます。また、Queryオペレーションもサプライヤー以外の条件も加えた "Show me products that are availability in stock and price over 150 dollars in category of computer components."（在庫がある150ドル以上のコンピュータ部品を見せて）のような長文も理解できます。

# SAP CoPilotで独自スキルを作ってみて
実際に、Skill Builderを使って独自スキルを作ってみて感じたことを書きます。

### あれ？ Utteranceをセットしていないですよね？
Amazon Lexにも、Intent（やってほしいこと）とUtterance（Intentをトリガーするための合言葉）がありますが、多くのサンプルUtterancesを登録して、漏れなくIntentがトリガーされるようにするのが、非常に大変でした。

具体的には、"Show me products", "Let me see ...", "Can I see ..." など、意図は同じで言い回しが違うものをいかに網羅するかが勝負でした。Intentがなかなかトリガーされないと、すぐにポンコツBot認定されてしまいますからね。

SAP CoPilotでは、例えば "Show me products" と聞いてください、というヒントUtteranceをひとつ定義しただけです。これ、すごくないですか？

### 揺れに強いですよね？
SAP CoPilotは、IntentがODataオペレーションという『決め』を作ったことで、人間が入力したUtteranceを人工知能が推察しやすくなっています。要するに、"Show me" でも "Let me see" でも "Can I see" でも、ユーザがやりたいことはQueryオペレーションということです。

それ以外にも、例えば、サプライヤー名をAVANTEL（＝存在する）ではなくAVENTAL（＝存在しない）と入力すると、「もしかしてAVANTELでしょうか？ AVANTELの製品はこちらです」と、やんわりと訂正してくれたり、ちょっとしたスペルミス、冠詞抜け、接続詞揺れなどは、いい感じに吸収してくれます。AIテクノロジーさまさまですね。


# さいごに
いかがだったでしょうか？ 

今回は、少しレアかも知れない（？）エンタープライズ向けのデジタルアシスタントをご紹介しました。一日も早くメジャーな存在になることを願ってやみません。大変残念ながら、投稿時点ではSAP CoPilotは日本語に対応していません。Amazon Lexも日本語に対応していないことを考えると、日本語の自然言語処理の難しさがうかがえますね。一刻も早い日本語対応を期待しています！

SAP CoPilotは、Digital Assistant（デジタルアシスタント）ではなくBot Integration Hub（ボット統合ハブ）という画期的な顔も持っているのですが、それはまた別の機会に書きたいと思っています。

### 参考情報
SAP CoPilot公式ページ：[https://www.sap.com/products/digital-assistant.html](https://www.sap.com/products/digital-assistant.html)