Classic/VPC環境で利用できます。
エンティティとは、人名、機関名、場所、日付、商品名などの単語が登録された辞書を意味します。チャットボットは、ユーザーの発話の中で分析したエンティティを、意図を把握してスロットを抽出するのに活用します。同じ意味を持つ単語をエンティティで定義しておくと、ユーザーの発話を把握するのに役立ちます。エンティティを作成、変更、削除した後、それをチャットボットサービスに反映するには、ビルドまたは変更された設定の適用を完了する必要があります。
- エンティティの種類
- ドメインエンティティ: 特定のドメインでのみよく使われるエンティティ。辞書ベースの辞書型エンティティと正規表現パターンベースのパターン型エンティティタイプに分けられる
- システムエンティティ: すべてのドメインで共通して使用可能なエンティティ。ビルトインとして提供される
- APIエンティティ: チャットボットビルダ内部に直接エンティティを定義する代わりに、外部 DBに保存されているエンティティデータを活用するエンティティ
ドメインエンティティ作成
ドメインエンティティは、そのドメインで使用されると想定される主な単語の集まりです。例えば、コーヒーの注文に関連したチャットボットを作成するとします。その場合、コーヒーの注文に必要なコーヒーの種類、コーヒーのサイズなどをドメインエンティティに登録して活用することができます。
ドメインエンティティを登録する方法は、次の通りです。
- NAVERクラウドプラットフォームコンソールで、
> Services > AI Services > CLOVA Chatbot > Domainメニューを順にクリックします。 - 希望するドメインの [ビルダを実行する] ボタンをクリックしてチャットボットビルダを実行します。
- チャットボットビルダでエンティティ > [ドメインエンティティ] タブをクリックします。
- [エンティティ作成] ボタンをクリックします。
| 項目 | 説明 |
|---|---|
| エンティティ名 | エンティティの名前を入力 |
| エンティティタイプ | エンティティタイプを選択
|
| 機密情報のセキュリティ設定 | エンティティに含まれる情報の機密情報有無を設定。機密情報が含まれる特殊な場合を除き、基本的には一般情報に設定
|
| エンティティ登録 | エンティティタイプとして辞書型エンティティを選択した場合
|
- エンティティ情報の入力が完了したら、 [保存] ボタンをクリックします。
-
例) パターン型エンティティ

-
例) 辞書型エンティティ

システムエンティティ作成
システムエンティティは、すべてのドメインで共通して使用可能なエンティティです。NAVERクラウドプラットフォームで管理します。チャットボット作成者は登録されているシステムエンティティのうち、使用するシステムエンティティのみ有効にします。
タスクまたは正規表現質問でそのシステムエンティティを参照している場合は、無効にできません。
`@SYSTEM_ANY
`@SYSTEM_ANYは、ユーザーの自由発話のうち、一部のパターンだけ保存する場合に使用します。例えば、辞書型エンティティまたはパターン型エンティティで定義しづらい人の名前や、検索キーワードなどをエンティティで分析する場合に活用できます。
- `@SYSTEM_ANYは、正規表現質問にのみ入力できます。
- `@SYSTEM_ANYはどの発話ともマッチングできます。正規表現記法の中ではワイルドカードと同じです。
- `@SYSTEM_ANYのみ登録するのではなく、登場し得る他のパターンをも併せて入力することをお勧めします。
正規表現質問: `@SYSTEM_ANY [は|が] [何んだ|何でしょう]
- ただし、選択的に登場する正規表現を併せて使用する場合、`@SYSTEM_ANYとマッチングされる単語を保証できないことにご注意ください。
正規表現質問: `@SYSTEM_ANY(を)[説明して](줘|주세요)
-> ユーザーが「CLOVA Chatbotを説明して」と入力した場合、`@SYSTEM_ANYが「CLOVA Chatbot」とマッチングされる可能性があります。
- `@SYSTEM_ANYのみ登録する場合、コンテキストまたは条件などを設定して特定の時点にのみ、その会話がマッチングされるように制限することをお勧めします。
正規表現質問: `@SYSTEM_ANY
-> `@SYSTEM_ANYのみ入力した正規表現質問を登録する場合、ユーザーが発話を入力する際に常にその会話とマッチングされてしまう可能性があります。
Slot Module
スロットモジュールは、シナリオを構築する際に最も頻繁に使用されるエンティティを共通モジュールとして提供するエンティティです。
- DATE、TIME、PEOPLE、NAMEの4つのシステムエンティティを提供し、日付、時間、人数、名前を含む発話を入力する場合、その発話に含まれる日付、時間、および人数のパターンを認識し、システムエンティティに値を含めて渡します。
- このエンティティを使用する場合、Date、Time、People、Nameなどのパターン型エンティティを別途作成せず、システムエンティティで必要なエンティティを On/Offする形式で利用できます。
-
システムエンティティのうち、DATE、TIME、PEOPLE、NAMEは正規表現質問に入力できません。
-
Onにした後は必ずビルドすることで、そのエンティティを使用できるようになります。
スロットモジュールは、レスポンス条件にユーザー変数を指定したり、レスポンス内容にユーザー変数を入力するために使用されます。
-
応答条件設定の場合、 [ユーザー変数] タブを選択して [値] フィールドに
@DATEのように一部を入力すると、スロットモジュールのリストが表示されます。

