CEK(Clova Extension Kit)のハンズオンを新潟で開催した時の話し

# Clova Extension Kit のハンズオンセミナーを新潟で開催
:warning:**この投稿内では CEK の使い方等、細かな開発については触れておりませんのでご注意ください。**
:warning:**また、いくつか特殊な用語がでてきますが、それらの説明は行っておりません。**

**くわしくは、↓ のリンクから LINE 公式の資料等を参照ください。**
[ドキュメント](https://clova-developers.line.me/guide/)

## きっかけ
お恥ずかしい話しなのですが、LINE BOOT AWARDS の存在を知りませんでした。

エンジニアの繋がりで紹介していただいた
「LINE BOOT AWARDS公式夏期講習 ～Messaging API アップデートハンズオン～」へ参加したので
そこで学んだことを地元 新潟にも展開しよう！ということで
今回ハンズオンセミナーを開催することになりました。

## やったこと
1. Messaging API で Bot 開発
2. CEK で Clova のスキル開発

どちらも、事前に頂いたプレゼン資料をほとんどそのまま使わせていただきました。
ご協力いただいた皆様へは多謝多謝 & 多謝でございます。

# ここからが本題
## Bot 開発
資料の通りで問題なく進めることができました。
## スキル開発
あれ？動かない・・・

**どうやら「呼び出し名」の登録に注意が必要なケースがある**
について以下に書いていきます。

# 「どうやら「呼び出し名」の登録に注意が必要なケースがある」の詳細
## ゴール
星座を Clova に伝えると今日の運勢を答えてくれるスキルを作る。
を目標にしている資料を使わせていただきました。

## Clova で占いスキルを使う時のざっくり流れ
1. 人)ねぇ Clova(ウェイクアップ)
2. 人){呼び出し名}を起動して
3. Clova)星座を教えてください
4. 人)射手座
5. Clova)あなたの今日の運勢は～です

## 少しだけ掘り下げる
上にも記載しました通り「ほとんど」お借りした資料のまま進めていたのですが
若干 加えてしまったアクセントが悪影響を及ぼしたのだと最初は考えていました。

1. スキルは資料の通りに作った。
上に書いた{呼び出し名}も資料の通り「サンプル占い」としました。
スキルのモロモロの情報や接続先サーバーも指定の通りです。
対話モデルでは、全星座分のスロットを作るのが大変だったので少し省略・・・

2. ~~サーバー側は Heroku を使う~~
Bot と同じくローカルで node を動かして ngrok でフォワードする
以下の理由から [CEK SDK README](https://github.com/line/clova-cek-sdk-nodejs) を使ってサーバー側の処理を作りました。

(結果、原因ではなかったものの確立された手順を守らないのは悪手なので反省・・・
　原因の特定が遅れたのも、この変更のせいで「間違う可能性がある箇所」の範囲を
　広げてしまったというのもありました。

- 直前に行った Bot 作成で node+ngrok の環境を作っていた。
- 普段、開発をゴリゴリやっていない方に参加いただいたので複数の技術を使いたくなかった。

## 動かしてみました
LINE Clova のスマホアプリから作ったスキルを「利用可能」に設定して動かしてみました。

1. 人)ねぇ Clova(ウェイクアップ)
2. 人)サンプル占いを起動して
3. Clova)**すみません。よくわかりませんでした**

わかって！お願い！

### そもそも、「よくわかりません」ってどういう時のメッセージ？
以下のことから素直にメッセージから受け取れる通り、
「{スキル名}を起動して」の {スキル名} に該当するスキルを見つけられなかった。
ということだと推定しました。

* 正常に動いているスキルのサーバー側でエラーが発生するよう加工して起動すると<br>
　「現在利用できません」といった別なメッセージだった。
* うまくいかないスキルと連携したサーバー側のコンソールに<br>
　例外ログは出力されなかった。

→スキルは起動できたけどサーバーで問題発生！のメッセージではなさそう。

+ 対話モデルからテキストベースで「魚座の運勢」とテストすると<br>
　作ったサーバー処理にアクセスして意図したレスポンスを受け取れた。

→スキル起動後のサーバーとのやり取りは正常に動いている。

## スキル名を(Clova が認識できるように)正しく言えているか
対話モデルを設定する画面から「発話履歴」の参照が可能です。
つまり、Clova にどう聞こえているか。をテキストで確認できます。

発話履歴を記録する状態に設定して再チャレンジ

1. 人)ねぇ Clova(ウェイクアップ)
2. 人)サンプル占いを起動して

発話履歴を見ると・・・ "サンプル占いを起動して"
ちゃんと聞こえてるぅ。

## 詰んだ・・・と思いました。
もうどこが悪いか分からん！となったところで Boot Awards を紹介してくれた方の登場です。

1. 人)ねぇ Clova(ウェイクアップ)
2. 人)サンプル占い~~を~~起動して
3. Clova)星座を教えてください

**！！？！！？！！？**

ギャー動いた！

発話履歴を見ると・・・ "サンプル占い起動して" いったい何が起きているんだろう・・・

## いったん落ち着ていて前自分が作ったスキルを動かしてみました
その名も「ラーメン情報」

1. 人)ねぇ Clova(ウェイクアップ)
2. 人)ラーメン情報**を**起動して
3. Clova)ラーメン情報を検索します

こっちは **を** が付いていても動きます。

## 整理してみる・・・
* サンプル占いの場合：<br>
　　サンプル占い**を**起動して → "サンプル占いを" スキルを探してる？<br>
　　スキルに指定した呼び出し名は "サンプル占い" なので **を** が差異になっています。
* ラーメン情報の場合：<br>
　　ラーメン情報**を**起動して → "ラーメン情報" スキルを探してる。<br>
　　スキルに指定した呼び出し名は "ラーメン情報" なので一致します。

ここからは想像ですが前後の文脈からスキルで言う スロット=スキル名 に当たる文章の
区切り方が変わってこうなっているような気がします。

### 試しに
呼び出し名(複数指定可)に「サンプル占いを」を追加して再チャレンジ

1. 人)ねぇ Clova(ウェイクアップ)
2. 人)サンプル占い**を**起動して
3. Clova)星座を教えてください

動きました。

ちなみに、この呼び出し名を追加する前に声の高低を変えてみたり
言葉を発するリズムを変えてみたりしたのですが
「発話履歴」上で **を** が含まれていて正しく サンプル占い が呼び出されたことはありませんでした。

# 最後に
スキルが呼び出せない時にこんなこともあるよ。という情報共有です。

「～を起動して」から実際にスキルが起動され
登録したサーバーにリクエストするまでの間はブラックボックスなので
"サンプル占いを" スキルを起動しているとは全く考えていませんでした。

「発話履歴」のあたりから文章の内どの部分を {呼び出し名} としているか
参照できるようにならないだろうか。と希望的なことを述べて
終わりとさせていただきます。

ここまで読んでいただきありがとうございました。

# 2018/08/26 追記
有識者の方とお話しさせていただいたところ既知の問題(課題)とのことでした。

そしてこれは、Clova のみでなく、その他スマートスピーカー
ひいては自然言語解析そのものが抱えているものとのことです。

日々 AI も学習しモデルも成長し続けていることと思います。

その中で一時的に認識精度が下がったり急に上がったりという時期もあるでしょうし
使いこなせるかどうかは結局のところ人に委ねられています。

こういった認識が甘かったなぁ。と今は考えています。