Chapter 24

(番外編)マークダウンで書いたコンテンツを利用する

maKunugi
maKunugi
2022.08.13に更新

このチャプターのゴール

  • マークダウンで記述したコンテンツをチャットボットの応答で利用できること

マークダウンで記述するメリット

マークダウン記法とチャットボットはとても相性が良いです。マークダウンの記法は簡潔に階層構造を表現できます。

# プロフィールについて
プロフィールについて何か気になることはありますか?
## 名前は?
まさおです。

### 名前の由来は?
特にありません。

## 年齢は?
28歳です。

このようなマークダウンを書いた場合を考えてみます。
まず見出し1の「プロフィールについて」が、下位の見出しを包含する「トピック」と捉えることができます。「プロフィールについて」というトピック配下に

  • 名前は?
    • 名前の由来は?
  • 年齢は?

という下位のトピックができていることになります。この状態をチャットボットとの会話でイメージしてみましょう。

まずは、「プロフィールについて」と話しかけると最上段のトピックの応答が返されます。クイックリプライには、一つ下のトピックが発話候補として表示されています。

「名前は?」と尋ねるとさらに下のトピックがクイックリプライに表示されました。
このように階層構造が定義できることで、トピックごとに深掘りを行う会話を表現することができるのです。その点において、マークダウンの記述は非常に適しています。

こういった背景から、meboはマークダウンによるコンテンツの記述に対応しています。

マークダウンコンテンツの利用方法

トレーニング一覧画面から「マークダウンでコンテンツを追加する」に進みましょう。「新規コンテンツの作成」を押すと、エディタが表示されます。

エディタにマークダウン記法のコンテンツを入力したら「保存する」を押します。保存を行ったら、公開設定画面から「トレーニングの反映」を行い、エージェントに学習させます。

トレーニングの反映方法については、下記のチャプターをご確認ください。

https://zenn.dev/makunugi/books/f3d9eb62b6d133/viewer/5e75b2

マークダウンの記法

マークダウンの基本的な記法が利用可能です。

見出し

#で見出しをつけることができます。見出しはユーザの質問について応答を検索する対象となります。maboは登録された見出しの中からユーザの質問に最もマッチしたものを選び、その中の文章を応答として返します。

# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5

#は最大5つまで利用可能で、見出し配下のコンテンツは、同じ大きさの見出しが出現するまで全てが小要素としての扱いになります。小要素の見出しは応答の下に表示されるクイックリプライの発話候補として表示されます。

太字にする

文字を太字にして強調できます。記法は下記の通りです。


これは**強調したい文字列**です。

斜体にする

文字を車体にして強調できます。記法は下記の通りです。

*これは強調したい文字列です。*

取り消し線

文字に取り消し線を表示できます。記法は下記の通りです。

~~これは強調したい文字列です~~

箇条書き

箇条書きを表現できます。記法は下記の通りです。

* Sample1
* Sample2
* Sample3

リストのサンプルです。

- Sample1
- Sample2
- Sample3

箇条書き(番号付き)

番号付きの箇条書きを表現できます。記法は下記の通りです。

1. Sample1
2. Sample2
3. Sample3

code記法

code記法はmeboでは利用することができません。
code記法を利用すると、code内の情報が前のチャプターで説明した「拡張データ」として扱われます。

https://zenn.dev/makunugi/books/f3d9eb62b6d133/viewer/f0c36f#拡張表現を利用する
ここにjson文字列を入れます

テーブル

表の表示ができます。記法は下記の通りです。

| Head | Head | Head |
| --- | --- | --- |
| Data | Data | Data |
| Data | Data | Data |
| Data | Data | Data |

画像の挿入

画像の挿入ができます。記法は下記の通りです。

![sampleImage](画像のURL)

リンクの挿入

リンクが挿入できます。

記法は下記の通りです。

詳細は[こちら](URL)をご覧ください。

独自記法を利用する

meboには一般的なマークダウンの記法に加え、独自の記法が定義されています。この独自記法を利用することで、より柔軟に会話をカスタマイズすることができます。

独自の記法とは

@」をつけた特定の表現を「#」見出しの配下に入力することで、チャットボットに機能追加をすることができます。

# アクセス
@cov: ["最寄駅","近くのバス停"]

