SAP Conversational AIでチャットbotを作成してみよう

SAP Tutorialsを参考に、SAP Conversational AIでチャットbotを作成してみようと思います。

今回はこちらのTutorialを参考にしています。

https://developers.sap.com/tutorials/cai-bot-getting-started.html

## SAP Conversational AI アカウントの作成

まずはこちらの SAP Conversational AI のサイトからアカウントを作成します。

https://cai.tools.sap/

SAP IDをお持ちであれば、Sign in でアカウントを作成することができます。
![スクリーンショット 2024-02-24 1.33.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/180f6f48-9aad-fc05-30c7-89878a063816.png)

免責事項の画面が表示されますので、諸条件にチェックを入れて同意ボタンを押します。これで完了です。
![スクリーンショット 2024-02-24 1.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/4b041eae-15d7-b77c-b0d1-66568ff9f89e.png)

## botプロジェクトの作成

アカウントの作成が完了しログインができると、ホーム画面が表示されます。
早速botプロジェクトを作成しましょう。Start With Templateボタンを押します。
![スクリーンショット 2024-02-24 1.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/a8e16440-5801-5cc7-c332-594e33b65eb0.png)

① "What do you want your chatbot to do?"の画面が表示されますので、Perform Actionsを選択します。
![スクリーンショット 2024-02-24 13.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/8713bcfc-4682-51ab-3555-d79d845523ea.png)


② "Select predefined skills for your bot"にはTutorial に従って、Greetingを選択します。
![スクリーンショット 2024-02-24 13.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/f460eda1-aab7-22a7-5a66-1f278ef946ea.png)

③ "Create your bot"には、￥Tutorial に従って、bot名には`my-first-bot`、Descriptionには`A bot that likes to tell jokes and have a little fun`を入力します。
![スクリーンショット 2024-02-24 13.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/cb8e89cb-1e47-b9de-b9d2-d0510f27d03f.png)

④ "Data Policy"にはTutorial に従って、Type of dataに`Non-personal`、Store conversation dataには`Store (recommended)`を選択します。
![スクリーンショット 2024-02-24 13.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/dea8eb35-603c-78ce-0b6c-a8d97006002e.png)

⑤ "Bot visibility"にはTutorial に従って、Publicを選択します。
最後にCreateボタンを押します。
![スクリーンショット 2024-02-24 13.56.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/c0eaf9aa-26d1-b972-5e48-695b23ea56a5.png)

作成が完了すると、こちらの画面が表示されます。
![スクリーンショット 2024-02-24 13.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/2e638732-368a-d26e-c1b8-a9d823724bb0.png)

## botのステージの解説

botのステージの解説がありましたので、日本語訳を記載します。
![スクリーンショット 2024-02-24 14.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/a90f184f-35be-8532-c382-eddde6768e20.png)

**Train**：botが理解する必要があることを教えます。ここでは、botがユーザーからの表現を認識すべきであるというアイデア、つまりintentsを作成します。

**Build**：私たちのBot Builderツールで会話の流れを作成します。ここで、botが実行できるスキルを与えます。ここでは、botができること（スキル）を作成し、それらがトリガーされるタイミングを定義します。スキルはトリガー、要件（ボットが収集する必要がある情報）、およびアクションによって定義されます。

**Connect**：botを一つまたは複数のメッセージングプラットフォームに展開します。

**Monitor**：ユーザーがbotと、どのようにコミュニケーションを取っているかを確認し、botがユーザーを正しく理解しているかをチェックし、botのintentsやentitiesを更新します。モニタリングはまた、ユーザーが何を求めているかを見ることができ、ボットに追加できる新しい機能のアイデアを提供します。

IntentとEntityについては、ChatGPTの回答をご参考ください。

**Intent**は、ユーザーの発言または質問の目的を表します。つまり、ユーザーが何をしたいか、何を求めているかということです。例えば、ユーザーが「今日の天気は？」と尋ねた場合、そのIntentは「天気を知りたい」という意図を示しています。チャットボットはこのIntentを識別し、適切な天気情報を提供することで応答します。

**Entity**は、Intentに関連する具体的な情報やキーワードを指します。これは、ユーザーの質問や発言から抽出される具体的な詳細や条件です。先の例で言えば、「今日」という言葉は「天気」というIntentに関連するエンティティです。エンティティによって、チャットボットはユーザーが求めている情報をより正確に理解し、より具体的な応答を行うことができます。

## IntentのFork

最初にForkの概念をChatGPTに聞いてみました。ソフトウェアやプロセスの分岐の意味でも使われますが、ここではGithubにおけるForkの概念が正しいと思われます。

**Fork**とは、他人のリポジトリを自分のGitHubアカウント下にコピーすることを指します。このプロセスにより、オリジナルのリポジトリに影響を与えることなく、コピーされたリポジトリで自由に変更や実験を行うことができます。Forkされたリポジトリは独立しており、オリジナルのリポジトリには自動的には反映されません。

