本記事のコードはこちら にあります。コードを参照しながら進めてください。
なお、本記事は 04_NLUService_TaskOrientedMap.md および 04_NLUService_TaskOrientedWeather.md を前提としています。 詳細は上記ドキュメントをご参照ください。
詳細な動作環境については04_NLUService_TaskOrientedBase.md#動作環境をご覧ください。
ソースコードを実行するための手順は以下の通りです:
my-nlu-project
ディレクトリのトップレベルにsrc
ディレクトリを作成します- nlu_task_oriented_system.ts を作成した
src
ディレクトリにコピーします - ソースコードにある
APPID='あなたの Client ID(アプリケーション ID)'
を設定します
(※)Client ID についてはこちらをご覧ください。 my-nlu-project
ディレクトリのトップレベルから次のコマンドを実行します
npx ts-node src/nlu_task_oriented_system.ts
プログラムを実行すると、以下のプロンプトが表示されます。このプロンプトに続けてテキスト入力が可能です。
発話を入力:
「そこの天気は」という質問において、「そこ」の場所名を過去のリクエスト履歴から補完する文脈引き継ぎの一例について紹介します。
まず、過去のリクエスト履歴がない状態で、プロンプトに続けて「そこの天気は」と入力してみましょう。
$ npx ts-node src/nlu_task_oriented_system.ts
発話を入力: そこの天気は
「そこ」の天気情報が見つかりませんでした。
発話を入力:
「そこ」という場所情報が特定できなかったため、エラー応答が返されました。
続けて、「東京ディズニーランドの地図」と入力してみましょう。
$ npx ts-node src/nlu_task_oriented_system.ts
発話を入力: そこの天気は
「そこ」の天気情報が見つかりませんでした。
発話を入力: 東京ディズニーランドの地図は
東京ディズニーランド(lon=139.8813280,lat=35.6325460)の地図を表示します。
発話を入力:
その後、「そこの天気は」と続けて入力します。
$ npx ts-node src/nlu_task_oriented_system.ts
発話を入力: そこの天気は
「そこ」の天気情報が見つかりませんでした。
発話を入力: 東京ディズニーランドの地図は
東京ディズニーランド(lon=139.8813280,lat=35.6325460)の地図を表示します。
発話を入力: そこの天気は
東京ディズニーランドは1時間は雨が降らなさそうです。
発話を入力:
「そこの天気は」と質問した場合に、「そこ」の場所名を過去のリクエスト履歴から「東京ディズニーランド」として補完し、「東京ディズニーランド」の天気情報を取得できました。
システムの応答の後に再び「発話を入力:」というプロンプトが表示され、同様の手順で入力を続けることができます。 プログラムを終了する際には、Ctrl-D(Unix/Linux)または Ctrl-Z(Windows)を入力します。
また、各ターン(ユーザ発話とシステム応答の組)ごとに、自然言語理解(NLU)と対話管理(DM)のログがそれぞれ nlu.log と dm.log に保存されます。 nlu.log には NLU クラスの analyze 関数(テキスト解析 Web API の自然言語理解で自然言語のテキストを解析する役割)の結果がログとして記録され、 dm.log には DM クラスの recognizeDA 関数(ユーザの発話に含まれる意図やパラメータを抽出し、適切な対話行為を決定する役割)の結果がログとして記録されます。
以上が、デモンストレーションの説明です。
次の節では、対話処理を構成する自然言語理解(NLU)、対話管理(DM)、自然言語生成(NLG)について解説します。
NLU クラスの analyze 関数の結果が記録された nlu.log を参照してください。
まず、過去のリクエスト履歴がない場合に、「そこの天気は」と入力した場合の結果を見てみましょう。
以下のテーブルでは METHOD
と PARAM_PLACE
を nlu.log から抜き出して表示しています。
パラメータ名 | 値 |
---|---|
METHOD | WEATHER |
PARAM_PLACE | そこ |
PARAM_PLACE
は「そこ」と抽出され、具体的な場所名ではないということがわかります。
次に、「東京ディズニーランドの地図」の質問の後、「そこの天気は」と質問した場合の結果を見てみましょう。
同様に、以下のテーブルでは METHOD
と PARAM_PLACE
を nlu.log から抜き出して表示しています。
「東京ディズニーランドの地図は」に対する NLU の結果:
パラメータ名 | 値 |
---|---|
METHOD | MAP |
PARAM_PLACE | 東京ディズニーランド |
「東京ディズニーランドの地図は」の質問の後に「そこの天気は」と質問した場合の NLU の結果:
パラメータ名 | 値 |
---|---|
METHOD | WEATHER |
PARAM_PLACE | 東京ディズニーランド |
PARAM_PLACE
は「東京ディズニーランド」と具体化されています。
以上のように、PARAM_PLACE
の情報は過去のリクエスト履歴から補完することが可能です。
リクエストの履歴は過去3回分まで引き継がれます。
DM クラスの recognizeDA 関数の結果が記録された dm.log を参照してください。
文脈引き継ぎを考慮していない場合、「そこの天気は」に対する対話行為は次の通りです。
"そこの天気は": {
"place": "そこ",
"type": "AskWeatherRain"
}
これは天気情報の要求(AskWeatherRain)を対話行為とし、その対象地点(place)が「そこ」となることを示しています。
「東京ディズニーランドの地図」に対する対話行為は次の通りです。
"東京ディズニーランドの地図は": {
"place": "東京ディズニーランド",
"type": "AskMap"
}
これは地図情報の要求(AskMap)を対話行為とし、その対象地点(place)が「東京ディズニーランド」となることを示しています。
文脈引き継ぎを考慮した場合、「そこの天気は」に対する対話行為は次の通りです。
"そこの天気は": {
"place": "東京ディズニーランド",
"type": "AskWeatherRain"
}
これは天気情報の要求(AskWeatherRain)を対話行為とし、その対象地点(place)が「東京ディズニーランド」となることを示しています。
NLG クラスの generateResponse 関数の結果はコンソールから確認できます。
文脈引き継ぎを考慮していない場合、「そこの天気は」に対するシステム応答は下記の通りです。 「そこ」に対する位置情報が取得できなかったためエラー応答が出力されます。
「そこ」の天気情報を取得できませんでした。
文脈引き継ぎを考慮した場合、「そこの天気は」に対する応答文は下記の通りです。 気象情報 API の結果に応じて応答を柔軟に変えることができます。
東京ディズニーランドは1時間雨は降らなさそうです。
東京ディズニーランドでは50分後から雨が強くなりそうです。
東京ディズニーランドでは現在雨が降っていますが、10分後には晴れそうです。
文脈引き継ぎ機能の追加は以上です。
最後に、レスポンスのカスタマイズ機能の追加へ進んでください。
LINEヤフー株式会社 言語処理エンジニア
西山 育宏