xxxx事務所は●●駅徒歩3分です。  
詳しくは下記の地図をご覧ください。  
[map](https://xxxxxxxxxxxxxxxxxxx)

上記の例は「cov」という独自記法を追加した例です。各機能の詳細は後述しますが、「cov」は自身が含まれている見出しが検索にヒットするための言葉を追加します。 (カバレッジを上げるという意味からcovと名付けられています。)
上記の例のコンテンツの場合、「アクセス」という見出しの言葉に反応して応答が返されることに加え、「最寄駅」「近くのバス停」といった言葉にも反応できるようになります。

独自記法は文頭に「@」を記入し、それに続けて「機能名」を入力します。
その後は各機能ごとに必要なパラメータが異なります。

それでは各機能について見ていきます。

独自記法一覧

検索のカバレッジを向上させる

@cov: ["文字列1","文字列2"]

# 料金について
@cov: ["いくらですか","お高いんでしょ"]

基本料金は無料です。

見出しの言葉が検索にヒットするための言葉を追加します。

maboはデフォルトで類似表現に対応しています。上記の例は、見出しにある「料金について」と類似する表現はmaboがデフォルトでカバーしてくれています。例えば、「プライス」や「値段」と言った言葉は自動的に考慮されます。自動での補填では足りず、特別に追加したい表現がある場合は、利用しましょう。

パラメータ: 文字列の配列

パラメータの記法: ["文字列1","文字列2"]

1つ以上の文字列が必須です。

発話候補を追加する

@add_options: ["Option1","Option2"]

チャットボットの応答の下に表示されるクイックリプライボタンの内容(発話候補)を追加できます。

# 使い方について
使い方について紹介します。
@add_options: ["ボットの作成方法","マークダウンの記法について","拡張機能の利用方法"]

発話候補は基本的に小要素に含む見出しや関連する見出しなどの有無に応じて自動的に挿入されますが、「@add_options」を利用することで明示的に発話候補を追加することができます。

ランダムな応答を利用する

@random: ["Utterance1","Utterance2"]

チャットボットの応答をランダムに返したい場合はこの拡張機能を利用します。

# ファシリテーターガチャ
@random: ["Aさん","Bさん","Cさん"]

上記のように、見出しは以下に「@random」の拡張機能を利用すると、指定した文言の中からランダムに応答を返すようになります。

自由入力を禁止する

@disable_free_input

指定した見出しに対するユーザの自由入力を禁止します。
その間ユーザはクイックリプライボタンのみ利用ができます。

# 職種について
@disable_free_input  

職種について教えてください。

## エンジニアの場合
hoge

## 教員の場合
hoge

## その他の場合
hoge

自由入力を禁止した見出しのコンテンツが返されている際は、テキストエリアのプレースホルダーが「上の選択肢からお選びください」に変更され、入力ができなくなります。

自動で追加される発話候補を除外する

@disable_auto_options

発話候補に自動的に追加される文言を除外することができます。
発話候補として自動で追加される、関連した見出しや親子関係にある見出しの文言が追加されなくなります。
この拡張機能を利用する場合、発話候補が1つも表示されなくなるため、

@add_optionsを併用することをお勧めします。

※ 併用する場合は、必ず @disable_auto_options を先に記述してください。

ユーザの回答をステートとして記憶する

@set: "key名"

# 自分に合ったサイズが知りたい場合
@set: "height"
@disable_option_thanks
@disable_option_unresolved

身長によって適切なサイズは異なります。
## 160cm以上
hoge
## 170cm以上
hoge
## 180cm以上
hoge
## 200cm以上

上記の会話でユーザが回答を選択すると、その情報は指定した key名で保持されます。
今回の例では、"height"というkey名にユーザが選択した回答が記録されることになります。
これは前のチャプターで紹介した「ステート」の機能にあたります。上記の記述方法を用いることで、マークダウンでもステートの機能を活用できます。

(参考)

https://zenn.dev/makunugi/books/f3d9eb62b6d133/viewer/a1c5e8

ユーザがすでに特定の情報を回答しているかどうかを確認する

@require_state: "key名"

上記の拡張機能を追加した見出し配下のコンテンツは、key名に指定した情報が記憶されていない場合は、ユーザの質問に対してマッチしません。

ユーザが回答した特定の情報の値が一致しているかどうかを確認する

@equals_state: ["key名":"value"]

@setによって記憶されたkey名に紐づく情報が指定したvalueと一致した場合のみ、この特殊機能を挿入した見出しの応答は採用されます。

ユーザ回答した特定の情報の値が部分一致しているかどうかを確認する

@contains_state: ["key名":"value"]

@setによって記憶されたkey名に紐づく情報が指定したvalueと一致した場合のみ、この特殊機能を挿入した見出しの応答は採用されます。

まとめ

マークダウンを利用すると、階層構造を会話内で簡潔に表現できます。さまざまな用途で活用できると思いますので、ぜひご活用ください。