1. はじめに
「Answers Anywhere」は、自然言語で入力されたユーザーの指示から意図を汲み取り、対話をしながら機器操作やデータ検索するシステムを構築するためのミドルウェアです。前回はAnswers Anywhereを使い、日本語の自然言語による質問でレストランを探すことができるアプリケーションを開発しました。今回はAnswers Anywhereの特徴のひとつである推論ヒント機能によりユーザーのナビゲートを加えて、より使いやすいアプリケーションに改良したいと思います。
2. 推論ヒント
前回はユーザーの命令を解釈して結果を返すエージェント・ネットワークを構築したわけですが、ただ「命令をどうぞ」とだけいわれても、初めて使う人は何をしたらよいか迷ってしまいます。そこでユーザーに「このシステムではどのようなことができるのか?」「何を入力したらいいのか?」という情報を提示することでユーザーをナビゲートすることを考えます。
このような情報提示はAnswers Anywhereの推論ヒント機能を使うことで実現できます。前記事の「エージェント・ネットワークの仕組み」でも解説しましたが、推論ヒントはエージェント・ネットワークでユーザー入力が解析され文脈追跡した後、処理を実行する直前に実施されます。推論ヒントの種類には以下の2種類があります。
必須値のチェックによるヒント
必須の値であるが未入力であるもの、入力された値が既定外のもの、入力が足りないため複数の意味に解釈され特定できないものに対し、ガイダンスを出力するヒントです。このヒントは表1に示す3つの種別に分けられます。
種別 | 概要 | 定義方法 |
必須値要求(Missing Field Hint) | Fieldの値が入力されていない場合には、サービスプロバイダによる処理実行を実施せずダイアログメッセージを出力。 | Fieldごとの条件をサービスプロバイダに定義 |
正規表現による値チェック(Invalid Field Hint) | Fieldの値が指定されたパターンに一致しない場合には、サービスプロバイダによる処理実行を実施せずダイアログメッセージを出力 | Fieldごとの条件をサービスプロバイダに定義 |
意図の確定要求(Ambiguity Hint) | 入力が複数の意味として解釈される場合に意味の候補を提示。ユーザーは次の入力で候補を選ぶことで情報の絞込みを行う(図1) | 出力するかどうかをActuationエージェントに設定 |
関連性の高い操作ヒント
今回の入力内容に関連性の高い次の操作を提示するヒントです。エージェント・ネットワークではエージェント同士のつながりが処理単位の関連性を示しています。この関係を利用して今の入力に関連が高い操作を推論するのがこのヒントです。動作としては、クレームしたエージェントにつながっている未クレームのエージェントをヒントとして提示します。このヒントは表2に示す3つの種別に分けられます。
種別 | 概要 | 定義方法 |
初期操作(Command)の提示(General Hint) | システムの利用可能なコマンド一覧を提示する。初期状態(入力 "restart" により文脈が初期化)で認識できない語が入力されたときに動作する(図2) | 出力するかどうかをActuationエージェントに設定 |
操作対象(Object/Field)の提示(Applicable Object/Relevant Field Hint) | Commandが入力された場合、そのCommandで使用可能なObjectを提示する。またはObjectが指定されたされた場合は使用可能なFieldを提示する(図3) | 出力するかどうかをActuationエージェントに設定 |
関連性の高い別操作の提示(Relevant Command Hint) | 今の入力に関連の高い別の操作候補を提示。Objectが2つ以上Commandの下にありそれらの間がRelationという関係でつながれている場合に出力される(図4) | 出力するかどうかをActuationエージェントに設定 |
レストラン検索アプリケーションに必須値要求のヒントと関連性の高い操作提示のヒントを実装してみましょう。前回連載でのアプリケーションを拡張した仕様をリスト1に示します。
リスト1 検索アプリケーション仕様(拡張版)
- 文章で検索条件を入力し、データベースのRestaurantテーブルからレストランのデータを検索する(※Restaurantテーブル仕様は前回記事参照)
- 検索条件はエリア名、ジャンル名、評価を検索条件とする
- 【追加】検索条件は、順不同または一括での指定、置き換えができることとする場所(エリア)の指定は必須とする。レストランの検索時に場所が指定されていない場合は要求する旨のメッセージを表示する。
- 【追加】操作支援のため操作に応じて次に利用できる機能を提示する
必須値のチェックによるヒントの定義
必須値のチェックは、対象とするFieldをサービスプロバイダに定義することで設定します。
サービスプロバイダの定義を編集するには、ActuatorエージェントをダブルクリックしService Providersのタブを選択します。Service Providersのリストから対象を選びダブルクリックすると設定画面が開きます。
[Edit]を押し、詳細設定を行う画面を開きます。Object Definitionsリストボックス下にある[New]を押すと設定ダイアログが開くので、対象Fieldの属するObjectの名前「レストラン」をPathに入力します。
対象のFieldを追加するため、Fieldsのリストボックス下の [New]を押し設定ダイアログを開きます。この設定ダイアログには表3に示すような設定項目があります。Pathに必須とするFieldの名前「エリア」をいれ、Mandatoryのチェックボックスを有効にします。さらに必須値が必要なときにユーザーに通知するメッセージをHintの欄にいれて[Ok]を押します。
設定を反映させるため各設定ダイアログの[Ok]ボタンを、開いた逆の順に押していきます。一連の操作を図5に示します。
項目名 | 内容 | 設定する値 |
Path | Fieldの名称 | "エリア" |
Possible Values | このFieldの値一覧。ヒントメッセージとともに出力される | (今回は使用しない) |
Include All Possible Values | Possible Valuesの表示形式 | (今回は使用しない) |
Mandatory | Objectがクレームした場合、このFieldを必須とするか | チェックする |
Validate Missing Field Input | ヒントを出力した次の回の入力を強制的にチェックするかどうか | (今回は使用しない) |
Hint | 出力するヒントメッセージ | "エリアを指定してください" |
Validation Reg Exp | Fieldの値として有効な値の正規表現パターン | (今回は使用しない) |
Default Value | 値が指定されなかったときのデフォルト値 | (今回は使用しない) |
関連性の高い操作ヒントの定義
関連性の高い操作ヒントは種別ごとに出力するかどうかをActuatorエージェントに設定します。エージェントをダブルクリックしOther Propertiesのタブを選択します。Enable Ambiguity Hint, Enable General Hint, Enable Applicable Objects Hint, Enable Relevant Fields Hint の各項目にチェックを入れ[Ok]を押します。チェックを入れなかったRelevant Commands Hintは2つ以上のObjectの間がRelationという関係でつながれている場合にのみ出力できるヒントですが今回のエージェント・ネットワークはObjectがレストラン1つしかないため使用しません。
3. フォーマッタ
Answers Anywhereからの出力は標準ではXML形式です。これは出力を返す先が別のプログラムである場合は都合がよいですが、ユーザーインターフェースとしてはHTMLやテキストなどの形式のほうが扱いやすいといえます。フォーマッタはこのような出力形式の変換を行うためのモジュールです。フォーマッタは Interactionエージェント上で動作します。初期状態のエージェント・ネットワークにはフォーマッタは登録されておらず、その場合にはエージェント・ネットワークの出力はXML形式となります。標準のSDKにはHTMLおよびテキスト形式で出力をするフォーマッタが付属しています。これらを Interactionエージェントに登録し変換のルールを設定することで目的の出力が得られます。
その他の出力形式、たとえばCSVやJSON形式で出力する場合はJava APIによりカスタムフォーマッタを開発することで対応します。
フォーマッタでは次の2種類の出力が生成されます。その動作の仕組みを図7に示します。
説明テキスト
サービスプロバイダで実施された処理結果の概要、推論ヒントからのメッセージなどが説明テキストです。Explanation Property Fileに、出力するメッセージの雛形文章およびエージェントが出力したXMLタグと表示文字列の組を定義します。後者は雛形文章に埋め込む文字列として使用されます。
結果一覧
サービスプロバイダでの検索結果は実行結果としてXML形式でフォーマッタに渡されます。それをリストまたは表形式に整形して出力されるのが結果一覧です。Display Property Fileにより一覧に結果のどの列を表示するのか、またその列名を設定します。
フォーマッタの設定を行うにはInteractionエージェントをダブルクリックします。[New]を押すと新規のフォーマッタの種別を選択するダイアログが出るのでHTMLフォーマッタ「com.dejima.core.io.HTMLPresentationFormatter」を選択し[Ok]を押します。表4にHTMLフォーマッタの設定値一覧を示します。また図8にフォーマッタの設定手順を示します。
項目名 | 内容 | 設定する値 |
Name | フォーマッタの名称 | html(デフォルト値) |
Explanation Property File | 説明テキストの表示内容設定 | XMLファイルの編集 |
Display Property File | 結果の表示内容設定 | XMLファイルの編集 |
Add Xml | 出力にXMLを付与する | false(デフォルト値) |
Add Explanation | 説明テキストのうち処理結果の概要部分(入力内容、結果一覧件数、検索条件)を表示する | true(デフォルト値) |
Add Ambiguous Fields Question | 意図の確定要求のヒントメッセージと選択肢を表示する | true(デフォルト値) |
Add Invalid Fields Question | 正規表現による値チェックのヒントメッセージを表示する。ヒントの定義にPossible Valuesがあればそれを候補値として表示する | true(デフォルト値。このヒントは使用しないため不問) |
Add Missing Fields Question | 必須値要求のヒントメッセージを出力する。ヒントの定義にPossible Valuesがあればそれを候補値として表示する | true(デフォルト値) |
Assign Numbers To Ambiguity Choices | 意図の確定要求のヒントメッセージと選択肢に番号をつけて表示する | true(デフォルト値) |
Assign Numbers To Possible Values | 正規表現による値チェックおよび必須値要求のヒントの候補値に番号をつけて表示する | true(デフォルト値。使用しないため不問) |
Add Results | 結果一覧を出力する | true(デフォルト値) |
Add Results Header | どのCommandで生成された結果かを表示する | true(デフォルト値) |
Add Results No Of Records Found | 結果の件数を表示する | true(デフォルト値) |
Add Hints | ヒントメッセージを表示する | true(デフォルト値) |
Display Results In Table | trueならば結果一覧をテーブル形式で表示する | true(デフォルト値) |
Explanation Property FileとDisplay Property FileはどちらもXML形式の設定ファイルです。それぞれの編集画面で[Generate]を押すことでエージェント・ネットワークを基に雛形が自動生成されます(図9)。
説明テキストの設定であるExplanation Property Fileについては雛形をそのまま使用します。Display Property Fileについては、雛形はエージェント・ネットワークから作成されるため店名を一覧の中に表示するという定義が欠けています。そこでリスト2の太字で示す部分を追加し店名が結果一覧に表示されるようにします。この設定ファイルのDisplayFieldsタグが表示する結果一覧の列を表します。このタグ列それぞれについて定義し、定義順で列が表示されます。
<DisplayProperties> <Object name="レストラン"> <DisplayFields>
<Path value="レストラン/rname" />
<Displayable value="true" />
<FormField value="false" />
<DisplayName value="店名" />
</DisplayFields> <DisplayFields> <Path value="レストラン/エリア" /> <Displayable value="true" /> <FormField value="false" /> </DisplayFields> <DisplayFields> <Path value="レストラン/ジャンル" /> <Displayable value="true" /> <FormField value="false" /> </DisplayFields> <DisplayFields> <Path value="レストラン/星" /> <Displayable value="true" /> <FormField value="false" /> </DisplayFields> </Object> </DisplayProperties>
表5にタグの中の設定内容を示します。Explanation Property FileとDisplay Property Fileのどちらも設定が終了したら[Ok]を押してデフォルトのファイル名で保存をします。
フォーマッタの設定が終わったら[Ok]を押します。最後にInteractionエージェントの設定画面でも[Ok]を押して変更を反映させます。
タグ名 | 内容 |
Path | 結果XMLに含まれる処理結果のどの列を表示させるかの指定。Results/{Object名}/FieldInfoに定義されているPathの名前と一致させる。 |
Displayable | trueにするとこの列を表示する |
FormFeild | (使用しない) |
DisplayName | 表示列名の指定。省略した場合はPathの値からObject名を除いた文字列を使用する。 |
4. テスト実行
さて、ヒントとフォーマッタの設定が完了したので動作の確認をしてみましょう。Interaction Consoleを表示させると、ダイアログ上に新しくFormat Usingという項目が表示され、そこに登録したフォーマッタの名前"html"が表示されます。複数のフォーマッタを登録した場合はここで切り替えてそれぞれの動作をテストすることができます。
まずは、次の操作候補が表示されるかを試します。エージェント・ネットワークをロードした直後の状態で、このエージェント・ネットワークが認識できない語彙、たとえば「こんにちは」と入力してみます。入力は理解できませんでしたが「関連性の高い情報・・・検索」と表示されこのシステムが「検索」という機能を持っているということがユーザーに通知されます。
続けて「検索」と入力するとこんどは「関連性の高い情報・・・検索 レストラン」と表示されます。これはCommand「検索」ではObject「レストラン」が使用できるということを表示しています。次に「レストラン」といれると、Field「エリア」に対して定義した必須値チェックのヒントメッセージが出力されます。
エリアを指定してくださいとのことなので「..赤坂」と入力します。必須値を満たしているので、サービスプロバイダでデータベース検索が実行され結果が出力されました。Display Property Fileで定義したように店名、エリア、ジャンル、星の順に一覧が出力されます。
Objectレストランに結びついているエリア以外のFieldを利用可能な検索条件としてヒント出力して欲しいところですが、残念ながら今回使用したフォーマッタ「com.dejima.core.io.HTMLPresentationFormatter」ではFieldに対する操作対象の提示ヒントを表示することができません。フォーマッタを通さないXML出力の場合はFieldに対する操作対象の提示ヒントが出力されます。このヒントを表示するにはカスタムフォーマッタの開発が必要となりますが、これについてはまた別の機会に解説をしたいと思います。
5. おわりに
Answers Anywhereの推論ヒントと出力フォーマッタでユーザーをナビゲートする機能を加えることで、自然言語入力のシステムでよく指摘される何を入力したらよいかわからないという課題を解決できることが理解していただけたのではないかと思います。
次回はAnswers Anywhereのデータ連携機能について解説をする予定です。この機能を使うと、今はテキストファイル中に固定値として持っているエリア名やジャンルなどのマスタ系のデータを、データベースと連携して動的に参照することができるようになります。お楽しみに。
推論ヒントの機能については各エージェントの発火状況の統計を記録しておき、それを推論の重みに使うようなことも検討中です。これにより現在は全てのユーザーに同じように出力されるヒントをパーソナライズして提示することができるようになります。この機能についてはAnswers Anywhereの将来のリリースで提供を予定しています。