Oracle Intelligent Bots ハマりポイント

技術検証案件にてOracleのチャットボットサービスである Intelligent Bots Cloud Service(IBCS)を扱いました。またオラクルの方ににスキルトランスファーして頂いたのでその時のナレッジも含めてIBCSを扱う上でハマったポイントを紹介したいと思います

# 対象読者

* これからIBCSを使ってチャットボットを作成したい方

# Intelligent Bots Cloud Service とは
Oracle Cloud ServiceのPaaSであるOracle Autonomous Mobile Cloud Enterprise(以下、AMCe)で利用できる
チャットボット作成サービスです。
自然言語処理（NLP)によるメッセージからIntent、Entityの抽出に加えて、メッセージ応答の処理、会話フロー、Q&A などの管理ができます。またチャンネル登録も可能なので作成したBotを複数の外部サービスから呼び出すことができます。

* イメージとしては、[DialogFlow](https://dialogflow.com/) に[QnAMaker](https://www.qnamaker.ai/)のようなKnowledgeBaseを作成できる機能を追加したサービスになります。
    * ただし、Q&A機能は現在日本語非対応のようです。
* ¥0.252/(リクエスト/時間)
* Oracle Mobile Cloud Enterprise上でも利用できます。ただしこちらはQ&A機能が使用できない等の制限があります。
* 大きな特徴として会話フローはすべてコンソール上でyaml形式で記述します。基本はバックエンドにサーバー等を用意せずにボットを作成できます。

# ハマりポイント


## Oracle CloudのリージョンはNorth America,EMEAを選択する

IBCSを利用するにはAutonomous Mobile Cloud Enterprise(AMCe)のPaaSが必要になります。
AMCeが作成できるリージョンはNorth America,EMEAのみとなります。
特に無料トライアルの方は**アカウント登録時**にしかリージョンを選べないので注意してください。
私は最初APACを選択してアカウントを作成し直すはめになりました

### AMCe作成時の設定値「Number Of Requests Per Hour」は40程度にする

AMCeインスタンス作成時の設定値に「Number Of Requests Per Hour」があります。
デフォルトは500ですがこちら**40**に変更してください。

500のままだと利用していなくてもどんどん課金されます。
無料トライアルだと7日程度で無料枠を使い切ってしまいます。。
逆に少なすぎるとインスタンスの作成自体失敗するそうなので40程度がよいらしいです。
![apireq.png](https://qiita-image-store.s3.amazonaws.com/0/203410/7dea6ae6-21b5-7d6f-c8b9-d0a7a50fe6fd.png)

    

### Intentのフレーズは英語で登録する

Intentのフレーズは**英語のみ対応**しています。
IBCSで使用されているモデルが英語に最適化されているためです。
日本語や他の言語のボットを作成したい場合は外部の翻訳サービスと連携させる必要があります。
翻訳サービスとの連携については後述します。

**その他のEntityやBotのレスポンス用文章は日本語で記述して問題ないです。**


### 5. Dialog Flowの構成

IBCSでは「Dialog Flow」と呼ばれる会話フローの設計が必要です。
他のチャットボットサービスとは違いBotの会話フロー、ロジックをyamlで記述します。

* 3つのメインパート
    * context
        * 会話フローの変数などを定義する
    * defaultTransitions
        * Bot全体のエラーハンドラを定義する
    * states
        * 各ステートの処理を定義
        * 使用するcomponent、プロパティ、次のstate遷移先などを記述
        * component
            * 使用するcomponentを記述
            * componentとは各ステートで処理するアクション
                * ユーザーへの応答、変数への代入、ユーザ入力のインテントの判定など
                * 基本的にIBCSで定義されているcomponentを組み合わせてBotのフロー・ロジックを構成していきます。
        * properties
            * このステートで使用する変数の初期化
        * transitions
            * 次のステートの遷移先を指定する
            * 指定しない場合は一つしたに定義されているステートに遷移する
            * return を定義すると会話セッションを終了させる
      
![dailogFlow](https://docs.oracle.com/en/cloud/paas/mobile-autonomous-cloud/use-chatbot/img/yaml_sections.png)

### 日本語対応させる方法

#### 1. IBCSのTranscateServiceを有効化する

1. Botのコンソール右上のメニュー ->「Translation Service」を選択
 ![transS1.png](https://qiita-image-store.s3.amazonaws.com/0/203410/3ea81dd0-2d19-9257-4d3e-ba722484bcfc.png)

2. 「＋ Service」を選択して ServiceType、Base URL、Authorization Tokenを入力して保存する
    * Service Typeは現在「Google」「Microsoft」を選択可能です。画像はGoogleの例です。
  
![transS2.png](https://qiita-image-store.s3.amazonaws.com/0/203410/b74eb6d6-5112-493e-2628-a4c9c1081057.png)


#### 2. Dialog Flowのstateの先頭に翻訳用componentを追加する

Dialog FLowのstateの先頭に"System.DetectLanguage","System.TranslateInput"の2つのcomponentを定義します。

```dialogflow.yaml
metadata:
  platformVersion: 1.0
main: true
name: ConversationBot
#context: Define the variables which will used throughout the dialog flow here.
context:
  variables:
    translatedInput: "string" # 翻訳後の値を保持するための変数を用意する
    iResult: "nlpresult"  
states:
  detect:
    component: "System.DetectLanguage"  #ユーザの入力言語を判定する
    properties: {}
    transitions: {}
  translate:
    component: "System.TranslateInput" #入力を英語に翻訳する
    properties:
      variable: "translatedInput" #翻訳後の値は"translatedInput"に保持される
    transitions: {}
  
  Intent:
    component: "System.Intent" # Intentの判別処理
    properties:
      confidenceThreshold: 0.5
      variable: "iResult"
      sourceVariable: "translatedInput" # ソースは翻訳後の値を指定する
    transitions:
      actions:
        hogeIntent: "hogeIntent"
        unresolvedIntent: "Unresolved"
```

### Botコンソールがエラーで表示されない場合の対処
原因は不明ですが、Botコンソールを開こうとしたときにエラーメッセージが表示されて何も表示されなくなることがあります。
![error.png](https://qiita-image-store.s3.amazonaws.com/0/203410/64b15de1-2747-e163-7a81-6b0b9710d9b9.png)


IBCSを扱っていた当時の対処法について記述します。
（原因がわからないのであくまで暫定的な処置です。これで直る場合があるという程度の認識でお願いします）

#### 対応1 ユーザーの権限を確認する
そもそもユーザの権限がなくて表示できていない場合があります。
応急処置として全権限をユーザに付与しましょう

1. OCSのページ右上の「ユーザ」を選択
1. 対象ユーザのパネル右上を選択ー＞「編集」を選択
1. 「ロール」タブを選択
1. 「管理ロールの追加」および「ユーザー・ロールの追加」を選択
1. 再ログインしてBotのページを開く

#### 対応2 キャッシュを削除して再ログインする

とりあえずキャッシュを削除してログインし直すと直る場合があります。
Bot以外にもOracle Cloudを使用している際に、ページ遷移にやたら時間がかかってタイムアウトする
場合でも、この方法は割と有効です。

#### 最終手段 AMCeを作成しなおす

**何してもだめな場合はAMCeを作り直してください。**


## 公式ドキュメント

* https://docs.oracle.com/en/cloud/paas/mobile-autonomous-cloud/use-chatbot/basics1.html#GUID-2DB01832-3BA3-4356-95DC-7ED760953DD6
* https://docs.oracle.com/en/cloud/paas/mobile-autonomous-cloud/index.html