Serchボックスに`joke`と入力して、Serchボタンを押します。
![スクリーンショット 2024-02-24 16.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/a00c23d7-a12a-5918-ade1-5799f792e35f.png)

いくつかIntentのリストが表示されますので、`@ask-joke`が付いているものの中から１つを選んで`Fork`を押します。（Tutorialと同じものは私は表示されませんでした。）
![スクリーンショット 2024-02-24 16.32.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/3cd00466-8e85-364f-7c4e-b32e80fae38f.png)

Intentが追加されました。
![スクリーンショット 2024-02-24 16.50.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/eaea3487-59d9-a18a-3fa7-ef2202e6e285.png)

登録されたIntentをクリックすると、登録されているExpressionを確認できます。
![スクリーンショット 2024-02-24 16.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/f0dbedc8-172f-f3d4-3058-0a8f0f64921c.png)

## Intentの新規作成

Intentを新規作成するには、New Intent ボタンを押します。
![スクリーンショット 2024-02-24 16.54.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/3e5d1ea8-9018-27f6-fd91-c84c67f47960.png)

Let's create your intentの画面が表示されますので、Tutorialに従いIntent名に`laughs`、Your intent description (optional)の欄に`A natural reaction to our awesome jokes.`を入力し、Create Intentボタンを押します。
![スクリーンショット 2024-02-24 16.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/88e4209f-78ca-971b-3d9e-6b4fed49db15.png)

同様に、Intent名に`lame`、Your intent description (optional)の欄に`You can’t succeed every time.`を入力し、Create Intentボタンを押します。
![スクリーンショット 2024-02-24 17.01.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/0fc661fd-58ca-4407-686e-cafe015d4614.png)

作成したIntentがリストに追加されました。
![スクリーンショット 2024-02-24 17.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/c7c48855-74ab-5def-b9ce-3606db6b4d04.png)

## Expressionの追加

