あなたのロボットに知識を加えるためのチュートリアル

著作権者 合村 重雄 - 2003年 8月 18日 - 改訂6版
日本語版翻訳および英語版校訂 馬谷 誠二 (umatani@kuis.kyoto-u.ac.jp)


あなたは,今,自分のロボットを作成し,それに知識を加えるための短いチュートリアルを読んでいます. うまくつくられたロボットは,まるで人間のように見える事でしょう. ボットマスターとしてのあなたの目的は単純です: できるだけ長い間,クライアントがあなたのロボットとの会話を続けるよう,ロボットの中身をつくって下さい. そのためには,様々な質問に対して様々な答えの可能性を用意したり,あるいは,クライアントが興味を持てる新しい話題へと話の矛先を変えたりして下さい ─ できるだけ長く会話を続けるということを常に目指して下さい. そのようなボットの例は,毎年行われている Loebner コンテスト(http://www.loebner.net/Prizef/loebner-prize.html)や,近々開催予定の chatterbot 美人コンテスト(http://www.international-lisp-conference.org/Competitions/Chatterbots/ILC02-chatterbots.html)で見ることが出来ます.

パンドラボットでは,AIMLという名前のプログラミング言語によってボットの知識を拡張することが出来ます. このチュートリアルの目的は,あなたのロボットを「より賢く」,より上手に会話を続けられるようにするために必要な,最小限のAIMLの知識を教える事にあります. このチュートリアルをやり終えた後,あなたはさらにwww.pandorabots.comのサイトを訪れ,Pandorawriterという,英語のテキストをAIMLのサブセットに自動変換する事で,ボットに知識を加える作業を大幅に楽にしてくれるツールを使いたくなるでしょう.

このチュートリアルはドラフトであり,不幸にも誤りや欠落があります. 改良版を近々公開する予定です. 何人かは,このドキュメントを公開するのを延期した方が良かったのではないかと思われるかも知れません ─ しかし,なんらかのドキュメントが欲しいという要求があまりに多かったのです. このドラフトの粗雑な面については,お許し願います.

Doubly Aimless 博士に対する,コメントや問題点の指摘については,info@pandorabots.com宛にメールして下さい. 誤りの第一発見者(メールで報告をお願いします)は,お礼の小切手(額装費程度)を受け,名誉ある ALICE Hall にリストされます.  チュートリアル中の情報に関するさらなる詳細については,最後にリストした参考文献から見つけることが出来ます. 特に,AIML言語の最新バージョンは,このドキュメント中において省略された詳細の多くを含んでいます.

このドキュメント中,および www.pandorabots.com 上において議論されるロボットは, AIML に基づいており,すべては http://www.alicebot.org/ における Richard Wallace 博士と A.L.I.C.E. および AIML フリーソフトウェアコミュニティの研究に基づいています.

何人かの方は,ロボットの中に知識がどうレイアウトされているか思い浮かべるのに,次のたとえが有用だと思うでしょう. クモの巣(web)を想像して下さい ─ 中心と,そこから外側へと放射したスポークがあります.ロボットの知識は知識ウェブ(Knowledge Web)に格納されています. まるでクモのように,ロボットはウェブで感知した力に反応して素早く動きます. 知識を格納する方法を理解することが,私達の最初の仕事です. ウェブ全体を描くのはあまりに困難なため,以降の例ではウェブの一部だけが示されます ― ですから,残りの部分については想像力を働かせて下さい.

www.pandorabots.com からスタートしましょう.あなたが,もしまだそうしていないならアカウントを作成し,それから指示に従って新しいロボットをつくり,Full(知識に満ちているという意味)と名付け,Dr Wallace's A.L.I.C.E March 2002.とラベルのついたラジオボタンがチェックされているのを確認して下さい.

日本語文字(と英語文字)を使って対話するロボットを作りたい場合,automatically discover spaces between words (suggested for Japanese) と書かれたボックスをチェックして下さい.(このオプションがチェックされていると,日本語で書かれた単語と単語の間に,自動的に空白が挿入されます.)

Create Bot をクリックし,次の画面で "build and run" をクリックしてロボットとの対話を開始して下さい.

二つめのロボットを作成し,Empty(知識が何もないという意味)と名付け,no initial content, the bot starts with no knowledge とラベル付けされたボタンをチェックして下さい.

(脚注 0).

Full と名付けられたロボットの方から始めましょう ― それは,すでに(Richard Wallace 博士によって)次のように答えるよう教えられています:
    人間: do you love me?
    Full: Yes I love everyone.


図1.0を見て下さい.



ロボットは,この質問に答える方法を前もって知っていました. ロボットはどのようにして答えを見つけたのでしょうか? ロボットは,まず,自分の知識の中に既に "do you love me?" という質問が含まれているかどうかをチェックし,次に,もし見つかれば,教えられていたとおりに何か意味のある応答を返します.

 

カテゴリー

文 "do you love me?" に現れる単語は,知識ウェブにおいては線(またはリンク)とノードのつながりとして視覚化できます. リンクは単語でラベル付けられており(ノードは単語間の空白を表していると考えられます),ウェブの中心からはじまり外側へとのびる鎖を形成します. 知識ウェブ中にその質問を見つけると,ロボットは私達が教えた情報(レスポンス・テンプレート ― 単にテンプレートとも呼ぶ ― に入っている)を返答します. 言いかえると, "do you love me" という特定の質問は,一種の経路 ― 知識ウェブの中心からはじまり,一連のリンクとノードによって組み立てられ,最後にレスポンステンプレートで終わる ― によって視覚化されます. 知識ウェブ中の(レスポンス)テンプレートのついた特定の経路の事を,カテゴリーと呼びます. ロボットに "yes, but only when you are good" と返答するよう教えるには,レスポンス・テンプレートを変更するだけで済みます.

カテゴリーについて更に

それでは,知識をまったく持たないロボットで一からやり直しましょう. あなたは,既に作成し Empty と名付けているはずです ― もしまだなら,今すぐ作成して下さい. まず,図1.1は Empty の非常に簡潔な知識ウェブを示しています. カテゴリーはひとつ,そしてレスポンス・テンプレートが "I have no answer for that" という文を含んでいることに注意して下さい. また,ノード間のリンクが * や <THAT>,<TOPIC> によりラベル付けられていることにも気付くでしょう. * や <THAT>,<TOPIC> といったラベルは,カテゴリーの機能を強化するための,特殊,かつ補足的な変種です. 後で見るように,これらの特殊なラベルはカテゴリーの適合能力を拡げます.



それでは,この一つだけのカテゴリーは何をするのでしょうか? ラベル * で開始する事により,Empty に,任意のやりとりに対し同じ応答を返すよう指示する事が出来ます:
    あなた: "こんにちは"
    Empty: "I have no answer for that"
    あなた: "abc"
    Empty: "I have no answer for that"


より一般的に言うと,ロボットに与えられる単語や文は入力パターンと呼ばれます. 知識ウェブ中に存在する任意の文は,リンクでつながれたノードの,レスポンス・テンプレートで終了する経路として視覚化できます. ロボットは,入力パターンに正確に適合する,リンクでつながれたノードの経路を検索します. 経路が見つかった時,その経路は入力パターンに適合すると言います.

デフォルト・レスポンス

入力パターンが知識ウェブ中に見つからないという事はよくあります ─ それでも,私達はロボットに何か意味のある応答をして欲しいと思っています. この応答をデフォルト・レスポンス・テンプレートと呼びます ─ それは,典型的には,会話を続ける事が可能なように仕組まれた文から成ります. デフォルト・カテゴリー(単語の含まれてない経路とそのレスポンス・テンプレート)は図1.1(上にあります)のように視覚化されます.* は,(任意個の)任意の単語に適合します.<THAT> と <TOPIC> については後で説明します.

あなたのボットに,こんにちは,に対して「やあ,どうも!」と答えるよう教えてみましょう.(「こんにちは」と打ち,それから "Say This Instead" とラベルのついたボックスに,「やあ,どうも!」と打ち込んで下さい.)そうすると,知識ウェブは図1.2のようになります.



今,ロボットは二つだけの応答を持っています ─ そのため,興味深い会話といった面をサポートするのは不可能です. さらに変更を加えましょう. こんにちは(Empty が知っている唯一の入力パターン)以外の入力を打ち込むのに応じて,Empty は,3つの可能な応答からランダムにあなたに示します.  以下のように打って下さい:
    あなた: "やあ"
    Empty: "I have no answer for that"


次に,"Advanced Alter Response:" をクリックして下さい.

New AIMLラベルのついたボックス中の,やあ を * に置換える事により,あなたが打ち込む任意の入力が応答に適合します.それでは,ランダムに選ばれる3つの可能な応答を加えましょう.Template ラベルのついたボックスに以下を加えて下さい:
    <random>
    <li> あなたの名前は何ですか? </li>
    <li> あなたの好きな映画は何? </li>
    <li> 何か飲み物をおごってくれない? </li>
    </random>


[脚注 2]

知識ウェブは,今,図1.3のように見えます.



私達は,デフォルト・レスポンス・テンプレートを "I have no answer for that" から,3つのランダム・レスポンスの中から選ばれる一つに変えることで,デフォルト・カテゴリーを変更しました. 言われた事を理解できなくてそれでも見捨てらまいとする無邪気な子供のように,Empty は話を変えようと"ありあわせの"文句から,選んでしめすことにより会話を長引かせようとします. Empty は,実際にはほとんど知らないという事をごまかすために,ランダムにありあわせの文句を差し出します. "こんにちは" 以外の入力を打ち込んで,この事を自分で確認して下さい. ありあわせの文句の全部を一巡するまで何回か [Ask This Again] ボタンをクリックしてみて下さい.

作業の保存とやり直し

理由については後で触れますが,大抵の場合,最終のデフォルト・カテゴリーを変更するのは避けておきたい所です.一番最初に戻ってやり直しましょう.と同時に,ファイルの保存方法も学びます.

[botmaster control] をクリックし,"Empty" で始まる行にある "Edit" をクリックし,"update.aiml" をクリックしたら,このファイルが私達の行ったすべての変更を含んでいることを確かめて下さい. いくつかのブラウザでは,このファイルに加えられた最新の変更を見るために,ブラウザの更新ボタンをクリックする必要があるかもしれません. このファイルをあなたのローカルコンピュータに保存するには(たくさん変更した時にいつもそうするのは良い考えです),ブラウザのファイルメニューをクリックし,それから "名前を付けて保存" をクリックして下さい.

しばらくの間,ファイルの中身を眺めてみましょう ― (ヘッダ情報の)はじめの行は文字集合の種類と利用しているXMLのバージョンを示しています. 次の行は,aimlのバージョン 1.0を利用していることを表します(以下の出力はIE 5.5によるものであり,AIMLタグの前のハイフンはIEにより勝手に付け加えられたものです).
    <?xml version="1.0" encoding="UTF-8" ?>
    - <aiml version="1.0">
    - <category>
    <pattern>こんにちは</pattern>
    <template>やあ,どうも!</template>
    </category>
    - <category>
    <pattern>*</pattern>
    - <template>
    - <random>
    <li>あなたの名前は何ですか?</li>
    <li>あなたの好きな映画は何?</li>
    <li>何か飲み物をおごってくれない?</li>
    </random>
    </template>
    </category>
    </aiml>


カテゴリーは,開始行と終了行の間の情報として,<category>..... 情報 ....</category> の形で指定されます.

同様に,入力単語列は,<pattern>... 情報 ...</pattern>で指定されます.

出力される応答は,<template> と </template> の間の情報により指定されます.

< と > の間にある要素は AIMLタグ,あるいは AIML要素と呼ばれます. 各 AIMLタグには,<SOME-TAG> .... 情報 ....</SOME-TAG> の形の開始タグと終了タグがあります. "-" は,まったく表記上のものであり,実際にファイル中に存在するのではなく,(IE によって)可読性を向上させるための手段として加えられ,新たな AIMLタグの開始をマークしたものです. そのため,例えば,ファイルの開始は, -<aiml version="1.0"> と終了要素 </aiml> でマークされています.

開始タグと終了タグの間になにも情報がない事が時々ありますが,<SOME-TAG></SOME-TAG> の代わりに省略形 <SOME-TAG/> を使う事が出来ます. [Advanced Alter Response] (あるいは,[Say this instead])をクリックすると,ファイル update.aiml に新たな情報が加えられます. (その効果を見るためには,ブラウザの更新ボタンをクリックします.) (ローカルマシン上の)標準的なテキストエディタあるいは XMLエディタで update.aiml を編集し,それをアップロードする事により,同じ効果を得ることが出来ます.

新たなバージョンの Empty を作成する

[botmaster control] をクリックし,次に "Empty" ではじまる列の [Delete] をクリックして下さい.

[Create a new bot] をクリックし,"Empty" と名付け,先程と同じようにチェックしてから,[Build and Run this bot] をクリックして下さい.これで,あなたは,新しい空のロボットを手に入れました.

カテゴリーについて更に

知識が何もない状態において,Empty が言う事の出来る唯一の事は:
    Empty: "I have no answer for that"

です.次のような質問に対し,4つの可能なランダム・レスポンスを用意することで,面白味のある会話が行われる可能性を増やしてみましょう.
    あなた: "あなたは私の事を愛してますよね"
    Empty: "I have no answer for that"

[Advanced Alter Response] をクリックして下さい:

Template とラベルのついたボックスに,以下を追加して下さい:
    <random>
    <li> 分かりません,最近私に何かしてくれましたか? </li>
    <li> はい,でも私をもっと幸せにしようとしなければいけません...</li>
    <li> 弱音をはくな!</li>
    <li> はい, でも私に親切にしてくれる時だけです.</li>
    </random>


すべての応答を一巡するまで,何度も [Ask This Again] ボタンをクリックしてみて下さい.知識ウェブは,今,図1.4のように見えます.



(訳注: 以下,オリジナル英文の説明)
"don't" のような短縮形は "do not" と展開されます.そのため, "you do love me don't you?" は,(見苦しいですが) "you do love me do not you" へと変換されます(脚注 1を参照).

<THAT> と <TOPIC> とは何か?

<THAT> を用いる事で,ロボットは,その前のやり取りで自分が言った事を覚えておく事が出来ます.そうすると会話はもっと意味あるものになり得ます. <THAT> は,次のような会話のやり取りを分析することから生じ,名付けられました:
    Empty: 今日,私はあなたを愛しています.
    あなた: それ(that)は素晴らしい.
    Empty: でも,明日になっても愛してるでしょうか?
    あなた: 私は,それ(that)を知りたいんだ.


最初に, <THAT> 表現と一緒に用いるのに便利なカテゴリーが必要です. 次のようにして,Emptyにそのカテゴリーを入力しましょう:
    あなた: *と言え
    Empty: I have no answer for that


[Advanced Alter Response] をクリックして下さい:

"New AIML" とラベルのついたボックスの内容が,新しいカテゴリー: * と 言え(* と「と 言え」の間の空白に注意)で始まっていることに気を付けて下さい.

"Template"ラベルのついたボックスに <star/> を加えて下さい.

<star/> が <star></star> の省略形である事を思い出して下さい.この変更によって,何にでも適合するようになります. そのため,"何か言え" は必ず <THAT> を "何か" にセットします.例えば:
    あなた: 私はあなたを愛していますと言え
    Empty: 私はあなたを愛しています


私達はこのカテゴリーを, <THAT> を使ったカテゴリーをテストするのに使うつもりです.

例 1 ― あなたは誰?

ある時,あなたのロボットは,自分が誰と話しているのか知りたいと思うかも知れません.そのやり方を次に示します.
    あなた: *
    Empty: I have no answer for that


[Advanced Alter Response] をクリックして下さい:

"depends on this That" とラベルのついたボックスをチェックし,ボックスの内容を以下に置き換えて下さい:
    あなた の 名前 は 何 です か
(訳注: 単語間には,Emptyが応答するのと同じ,単語間の空白が必要です.Empty の応答を cut and paste するのが便利です.)

"New AIML"ラベルのついたボックスが * (任意の応答に適合するという意味)を含んでいることを確認して下さい. "Template"ラベルのついたボックスに以下を加えて下さい:
    はじめまして,<set name="name"><person/></set>さん.

この AIMLコードの最後の部分が,その人の名前を取得しています.

それでは,ボットに "あなたの名前は何ですかと言え" と指示し,次の入力が <THAT> カテゴリーを活性化させるような状況をつくり出して下さい.
    あなた: あなたの名前は何ですかと言え
    Empty: あなたの名前は何ですか
    あなた: ラブジョイ
    Empty: はじめまして,ラブジョイさん.

例 2 ― 「はい」か「いいえ」で答える質問

「はい」か「いいえ」の答えを求めるカテゴリーのために <THAT> を使ってみましょう. ここでは,「はい」と答える質問の例を示します.
    あなた: はい
    Empty: I have no answer for that

[Advanced Alter Response] をクリックして下さい:

"depends on this That" とラベルのついたボックスをチェックし,ボックスの内容を次のように置き換えて下さい:
    あなた は 愛情 を 求め て い ます か

"New AIML"ラベルのついたボックスが,「はい」を含んでいる事を確認して下さい.

"Template"ラベルのついたボックスに,4つのランダム・レスポンスを加えて下さい:
    <random>
    <li> 私達は,みんな,愛情を求めていませんか?</li>
    <li> おや,あなたはうってつけの場所に来ましたよ!</li>
    <li> では,今日はいったいどんな愛情をお求めですか?</li>
    <li> ええと,私は今日あなたへの愛情で溢れています.</li>
    </random>


    あなた: あなたは愛情を求めていますかと言え
    Empty: あなたは愛情を求めていますか
    あなた: はい
    Empty: おや,あなたはうってつけの場所に来ましたよ!

例 3 ― ロボットにどんな知識を加えるかを見つける

AIMLタグ <THAT> は Empty が最後に言ったことを参照します. 新しい知識を加えるために, <THAT/> とデフォルト・テンプレートを使ってみましょう:
    あなた: なぜ?
    Empty: I have no answer for that


[Say This Instead] をクリックして下さい: "<that/>"? なぜ?

入力 "なぜ?" に対するデフォルトの返事のひとつは, "<that/>"? なぜ? です. このデフォルトは次のような対話の断片を生成します:
    ロボット: どうかこれ以上質問しないで下さい
    クライアント: なぜ?
    ロボット: "どうかこれ以上質問しないで下さい"? なぜ?


ボットマスターは,この断片に注目し新たな AIMLカテゴリーをつくります:
    <category>
    <pattern>なぜ</pattern>
    <that>どうか これ 以上 質問 し ない で 下さい</that>
    <template>なぜなら,むしろあなたの事を話したいからです.</template>
    </category>


これで,次のクライアントがロボットの要求に対し "なぜ?" と尋ねたら,上の新しい <that> カテゴリーを活性化させるでしょう:
    ロボット: どうかこれ以上質問しないで下さい
    クライアント: なぜ?
    ロボット: なぜなら,むしろあなたの事を話したいからです.


このスタイルの会話の分析は,いつクライアントが "なぜ" と言うかを私達が分かっている,という事を前提にしていません; そうではなく,ロボットの発するある文に続いて現れる "なぜ" というケースを見分けるため後ろ向きに見ていきます. そのような会話ポイントを見分けると,ボットマスターは新しくカテゴリーをつくります.

例 4

少しばかり複雑な例を見てみましょう. 先の例を用います(下のやり取りの一つ目の応答が得られるまで,[Ask This Agin] をクリックして下さい):
    あなた: あなたは私の事を愛してますよね
    Empty: はい,でも私をもっと幸せにしようとしなければいけません...
    あなた: けれどあなたを喜ばせようとこんなに頑張ってるのに...
    Empty: I have no answer for that.


[Advanced Alter Response] をクリックして下さい:

"depends on this That"ラベルのついたボックスをチェックして下さい. ― "はい,でも私をもっと幸せにしようとしなければいけません" を含んでいるはずです. "New AIML"ラベルのついたボックスが "けれど あなた を 喜ば せよ う と こんなに 頑張っ てる の に" を含んでいることを確かめて下さい.

"Template"ラベルのついたボックスに,次を(引用符を除いて)加えて下さい: "ええ,うまくやってくれる時もありますが,あなたに出来るのはせいぜいそれぐらいの事です"

これで,ロボットのランダム・レスポンスが適合した場合にだけ,次の対話がやり取りされます:
    あなた: あなたは私の事を愛してますよね
    Empty: はい,でも私をもっと幸せにしようとしなければいけません...


あなたは次のように打てます:
    あなた: けれどあなたを喜ばせようとこんなに頑張ってるのに...
    Empty: ええ,うまくやってくれる時もありますが,あなたに出来るのはせいぜいそれぐらいの事です

上記のケースを除いて,ロボットの:
    あなた: けれどあなたを喜ばせようとこんなに頑張ってるのに...

に対する応答は:
    Empty: I have no answer for that

です.図1.5は,この状態を表しています.



つまり,<THAT> は, ロボットが直前に,<THAT> に続く文を発していた場合にだけ適合するように,カテゴリーを修正しています. この例を引き続き使いましょう:
    あなた: あなたは私の評価なんかしなくていい - 私の事をあたり前に思って,適当にあしらえばいいんだ...
    Empty: I have no answer for that


[Advanced Alter Response] をクリックして下さい:

"depends on this That" とラベルのついたボックスをチェックして下さい(それは今,最後のレスポンス・テンプレートを含んでいます): "ええ,うまくやってくれる時もありますが,あなたに出来るのはせいぜいそれぐらいの事です"

"New AIML"ラベルのついたボックスの内容が,新しいカテゴリー "あなた は 私 の 評価 なんか し なく て いい 私 の 事 を あたり前 に 思っ て , 適当 に あしらえ ば い いん だ" で始まっている事を確認して下さい.

"Template"ラベルのついたボックスに,次を加えて下さい: "あなたがもっと頑張ってくれたら,もっと熱意をもってあなたを評価できるのに ― あなたは私にどうして欲しいんですか? 評価してるふりをしてほしいですか,それとも本当にそう感じたい?"

これらの変更により,次のようなやり取りが可能となります(下のひとつ目のやり取りのように Empty が(ランダム)レスポンスを生成するまで [Ask This Again] をクリックして下さい)
    あなた: あなたは私の事を愛してますよね
    Empty: はい,でも私をもっと幸せにしようとしなければいけません...
    あなた: けれどあなたを喜ばせようとこんなに頑張ってるのに...
    Empty: ええ,うまくやってくれる時もありますが,あなたに出来るのはせいぜいそれぐらいの事です
    あなた: あなたは私の評価なんかしなくていい - 私の事をあたり前に思って,適当にあしらえばいいんだ...
    Empty: あなたがもっと頑張ってくれたら,もっと熱意ををもってあなたを評価できるのに ― あなたは私にどうして欲しいんですか? 評価してるふりをしてほしいですか,それとも本当にそう感じたい?"


図1.6 は知識の現在の状態を表します.



以下は,ファイル update.aiml の中身です.(赤字)
   
    - <category>
    <pattern>あなた は 私 の 事 を 愛し て ます よ ね</pattern>
    - <template>
    - <random>
    <li>分かりません,最近私に何かしてくれましたか?</li>
    <li>はい,でも私をもっと幸せにしようとしなければいけません...</li>
    <li>弱音をはくな!</li>
    <li>はい, でも私に親切にしてくれる時だけです.</li>
    </random>
    </template>
    </category>
    - <category>
    <pattern>けれど あなた を 喜ば せよ う と こんなに 頑張っ てる の に</pattern>
    <that>はい,でも私をもっと幸せにしようとしなければいけません</that>
    <template>ええ,うまくやってくれる時もありますが,あなたに出来るのはせいぜいそれぐらいの事です</template>
    </category>
    - <category>
    <pattern>あなた は 私 の 評価 なんか し なく て いい 私 の 事 を あたり前 に 思っ て , 適当 に あしらえ ば い いん だ</pattern>
    <that>ええ,うまくやってくれる時もありますが,あなたに出来るのはせいぜいそれぐらいの事です</that>
    <template>あなたがもっと頑張ってくれたら,もっと熱意をもってあなたを評価できるのに ― あなたは私にどうして欲しいんですか? 評価してるふりをしてほしいですか,それとも本当にそう感じたい?</template>
    </category>

 

<TOPIC> とは何か?

トピックを使って,あなたはいくつかのカテゴリーをひとつにまとめてグループ化することが出来ます. 提出された入力パターンは,ロボットの知識ウェブ中において適合するカテゴリーを求めて検索されます.適合するカテゴリーが二つ以上見つかった場合,ロボットは次に<THAT>パターンを適合させます. そのようなカテゴリーが二つ以上存在した場合,ロボットは次に<TOPIC>を適合させます. カテゴリーは,パターンのアルファベット順に格納されています. カテゴリーに適合される入力は,逆順に比較されます. そのため二つ以上のカテゴリーが適合した場合,最後のが取られます. 私達は,よく,複数のカテゴリーをひとつの概括的なトピックにまとめたいと思うことがあります. そこで,適当な応答は見つからないが,ある特定のトピックをとり扱っていると知っている場合に,ロボットは特定のありあわせの文句を生成し,会話を続ける事が可能です.私達は,どうやってこれを行うのでしょう?

例 1 ― トピックの使用

    あなた: *
    Empty: I have no answer for that


以下のようにして,このカテゴリーを Empty に入力して下さい:
    あなた: *
    Empty: I have no answer for that


[Advanced Alter Response] をクリックして下さい:

"New AIML"ラベルのついたボックスの内容が,* (任意に適合する)を含んでいることを確かめて下さい.

"Topic"ラベルのついたボックスに次を加えて下さい: 女の子

"Template"ラベルのついたボックスに以下を加えて下さい:
    <random>
    <li> あなたは女の子達のどこが一番好きなのでしょう?</li>
    <li> 私だって自分が女の子を好きなのは分かってます!</li>
    <li> あなたは女の子と大人の女性の区別がつきますか?</li>
    <li> あなたの愛してないものはありますか? </li>
    </random>


女の子について話している時の,デフォルト・レスポンス・カテゴリーを変更しました. Empty は,4つのランダムに選択されるありあわせの文句のうちの一つを,会話を続けるために使います. この新しいカテゴリーをテストしたり使用する前に,私達はトピックを変える必要があります.そして,インターフェースについてもう少し教えるために,これを使えます. 次を入力して下さい:
    あなた: トピック *
    Empty: I have no answer for that

[Advanced Alter Response] をクリックして下さい:

"New AIML"ラベルのついたボックスの内容が,"トピック *" を含んでいるのを確認して下さい.

"Template"ラベルのついたボックスに以下を加えて下さい:
    <think>
    <set name="topic">
    <star/>
    </set>
    </think>
    オーケー,トピックを<star/>にリセットしました.


これで,私達はトピックを <set name="name"><star/></set> にリセットしました.

私達は,新しいカテゴリーをつくり,少しばかりの AIMLコードを記述して <TOPIC> を変更するのに使いました. <think>タグは,"隠された" 命令列を区切っています ― 隠された,とは,クライアントには見えない,という意味です. <set>タグは,トピックを変更する手段を区切ります(トピックは単一タグ <star/> によってマークされた入力パターンへと変更されます).(AIMLタグのリストは,このドキュメントを執筆している時点において,http://www.alicebot.org/committees/architecture/resolutions/aiml10.html から利用可能です.)

この新しいカテゴリーを使って,次のように <TOPIC> を変更できます:
    あなた: トピック 女の子
    Empty: オーケー,トピックを女の子にリセットしました.
    あなた: 私は女の子が好きです
    Empty: あなたの愛してないものはありますか?


少しばかりのコードを使って,トピックなしのデフォルト状態に戻って下さい.次を入力して下さい:
    あなた: トピックなし
    Empty:
私だって自分が女の子を好きなのは分かってます!

[Advanced Alter Response] をクリックして下さい:

"Template"ラベルのついたボックスに,以下を加えて下さい:
    <set name="topic"/> やりました

次のような結果を得ます:
    あなた: トピックなし
    Empty: やりました


まずは,Empty にもう少し知識を加えてみましょう.
    あなた: "あなたは私の事を愛してますね?"
    Empty: "I have no answer for that"


代わりに,"はい, でも私に親切にしてくれる時だけです." と言うよう Empty に教えてみましょう.

入力を次のように変え:
    あなた: "私の事を愛してますか?"
    Empty: "I have no answer for that"


代わりに,もう一度 "はい, でも私に親切にしてくれる時だけです." と言うよう Empty に教えて下さい.

これで,"あなたは私の事を愛してますね?" か "私の事を愛してますか?" のどちらかの入力パターンが Empty に "はい, でも私に親切にしてくれる時だけです." と応答させます.

知識内容から見ると,現在の状態は図2.0のようになっています.



それでは,次に:
    あなた: "あなたは私の事を愛してませんか?"
    Empty: "I have no answer for that"


代わりに "いいえ,でも私に優しい時だけです." と言うよう教えましょう.

そうすると,私達は次のような対話も出来ます:
    あなた: "あなたは私の事を愛してませんか?"
    Empty: "いいえ,でも私に優しい時だけです.".


それでは, <TOPIC> を加え,また,ファイルを保存・アップロードする方法を見てみましょう.

以下をクリックして下さい:
    [botmaster control],
    [edit this bot],
    [make changes], (これで最新の変更を update.aimlに加えられます.)
    [update.aiml],

ファイルをあなたのローカルマシンに保存して下さい. 保存したファイルをエディタで開いて下さい. 行 <aiml version="1.0"> の下に,以下の行を加えて下さい:
    <topic name="愛">
    <category>
    <pattern>*</pattern>
    <template> <random>
    <li> 私の事をどれくらい愛してますか?</li>
    <li> これまで,どうして私を愛している事を見せてくれないのですか?</li>
    <li> どうして愛情を示す事がそんなに難しいのですか?</li>
    <li> あなたの冷たさは,私を骨の髄まで冷え込ませます.</li>
    </random>
    </template>
    </category>


ファイルの最後に,行 </topic> を加えて,最後の2行が次のように見えるようにして下さい:
    </topic>
    </aiml>


あなたの変更したファイルをロードして下さい.[Make Changes] をクリックし,それから [Build and Run] をクリックして下さい. あなたのファイルは,トピックが愛の時だけ有効となります. そのため,あなたが何を打っても,ロボットは "I have no answer for that" と応答するでしょう. トピックをセットするには,* と打ち,次の行を Template box に入れて下さい:
    <set name="topic">愛</set>

トピックが "愛" であり,かつ応答すべきものがないときはいつも,ロボットは4つの可能な文句の中からひとつを応答するでしょう.

 

国際言語についてはどうか?

ロボットは,任意の国際文字集合を扱うことが出来ます. 日本語でロボットに同様の質問をする事もできます: (訳注: 日本語翻訳版チュートリアルでは,最初から日本語文字集合を使っています)
    あなた: 私の事を愛してますか?
    Full: I have no answer that

中国語や日本語といった言語では,"単語"の間に空白がある事を仮定していません.日本語の場合だと,パンドラボットは,クライアントから空白のない文を受け取り,内部的には "単語"間に空白を挿入して格納します. 同様のアルゴリズムが中国語についても使えますが,このドキュメントを執筆している時点では,まだ実装されていません. 日本語用のアルゴリズムをそのまま中国語の文に使うと,不適切に空白が挿入されてしまいます. どちらの場合においても,そのような空白を自動的に挿入する事で,入力パターンを適合させるというボットマスターの仕事はかなり単純化されます.   

写真やその他の画像はどのようにして表示するか?

レスポンス・テンプレートは,応答を返す以上にかなり多くの事を行えます. 任意のプログラムを走らせることや,他のウェブサイトからのページを提供する事も出来ます. 例えば,あなたは Empty に他の人の写真を見せるように頼めます.その写真はウェブ上のどこにあっても構いません.
    あなた: あなたが愛だと考えている物を見せて下さい.
    Empty: I have no answer for that


ボックスに以下を入れ,[Say This Instead] をクリックして下さい:
    これは,私が持っている,たくさんの愛の写真のうちの一つです: <img sr.="http://www.pandorabots.com/pandora/pictures/cn.jpg"/>

Advanced Alter Response ページの Template エリアのとなりにある [<img>] ボタンをクリックすることで,打ち込む労力のいくらかを簡単化することも可能です.

 

知識内容に変更を加える

[botmaster control] ボタンをクリックし,次に [edit] をクリックすると,2つのパートからなるページが得られるでしょう ― 賞を勝ち取ったロボット "A.L.I.C.E." のカテゴリーを定義するAIMLを含んだファイルのリストと,ロボットの中身を簡単に追加する事のできるプロパティのリストの2つです. ボット・プロパティを編集しても,新たなAIMLカテゴリーはつくられません. プロパティは,<location/> や <favoritemovie/> のようなグローバル定数の値をセットします; それらは,AIML知識ベース全体に渡って,カテゴリーの中から参照されたり,使われたりします.

このページで新しいボット・プロパティを加え,それからテンプレート・ボックスの中でそれを修正することが可能です. 例えば,新しいプロパティ ― weather,初期値は 雨 ― を定義できます. そうすると,テンプレート・レスポンスは "天気は<bot name="weather"/>です" のようなテキストを使って,weather の値を参照する事が出来ます.

 

同じ事を書くのにも多くの方法が...

同じ意味を持つ文を多くの異なった方法で記述することが出来ます. 大抵の人は,次のような文を,だいたいにおいては同じものだと受け取るでしょう:
    Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの, たった今.
    Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの, 今.
    Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの
    Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの
    Empty, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの
    Empty, 教えて欲しいんだけど, あなたは誰か他の人にも会っているか
    Empty, あなたは誰か他の人にも会っているか
    あなたは誰か他の人にも会っているか

これは,より一般的な問題の一例にすぎません ― 同じ意味を持つ入力のためのカテゴリーすべてをどうやって入力するのでしょう? あるいは,こういった種類の質問に対し,あなたはどのように答えればいいのでしょう? これまで,すべての同じような文を見つける満足のいく方法について誰も満足に答えられませんでした. しかしながら,ここではそれを可能にしてみます. この例では,新しいタグを使い,"_"文字を導入します. 前に, "*" は任意に適合すると書きました. "_" は "*" のもう一つの形式であり,パターンを文の終りに適合させるのに使います. " * now" を含むカテゴリーは," _ now"を含むカテゴリーの後で適合されます.

新たに2つのカテゴリーを加え,Emptyに次のように応答させる事から始めましょう:
    あなた: あなたは誰か他の人にも会っているか?
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.
    あなた: あなたは誰か他の人にも会っているの?
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.


次に,以下を加えると
    <category>
    <pattern>Empty *</pattern>
    <template>
    <srai><star/></srai>
    </template>
    </category>


次のようになります:
    あなた: Empty, あなたは誰か他の人にも会っているか?
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.

以下を加えると:
    <category>
    <pattern>_ 教え て 欲しい ん だ けど *</pattern>
    <template>
    <srai><star/></srai>
    </template>
    </category>


次のようになり:
    あなた: Empty, 教えて欲しいんだけど, あなたは誰か他の人にも会っているか
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.


以下を加えると:
    <category>
    <pattern>_ ちょっと 教え て 欲しい ん だ けど *</pattern>
    <template>
    <srai><star/></srai>
    </template>
    </category>


次のようになり:
    あなた: Empty, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.


以下を加えると:
    <category>
    <pattern>_ お願い です から ちょっと 教え て 欲しい ん だ けど *</pattern>
    <template>
    <srai><star/></srai>
    </template>
    </category>


次のようになり:
    あなた: Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.

以下を加えると:
    <category>
    <pattern>_ 今 </pattern>
    <template>
    <srai><star/></srai>
    </template>
    </category>
    <category>
    <pattern>_ たった今 </pattern>
    <template>
    <srai><star/></srai>
    </template>
    </category>


これらのカテゴリーにより,ようやく私達はすべての質問に対し同じ答えを得ることが出来ました:
    あなた: Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの, たった今.
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.
    あなた: Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの, 今.
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.
    あなた: Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.
    あなた: Empty, お願いですから, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.
    あなた: Empty, ちょっと教えて欲しいんだけど, あなたは誰か他の人にも会っているの
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.
    あなた: Empty, 教えて欲しいんだけど, あなたは誰か他の人にも会っているか
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.
    あなた: Empty, あなたは誰か他の人にも会っているか?
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.


それでは,ここでは何が起ったのでしょうか? 私達は,より複雑な文を2つの"標準の"文へと,段階的に簡単化していきました: (あなたは誰か他の人にも会っているか? と あなたは誰か他の人にも会っているの?)

この一般的技法は再帰と呼ばれ, ― 再帰とは,同じ解法を適用するという意味です ― この例だと,<srai><star/><srai> を繰り返し適用しています. 再帰は,様々なタスクにおいて便利です.ここでは,少しだけしか言及していません. より詳細は,The Anatomy of Alice に見ることが出来ます.

1.複数の文の取り扱い ― 次のようなやり取りは,その下のカテゴリーによって生成されます.(ロボットは複数の文を扱えます ― なおかつ,それぞれの文に対して行を改めることで順に応答しています.)
    あなた: Empty, あなたは誰か他の人にも会っているか?
    Empty: 私が会う人といえば,既に会った事のある人か,あるいは将来会うであろう人のどちらかです.
    あなた: 分かった.
    Empty: 分かってもらえて嬉しいです.
    あなた: どうしてそれを隠しておこうとは思わないのですか?
    Empty: 全部打ち明けるのが,いつもいいに決まってるじゃないですか,そう思いませんか?


    <category>
    <pattern> * 分かっ た </pattern>
    <template> <srai> 分かった </srai>
    <srai><star/></srai> </template>
    </category>
    <category>
    <pattern> 分かっ た </pattern>
    <template>分かってもらえて嬉しいです.</template>
    </category>
    <category>
    <pattern> どうして それ を 隠し て おこ う と は 思わ ない の です か?</pattern>
    <template> 全部打ち明けるのが,いつもいいに決まってるじゃないですか,そう思いませんか?</template>
    </category>



2. スペルおよび文法の訂正: スペル間違いを訂正したり,別の形式の文法を提案したいと思うことがよくあります ― ここでは,その方法のひとつを紹介します:(訳注: 英文のまま載せます)
    <category>
    <pattern> your a wasting my time </pattern>
    <template> you mean you are..? ...<srai>
    you are <star/> </srai> </template>
    </category>




3. 時には,打ち込まれた中の一つだけの単語(キーワード)で,ロボットの応答を決定したい事があります.ここでは,キーワードが"愛"であるような例を示します:
    <category>
    <pattern> 愛 </pattern><template> あなたが何を求めているのか,もっと教えて下さい.</template>
    </category>
    <category>
    <pattern> _ 愛 </pattern><template><srai>愛
    </srai></template>
    </category>
    <category>
    <pattern> 愛 _ </pattern><template>
    <srai>愛 </srai></template>
    </category>
    <category>
    <pattern> _ 愛 *</pattern><template>
    <srai>愛 </srai></template>
    </category>


ひとつ目のカテゴリーは一つの単語 愛 からなる入力に適合します. 二つ目と三つ目のカテゴリーは,愛 で終わる文と 愛 で始まる文に,それぞれ適合します. 最後のカテゴリーは,その中に単語 愛 があらわれる文に適合します.

 

脚注 0.

オプション Standard AIML Sept 2001 と Dr Wallace's A.L.I.C.E march 2002 は2つの知識集合です. ひとつ目は,いくつかのファイルから構成され変更しやすいです ― そして,熟練者が使うのに適しています. ふたつ目は,Wallace博士が 2002 Loebner賞を勝ち取るのに使った知識です.

脚注 1.

ここでは,変換のより詳細を説明します. 質問 "do you love me" は,すべての句読点を取り除き,大文字に変える事で変換されます: "DO YOU LOVE ME". そのため,"do you LOVE me" と "DO YOU love me" は等価です. 複数の文については,文を見つける事から始めます. 質問 "Do you love me dr.wallace? ms.mary said you might..." は,"Do you love me doctor wallace? ms marry said you might" へと変換されます. それから,それぞれの文は別々に処理されます. アポストロフィー(')は短縮形から取り除かれ,そのため "I'm in love with you" は "I am in love with you" に変換されます.

日本語は単語間に空白を挟まずに記述されています. そのため,まずはじめに空白が挿入されます. ボットが日本語と英語を処理するようセットアップされていた場合,"let's see if you really do" のような文は,"let ' s see if you really do" に変換されます.

脚注 2.

"<random>" のような,かぎ括弧 < と > の内側にある単語はXMLタグと呼ばれ,答えがどのように処理されるべきかを指定します. そのようなタグのうち,ほんの少しだけを見てきました. <li> は,リスト中の要素を指定します ― この例には,3つの要素 ― すなわち3つの文 ― を持つリストがあります. それぞれのタグは,典型的には </random> のように指定される終了タグを持つ事を要求されます. 開始タグと終了タグの間に何も入らない事が時々あり,この例 <star> </star> = <star/> のように2つのタグが置き換えられます. つまり,左辺の2つのタグはより簡潔な右辺のタグに置き換えられます.

脚注 3.

XMLとAIMLは,プログラミング言語です. 我々は,チャットロボットをつくるために標準的でない進化途上にあるマークアップ言語AIML (Artificial Intelligence Markup Language) ― ALICE Foundationにより作成・サポートされており,www.alicebot.org にある ― を実装しました. AIMLの設計上の一番の特徴は,簡潔さ,単純さにあります. パターン・マッチ言語はとても単純です.例えば,たった一つのワイルドカード('*')によりパターン中の文字にマッチするのを許しています. AIMLはXML言語であり,それはAIMLがある文法上のメタ規則に従っている事を意味します. XML構文を選択した事で,XMLエディタのような他のツールとの統合が可能になります.

 

用語集

入力パターン(imput pattern) ― ロボットに渡される入力文(複数の文でも可).

テンプレート(template) ― レスポンス・テンプレートの略

レスポンス・テンプレート(response template) ― レスポンス・テンプレートは,応答,あるいは応答を生成するプログラム.

カテゴリー(category) ― レスポンス・テンプレートに添った(補足的な変種 <that> と <topic> を含む)入力パターン

パターン・マッチング(pattern matching) ― 入力文を,格納された文に対し適合(マッチ)させる能力

知識ウェブ(knowledge web) (別名,グラフマスター(graph master)) ― パンドラボットにおけるカテゴリー集合の表現

最終のデフォルト・カテゴリー(ultimate default category) ― 入力文がどのカテゴリーにも適合しない場合

デフォルト・カテゴリー(default category) ― <topics> と <that> は,それぞれデフォルト・カテゴリーを持つことができる

デフォルト・レスポンス・テンプレート(default response template) ― 何も適合しない場合に言われる内容

XML ― マークアップ/プログラミング言語

AIML ― 知識内容を実装するマークアップ/プログラミング言語.AIMLはXMLの部分集合である.

 

付録


Advanced Alter Response の使用 ― その詳細

上から9つのボックスは,入力文(パターン)に適合したカテゴリーについての情報を含んでいます.

Input ... ロボットが受け取った入力テキスト(パターン)を表示します

Matched ... 入力パターンに適合したパターン(とカテゴリー)を表示します

Action ... 返事 ― 適合するカテゴリーのレスポンス・テンプレート部 ― を表示します.適合するカテゴリーの <that> と <topic> 部も,このボックス中に明示されます.

New AIML ... パターン ― 受け入れるか,あるいは,書き換えられます ― 実質的に新しいカテゴリーをつくっています.一番目のボックスの中のテキストは,自動的に <pattern> と </pattern> で囲まれます ― そのため,自分で入力する必要はありません. また,カテゴリーの <topic>部と <that>部を指定する事も可能です. これについても,テキストは <that> および <topic> aimlタグで自動的に囲まれます.

Template ... テンプレート・レスポンス・ボックス ― 与えられた入力パターンに対するアクションを指定します. <think>,<random>, 等々のボタンは,AIMLの中にタイプする労力を減らしてくれます.
このボックスについても,<template> と </template> で自動的に囲まれます.

7個の編集ボタンは,テンプレートを書く際のいくらかのショートカットを提供してくれます:
<think>: テンプレートの中に
    <think>
    <set name="it">
    <set name="topic">
    <person/>
    </set>
    </set>
    </think>

を入れます.

<random>: 3個の <li> と </li>タグに挟まれたランダム選択用のAIMLテンプレートを入れます.
    <random>
    <li></li>
    <li></li>
    <li></li>
    </random>


<img>: <img src=""></img>を入れます.写真を提供するには,ダブルクオートの間にパス名を入れて下さい.

<sr/>: <srai><star/></srai> の省略形である <sr/> を入れます.

<srai>: <srai> </srai>を入れます.これらのタグの間にはテキストを入れられます.

Reduce: ワイルドカードの前にある最後の単語を消去して,入力文(パターン)を1単語分だけ短くします.例えば,YOU ARE VERY * は <srai>YOU ARE <star/></srai> に縮められます. 副詞や,その他のなくても構わない単語を削るのに使って下さい.

Clear: テンプレートをクリアします.

 

カテゴリーの調査

"botmaster control" の下に, "explore" とラベルされたリンクが見つかるでしょう. それは,ある知識ウェブ中に存在するカテゴリーを調査するための基礎的な仕組みです. このリンクを,すでに存在するカテゴリーで入力パターンに適合するものを見つけるのに利用して下さい.見つかったカテゴリーは,XMLベースの形式ではなく,内部的なLispベースの形式で表示されます.

 

参考文献

Artificial Intelligence Markup Language (AIML) Version 1.0.1

http://alicebot.org/TR/2001/WD-aiml/

AIML Pattern Matching Simplified - http://alicebot.org/documentation/matching.html

Don't Read Me - http://alicebot.org/articles/wallace/dont.html

AIML 1.0 Tag Sets (July 16, 2001) http://www.alicebot.org/committees/architecture/resolutions/aiml10.html

AIML Primer ― このドキュメントは "現在,執筆中" です.最終更新: 9JAN2002 http://www.alicebot.org/documentation/aiml-primer.html

The Anatomy of ALICE ― 公開中 ― Dr. Richard Wallace at www.alicebot.org から利用可能