-
回答にユーザー変数を入力するには、ユーザー変数項目の値ドロップダウンリストからエンティティを選択します。`@DATEのように一部を入力するとリストが表示されます。

DATE
DATEは「今日」、「クリスマス」、「釈迦誕生日」、「1年後」といった日付入力パターンを認識し、該当する日付を保持して渡すエンティティです。
DATE値をシステムエンティティに含めて活用したい場合、当該エンティティを Onにすると有効になります。DATEを有効にすると、TIMEエンティティも同時に有効になります。
システムエンティティである dateと datetimeは同時に有効にできません。dateを onにして datetimeを offにすると、dateが offになります。
会話で日付を処理する場合、次の2つのパターンが考えられます。
- レストランなどに予約の電話をする -> analyzed: 未来の日付
- カード会社に利用履歴を照会する -> alternative: 過去の日付
レストランに予約の電話をする場合は通常未来の日付を予約することになり、カード会社で利用履歴を照会する場合は過去の日付を照会することになります。
date値には analyzed値と alternative値の2種類があり、未来と過去の日付を両方推測して確認できます。
例えば、現在の日付が2022年4月1日で「5月1日」と言うと、次のように分析されます。
- analyzed: 2022-05-01
- alternative: 2021-05-01
-
現在は、analyzedのみ使用可能です。alternativeについては、今後利用可能になる予定です。
-
分析結果として画面に alternativeが表示される場合がありますが、仕様が変更される可能性があるためご注意ください。
| attribute | type | description |
|---|---|---|
| `@{DATE.literal} | string | ユーザーが言った通りの値 ex) 12月25日 |
| `@{DATE.analyzed} | - | ユーザーが確定した日付をレスポンスせず、一部の情報のみをレスポンスした場合 例) 25日 → 将来の日付として推測して返却 例) 現在の日付が2022年12月24日の場合、2022年12月25日と分析 |
| `@{DATE.analyzed.value} | string | ex) 2020-12-25 |
| `@{DATE.analyzed.year} | number | 分析された年度値 ex) 2021 |
| `@{DATE.analyzed.month} | number | 分析された月(month)値 ex) 12 |
| `@{DATE.analyzed.day} | number | 分析された日付(day)値 ex) 25 |
| `@{DATE.analyzed.dayOfWeek} | number | 分析された曜日値を数値で表現 例) 月曜日~日曜日 → 0~6 ex) 5 → 土曜日 |
| `@{DATE.analyzed.type} | string | 分析された値の typeを表示 |
| `@{DATE.analyzed.relative} | - | 現在の日付情報と実際に分析された日付情報との間の相対的な値。analyzedを基準に分析 |
| `@{DATE.analyzed.relative.year} | number | 現在の年度と実際に分析された年度との間の相対的な値。analyzedが availableDateである場合のみ analyzedを基準に分析、またはユーザーが相対的な発話をした場合のみ分析 ex) 2年前 → -2 |
| `@{DATE.analyzed.relative.month} | number | 今月と実際に分析された日付の月との間の相対的な値。analyzedが availableDateである場合のみ analyzedを基準に分析、またはユーザーが相対的な発話をした場合のみ分析 ex) 2か月後 → 2 |
| `@{DATE.analyzed.relative.week} | number | 今週と実際に分析された日付の週との間の相対的な値。analyzedが availableDateである場合のみ analyzedを基準に分析、またはユーザーが相対的な発話をした場合のみ分析 ex) 2週間前 → -2 |
| `@{DATE.analyzed.relative.day} | number | 今日の日付と実際に分析された日付との間の相対的な値。analyzedが availableDateである場合のみ analyzedを基準に分析、またはユーザーが相対的な発話をした場合のみ分析 ex) 3日後 → 3 |
| `@{DATE.alternative} | - |
|
| `@{DATE.alternative.value} | string | ex) 2020-12-25 |
| `@{DATE.alternative.year} | number | 代替値の年度 ex) 2021 |
| `@{DATE.alternative.month} | number | 代替値の月(month) ex) 12 |
| `@{DATE.alternative.day} | number | 代替値の日付(day) ex) 25 |
| `@{DATE.alternative.dayOfWeek} | number | 代替値の曜日を数字で表現 月曜日~日曜日 → 0~6 ex) 5 → 土曜日 |
| `@{DATE.alternative.type} | string | 分析された値の typeを表示
|
| `@{DATE.alternative.relative} | - | 現在の日付情報と実際に分析された日付情報との間の相対的な値。alternativeを基準に分析 |
| `@{DATE.alternative.relative.year} | number | 現在の年度と実際に分析された年度との間の相対的な値。alternativeが availableDateである場合のみ analyzedを基準に分析、またはユーザーが相対的な発話をした場合のみ分析 ex) 2年前 → -2 |
| `@{DATE.alternative.relative.month} | number | 今月と実際に分析された日付の月との間の相対的な値。alternativeが availableDateである場合のみ analyzedを基準に分析、またはユーザーが相対的な発話をした場合のみ分析 ex) 2か月後 → 2 |
| `@{DATE.alternative.relative.week} | number | 今週と実際に分析された日付の週との間の相対的な値。alternativeが availableDateである場合のみ analyzedを基準に分析、またはユーザーが相対的な発話をした場合のみ分析 ex) 2週間前 → -2 |
| `@{DATE.alternative.relative.day} | number | 今日の日付と実際に分析された日付との間の相対的な値。alternativeが availableDateである場合のみ analyzedを基準に分析、またはユーザーが相対的な発話をした場合のみ分析 ex) 3日後 → 3 |
例1: 現在の日付が2022年5月31日で、ユーザーが「週末」と言った場合
| プロパティ | 値 | 説明 |
|---|---|---|
| 分析 | 6/4または6/5と推定 | 未来の土曜日または日曜日 |
| year | 2022 | 土曜日と日曜日ともに2022年 |
| month | 6 | 土曜日と日曜日ともに6月 |
| day | null | 土曜日か日曜日かによって異なる |
| タイプ | multiDate | 複数の日付が適用される |
例2: 現在の日付が2022年5月2日で、ユーザーが「週末」と言った場合
| プロパティ | 値 | 説明 |
|---|---|---|
| 分析 | 5/7または5/8と推定 | 未来の土曜日または日曜日 |
| year | 2022 | 土曜日と日曜日ともに2022年 |
| month | 5 | 土曜日と日曜日ともに5月 |
| day | null | 土曜日か日曜日かによって異なる |
| タイプ | multiDate | 複数の日付が適用される |
例3: 現在の日付が2022年5月31日で、ユーザーが「今日」と言った場合
| プロパティ | 値 | 説明 |
|---|---|---|
| 分析 | 2022-05-31 | 決定した日付 |
| year | 2022 | |
| month | 5 | |
| day | 31 | |
| タイプ | availableDate | 有効な日付 |
例4: 現在の日付が2022年5月31日で、ユーザーが「1日」と言った場合
| プロパティ | 値 | 説明 |
|---|---|---|
| 分析 | 2022-06-01 | 未来の確定した日付 |
| year | 2022 | |
| month | 6 | |
| day | 1 | |
| タイプ | availableDate | 有効な日付 |
- 分析されたエンティティの例
{
"literal" : "12月25日",
"analyzed":
{
"value" : "2022-12-25",
"year" : 2022,
"month" : 12,
"day" : 25,
"dayOfWeek" : 5,
"type" : "availableDate",
"relative" :
{
"year" : 0,
"month" : 1,
"week" : 1,
"day" : 11
}
},
"alternatives" :
{
"value" : "2021-12-25",
"year" : 2021,
"month" : 12,
"day" : 25,
"dayOfWeek" : 5,
"type" : "availableDate",
"relative" :
{
"year" : -1,
"month" : 1,
"week" : 1,
"day" : 11
}
}
}
}
TIME
TIMEは「7時半」「2時間後」「今」といった入力パターンを認識し、対応する時間をスロットに入力して転送します。
スロットモジュールは「予約」をテーマとしているため、すべての時間は10分単位で区切られるように推定します。
例) 例えば、現在時刻が午後6時30分で「7分後」と発話した場合、6時37分ではなく6時40分として返します。
TIMEを有効にするには、DATEを ONにします。
| attribute | type | description |
|---|---|---|
| `@{TIME.literal} | string | ユーザーが言った通りの値 ex) 7時半 |
@{TIME.analyzed}|-|<ul><li>分析された値でユーザーが確定した日付をレスポンスせず、一部の情報のみをレスポンスした場合 <ul><li> ex)7時<ul><li>@{TIME.analyzed}は未来の時間として推測され返却</li><li>@{TIME.alternative}は過去の時間として推測され返却</li></ul></ul></ul><ul><li>ユーザーが確定した時間をレスポンスした場合<ul><li>ex)午後1時30分</li> <ul><li> @{TIME.analyzed}と @{TIME.alternative}は同じ値を持つ |
||
| `@{TIME.analyzed.value} | string | ex) 19:30 |
| `@{TIME.analyzed.hour} | number | 分析された時間値 ex) 19 |
| `@{TIME.analyzed.minute} | number | 分析された分(minute)値 ex) 30 |
| `@{TIME.analyzed.type} | string | 分析された値の typeを表示
|
| `@{TIME.analyzed.relative.hour} | number | 現在の時間と実際に分析された時間との間の相対的な値。analyzedを基準に分析 ex) 1時間後 → 1 |
| `@{TIME.analyzed.relative.minute} | number | 現在の分と実際に分析された分との間の相対的な値。analyzedを基準に分析 ex) 30分後 → 30 |
| `@{TIME.alternative} | - |
|
| `@{TIME.alternative.value} | string | ex) 07:30 |
| `@{TIME.alternative.hour} | number | 分析された時間値 ex) 7 |
| `@{TIME.alternative.minute} | number | 分析された分(minute)値 ex) 30 |
| `@{TIME.alternative.type} | string | 分析された値の typeを表示
|
| `@{TIME.alternative.relative} | - | 現在の時間情報と実際に分析された時間情報との間の相対的な値。alternativeを基準に分析 |
| `@{TIME.alternative.relative.hour} | number | 現在の時間と実際に分析された時間との間の相対的な値。 alternativeを基準に分析 ex) 1時間後 → 1 |
| `@{TIME.alternative.relative.minute} | number | 現在の分と実際に分析された分との間の相対的な値。alternativeを基準に分析 ex) 30分後 → 30 |
- 分析されたエンティティの例
{
"literal" : "7時半",
"analyzed":
{
"value" : "19:30",
"hour" : 19,
"minute" : 30,
"type" : "availableTime",
"relative" :
{
"hour" : 1,
"minute" : 30,
"second" : -30
}
},
"alternatives" :
{
"value" : "07:30",
"hour" : 7,
"minute" : 30,
"type" : "availableTime",
"relative" :
{
"hour" : 1,
"minute" : 30,
"second" : -30
}
}
}
People
Peopleは「大人1人、子供2人」「大人3人」といった人数入力パターンを認識し、総人数や大人/子供の人数をスロットに入力して転送します。
システムエンティティで Peopleを Onにして使用できます。
現在の仕様上、「学生」は子供として計算しません。
| attribute | type | description |
|---|---|---|
| `@{PEOPLE.literal} | string | ユーザーが言った通りの値 例)「大人二人と子供一人」 |
| `@{PEOPLE.total} | number | 分析された人の総数 ex) 3 |
| `@{PEOPLE.numAdult} | number | 分析された成人の数 例) 2、もし childの情報がない場合は、常に totalの値で推測して入力 |
| `@{PEOPLE.numChild} | number | 分析された子供の数 例) 1、child情報がない場合は常に0と推定 |
| `@{PEOPLE.type} | string | 分析された値の typeを表示
|
- 分析されたエンティティの例
{
"literal" : "大人二人と子供一人",
"total" : 3,
"numAdult" : 2,
"numChild" : 1,
"type" : "availablePeople"
}
Name
ユーザーが入力した値の中から名前を認識し、スロットに入力して出力できます。
システムエンティティで Peopleを Onにして使用できます。
人の名前ではなく団体名/会社名/ハンドルネームの場合は認識しません。
| attribute | type | description |
|---|---|---|
| `@{NAME.literal} | string | |
| `@{NAME.lastName} | string | |
| `@{NAME.firstName} | string | |
| `@{NAME.type} | string |
- 分析されたエンティティの例
{
"literal" : "鈴木一郎",
"lastName" : "鈴木",
"firstName" : "一郎",
"type" : "availableName"
}
活用方法
-
ユーザー変数に保存: `@{DATE.analyzed.dayOfWeek}のように、必要なフィールドを選択してユーザー変数に割り当てて活用できます。

-
タスク会話
-
ユーザーレスポンス値の場合: literalの値として保存して活用できます。

-
ノーマライズ値の場合
@{DATE.analyzed}、@{TIME.analyzed}、@{PEOPLE.total}、@{NAME.literal}の値として保存して活用できます。

-
-
回答
-
ユーザー変数をそのまま使用して活用できます。

-
特定のフォーマットに置換して使用したい場合は、ユーザー変数に入れて活用できます。
例) @{TIME:kr.time.partsDay}ですよね?

-
特定のフォーマットに置換するためには、ユーザー変数は必ず json形式で作成する必要があります。

| format name | user variable | output | detail | e.g |
|---|---|---|---|---|
| kr.date | {"month" : M, "day" : D, "weekday" : "AAAA"} | [M]月[D]日 | 5月5日 | |
| kr.date.weekday | {"month" : M, "day" : D, "weekday" : "AAAA"} | [M]月[D]日[AAAA] | [AAAA] = [月曜日、火曜日、水曜日、木曜日、金曜日、土曜日、日曜日] | 5月5日火曜日 |
| kr.time | {”hour" : H, "minuet" : M} | [H]時[M]分 | H = 24時間制 | 23時30分 |
| kr.time.partsDay | {”hour" : H, "minuet" : M} | [partsDay][H]時[M]分 | H = 12時間制 | 夜23時30分 |
| kr.time.twelveHour | {”hour" : H, "minuet" : M} | [H]時[M]分 | H = 12時間制 | 11時30分 |
| kr.people | {"numPeople" : NNNN} | [NNNN]分 | 1<= N <50 : 序数に変換、50<= N : 基数に変換 | 四分 |
| kr.people.arabic | {"numPeople" : NNNN} | [NNNN]分 | N: arabic数字そのまま | 4分 |
| kr.telNum | "XXXYYYYZZZZ" | [XXX]に[YYYY]に[ZZZZ] | XYZ : 基数に変換 | 零一零に二九二九に二九二九 |
| kr.telNum.fourDigits | "XXXYYYYZZZZ" | [ZZZZ] | N: 基数に変換 | 二九二九 |
| telNum.arabic | "XXXYYYYZZZZ" | [XXX]-[YYYY]-[ZZZZ] | XYZ: arabic数字そのまま | 090-1234-5678 |
| telNum.fourDigits.arabic | "XXXYYYYZZZZ" | [ZZZZ] | XYZ: arabic数字そのまま | 2929 |
API連携型エンティティ作成
API連携型エンティティは、チャットボットビルダでは管理できないエンティティやリアルタイムで情報が変更されるエンティティがある場合に活用します。例えば、従業員名や顧客名といったセキュリティの重要なデータをチャットボットビルダにエンティティとして登録して管理するのが困難な場合、API連携型エンティティを活用します。エンティティを代わりに分析できるサーバの API urlを入力すると、ユーザーが入力した発話をエンティティ分析が可能な APIサーバに転送し、分析された結果を受け取ってシナリオを展開することができます。
API連携型エンティティは以下のような場合に使用します。
- タスクのスロットとして使用する場合
- 回答条件でエンティティ条件をチェックする場合
- アクションメソッド v1を呼び出す場合
API連携型エンティティの使用方法は、次の通りです。
- NAVERクラウドプラットフォームコンソールで、
> Services > AI Services > CLOVA Chatbot > Domainメニューを順にクリックします。 - 希望するドメインの [ビルダを実行する] ボタンをクリックしてチャットボットビルダを実行します。
- チャットボットビルダでエンティティ > [APIエンティティ] タブをクリックします。
- URL領域の [変更] ボタンをクリックします。
- URLフィールドにエンティティを分析できる APIのアドレスを入力して、 [保存] ボタンをクリックします。
- チャットボットは、入力された URLで形態素を分析した結果を含めて呼び出す
- [エンティティ作成] ボタンをクリックします。
- エンティティ作成画面が表示されたら、エンティティの名前を入力して [重複チェック] ボタンをクリックし、 [保存] ボタンをクリックします。
- 作成されたエンティティを確認します。
- リクエスト形式
{
"query": "韓国住んでる",
"nlpResult": {
"data": [
{
"words": [
{
"in": [
{
"morph": "韓国",
"tag": "NOUN",
"ner": "Ner=B-韓国エンティティ名",
"lemma": null,
"start": 0,
"end": 5,
"feature": 0,
"additionals": ""
},
{
"morph": "住んでる",
"tag": "NORMALVERB",
"ner": "Ner=O",
"lemma": "住む",
"start": 6,
"end": 11,
"feature": 0,
"additionals": "んでる"
}
],
"word": "韓国住んでる"
}
]
}
],
"success": true
}
}
- レスポンス形式
{
"code": "OK",
"message": "Option[String]",
"entity": [
{
"name": "国",
"userInput": "韓国",
"represent": "Korea"
}
]
}
手動によるエンティティのタグ付け
辞書型エンティティは、会話の一般質問にタグ付けできます。エンティティを登録してモデルのビルドが完了すると、一般質問の登録時にエンティティに該当する単語が自動でタグ付けされ、タグ付けされたエンティティは会話の質問リストで青い文字で表示されます。エンティティがタグ付けされた質問は会話モデル学習に反映され、ユーザー発話の認識を手助けします。
会話モデルのビルド前か、エンティティに自動でタグ付けされていない場合は、チャットボットの作成者がエンティティを手動でタグ付けすることができます。
手動でエンティティをタグ付けする方法は、次の通りです。
- 事前タスクを完了します。
- 「ピザの種類」エンティティ追加、代表語: ポテトピザ

- 「ピザの種類」エンティティ追加、代表語: ポテトピザ
- 質問を登録し、エンティティとしてタグ付けする単語をドラッグします。
- このシナリオでは、「ポテトピザ」をドラッグします。

- このシナリオでは、「ポテトピザ」をドラッグします。
- エンティティ選択画面が表示されたら、タグ付けしたいエンティティを選択して [適用] ボタンをクリックします。
- 新しい代表語として追加するか、既に登録済みの代表語の類義語として追加できます。
- エンティティが存在しない場合は、 [エンティティ作成] をクリックして新規作成します。

- エンティティのタグ付けが完了したか確認します。