作成したIntent(意図)にExpression(表現）を追加していきます。
作成したIntent`@laughs`をクリックし、Tutorialに従い以下の文章を一行ずつ入力してEnterを押します。
右側のImport Expressionsボタンは、csvファイルにした一覧を一括で取り込む場合に利用します。
```
Hahaha that's hilarious
ROFL you're good!
That, my friend, was an amazing joke.
I haven't laughed that much in a long time!
```
![スクリーンショット 2024-02-24 17.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/fbd5e17d-9395-f954-0485-957e039d1dd9.png)

追加したExpression はリストに追加されていきます。
![スクリーンショット 2024-02-24 17.10.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/874652f1-6595-c74c-0a9f-bd7045317abc.png)

同様にIntent`@lame`をクリックし、Tutorialに従い以下の文章を一行ずつ入力してEnterを押します。
```
You have no sense of humor whatsoever.
That's both terrible and offensive.
What the heck was that?
Try harder, that was a very bad joke.
```
![スクリーンショット 2024-02-24 17.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/f9a1b9ec-b365-2b85-2029-aeb48fa0c29b.png)

## botのテスト

画面右上のTrainボタンを見るとステータスが黄色になっています。最新のIntentとExpressionを学習できていない状態ですので、Trainボタンを押して最新の情報にアップデートします。
![スクリーンショット 2024-02-24 17.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/3b81f0eb-c3b7-dc5a-83b9-a35a7b4c0887.png)

数秒まつとステータスがグリーンとなり学習が完了した状態になります。
![スクリーンショット 2024-02-24 17.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/832f6a79-9648-a5e3-37fe-d5f6128fb5e5.png)

トレーニングモードはSetting -> Versions -> ドロップダウンぼたん -> Training Modeから、AUtomaticとManualを切り替えることができます。
![スクリーンショット 2024-02-24 17.20.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/392a5c79-c9c8-16cf-ba52-719caae5d0b8.png)
![スクリーンショット 2024-02-24 17.21.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/90f77356-3abe-10a1-deba-78a3e9765c5d.png)

画面右下のExpression Analysisタブを開きます。
![スクリーンショット 2024-02-24 17.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/f2c15252-a229-cdf1-cedb-8ce44f34e72a.png)

Tutorialに従い、`Botty bot, can you tell me a joke please?`を入力しEnterを押します。もしIntentがうまく学習されていれば、テストはbotがそのIntentを認識したことを示すでしょう。
![スクリーンショット 2024-02-24 17.26.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/fc3b1b89-0105-3fdf-1376-0d50183967e9.png)

## スキルを使った会話の流れの管理

Buildタブをクリックすると、以下の画面が表示されます。
![スクリーンショット 2024-02-24 17.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/82a64294-a27b-d144-027d-54c895fffcbc.png)

**スキルとは？**
各スキルは、botが実行できる1つのことを表します。スキルは複雑なもの（例：クレジットカードによる支払いの管理）から、非常にシンプルなもの（例：基本的な質問に答える）まで様々です。意図（Intents）と同様に、スキルはゼロから作成することも、作成した他のbotや他の人のbotからスキルを継承することもできます。

ここで事前定義されたスキル「Greetings（挨拶）」を選択して確認してみましょう。
Greetingsスキルは、すべてのスキルと同様に、4つのタブを持っています：

README.md: スキルの目的の説明
![スクリーンショット 2024-02-24 17.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/4114c4f4-5cc7-c89d-7459-be6c5378a956.png)

Triggers（トリガー）: スキルが実行されるために発生しなければならない条件 - 一般的にはユーザーが表現しなければならない意図
![スクリーンショット 2024-02-24 17.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/a70c1b66-52d5-87c1-fbfe-3c42e46510c4.png)

Requirements（要件）: スキルが実行されるために収集されなければならない情報
![スクリーンショット 2024-02-24 17.37.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/42635a70-3bfe-6cf8-825b-7b93ae5b18a6.png)

Actions（アクション）: 実行するアクション（基本的にこれがスキルです）
![スクリーンショット 2024-02-24 17.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/01717ce8-63f9-f464-6eb7-95138b1cc2e2.png)

## スキルの新規作成

スキルの作成を行います。BuildタブのAdd skillを押します。
![スクリーンショット 2024-02-24 17.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/55ce0ccd-4e6b-aaa3-877d-a08a2c61723b.png)

Tutorialに従い、Nameに`tell-me-a-joke`を入力、Typeに`Business`を選択し、Addボタンを押します。
各Typeの説明の翻訳は以下になります。
・**Business**は、ボットの核心的な目的を反映しています。
・**Floating**は、ボットの核心的なビジネススキルを補完します（例えば、雑談など）。
・**Initialize**（チャットボットには1つだけ存在できます）は、ユーザーとの会話が開始されたときにトリガーされます。
![スクリーンショット 2024-02-24 17.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/757a26fa-51c3-c684-e0f7-2b8143fac96a.png)

作成されたスキルtell-me-a-jokeをクリックします。
![スクリーンショット 2024-02-24 17.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/f79b978e-9ae6-d38a-7593-96514ce62c57.png)

Triggersタブをクリックします。
![スクリーンショット 2024-02-24 17.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/270ab62e-8a07-83c1-ada4-5ded70b2d1b1.png)

Ifの右側の空白を押すと、空白の下にリストが表示されます。そこから`@ask-joke` -> Saveボタンの順にクリックします。
![スクリーンショット 2024-02-24 17.55.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/eb99be27-45b1-8e7f-9b7e-8df655bdfcee.png)

`@ask-joke`が追加されました。`＋`ボタンを押して、同様に`@laughs`と`lame`も追加します。
![スクリーンショット 2024-02-24 17.58.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/6a8158f5-a982-cc2b-663a-fa051fc04461.png)

ANDボタンをどれか一つ押します。
![スクリーンショット 2024-02-24 17.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/22b96494-b062-db24-ba5f-ec53cb7d7b9f.png)

すると一括でANDが全てORに変更されます。
![スクリーンショット 2024-02-24 18.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/c154fcfe-d128-f7a1-9290-be248e253f07.png)

Actionsタブに移動し、`New Action Group`ボタンを押します。
![スクリーンショット 2024-02-24 18.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/89034147-8b5b-ea37-6778-6442657d882c.png)

ADD CONDITION to trigger actionsを押します。
![スクリーンショット 2024-02-24 18.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/226d5cfa-e5cf-f9a9-5ff6-3b5c3361adbf.png)

Ifの右側の空白を押すと、空白の下にリストが表示されます。そこから`@ask-joke` -> Saveボタンの順にクリックします。
![スクリーンショット 2024-02-24 18.07.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/70a474c8-2f39-1a77-15ec-b6b7cfc2445a.png)

Choose Message Typeを押します。
![スクリーンショット 2024-02-24 18.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/d137fa52-dcbc-d5cc-2621-d1caf34d2076.png)

Textを選択します。
![スクリーンショット 2024-02-24 18.09.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/8d043ea1-8f84-5f38-a6f3-5f5b0d10a8fc.png)

Tutorialに従い、`I just flew into town, and boy are my arms tired.`を入力し、Saveボタンを押します。
![スクリーンショット 2024-02-24 18.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/081891e4-a073-a8a6-3e35-c97d7f1a6e20.png)

Saveボタンを押すと以下の画面になります。
![スクリーンショット 2024-02-24 18.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/7baf753b-f975-e141-7a00-0dd3d25f0507.png)

## チャットbotのテスト

チャットbotをテストをするには、画面右下のCHat Previewタブを開きます。
![スクリーンショット 2024-02-24 18.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/573cff47-796c-a019-d599-f3feaf585d0b.png)

Tutorialに従い、`Tell me a joke`と入力してEnterを押します。意図した結果が返されました。
![スクリーンショット 2024-02-24 18.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1181562/290e2cff-f822-210f-47ec-af42e5be39cb.png)

## あとがき

これで今回の記事は終了です。お疲れ様でした。
ITの技術スキルは殆ど必要としませんでしたが、面白いので色々試してみたいと思います。もちろん日本語も。