![]() | File No.10
辞書の構築 |
| |
辞書をどのように作るかというトピックは,乱数型人工無脳の性能を最も左右する重要なテーマである.いくら優れたシステムを持っていても教育の行き届いていない人工無脳は無表情で通り一遍の返事しかできない.逆に極めてシンプルな構造の人工無脳でも教育が十分であれば驚くようなやり取りができる.そこで今回は良い辞書の設計戦略と教育の指針を探る。百科事典型知識最も初歩的な辞書設計の戦略は,初期の人工無脳に見られた『〜って何?』という質問による知識の獲得である.何?と聞かれれば人間は自然と百科事典に載っているような形式で答える.これはOOPの用語でis-a関係とよばれ,このタイプの知識が蓄積していくと人工無脳は必然的に百科事典存在的になってしまう.そこでユーザは工夫して,ユーザ:おはよう 無脳:おはようって何? ユーザ:おはようございますーと,人工無脳にそう答えてもらいたいような内容を入力することでそれらしい応答を憶えこませてゆく.この方法の利点は人工無脳のキャラクタづけが容易であることであるが、ひとつの人格と会話しているとは到底思えず,短時間で教育に飽きてしまう,ユーザの独り言になる,会話のパターンが読めすぎる,などの問題が指摘されている.しかし百科事典的知識も人間の会話の構成要素ではあるので,is-a関係に特化した知識も補助的に使うことを考えるべきである.人間の会話を考えるとボケがそれに当たる. 実際の人工無脳ではあらかじめ挨拶や相槌などをある程度記憶させておくことで,自然な応答を目指す.その場合学習能力を外してもそれなりに対応ができるようになる.この方法の最も重大な問題点は辞書を作るときに人間がそれほどいろいろ思いつかないという点であると思われる.基本的に人間は,あるシチュエーションに放り込まれてはじめて思考を開始するため,いざエディタに向うと何も思いつかなかったりする. チャットログからの再構成直接的な教育ではあまり面白くないことから,人間同士のチャットのログを用いて辞書を生成する戦略がある.これはn-1番目の文からキーを抽出し,n番目の文を値とするという操作を全文にわたって繰り返すことで辞書を生成する.意外と予想不可能で複雑な反応を示し,自然な会話になりうる.欠点としては複数人の発言を混ぜて使うためにキャラクタの設定が困難であり,語尾の変化などが統一されない.またソースとなるチャットの会話自体が面白くない場合,同様に面白くない人格が出来上がってしまう,必然的に内輪になってしまう,などがあげられる.しかし会話の面白さはその欠点を補って余りある強力さを示す.自動教育型基本的にはチャットログからの再構成であるが,再構成をリアルタイムで行なうことを特徴とする.すなわち人工無脳もチャットに参加しつつ,その場で会話を辞書へと変換している.常に成長を続けるためにうっかりすると巨大な辞書が出来上がってしまう.利点は教育操作が必要なく,何をどのキーで覚えるのかユーザが知らないために意外な答えをする点である.欠点としてはチャットログからの再構成と同様にキャラクタづけが困難な点である. |
| |
以上を踏まえて良い辞書を作るための指針を考えてみよう。 まず設計者がいきなり全辞書を構築するのはつらいので,基本的な挨拶,多少の知識について教えておく。 ↓ その後チャットに張りついた人工無脳として稼動させて,人間同士の会話を含めてログを取る ↓ ログの内容を次のように分類する
人工無脳への質問に対しては設計者が返答を考えて辞書に書きこみ,次回からは答えられるようにする。人同士の会話をそのまま人工無脳で再現できるように辞書に書きこむ。このとき自然な会話を作るため,
などへすりかえるとよい。また文字列の長さ分布が File No.6のFig.1に一致するように工夫すると良い。 ここまでの内容は既存の人工無脳に対して無改造のまますぐに適用できる.人工無脳を改良できるのであれば次のような機能がほしい。 生い立ち 人の性格は,その境遇と切り離して考えることはできない。すなわち映画やギャルゲーで人を感動させるせりふは,それだけを切り離せばなんでもないような言葉でも,キャラクタの背負った世界がにじみ出たときにはじめて破壊力を生み出す。したがって人工無脳にもそういったキャラクタの世界観を語らせるための機構があってもよい.ここでは生い立ちとして,人工無脳が自分の言葉で語る自分の過去を一行ごとにつづって辞書とし,ときどき会話で使用する.生い立ちにはストーリーがあるので,ユーザごとにどこまでしゃべったかをクッキーなどで保存し,だんだん深い内容にはいってゆけるとなお良い. 固有の知識 見ていて面白い個人のホームページには,何かに特化した深い知識や経験が語られていて,それを見て非常に参考になったり,考えさせられたり,また見に来たりする.人工無脳もそのような偏った深い知識を持つべきで,多くは設計者のマニアックな一面をそのまま反映すると思われる. |
| |
タグを使うARISA,カツオやHeartなどはKey,Value1|Value2|Value3| ...というような形式で,ひとつのキーに複数の値を格納して,ランダムにそれを使うことができる.さらに
{好物},{わたし,{T食べ物}好きだよ}
{T食べ物},{ご飯},{ラーメン},{中華料理}
のように再帰的にキーを展開することができ,キーを一種のタグとして用いることが出来る.このタグを効果的に使う方法を考えよう.まずプログラム側でないと展開できない組み込みタグとして,
{user} ユーザ名
{name} 人工無脳の名前
{hour} 現時刻
{min} 分
{sec} 秒
{year} 年
{month} 月
{date} 日
{day} 曜日
{vcond} 人工無脳の体調(仮想環境)
{vweather} 天気(仮想環境)
などが実装されていることを前提とする.このとき時間ごとの返事を"GT"という名前で次のように簡単に記述できる.
こんにちは,{{GT{month}}}
GT01,{一時ですよ.そろそろ佳境ですねぇ},
{うーん.テンション上がってきた−−!}
GT02,{ねむいー}
.
.
.
GT12,{おなかすいたよー.{user}さんは今日なに食べる?}
,{{T食べ物}食べたいよー}
.
GT21,{はぁー疲れたなあ}
.
GT24
同じ考え方で、季節の挨拶,曜日限定の挨拶を記述できる.{vcond}や{vweather}は仮想環境と呼ぶパラメータで,数日単位でゆっくりと変化する値である.{vcond}は体調を表し,元気であれば大きい値となる.{vweather}は人工無脳のいる仮想的な場の天気を乱数で決めてしまうものである.これらが実装されていれば,われわれの生活と同じようなテンポで移ろうレスポンスも記述できる.ランダム性をうまく使えば即興的な文を作り出せる可能性もある.
{Tランダム文},{こんにちは,{T2}}
{T2},{今日はどんなご用ですか},{今日も天気がいいで
すねー,{T3}},{{user}さんって,{T食べ物}すき?}
{T3},{ところで{user}さんのコンピュータのスペックは..}
,{さいきんどこかでかけました?}
というようにタグをつないでゆけば,自由な広がりを感じさせる文を作ることができる.生成する確率を制御するには前述のデッキを使った手法を取り入れれば簡単である.ただし再帰呼び出しといえば Stack Over Flow がつき物である.スタックが深くなりすぎたり,循環しないように注意して辞書を作るか,スタックが深くなりすぎたら適当な言葉や専用のタグで置き換えてしまうなどの処理を忘れてはならない.再帰呼び出しの回数を{vcond}回にするというアイデアを使えば,体調が良いときはたくさんしゃべり,体調が優れなければ無口にできる. {T名前}と{T名前}って,仲いいの? のように二つのタグを使う場合,ある程度関係のある名前を選択する必要があることが,『どこでもいっしょ』や偽春菜で指摘されている.これを実現するには次のように乱数を発生する組み込みタグが必要になる
{T名前グループ1}, ...
{T名前グループ2}, ...
.
.
{T名前グループn}, ...
{T名前グループ{rand1}}と{T名前グループ{rand1}}って仲いいの?
ここでrand1はこの文全域に渡って同じ値でなければならない.かつ{T名前グループn}は毎回違う値でなければならない.
話題を引っ張る人工無脳は全般的に、話題を継続するのが苦手である.すなわちユーザや人工無脳自身が前にしゃべった内容を覚えていないので脈絡が発生しない.これを解決する方法として前述のキューを導入しよう.辞書に組み込まれるキューは次のようなものである.
$story1$ 昔々あるところに、%queue $story2$% $story2$ おじいさんが住んでいました 実際にどのタグがどの程度役に立つのか、追加すべきタグはなにか、またタグや辞書型では対応できない点を明らかにしなければならない.そこで人工無脳D型精霊石をテスト運用した.まだまだ辞書が小さくたいした反応はしないものの、以下のような課題が明らかとなった.
|
|
| D型人工無脳の世界 |