今時の JavaScript で動きそうなELIZA実装は?

このページは 今時の開発環境で動きそうなELIZA実装は? の続編のようなものです。
今回は JavaScript 限定で実装を紹介します。

僕が勝手に信じ込んでるだけなのかもしれないのですが、スマートスピーカー用アプリ(スキルと言うらしい)の主力開発言語はJavaScriptらしいので…もちろん他の言語でもスキルは作れるんだけど、各種のHow toで例示されるのはJSが圧倒的に多い気がしてならないので。勘違い?

…と言うわけで、今時感に溢れるJSで書かれたELIZAを探してみました。実は、最初はgithubで、"ELIZA"で検索してみたら、何ページにも渡って検索結果が出てきて、次に"ELIZA JS"で検索したら25件ヒット。「まだ少し多いな」と思い"ELIZA nodejs"で検索したら9件残りました。で、しらみ潰しにチェックしたのだけど、なんか違う………結局、npmのサイトでELIZAと言う名前で調べた結果、良さげな6つが見つかったという経緯です。

まぁ「似て非なる」モノが山ほど見つかる昨今、昔みたいに気合と根性で探し回る必要が無いのはありがたいんだが、チェックしてるうちに「本当に欲しかったモノは何だったっけ…」となるのが困りもんですね。情報不足と情報過多を比べるとどちらが幸せなんだろうかねぇ?本当に。


調べてみたらベースコードはどれも Norbert Landsteiner の elizabot

…という事で npm に登録されているライブラリとして利用できる ELIZA 実装をピックアップしてみました。

結果はこの3つです。比較してみたら…中身は3つともほとんど Norbert Landsteiner が実装した elizabot のコードでした。

www.masswerk.at

このコードは前回紹介した Charles HaydenEliza test を参考に JavaScript に書き直された ELIZA 実装のようです。 素敵な事に、スクリプトは…

Data Structures (cf: "elizadata.js"):

         elizaInitials ......... Array of initial phrases
         elizaFinals  .......... Array of final phrases
         elizaQuits ............ Array of quit phrases
         elizaPres ............. Array of alternating name value pairs for preprocessing
         elizaPosts ............ Array of alternating name value pairs for postprocessing
         elizaSynons ........... Object of words and their synonyms (as array)
         elizaPostTransforms ... regexp/replacement pairs to be performed as final cleanings
         elizaKeywords ......... Array of keywords with decompositions and reasemblies

         elizaKeywords elements are of:
       
         ["<key>", <rank>,
           [
             [ // first decomposition pattern
               "<decomp>",
               ["<reasmb>", "<reasmb>", "<reasmb>"]
             ],
             [ // second decomposition pattern
               "<decomp>",
               ["<reasmb>", "<reasmb>", "<reasmb>"]
             ]
           ]
         ]

         keywords with higher rank take precedence.
         decompositions are matched in definition order.
         reasemblies are chosen by random or cycled through if the no-random flag ist set.
 
         the special keyword "xnone" holds the rules for default phrases (no match).
         
         decomposition and reasembly syntax follow the "canonical" form:

         decomposition:
           * ... any words (incl. none)
           $ ... (in first position) reassemble for memory only
           @synon ... substitute entry with synononym expression

         reassembly:
           (n) ... insert param of position n (first is "1")
                   positions are any matchings of "*" or "@synon"

         pres, posts, synonyms, keywords, decompositions all in lower case.
         all definitions are optional but at least elizaKeywords should be supplied.
         if no keywords are found `transform()' returns the default string:
         "I am at a loss for words.".

Note:   "elizaPostTransforms" is not a standard ELIZA feature and was included to provide
         a smoothing mechanism for any productions of a bot-to-bot conversation.

Hayden バージョンと同じシンタックスを使います。したがって ELIZA(3)スクリプト ー 応答を作り出す仕掛け で説明したとおりに動きます。ちなみに Eliza Test というページも用意されていて、ELIZA論文に掲載されていた対話事例がステップ実行できるようになってます。

ですが、このコードが実装されたのは 2005 年。 クライアント・サイド JavaScript として実装されており、 一部のコードは HTML に埋め込み型で記述されています。 今では一般的なプログラミング環境として認知されている nodejs は、 登場したのは 2009 年ですから無理もない話なのかもしれません。

そこで、nodojs の作法に合うよう手直しした前述の3つのモジュールが npm に登録されています。 いずれも、ソースコードgithub からダウンロード可能です。

github.com github.com github.com

いずれも原則的には Landsteiner 版のソースに module.exports = ElizaBot; を追加しただけでした。 (もう少し何か拡張しているのかと期待したのだけど…) npm のサイトでの一番人気は、登録が一番早かった elizabot です。 でもこの3つ、優劣が付けられるほどコードの差はありません。


チャットシステムと連携する JS 版 ELIZA 実装

その他、チャットシステムと連携するコードが含まれているパッケージが3つありました。

eliza (for irc)

eliza - npm github.com

これには(懐かしの)インターネット・リレー・チャット(IRC)へのインターフェースが付属しています。

hubot-eliza

hubot-eliza - npm github.com

これは github が公開する hubot にアダプトできる ELIZA です。

snarl-eliza

snarl-eliza - npm github.com

これは ELIZA を Slackプラグイン化するためのコードの模様。

今時 hubot にアダプトできさえすればどんなチャットシステムでも ELIZA が使えるようになるんだろうなぁ… とは思いましたが「今時そんな需要があるんだろうか?」というのが正直なところです。


ELIZAの JavaScript 版実装を整理してみた

冒頭で「似て非なる」と書きましたが、それどころか npm の ELIZA 関連モジュールは「似て同一なるもの」だった、というあまり締まりのない結論に行き着きましたが、 これもありがちな話でしょう。特に僕が引っかかるのは、いずれも DOCTER スクリプトが埋め込み型になっているところ。 これも欧米では ELIZA がクラシカル・ゲームの定番のひとつとなっていて、 スクリプト・エンジンと DOCTER スクリプトが一体で "ELIZA" と認知されているからでしょうか?

僕的な都合ですが「CLI ベースでスクリプトを取っ替え引っ替えして使える」ものが欲しいので、 4番目の「似て同一なるもの」を作ってみました。

github.com

Norbert Landsteiner の elizabot をベースに Tomáš Kafka が行った修正を施し、さらに elizadata.js を JSON フォーマットに書き直した doctor.json を作成しました。 macOSの環境であれば、任意のディレクトリで次の手順を実行すれば簡単に ELIZA が実行できます。あ、nodejs/npm を使ってますので、予めインストールしておいてください。

$ git clone https://github.com/m04uc513/eliza-js.git
$ cd eliza-js/
$ node elizaapp.js doctor.json test
C: Men are all alike.
E: In what way ?
C: They're always bugging us about something or other.
E: Can you think of a specific example ?
C: Well, my boyfriend made me come here.
E: Your boyfriend made you come here ?
C: He says I'm depressed much of the time.
E: I am sorry to hear that you are depressed.
C: It's true. I am unhappy
E: Do you think coming here will help you not to be unhappy ?
C: I need some help, that much seems certain.
E: What would it mean to you if you got some help ?
C: Perhaps I could learn to get along with my mother.
E: Tell me more about your family.
C: My mother takes care of me.
E: Who else in your family takes care of you ?
C: My father.
E: Your father ?
C: You are like my father in some ways.
E: What resemblence do you see ?
C: You are not very aggressive but I think you don't want me to notice that.
E: What makes you think I am not very aggressive ?
C: You don't argue with me.
E: Why do you think I don't argue with you ?
C: You are afraid of me.
E: Does it please you to believe I am afraid of you ?
C: My father is afraid of everybody.
E: What else comes to your mind when you think of your father ?
C: Bullies.
E: Does that have anything to do with the fact that your boyfriend made you come here ?
$

このプログラムは CLI で、実行方法は ELIZA(3)スクリプト ー 応答を作り出す仕掛け で紹介した Java 版に合わせてあります。doctor.json は Landsteiner の elizadata.js の記述をできるだけ修正しないようにして、 JSON フォーマットに書き換えたので、(JSONはコメントを付けれない事もあって)ちょっと見づらいです。 また Landsteiner の elizabot.js のコードは ELIZA 特有のパターンマッチング処理が読みづらい。 このあたりは、今後修正したいと考えています。

ともあれ…

これで望みの JavaScript 実装が手に入ったので先に進めます(笑)

以上

ELIZA開発の背景は?

ここしばらくコードを使ったページが続いたので、久々にウンチク系の内容で。

精神分析医シミュレーターで有名になった ELIZA。そこには Weizenbaum の巧妙な戦略が隠されていた…と言うことは既に紹介しました。 では、この巧みな戦略を Weizenbaum は最初から意図していたのか?と問うのがこのページのお題です。 彼のキャリアを振り返れば「タフで聡明で博識な Weizenbaum のこと、全ては計算づくで…」と考えたくなるところですが、 実際には さにあらず だったようです。


"Islands in the Cyberstream"

実は、この話題にピッタリ来る書籍が刊行されています。 Weizenbaum が最晩年にインタビュアーのガナ・ウェンド(Gunna Wendt)に語ったインタビューを収録した本です。 Weizenbaum が亡くなる2年前の 2006 年にドイツで出版されました。

www.perlentaucher.de

こちらがドイツ語による原書です。その後、2015 年に Benjamin Fasching-Gray の手で英語に翻訳されました。

litwinbooks.com

上記は英語の翻訳版。原題では "Wo sind sie, die Inseln der Vernunft im Cyberstrom?("Where are they, the islands of reason in cyberstream?":『彼らはどこへ?:サイバーストリームの中の理性の島』)なのですが、本当に "Wo sind sie" はどこに行っちゃったんでしょうねぇ?

この本での Weizenbaum はインタビューという形にも助けられて「なんでも話しちゃう」といった感じのリラックスした語り口で、彼の名著の "Computer Power and Human Reason"とは対局的な印象を僕は持ちました。この本の本編は、のちほど "Computer Power and Human Reason" の紹介の際に触れるつもりですので、ここでは ELIZA の開発に直接関わるトピックのみを紹介します。


ELIZA の開発の動機は?

同書の "ELIZA Today" では、インタビュアーが Weizenbaum に “Eliza,” と話を向けると、その開発に至った経緯と当初の開発目的を語っています。

That's right. In 1963 MIT invited me to be a guest professor, at first for just a year. It turned out to be, as you know, for decades. In the same year, 1963, we developed a time sharing system at the institute so that several people could use a computer simultaneously. Today that is taken for granted, back then it was new. Instead of using a computer indirectly with the punch cards that were normal back then, we could make direct contact to the computer with the help of a typewriter. Programs that answered questions were needed. My contribution was “Eliza,” a program that the user could converse with in “natural language,” in this case English.

そのとおり。 1963年にMITは私を客員教授に招待しました。最初はたった1年です。ご存知のように、それは何十年も続きましたが。同じ年の1963年に、我々は研究所でタイムシェアリング・システムを開発しましたが、それは数人の人々が同時にコンピュータを使うことができました。今日では当たり前のことと考えられてますが、当時は新しいものでした。当時、一般的だったパンチカードを使ってコンピュータを間接的に使用する代わりに、タイプライターを使ってコンピュータに直接接続することもできました。(我々は)質問に答えるプログラムが必要でした。私の貢献が「Eliza」でした。ユーザーが「自然言語」(この場合は英語)で会話できるプログラムでした。

つまり ELIZA は当初、タイムシェアリング・システムのデモンストレーションのためのアプリケーションとして考えられたと言うのです。 この『タイムシェアリング・システム』とは Multics の事ですと書くと色めき立つ方々が何人もいるかとは思いますが…

元々General Electric(GE)でコンピュータ開発に従事していた Weizenbaum を MIT に招聘したのは Project MAC でした。その経緯は次のように紹介されています。

Project MAC began with a 6-week Summer Study in July and August 1963, exposing 57 visiting researchers from universities, government, and industry to the MIT Computation Center's CTSS time-sharing system, which ran on an IBM 7090 modified with hardware RPQs. The Summer Study was suggested to Prof. Fano by Licklider.
*snip*
Several people from the Summer Study were recruited to permanent positions at Project MAC, such as Ted Glaser, Bob Graham, and Joe Weizenbaum.

Project MACは、1963年7月と8月に6週間のサマー・スタディを行い、ハードウェアが改造されたIBM 7090で実行されるMIT計算センターのCTSSタイムシェアリングシステムが大学、政府機関、産業界から57人の訪問研究者に披露されました。このサマー・スタディJ. C. R. LickliderRobert Fano教授に提案されたものでした。
(中略)
サマー・スタディからの何人か(Ted Glaser、Bob Graham、Joe Weizenbaumなど)が、Project MAC の常任職に採用されました。

したがって Weizenbaum は本来、Multics やその開発ツールを開発するグループに所属していました。ちなみに Weizenbaum は Multics の開発においても決定的な役割を果たしたことが Multics Historyの "2.1.3. Selection of Hardware Vendor" で紹介されています。

MAC senior staff visited computer hardware vendors in 1963 and 1964, and the Multics specifications were developed and sent out to bid.

From fall 1963 until April 1964 four of us (Corbató, Edward L. Glaser, Robert Graham and I (dennis)) visited the principal main-frame computer vendors (IBM, RCA, Sperry/Rand, Burroughs, GE, Philco, CDC, Cray -- known in those days as "Snow White and the Seven Dwarfs") to see which of them had the ideas and resources to work with Project MAC to build hardware for the Multics system. When we visited GE in Phoenix, met John Couleur and learned about the GE-635, we were very much impressed. That led to the selection of GE (much to the chagrin of IBM, who desperately attempted to change our decision) and the collaboration of John Couleur with Ted Glaser to specify the GE 645 system for Multics.

When it came time to select a vendor for the computer that would support the new OS, the folklore is that IBM pitched the machine that would become the 360/65. They were not interested in the MAC team's ideas on paging and segmentation. Professor Joseph Weizenbaum, then a lecturer at MIT, introduced the MAC team to former colleagues of his from General Electric Phoenix, who were receptive and enthusiastic, and proposed what became the GE-645. DEC also responded to the bid. The GE proposal was chosen in May 1964 (much to the surprise and chagrin of IBM) and the contract signed in August 1964.

MACシニアスタッフは1963年と1964年にコンピューター・ハードウェア・ベンダーを訪問し、Multics仕様が開発され入札に出されました。

1963年の秋から1964年4月まで、私達4人(Corbató, Edward L. Glaser, Robert Graham, Jack Dennis)は主要なメインフレームのコンピュータベンダー(IBM, RCA, Sperry/Rand, Burroughs、GE, Philco, CDC, Cray -- 当時「白雪姫と7人の小人」として知られていましたが)、Multicsシステム用のハードウェアを構築するためにProject MACと連携するためのアイデアとリソースがどれにあるかがわかります。Phoenix で GE を訪問し、John Couleur に会い、GE-635について学んだとき、私たちは非常に感銘を受けました。それが(私たちの決断を変えようと必死に試みたIBMには悔しい)GEの選択と、Multics用のGE 645システムを指定するための John Couleur と Ted Glaser の共同作業につながりました。

新しいOSをサポートするコンピュータのベンダーを選択する時が来たとき、IBMが360/65になるマシンを売り込んだことが伝説になっています。彼らは、ページングとセグメンテーションに関するMACチームのアイデアには興味がありませんでした。当時MITの客員教授をしていた Joseph Weizenbaum は、General Electric, Phoenix の元同僚にMACチームを紹介し、GE-645にすることを提案しました。 DECも入札に応じました。1964年5月に(IBMは驚きと悔しさがりましたが) GEの提案が選択され、1964年8月に契約が調印されました。

それまで大型コンピュータといえば IBM 一辺倒だった MIT が Multics の開発では唐突に GE(後にHoneywell になりますが)を採用した裏には、実は Weizenbaum が関わっていました。

上記では「伝説」として語られている IBM の System/360 ですが、従来の(銀行や政府機関で使われる)事務処理系コンピュータと(MIT がお得意様だった)科学技術計算系コンピュータを統合したメインフレーム(日本語では汎用と訳されますが)の構想を打ち出した画期的で野心的な製品コンセプトで知られています。当のIBMにとっては従来製品からの継続性を捨てて新アーキテクチュアへの移行を推し進める、文字通りの社運をかけた試みでした。一方、それまでMITで使用されていたIBM製品には個別依頼によるハードウェアの改造が施されていました。実験的なタイムシェアリングを搭載していた CTSS は仮想記憶を実現するためのハードウェア追加が必要だったからです。IBMもMITも両者が望むハードウェア構成が商品の標準仕様となることを望んでいたのは間違いありません。が、望む仕様が違っていた。両者とも妥協できないまま、Multics 向けのコンピュータ・ハードウェアの交渉は平行線のままでした。効率性重視で個別対応を極力排除したいIBMは「ハードウェアを提供する自社が交渉で優位である」と考えており、強気の姿勢を崩さず「最終的にはMITが折れてくる」とタカをくくっていました。

新シリーズの製品ラインナップは1964年4月に発表されたのですが、直後の8月の MIT の Multics マシンの選定では外された訳ですから、文字どおり「いきなりズッコケた」ことになります。更に11月には AT&T のベル研が Multics の開発に参加することを表明し、翌年の1965年11月に Multics の開発計画の全貌を明らかにする6本の論文が発表された頃には、IBM はパニック状態に追い込まれていました。と言うのも、それまで MIT 周辺だけで例外的に使われていた CTSS によるタイムシェアリング・システムが大型コンピュータのプロダクトとして商業化され、しかも最大のライバルであった GE の製品になって出てくる…IBM にとってこれ以上の悪夢は無いわけで、主力製品に育てる予定だった System/360 には当初タイムシェアリング機能を搭載する計画が無かったことも相まって、ここに IBM の狂乱の60年代が始まります。

つまり、Weizenbaum は当時の IBM を地獄に叩き込んだ男でもあり………余談が過ぎました。 *1


どんな対話プログラムが求められたのか?

上記の Weizenbaum の発言からは、そもそも「タイムシェアリング」自体が画期的だったように感じられます。 例えば、1961年に MIT リンカーン研究所の Bert F. Green, Jr. が書いた論文 "BASEBALL: AN AUTOMATIC QUESTION-ANSWERER" の要約は次のような内容でした。

Baseball is a computer program that answers questions phrased in ordinary English about stored data. The program reads the question from punched cards. After the words and idioms are looked up in a dictionary, the phrase structure and other syntactic facts are determined for a content analysis, which lists attribute-value pairs specifying the information given and the information requested. The requested information is then extracted from the data matching the specifications, and any necessary processing is done. Finally, the answer is printed. The program's present context is baseball games; it answers such questions as "Where did each team play on July 7?"

Baseball は保存されたデータについて普通の英語での質問に答えるコンピューターです。プログラムはパンチカードから質問を読みます。単語と慣用句は辞書の中にあり、句構造やその他の構文上の事実により内容分析が判断され、属性値ペアにリストされます。その後、要求された情報が仕様に一致するデータから抽出され、必要な処理が行われ、最後に答えが印刷されます。プログラムの現在の状況は野球の試合で「各チームは7月7日に何をしましたか?」といった質問に答えます。

この Baseball自然言語処理技術を応用した質疑応答システム研究の草分け的研究事例です。「各チームは7月7日に何をしましたか?」といった問いに答える…今日でも十分にビジネスになりそうなアイデアなんですが、その利用法はと言うと「質問をパンチカードに打ち込み、それをオペレータに渡して待ち行列に並び、プリントアウトされた出力結果を見る」と言う対話性のカケラもないプログラムだったようです。どこからか「それじゃぁ、スポーツ新聞を買ったほうが早いんじゃないの?」って声が聞こえてきそうなくらい。1960年代(日本では1970年代でも)のコンピューティングの現実はこんなものだったのです。それが常識だった時代ですから、当時ターミナルを介してコンピュータと直接会話することができるタイムシェアリングはそれ自体が画期的な技術だった訳です。


リスト処理用プログラミング言語 SLIP

デモンストレーションの重点は「コンピュータとの対話」にあった訳ですから「対話相手」は Weizenbaum が好きに選べたのだと僕は想像しています。 もし彼が通信やコンピュータ・ネットワークの専門家であれば IRC のような人間同士が対話するツールを開発したのではないでしょうか? しかし、彼は自然言語処理の技術を応用したプログラムを作成しました。その理由のひとつは彼がリスト処理を行うプログラミング言語の専門家だったから。 彼が GE 時代の 1963年に投稿した論文 "Symmetric List Processor" の要約では、SLIP について次のように説明しています。

A list processing system in which each list cell contains both a forward and a backward link as well as a datum is described. This system is intended for imbedding in higher level languages capable of calling functions and subroutines coded in machine language. The presentation is in the form of FORTRAN programs depending on only a limited set of "primitive" machine language subroutines which are also defined. Finally, a set of field, particularly character, manipulation primitives are given to round out the system.

各リストセルが順方向リンクおよび逆方向リンクの両方ならびにデータを含むリスト処理システムについて説明します。このシステムは、機械語でコーディングされた関数やサブルーチンを呼び出すことができる高水準言語への組み込みを目的としています。プレゼンテーションは、同様に定義されている「原始的な」機械語サブルーチンの限られたセットのみに依存するFORTRANプログラムの形式です。最後に、一連のフィールド、特に文字操作プリミティブがシステムを完成させるために与えられます。

SLIP は様々な高水準言語でリスト処理を可能にするための拡張機能だったようです。*2この論文では FORTRAN に対する拡張が説明されていますが、ELIZA の開発ではMichigan Algorithm Decoder(MAD))を拡張したバージョンが用いられました。 MADはミシガン大学が開発したALGOL風?コンパイラです。

また、ELIZA論文の参考文献の一番最後にコッソリ書かれている COMIT。本文でも全くコメントされてないのですが、実はこれがリスト処理プログラミング言語の元祖だったとは調べてみるまで僕も全く気づきませんでした。COMITVictor Yngve機械翻訳のために開発したプログラミング言語だそうです。Weizenbaumが引用している文献は見つけれらませんでしたが、その概要が記された次の論文が見つかりました。

"A Programming Language for Mechanical Translation"

COMIT はコンピュータを使った数値計算以外を主な処理対象とする初めてのプログラミング言語とか。その主要課題が機械翻訳、それも英語ーロシア語の翻訳だった事には時代を感じさせますよね。と言うのも、1950年代はケネディが大統領になる以前の冷戦が最もヒートアップしていた頃ですから、この研究領域が注目された背景として国防関係者の中ではロシア語が堪能な翻訳家が不足していた事が容易に想像できます。

ちなみに次のドキュメントでは COMITIPL-VLISP 1.5)、 SLIP) のリスト処理のための当時の4つの主要プログラミング言語が比較されています。

www.rand.org

いずれも IBM 700/7000 シリーズで動くリスト処理用プログラミング言語で、 SLIPを除く3つは概ね 1957年前後、ダートマス会議の直後には登場していたようです。 主に自然言語処理のための開発ツールであったようで、いわゆる記号処理的AI研究の勃興期の成果と説明すべきでしょうか?

話題を元に戻して…SLIPは他の言語に比べると幾分登場が遅れていました。 既存の数値計算を主目的としたプログラミング言語FORTRAN、ALGOL派生など)にリスト処理機能を拡張するアドオン方式の処理系だったようです。 上記の GE 在籍時の論文のあと 1964 年の MIT のクレジット入りの論文 "SLIP" で処理系に関する研究は終結したと思われます。 一般的なプログラミング言語の研究の常として、処理系実装が終了した後は、その言語の実用性を評価するためのアプリケーション作成へと研究は移行します。 Weizenbaum の対話するプログラムが「SLIP による自然言語処理アプリケーション」となったのは割と自然な流れなんじゃないかと思います。


自然言語処理による対話プログラム

自然言語処理アプリケーション」となると Weizenbaum の身近なところに好例がありました。 ELIZA論文でもコメントされている Daniel G. Bobrow の次の学位論文です。

dspace.mit.edu

このプログラムも Peter Norvig の名著 "Paradigms of AI Programming: Case Studies in Common Lisp" (邦題『実用 Common Lisp』)の7章 "STUDENT: Solving Algebra Word Problems" では、実装ベースで解説されています。

github.com

以下のように Norvig は STUDENT が ELIZA よりも洗練されているとコメントしています。

STUDENT could correctly reply that the number of customers is 162 . To do this, STUDENT must be far more sophisticated than ELIZA; it must process and "understand" a great deal of the input, rather than just concentrate on a few key words. And it must compute a response, rather than just fill in blanks. However, we shall see that the STUDENT program uses little more than the pattern-matching techniques of ELIZA to translate the input into a set of algebraic equations. From there, it must know enough algebra to solve the equations, but that is not very difficult.

STUDENTは、顧客数が162であることを正しく返信できました。これを行うには、STUDENTはELIZAよりはるかに洗練されていなければなりません。単にいくつかのキーワードに集中するのではなく、大量の入力を処理して「理解する」必要があります。また、単に空白を埋めるのではなく、応答を計算する必要があります。しかし、STUDENTプログラムでは、入力を代数方程式のセットに変換するのに、ELIZAのパターンマッチング技術以外にはほとんど使われていないことがわかります。そこから、方程式を解くのに十分な代数を知っている必要がありますが、それはそれほど難しいことではありません。

このコメントを読んでいると STUDENT は ELIZA よりも後に開発されたかの印象を持ちます。が、それは Norvig の本の章割りの都合で、実際には STUDENT の博士号論文が提出されたのは 1964 年、ELIZA 論文は 1966 年に発表されてますので、STUDENT の方が先に完成していたはずです。当時の Weizenbaum は客員教授で学生である Bobrow の指導には関わってなかったようですし、両者で共著の論文や報告書が複数見つかっている事から、二人は親しかったのではないかと推測できます。おそらく Bobrow の開発のプロセスを間近で見ていた Weizenbaum は、当時最先端だった STUDENT のアプローチを踏襲し、それに匹敵するような(あるいは超えるような)周囲をアッと言わせるプログラムを書きたいと考えたのかもしれません。


精神医学的インタビュー

STUDENT が「高校数学の文章題」という大学進学者が誰でも経験する身近なテーマで自然言語処理を実演してみせたところにWeizenbaumはインスパイアされたのでしょう。 ELIZAにおける「精神医学的インタビュー」は同じような位置付けだったように僕は思います。

前述のインタビューに戻りますが、インタビュアーの「なぜそのような難しい研究課題を選んだのですか?」との質問に答えてWeizenbaumは次のように述べています。

It wasn’t that difficult. If you look at the structure of a therapeutic session, for example Carl Rogers’ approach, you will recognize that it works like a kind of echo. The patient says something about his or herself, and the therapist then — maybe not right away in the very next question, but then in one of the following questions — picks it up and uses it as his or her own contribution to the discussion.

The trick is that “Eliza” assumes that the conversation partner will interpret the signals that it delivers according to the background of her or his own situation and needs — just as it happens in conversations between people.

それほど難しいことではありませんでした。 Carl Rogers のアプローチなど、治療セッションの構造を見ると、一種のおうむ返しのように機能することがわかります。 患者は自分自身について何かを言い、そしてその後セラピストは(次の質問ではすぐにではなく、次の質問のいずれかで)それを拾い上げて、彼または彼女の自身議論への貢献としてそれを使います。

トリックは「ELIZA」が(人間の間での会話でも起こるように)会話相手が自分の状況やニーズの背景に応じて送るシグナルを解釈することを前提としていることです。

この返答を聞くと 前々回前回 のページで紹介したスクリプト・エンジンの機能が用意された理由がよくわかります。 それから、Weizenbaum は以前 クライアント中心療法のページ で紹介した Carl Rogers が制作したセラピーの記録映像(特に1950年代に制作された)の幾つかを見ていたのではないかとも思います。 Rogers の対話手法を注意深く観察した Weizenbaum は、それを簡略化したロジックを ELIZA に組み入れたのではないかと思えてなりません。


まとめ

今日では ELIZA も STUDENT も記号処理的AIの古典的な研究成果に数えられていますが、 両者とも非常に上手に機能するのは問題の切り取り方の上手さによるものだと思います。 1つは人工知能という技術に不慣れな人々を十分に意識して出来るだけ身近なテーマを取り上げること、 もう一つは対面する人間(STUDENTの場合は問題文章を考えた人になるのかも知れませんが) に起因する不確定な要素を上手に使って機械が作り出す応答に人間味を演出すること、 が挙げられるように思います。 そのあたりが、当時の人たちとは違い Chatbot に慣れた我々をも驚かせる理由のような気がします。

ともあれ…

Multics のタイムシェアリングをアピールするために生まれた(はずの)対話システム ELIZA は、その役割は十二分に果たしました。 学科長で Project Mac の責任者でもあった Robert Fano は Weizenbaum の対話システムがお気に入りで、 次のように Project Mac の代表的な研究成果としてアピールをして回りました。

multicians.org

ちなみにこのプレゼンテーションで紹介されている対話例は ELIZA では無いようですが…

ELIZA の成功がここまでであれば、それは Weizenbaum の想定内の出来事で、その後の彼の人生はもっと穏やかなものになったのでしょう。 が、実際には ELIZA は彼の想像をはるかに超えて多くの人々にインパクトを与えてしまったのです。 その話は次回…書くつもりです。

以上

*1:この続きは僕が執筆を公言しているもうひとつの書籍『Multicsの謎』に書く事になると思います。

*2:今日ではC++のテンプレートである GNU gslip が使えるようです。

ELIZA本の草稿を公開します

これは告知文です。

昨年からあちらこちらで僕が公言していたELIZA本ですが、その草稿をブログの形で公開することになりました。 取り敢えずはまとめて6本。実は既に公開していたのですが、以下の6本を書き溜めるまで告知は控えました。

まぁ、単行本1冊となると60本ぐらいは必要なので、6本で1セットして10セット。 まだまだ先は長そうです。

1月の勉強会に参加した方々、大変お待たせしました。当日の僕の講演内容は1番目の記事にまとまってます。 実は、勉強会の翌日に担当編集と相談して、当初考えていた執筆スタイルやアプローチを変更することになりました。 もちろんテーマに変更はないんですが、進め方は今時の現実に添わせたほうがよかろうと考えた訳です。

一番大きな理由は、昨年のうちに何度か草稿は描いてみたのですが、あんまり良い文章が書けてないと思ってたこと。 昨年は、さまざまな批判を受けながらも、僕自身はELIZAにこだわり執拗に追い続けていて、膨大な情報を集められたのですが、いざ書いてみるとイマイチ。 さまざまなトピックを一度に一気に扱おうとすると、散漫な内容になってしまって、自分で書いたのに薄っぺらい感じがしてしまうのです。 担当編集が言うには「月間連載スタイルでないと書けないのでは?」とのこと。 確かに『Unix考古学』の時に毎月6〜10ページの鉄の締め切りの枠組みの中で執筆してた訳で、 ある種のインターバル・トレーニング状態にしないと僕は個々のトピックに集中できないことは否めません。 が、今時、今回の執筆に都合の良い情報系月刊誌はないので「だったら、ブログとして書いちゃえ」と言うことになりました。


次の理由は今時では ELIZA そのものに請求力があるように感じられなかったこと。 もちろん僕が選ぶ執筆テーマはもとより「おっさんホイホイ」なのですが、 第1次AIブームでもっとも知名度の高い成果である ELIZA に注目が集まらないのは何故なのか?みたいな話です。

まぁ、今のAIブームはディープ・ラーニング1点ばりで状況が推移していることもあります。
また、今のエンジニア諸君の多くはエンジニアリングそのものにばかり目がいって、その背景が見えなくなってる印象もあります。 でも、ディープラーニングだって2006年に唐突に登場した訳ではないんだけどねぇ。 そして何よりも、執筆内容と今時の先端技術開発との接点が明確に説明できないとその重要性が理解されないこと。

と、まぁ「多くに読んでもらうためには、何が不足してるのか?」を考えた訳です。 そこで、『Unix考古学』よりもトピックの守備範囲を広げて執筆することにしました。 幸運にも、今、僕はスマートスピーカーをやっているので、今時感のある教養の本という目標に転換することにしました。 いざ転換してみると、意外にも書きたくなるようなワクワクするネタが思いつくようになるのは不思議です。


今のところ、60本書けたら書籍化への作業に移行するつもりでいます。 ここで公開した草稿はそのまま使うことになる…はずなんですが、 『Unix考古学』の時も単行本化の際に膨大な量を書き足し、既存の原稿にも手を入れて、 書籍の3分の2ぐらいは新しくなったので「草稿をそのまま使う」とは断言しません。

ともあれ…

2月の頭から取り掛かって、9週間で6本書けました。 「当初の予想よりは頑張ったかな?」 が正直な感想なんですが、もう少しペースをあげないとねぇ… 集めていた資料を読み返すとさらに脱線したくなる癖をなんとかせねば。

今後ともよろしくお願いします。

PS パスタくん、準備はできた。勉強会をやろう!!

ELIZA(4)DOCTOR スクリプト

またまた間が開いてしまいましたが・・・

前回のページでは ELIZA のスクリプトの記法を紹介しながらスクリプト・エンジンの動作を追っかけてみましたが、このページでは(かの有名な) DOCTOR スクリプトの振る舞いを追っかけてみたいと思います。ELIZA(1)のページでも紹介したようにこのスクリプトは「精神分析医を模倣した傾聴的振る舞いをする」ことで知られていますが、実はここにELIZAの心理学的トリックが仕込まれていました。 少し長くなりますが、このトリックについて Weizenbaum は論文の Discussion の項で次のように述べています。

At this writing, the only serious ELIZA scripts which exist are some which cause ELIZA to respond roughly as would certain psychotherapists (Rogerians). ELIZA performs best when its human correspondent is initially instructed to "talk" to it, via the typewriter of course, just as one would to a psychiatrist. This mode of conversation was chosen because the psychiatric interview is one of the few examples of categorized dyadic natural language communication in which one of the participating pair is free to assume the pose of knowing almost nothing of the real world. If, for example, one were to tell a psychiatrist "I went for a long boat ride" and he responded "Tell me about boats", one would not assume that he knew nothing about boats, but that he had some purpose in so directing the subsequent conversation. It is important to note that this assumption is one made by the speaker. Whether it is realistic or not is art altogether separate question. In any case, it has a crucial psychological utility in that it serves the speaker to maintain his sense of being heard and understood. The Speaker further defends his impression (which even in real life may be illusory) by attributing to his conversation partner all sorts of background knowledge, insights and reasoning ability. But again, these are the speaker's contribution to the conversation. They manifest themselves inferentially in the interpretations he makes of the offered responses. From the purely technical programming point of view then, the psychiatric interview form of an ELIZA script has the advantage that it eliminates the need of storing explicit information about the real world.

これを書いている時点で、存在する唯一の真面目なELIZAスクリプトは ELIZA にロジャー派の心理療法士が行うインタビューとよく似た反応をさせるものです。ELIZA はタイプライターを介して、その人間の対話者が初めて精神科医に行うのと同じように、それに「話しかける」ように初めて指示されたときに最も効果的な対話をします。精神学的なインタビューは参加しているペアのうちのひとりが、現実の世界についてほとんど何も知らないという態度をとることができるという2者間の自然言語コミュニケーションの数少ない事例の1つであることから、この会話モードが選択されました。例えば、ある人が精神科医に「私は長いボートに乗りました」と言った場合に「ボートについて教えてください」と答えたとしても、彼がボートについて何も知らなかったとは思わないでしょう。彼がその後の会話を促すという目的を持っていると仮定できます。この仮定が対話者によってなされたものであることに注意することが大事です。それが現実的であるかどうかはまったく別の問題で、いずれにせよ、「それが対話者に聞いてもらえて理解されている」という感覚を維持するために役立つという点で重大な心理的な有用性があります。さらに対話者は、会話相手にあらゆる背景知識、洞察力および推論能力を動員することによって(実際の生活においても幻想的であるかもしれない)彼の印象を守ります。これらもまた対話者の対話への貢献です。提示された回答について彼が行った解釈の中で推論として現れています。また(メモリの記憶容量が小さかったという)当時のプログラミングの技術的な観点からみても、ELIZAスクリプトの精神医学的インタビューの形式が実社会に関する明示的な情報を格納する必要がないという利点も持っています。

ここで述べられているように、そもそも「精神医学的インタビュー」という形式こそが ELIZA の傾聴能力を実現するための最初のトリックだったという訳です。そこで実際の DOCTOR スクリプトをステップ・バイ・ステップで追っかけて、ELIZA の心理学的トリックの詳細を明らかにしようというのが、このページのテーマです。


ELIZAの応答メッセージの生成手順のおさらい

前回のページで説明した ELIZA の応答メッセージの作り方をおさらいしましょう。 ELIZAは対話相手である人間が直前に入力した文だけを使って応答メッセージを生成し、それは次の7つの手順を取ると説明したました。

  タグ 説明
  入力文をスペースで区切られた単語に分割(いわゆる形態素解析)を行う。
pre 入力文に対し一連の事前の文字列置き換えを行う。
key 入力文の全ての単語を走査しキーワードリストを作成し、以降はキーワード毎に処理を行う。
decomp 与えられたキーワードに対し分解パターン(decomposition pattern)をマッチさせ、最初に一致した要素を選択する。
assemble 分解パターンに対応する再構成パターン(reassembly pattern)を選択する。
post 生成された応答文に対し一連の事後の文字列置き換えを行う。
  応答文を出力する。

ELIZAとの会話の追跡ではそのうちの5つのステップをトレースすることにします。 応答メッセージ生成処理は2、3、4が中核で、各々キーワード、分解パターン、複数の再構成パターンが表示します。 1では、2あるいは3が上手く機能するように入力メッセージを部分的に書き換える処理を行なっています。 5では、入力メッセージの4の再構成パターンから合成した応答メッセージに主に人称を変更をする書き換えを行なっています。 また PUSH/POP のタグは前回も説明したELIZAのメッセージを記録しておく機構が動いていることを意味します。 一連のメッセージ書き換えを手順にしたがって追えるので ELIZA が比較的簡単な方法で応答メッセージを生成していることがよくわかります。

以上、スクリプトの技術的な側面は一通り説明しましたが、 せっかくなのでスクリプトの会話的な側面(心理学的側面?)についても考えてみます。 人間どおしのマンツーマンで行う会話をちょっと想像してみてください。 実際、誰かと話をしている時は「相手の発言にどのように返答するか?」を考えながら会話をしますよね? 多くの場合、挨拶などの決まり切ったやりとりや会話の相手との間で自明なことについてはあまり考えずに即座に返答することができます。 ですが、初対面の人や非常にシリアスな会話(例えば、悩みの相談に乗るとか…)の場合、返事の言葉を選んだりします。 会話相手を傷つけないような言葉を選んだり、相手に忖度したり、あるいは自分の思いや意見を率直に述べたり… 会話は案外頭を使う作業であることが多いし、考えても良い返事を思いつかないことがママあります。

ELIZAの応答メッセージの生成とは、この返事を考えるプロセスをコンピュータにシミュレートさせているとも言えます。 でも実際に ELIZA が返事そのものを考えている訳ではなくて「こういうキーワードが発言されたら、このような返事を返す」式のQ&A集をスクリプトに記述してます。 なので、返事を考えているのはスクリプトを書いた人で、ELIZAはそれを適切に選んで表示しているだけです。これが ELIZA が人工無脳と呼ばれている理由です。 ここではスクリプトを書く人になったつもりで、相手からこういう言葉を聞いた時に相手は何を考えているか想像しながら、 ELIZA のスクリプト(DOCTOR)が用意している応答メッセージを意味的にもチェックしてみます。


ELIZA論文の対話例で追っかけてみる

…と言うことで、ELIZAプログラムにちょっと細工をして、論文に掲載されている対話例を実行してみました。

さらに、実行ログにはメッセージ生成の追跡に役立つ情報を手作業で挿入しました。 入力メッセージには行の先頭に ">>>" を、出力メッセージには行の先頭に "<<<" を表示するようにしました。 "---" で始まる日本語文は例によって Google 翻訳の結果を後で挿入しました。 生成の過程が追いやすいように、assembleでは定義されている全パターンを挿入しています。ELIZAが選択したパターンは行の先頭を '>' でマークしています。 また類義語を参照しているところでは synon のワードリストも挿入しました。

では、ステップ・バイ・ステップで見ていきましょう。


--- こんにちは
>>> Hello.
      pre: hello
      key: hello
   decomp: *
>assemble: How do you do.  Please state your problem.
 assemble: Hi.  What seems to be your problem ?
     post: How do you do.  Please state your problem.
<<< How do you do.  Please state your problem.
--- ごきげんよう。あなたの問題を述べてください。

これは挨拶のような慣用表現に対して決まり切った応答を返す例です。 技術的には decomp は '*' で素通して、assemble を複数用意するELIZA スクリプトの記述の基本形でもあります。 応答メッセージを複数用意しておくと ELIZA は順繰りに(ラウンドロビンで)選択してくれるので、対話者の決まり切ってる感を多少和らげてくれます。

会話的には、この例では2つしか定義されてませんが、会話中になんども Hello という人間はいない訳で…


--- 男性はみんな似ている。
>>> Men are all alike.
      pre: men are all alike
      key: alike
   decomp: *
>assemble: In what way ?
 assemble: What resemblance do you see ?
 assemble: What does that similarity suggest to you ?
 assemble: What other connections do you see ?
 assemble: What do you suppose that resemblance means ?
 assemble: What is the connection, do you suppose ?
 assemble: Could there really be some connection ?
 assemble: How ?
     post: In what way ?
<<< In what way ?
--- どのように?

これも基本形の記述です。技術的には前項と同じ。

会話的にはキーワード 'alike'(同様の)に対する応答メッセージがたくさん並んでます。

* どうやって?(In what way ?)
* どのような類似性がありますか?
* その類似性はあなたに何を示唆していますか?
* 他にどのようなつながりがありますか?
* 似ているとはどういう意味ですか?
* その関係は何だとあなたは思いますか?
* 本当に何らかの関係があるのでしょうか?
* どうやって ?(How ?)

いずれも alike の状態について具体的な説明を促すメッセージに見えます。 もちろん精神医学的なインタビューを想定しているから返せる応答ではありますが…


--- 彼らはいつも何か他のものについて私たちを悩ませています。
>>> They're always bugging us about something or other.
      pre: they're always bugging us about something or other
      key: always
   decomp: *
>assemble: Can you think of a specific example ?
 assemble: When ?
 assemble: What incident are you thinking of ?
 assemble: Really, always ?
     post: Can you think of a specific example ?
<<< Can you think of a specific example ?
--- 特定の例を考えていただけますか。

これまた基本形の記述です。技術的には前項と同じ。

会話的にはキーワード 'always' (いつも、いつでも)から想定できる応答メッセージになっています。

* あなたは特定の例を考えることができますか?
* いつ?
* あなたはどんな出来事を考えていますか?
* 本当にいつでも?

対話者には、肯定的にいつも(always)繰り返される出来事について説明を求めている応答メッセージと 懐疑的に「本当にいつでも?」と認識の確かさを問い返す応答メッセージが定義されています。 傾聴のルールでは対話者には肯定的に反応することが原則ですが、 敢えて懐疑的に反応させるケースを挿入するのは、 その方が人間が応対しているような印象を与えやすいという事でしょうか?


--- はい、私のボーイフレンドが私をここに来させました。
>>> Well, my boyfriend made me come here.
      pre: well
      pre: my boyfriend made me come here
      key: my
   decomp: $* my *
 assemble: Lets discuss further why your (2).
 assemble: Earlier you said your (2).
>assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: But your boyfriend made you come here .
   decomp: * my *
>assemble: Your (2) ?
 assemble: Why do you say your (2) ?
 assemble: Does that suggest anything else which belongs to you ?
 assemble: Is it important that your (2) ?
     post: Your boyfriend made you come here  ?
<<< Your boyfriend made you come here  ?
--- あなたのボーイフレンドがあなたをここに来させましたか?

技術的には、これはdecompの分解パターンをフルに活用した事例です。 1つ目のdecompのパターンには先頭に '$' が付いていますが、これはメッセージを表示させず内部で記録させる指示マーカーです。 前回のページでも説明したように、 対話者からの入力メッセージから応答メッセージが作れなかった場合、ELIZAはデフォルトの応答メッセージを採用する前に使用できる応答メッセージを随時記録します。 そのため「そういえばさっきXXXって言いましたよね?」的な応答メッセージをここでは生成しています。 2つ目のdecompのパターンで実際に表示される応答メッセージを生成しています。パターンは '* my * ' とありますが、 これは入力メッセージから my というキーワードを探し、その前のワードリストとその後のワードリストに分けることを意味しています。 再構成パターンでは前のワードリストを(1)として後のワードリストを(2)として引用することができます。 ここでは "my boyfriend made me come here" から "your boyfriend made me come here" を作り出していますが、 仮に "Why do you say your (2) ?" や "Is it important that your (2) ?" が選択されてもおかしな文にはなりませんよね? ELIZA は応答メッセージ生成で英語やドイツ語といったラテン語系の自然言語を仮定しているので、こういう操作が可能になります。

会話的には、傾聴の要件である対話者の発言の一部を繰り返す反復の応答メッセージが生成されています。 1つ目のdecompでは、後の会話で話題を変更するために用いられることを想定しています。

* あなたの(2)が何故なのか、さらに議論しましょう。
* あなたは以前、あなたの(2)と言いましたよね?
* しかし、あなたの(2)
* それはあなたの(2)という事実と何か関係がありますか?

もちろん、このメッセージが呼び出される時、その会話の内容を ELIZA は理解してません。 ですが、唐突にこのようなメッセージが帰って来れば、対話者は「あ、さっきの話ね」と機転を聞かせてくれるでしょう。 2つ目のdecompでは(2)が表現する何かについて確認する、あるいはさらに詳しい説明を求める応答メッセージが生成されます。

* あなたの(2)?
* 何故あなたは、あなたの(2)だと言うのですか?
* それはあなたに属する何か他のことを示唆していますか?
* あなたの(2)が重要ですか?

このような、対話者に「聞いてもらえてる。理解してもらえてる。」実感を演出するところが、ELIZA が傾聴するシステムとされる理由でしょう。


--- 彼は私がいつも落ち込んでいると言います。
>>> He says I'm depressed much of the time.
      pre: he says i am depressed much of the time
      key: i
   decomp: * i am* @sad *
    synon: sad unhappy depressed sick
>assemble: I am sorry to hear that you are (3).
 assemble: Do you think that coming here will help you not to be (3) ?
 assemble: I'm sure it's not pleasant to be (3).
 assemble: Can you explain what made you (3) ?
     post: I am sorry to hear that you are depressed.
<<< I am sorry to hear that you are depressed.
--- あなたが落ち込んでいるのを聞いて私は残念です。

技術的には、これは synon を使った応答メッセージの生成事例です。decomp の分解パターンで@から始まるワード(ここではsad)は synon で定義されているワードリストの全てのワードとのマッチが試みられます。この synon は assembleの再構成パターンでも考慮されます。ここで使われている '* i am* @sad *' のパターンでは2つの '*' に続き3番目に@sadが登場するので、再構成パターンでは(3)として 'depressed' が採用されます。Weizenbaumの論文でも丁寧に説明されていたかと思います。

会話的には(3)、すなわち対話者の @sad で定義されているネガティブな状況にフォーカスした応答メッセージが生成されています。

* あなたが(3)であると聞いて私は残念です。
* あなたはここに来ることが、あなたが(3)でなくなることに役立つと思いますか?
* (3)になるのは楽しいことではないと、私にはわかってます。
* あなたを(3)にしている理由をあなたは説明できますか?

メッセージはいずれも対話者を理解・同情する内容で「本当に @sad なんですか?」といった懐疑的あるいは否定的な内容は含まれません。 key が i である場合、それは対話者自身に関する発言と見なして、傾聴のルールがしっかり守られているのでしょう。


--- それは本当です。私は幸せではありません。
>>> It's true. I am unhappy
      pre: it's true
      pre: i am unhappy
      key: i
   decomp: * i am* @sad *
    synon: sad unhappy depressed sick
 assemble: I am sorry to hear that you are (3).
>assemble: Do you think that coming here will help you not to be (3) ?
 assemble: I'm sure it's not pleasant to be (3).
 assemble: Can you explain what made you (3) ?
     post: Do you think that coming here will help you not to be unhappy ?
<<< Do you think that coming here will help you not to be unhappy ?
--- ここに来ることはあなたが不幸にならないために役立つと思いますか?

これは技術的にも会話的にもほぼ前項と同じの synon を使った応答メッセージの生成事例です。 技術的には同じマッチング・ルールが連続して適用されたので assemble の次のメッセージを選択されています。 会話的には…もし対話者が表現を変えてなんども同じ事を発言する人物だった場合、 assemble のメッセージが4つだけでは直ぐに循環してしまうだろうなということぐらいです。もっとたくさんメッセージを用意する。 あるいは技術的に連続して同じマッチングルールが頻繁に適用された場合には、 格納されている応答メッセージを取り出して話題を変更させるロジックを組み入れる事を考えても良いかも。 実際の人間同士の会話でもよくありますよね?同じ事を何度も言う人間との会話で、強引に話題を変えたりすることが…


--- 私はいくらか助けを必要とします、それは確かにそうです。
>>> I need some help, that much seems certain.
      pre: i need some help
      key: i
   decomp: * i @desire *
    synon: desire want need
>assemble: What would it mean to you if you got (3) ?
 assemble: Why do you want (3) ?
 assemble: Suppose you got (3) soon ?
 assemble: What if you never got (3) ?
 assemble: What would getting (3) mean to you ?
 assemble: What does wanting (3) have to do with this discussion ?
     post: What would it mean to you if you got some help  ?
<<< What would it mean to you if you got some help  ?
--- あなたが何らかの助けを得た場合、それはあなたにとって何を意味するのでしょうか?

これも前項、前々項と同じ synon を使った応答メッセージの生成事例です。 ただマッチしたパターンが@desireですのでassembleのメッセージ・セットが変わります。

* あなたが(3)を手に入れたら、それはあなたにとって何を意味するのでしょうか?
* なぜ、あなたは(3)が欲しいのですか?
* すぐに(3)を手に入れたらどうでしょうか?
* あなたが(3)を持っていない場合はどうなりますか?
* (3)を得ることはあなたにとって何を意味するのでしょうか?
* (3)と思うことは、この議論と何の関係があるのでしょうか?

会話的には @desire は対話者の望みを語る表現ですので理解・同情ではなく詳細の説明を求める応答メッセージが並んでいます。 これが人間同士の会話であれば対話者の望みを叶える応答か、 「そうだったら良いのにね」と理解・同情する応答を返すところですが、 対話者に望みをさらに具体的に語らせる応答をするのは精神医学的なインタビューだからでしょうか?


--- 多分私は私の母と仲良くすることを学ぶことができるでしょう。
>>> Perhaps I could learn to get along with my mother.
      pre: perhaps i could learn to get along with my mother
      key: my
   decomp: $* my *
 assemble: Let's discuss further why your (2).
 assemble: Earlier you said your (2).
>assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: But your mother .
   decomp: * my* @family *
    synon: family mother mom father dad sister brother wife children child
>assemble: Tell me more about your family.
 assemble: Who else in your family (4) ?
 assemble: Your (3) ?
 assemble: What else comes to mind when you think of your (3) ?
     post: Tell me more about your family.
<<< Tell me more about your family.
--- あなたの家族についてもっと教えてください。

これは技術的には既出の '$* my * ' の分解パターンと synon @family を使った応答パターンを組み合わせた事例です。 スクリプトを見てもらうとわかるように key 'my' には多数の decomp が定義されています。 会話的には「私の」とつく対話者の周辺に関わる発言には様々な応答メッセージが用意されていることから、 対話者は「私」以外の自分の周辺について語りやすいのかもしれません。 ここでは decomp '* my* @family * ' のメッセージ・セットを覗いてみると…

* あなたの家族についてもっと教えてください。
* あなたの家族の(4)他に誰がいますか?
* あなたの(3)?
* あなたの(3)について考えるとき、あなたは他に何が思い浮かべますか?

ELIZA は家族に関してより詳細な情報を求める応答メッセージを返すようです。 確かに精神医学的インタビューの会話法をなぞっているように見えます。


--- 私の母は私の面倒をみてくれます
>>> My mother takes care of me.
      pre: my mother takes care of me
      key: my
   decomp: $* my *
 assemble: Let's discuss further why your (2).
>assemble: Earlier you said your (2).
 assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: Earlier you said your mother takes care of you .
   decomp: * my* @family *
    synon: family mother mom father dad sister brother wife children child
 assemble: Tell me more about your family.
>assemble: Who else in your family (4) ?
 assemble: Your (3) ?
 assemble: What else comes to mind when you think of your (3) ?
     post: Who else in your family takes care of you  ?
<<< Who else in your family takes care of you  ?
--- あなたの家族の他の誰があなたの面倒をみてくれますか?

これは技術的にも会話的にもほぼ前項と同じの応答メッセージの生成事例です。 メッセージ・セットが巧妙に出来てるので、対話者は母親に関する発言からELIZAに別の家族に関する質問をされてしまいました。


--- お父さん。
>>> My father.
      pre: my father
      key: my
   decomp: $* my *
>assemble: Let's discuss further why your (2).
 assemble: Earlier you said your (2).
 assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: Let's discuss further why your father .
   decomp: * my* @family *
 assemble: Tell me more about your family.
 assemble: Who else in your family (4) ?
>assemble: Your (3) ?
 assemble: What else comes to mind when you think of your (3) ?
     post: Your father ?
<<< Your father ?
--- あなたのお父さん ?

これは技術的にも会話的にもほぼ前項と同じの応答メッセージの生成事例です。 対話者は父親に関する発言をさせられてしまいました。 おそらく、対話者にとって父親はあまり触れられたくないことだったのではないでしょうか? でも ELIZA は容赦しません。父親について反復してます。


--- あなたは私の父のようなものです。
>>> You are like my father in some ways.
      pre: you are like my father in some ways
      key: like
   decomp: * @be *like *
    synon: be am is are was
 assemble: goto alike
      key: alike
   decomp: *
 assemble: In what way ?
>assemble: What resemblance do you see ?
 assemble: What does that similarity suggest to you ?
 assemble: What other connections do you see ?
 assemble: What do you suppose that resemblance means ?
 assemble: What is the connection, do you suppose ?
 assemble: Could there really be some connection ?
 assemble: How ?
     post: What resemblance do you see ?
<<< What resemblance do you see ?
--- どのような類似性がありますか?

技術的には assemble の goto ルールで key 'alike' のルール・セットに切り替えられている事例です。 英語の場合 @be like は alike と同じ意味(同じとか似ているとか)を表すと言うことでしょうか?

会話的には対話者は父親について直接的な評価を避けたように見えます。 が、やはり ELIZA は容赦しません。父親について更なる説明を求めています。


--- あなたはそれほど積極的ではありませんが、私にそれに気付かせたくないと思います。
>>> You are not very aggressive but I think you don't want me to notice that.
      pre: you are not very aggressive but i think you don't want me to notice that
      key: you
   decomp: * you are *
>assemble: What makes you think I am (2) ?
 assemble: Does it please you to believe I am (2) ?
 assemble: Do you sometimes wish you were (2) ?
 assemble: Perhaps you would like to be (2).
     post: What makes you think I am not very aggressive but you think I don't want you to notice that  ?
<<< What makes you think I am not very aggressive but you think I don't want you to notice that  ?
--- 私がそれほど積極的ではないと思うのはなぜでしょうか。

この会話で初めて key: 'you' と decomp: '* you are *' のルール・セットが選択されました。 これは対話者が ELIZA を話題にし始めた事を意味します。応答のメッセージ・セットは以下の通りです。

* あなたは私が(2)だと思う理由は何ですか?
* 私が(2)であると信じていいですか?
* あなたは時々あなたが(2)であることを望みますか?
* おそらくあなたが(2)になりたいと思うでしょう。

会話的には父親への論評を避けたい対話者は、よく似ている(と思っている)ELIZA に対して批評を始めたからだと思います。 もっとも、一般的な ELIZA との会話において ELIZA への批判は最も頻出する話題だと想像出来ますので、 そこでの知見に基づいているであろう key: 'you' 以下のルールセットは非常に洗練されている事は容易に想像できます。 対話者は ELIZA(と父親)が積極的でないと感じる理由を説明しなければならなくなりました。


--- あなたは私と議論しません。
>>> You don't argue with me.
      pre: you don't argue with me
      key: you
   decomp: * you* me *
>assemble: Why do you think I (2) you ?
 assemble: You like to think I (2) you -- don't you ?
 assemble: What makes you think I (2) you ?
 assemble: Really, I (2) you ?
 assemble: Do you wish to believe I (2) you ?
 assemble: Suppose I did (2) you -- what would that mean ?
 assemble: Does someone else believe I (2) you ?
     post: Why do you think I don't argue with you ?
<<< Why do you think I don't argue with you ?
--- なぜあなたは私があなたと議論しないと思いますか?

ここでは前項と類似の key: 'you' と decomp: '* you* me *' のルール・セットが選択されました。 対話者の発言は「あなたが私に〜した」と言うパターンにマッチしてます。応答のメッセージ・セットは次の通りです。

* あなたは何故、私があなたに(2)したと思いますか?
* あなたは私があなたに(2)したと思うのが好きですね -- 違いますか?
* 私があなたに(2)したことをあなたはどう思いますか?
* 本当に、私があなたに(2)しましたか?
* 私にあなたに(2)したと信じることをあなたは望みますか?
* 私があなたに(2)をやったとしましょう -- それにはどういう意味がありますか?
* 私があなたに(2)したと他の誰かが信じますか?

全てが質問の形になっているので対話者には更なる説明が求められています。 抗議に対する受け答えの問答集のようにも見えますね。 この種の攻撃的な発言には ELIZA は鉄壁なように思えます。


--- あなたは私を恐れています。
>>> You are afraid of me.
      pre: you are afraid of me
      key: you
   decomp: * you are *
 assemble: What makes you think I am (2) ?
>assemble: Does it please you to believe I am (2) ?
 assemble: Do you sometimes wish you were (2) ?
 assemble: Perhaps you would like to be (2).
     post: Does it please you to believe I am afraid of you  ?
<<< Does it please you to believe I am afraid of you  ?
--- 私があなたを恐れていると信じてよいですか?

これは技術的には前々項と同じ応答メッセージの生成事例です。 会話的には対話者は自分の素直な印象を答えているように見えます。 が、ELIZA からは容赦無く鉄壁のメッセージ・セットから更なる質問が繰り出されます。


--- 私の父は皆を恐れている。
>>> My father is afraid of everybody.
      pre: my father is afraid of everybody
      key: my
   decomp: $* my *
>assemble: Lets discuss further why your (2).
 assemble: Earlier you said your (2).
 assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: Lets discuss further why your father is afraid of everybody .
   decomp: * my* @family *
    synon: family mother mom father dad sister brother wife children child
 assemble: Tell me more about your family.
 assemble: Who else in your family (4) ?
 assemble: Your (3) ?
>assemble: What else comes to mind when you think of your (3) ?
     post: What else comes to mind when you think of your father ?
<<< What else comes to mind when you think of your father ?
--- あなたがあなたの父について考えるとき、他に何が思い浮かぶのですか?

これは技術的には既出の '$* my * ' と '* my* @family * ' のパターンの組み合わせです。 会話的には、答えに窮した(と思われる)対話者が(伏せておきたかったと思われる)自分の父親の話を持ち出します。 彼女の父親に対する感情が剥き出しになってきている感じがします。 精神医学的インタビューとしてはこれは成功なんでしょうねぇ。 ですが、ELIZA はメッセージ・セットにしたがってもうひと押しします。


--- いじめっ子。
>>> Bullies.
      pre: bullies
      POP: But your boyfriend made you come here .
<<< But your boyfriend made you come here .
--- しかし、あなたの彼氏はあなたをここに来させました。

対話者のこの発言は本音の呟きのようにも見えます。 技術的には ELIZA のルールセットには全くマッチしないので、 ここでようやく保管していた応答メッセージが呼び出されました。 会話的は…対話者はELIZAの父親に関する質問攻勢からようやく解放されて、ちょっと安堵したのではないでしょうか?


このようにして対話者が終了を宣言するまで、ELIZAとの会話は続いていきます。


まとめ

随分長くなってしまった…
お付き合いいただいた皆さん、お疲れ様でした。

このページではELIZA論文に掲載されている対話例を使ってELIZA内部でどのように応答メッセージを生成しているかトレースしてみました。 前回のページで紹介したスクリプト・エンジンの動作が具体的に示せたかと思います。 さらにELIZAが提供する傾聴的対話はELIZA本体ではなくDOCTORスクリプトによって支えられていることも納得していただけたでしょう。

僕自身の感想はと言うと…
ELIZA を始祖とする人工無脳が流行った 1980 年あたりに聞いた話では「対話システムは入力された文字列から特徴的なキーワードを取り出して、それにふさわしい応答文を返す」と言ったものだったのですが、今回、実際にELIZAでヒットした分解パターン(decomp)は次のような予想外の(英語が苦手な僕にも)平易なワードで構成されたものでした。

   decomp: *
   decomp: * @be *like *
   decomp: * i @desire *
   decomp: * i am* @sad *
   decomp: * my *
   decomp: * my* @family *
   decomp: * you are *
   decomp: * you* me *

おそらくネイティブスピーカーはこのパターンに意味的な何かが感じ取れるのでしょうが、僕には全くピンと来ませんで、40年前にELIZAの日本語化や独自の人工無脳の作成を志した人たちでもそれ同じだったんだろうなぁ…と思いました。日本語での会話を前提に「ELIZAの方法を単純に真似るやり方は上手くいかない」と言う話を聞いた記憶があります。その後、日本の人工無脳の開発者たちがどう言うアプローチを取ったのか?はもう少し調べてみたいと思います。

そもそも Weizenbaum(と彼の研究グループ)は、どうやってこの DOCTOR スクリプトを作ったのでしょうねぇ?そのヒントは ELIZA 論文にちょこっとだけ出てきます。オリジナルの ELIZA にはエディタを起動する機能がついていたそうで、それを使って ELIZA の動作中にスクリプトの追加・修正・削除が随時できたのだそうです。で、エディタを終了すると、更新されたスクリプトが有効になるような仕掛けになってたとか。この仕掛けを Weizenbaum は随分気に入っていたようで、論文で次のように語っています。

An important consequence of the editing facility built into ELIZA is that a given ELIZA script need not start out to be a large, full-blown scenario. On the contrary, it should begin as a quite modest set of keywords and transformation rules and permitted to be grown and molded as experience with it builds up. This appears to be the best way to use a truly interactive man-machine facility -- i.e., not as a device for rapidly debugging a code representing a fully thought out solution to a problem, but rather as an aid for the exploration of problem solving strategies.

ELIZAに組み込まれた編集機能の重要な結果は、大規模で本格的なシナリオであることをELIZAスクリプトを与えて始める必要はないということです。と言うよりもむしろ、キーワードと変換規則の控えめなセットとして始め、それを使った経験が積み重ねて成長させ成形することを可能にするべきです。これは、真にインタラクティブなマンーマシン環境を使う最善の方法のようで、問題に対する十分に考え出された解決策を表すコードを迅速にデバッグするための装置としてではなく、むしろ問題解決戦略を探求するための補助手段として考えるべきでしょう。

つまり、DOCTOR スクリプトは作成者のアドホックな作業の結果だったと推測されます。上記の decomp は文法と言ったルール的に正しいデザインと言うよりは、何度も試行錯誤を繰り返した結果、これが一番収まりが良かったといった類のパターンだったのでしょう。とすれば、日本語化においてもこのアプローチは有効なんだろうと思います。が、少なくとも入力文を分かち書きにする手段は必要でしょうねぇ。

などと、ELIZAと日本語で対話したいと思いつつ、本ページを終了します。

以上

ELIZA(3)スクリプト ー 応答を作り出す仕掛け

間が空いてしまいました。 これも確定申告に忙殺されていたせいです(笑)

さて、クライアント中心療法に関する僕のへっぽこレポートはいかがだったでしょうか? これを書いてみて、僕はクライアント中心療法の要点が次の3つだと理解しました。

  • インタビューでは被験者の内面に焦点を当てる
  • 受容、反復、明確化を用いて信頼を獲得し被験者に内面をより語らせる
  • 語りにより被験者自身の問題解決への気づきを促す

専門家から見れば理解の不足・不十分ではあると思いますが「いわゆる傾聴とはこういうことなのかな?」などと僕はかなり具体的に想像できています。このように要点がまとめられるとELIZA論文に掲載されている対話例について、なおさら驚いてしまいます。ELIZAの被験者が語ったことを思い出すと、最初は「ボーイフレンドに勧められた」から始まったのですが両親のこと、あるいは両親について自分がどのように感じているか?など…見事に彼女の内面に焦点を当てることに成功しているように思えます。正直「あの当時の処理能力の低いコンピュータを使って、このような対話を行うなんて…どういう仕掛けなんだろうか?」と思わず考えちゃいますよね?

ということで…

実際のELIZAのコードを眺めながらその仕掛けを探ってみようというのがこのページのテーマです。

ELIZAのJava版実装を追っかけてみる

と言ったものの…

Weizenbaumの ELIZA 論文ではDOCTORスクリプトの挙動を丁寧に解説しているのですが、肝心のオリジナルのソースコードは(今のところ)見つかっていません。今時の開発環境で動きそうなELIZA実装は?のページでも紹介したように、オリジナルと互換性の高い実装は LISPJava がありますが、ここでは Charles HaydenEliza Test のページの次の文言を信じてJavaの実装を使って追っかけてみることにします。

This rendition of ELIZA is a complete and faithful implementation of the program described by Weizenbaum. The script language has been reformatted for clarity, but is unchanged in its content.

ELIZAのこの版は、Weizenbaumによって記述されたプログラムを忠実かつ完全に再現した実装です。スクリプト言語は明確にするためにフォーマットが変更されていますが、その内容は変わりません。

もっとも、このページには剥き出しの Java ソース(とクラスファイル)が置いてあるだけなので、以降の作業の利便を考えて maven でビルドできる環境を作ってみました。

github.com

macOSの環境であれば、任意のディレクトリで次の手順を実行すれば簡単に ELIZA が実行できます。

$ git clone https://github.com/m04uc513/eliza-java.git
$ cd eliza-java
$ ls
README.md   pom.xml     script      test
bin     run     src
$ mvn package
・・・・
$ bin/ElizaApp script test
>> Hello.
How do you do.  Please state your problem.
>> Men are all alike.
In what way ?
>> They're always bugging us about something or other.
Can you think of a specific example ?
>> Well, my boyfriend made me come here.
Your boyfriend made you come here  ?
>> He says I'm depressed much of the time.
I am sorry to hear that you are depressed.
>> It's true. I am unhappy
Do you think that coming here will help you not to be unhappy ?
>> I need some help, that much seems certain.
What would it mean to you if you got some help  ?
>> Perhaps I could learn to get along with my mother.
Tell me more about your family.
>> My mother takes care of me.
Who else in your family takes care of you  ?
>> My father.
Your father ?
>> You are like my father in some ways.
What resemblence do you see ?
>> You are not very aggressive but I think you don't want me to notice that.
What makes you think I am not very aggressive but you think I don't want you to notice that  ?
>> You don't argue with me.
Why do you think I don't argue with you ?
>> You are afraid of me.
Does it please you to believe I am afraid of you  ?
>> My father is afraid of everybody.
What else comes to mind when you think of your father ?
>> Bullies.
Earlier you said your boyfriend made you come here .
$

bin/ElizaApp は maven でビルドした jar ファイルを使ってCLIベースのELIZAを起動するスクリプトです。 引数の script はELIZAの(Doctor)スクリプト、text はELIZAへの入力を納めたテキストファイルで、Weizenbaumの論文で紹介された実行例の入力が格納されています。

【注】maven の使い方については各種ドキュメントを参考にしてください。

ELIZAとスクリプト

ELIZAは対話相手である人間が直前に入力した文だけを使って返答の文を生成します。 入力文から応答文への書き換えはスクリプトに記述されたルールに従い、概ね次の7つの手順で実行されます。

1. 入力文をスペースで区切られた単語に分割(いわゆる形態素解析)を行う。
2. 入力文に対し一連の事前の文字列置き換えを行う。
3. 入力文の全ての単語を走査しキーワードリストを作成し、以降はキーワード毎に処理を行う。
4. 与えられたキーワードに対し分解パターン(decomposition pattern)をマッチさせ、最初に一致した要素を選択する。
5. 分解パターンに対応する再構成パターン(reassembly pattern)を選択する。
6. 生成された応答文に対し一連の事後の文字列置き換えを行う。
7. 応答文を出力する。

以下ではロジャー派心理療法士(Rogerian psychotherapist)のインタビューを再現する DOCTER を例に ELIZA スクリプトの記法を解説します。このスクリプトで被験者からの入力文から応答文を生成する書き換えルールを定義します。Weizenbaum のオリジナル・フォーマットを Charles Hayden が変更してくれたおかげで、(僕らの世代には)行指向の読みやすいスクリプトになっていますが ELIZA 論文に掲載されている対話例は完全に再現できます。(まぁ、今時の JSON フォーマットの方が可読性やプログラムからの扱いやすさは格段に上ですけども)

タグ initial, final, quit

タグ initial, final, quit は書き換えルールには関係のない起動・終了・停止時の表示メッセージを定義します。 停止時とは入力文に quit が含まれている場合で、ELIZA は被験者から停止が指示されたと解釈します。

initial: How do you do.  Please tell me your problem.
final: Goodbye.  Thank you for talking to me.
quit: bye
quit: goodbye
quit: quit

quit は複数定義することができますが、実際の停止時には ELIZA が任意のメッセージを選びます。

タグ pre, post

タグ pre は生成処理前に入力文に対する置き換えを行う単語を定義します。左側が置き換え前の単語、右側が置き換え後の単語です。

pre: dont don't
pre: cant can't
pre: wont won't
pre: recollect remember
pre: dreamt dreamed
pre: dreams dream
pre: maybe perhaps
pre: how what
pre: when what
pre: certainly yes
pre: machine computer
pre: computers computer
pre: were was
pre: you're you are
pre: i'm i am
pre: same alike

この処理に続く入力文のパターンマッチングが上手く動くように幾つかの単語の書き直しをしているようです。

タグ post は生成処理後に応答文に対する置き換えを行う単語を定義します。左側が置き換え前の単語、右側が置き換え後の単語です。

post: am are
post: your my
post: me you
post: myself yourself
post: yourself myself
post: i you
post: you I
post: my your
post: i'm you are

これは生成した応答文の書き換え、例えば I → you とか my → your といった人称に関わる書き換えを行なっているようです。

タグ synon

タグ synon はシノニムリスト(同義語・類義語リスト)を定義します。このシノニムリストは入力文に対するパターン・マッチングの際に使用します。左端の単語がリスト名で、例えば @family は mother mom father dad sister brother wife children child の全てとマッチさせ、いずれかの単語が一致すると真となります。

synon: belief feel think believe wish
synon: family mother mom father dad sister brother wife children child
synon: desire want need
synon: sad unhappy depressed sick
synon: happy elated glad better
synon: cannot can't
synon: everyone everybody nobody noone
synon: be am is are was

上記の用例を見ていると、同義語・類義語というよりは会話上の概念(例えば want と need をまとめて desire とする)を定義しているようにみえます。

タグ key, decomp, reasmb

ELIZAでの中核的な応答文を生成する処理は key, decomp, reasmb の3つのタグから構成されるルールを実行します。前述の実行手順3、4、5が該当します。 まずタグ key は1つあるいは2つの引数をとります。1つ目の引数はマッチするキーワード、2つ目の引数はランクと呼ばれる優先度を示す数値です。 ランクは数値が大きくなるほど優先度が高くなります。省略された場合は1と仮定されます。 次にタグ decomp に続く文字列はひとまとまりとして入力文全体を分解するパターンを表します。'*' は1つ以上の単語列を意味します。 最後にタグ reasmb に続く文字列はひとまとまりで応答文あるいはそのテンプレートを表します。 スクリプトでは1つの key 行に対して従属する複数の decomp 行が定義でき、さらに decomp 行各々について従属する複数の reasmb 行ができます。

例として入力文が "hello" だった場合に適用されるルールを示します。

key: hello
  decomp: *
    reasmb: How do you do.  Please state your problem.
    reasmb: Hi.  What seems to be your problem ?

この例では分解パターンは任意(なんでもOK)で、このキー(hello)がマッチするたびに、2つの応答文が交互に採用される動作をします。

入力文に含まれる単語が全くマッチしない場合には、次の xnone で定義されているルールが適用されます。

key: xnone
  decomp: *
    reasmb: I'm not sure I understand you fully.
    reasmb: Please go on.
    reasmb: What does that suggest to you ?
    reasmb: Do you feel strongly about discussing such things ?

ここでは4つの応答文が定義されていますが、この場合は4つの応答文が順番に採用される動作をします。

次に入力文の一部を使って応答文を空白を埋める例を見てみましょう。

key: dreamed 4
  decomp: * i dreamed *
    reasmb: Really, (2) ?
    reasmb: Have you ever fantasized (2) while you were awake ?
    reasmb: Have you ever dreamed (2) before ?
    reasmb: goto dream

ここでは " i dreamed " という分解パターンが定義されていますが、入力文の "i dreamed" よりも前の単語列を(1)と、後ろの単語列を(2)として扱います。続く reasmb 行の3つまでは(2)が定義されていますから、入力文の "i dreamed" よりも後ろの単語列が埋められます。4つ目の reasmb 行はルールの省略記法で、goto の後ろの単語が key として扱われます。 この例では次の dream のルールの reasmb 行が応答文として使われることになります。

key: dream 3
  decomp: *
    reasmb: What does that dream suggest to you ?
    reasmb: Do you dream often ?
    reasmb: What persons appear in your dreams ?
    reasmb: Do you believe that dreams have something to do with your problems ?

このように時折、入力文の一部を取り込む、すなわち対話者の発言におうむ返しをすることにより、ELIZAは対話者の話を聴いてる感を演出します。

もうひとつトリックを紹介しておくと、次のような$から始まる分解パターンのルールがあります。

key: my 2
  decomp: $ * my *
    reasmb: Lets discuss further why your (2).
    reasmb: Earlier you said your (2).
    reasmb: But your (2).
    reasmb: Does that have anything to do with the fact that your (2) ?

この場合、reasmb 行で採用された応答文は対話者には返されずに記録されます。 この記録された応答文は、その後の対話で key が見つからない入力文が現れた場合に応答文として返されます。 すなわち、対話者には ELIZA が以前話したトピックに話題を切り替えたような印象を与えることになります。

このように、ELIZA は数々のちょっとした(でも巧みな)トリックを散りばめて、対話者との会話を演出します。それについて Weizenbaum 自身は論文の冒頭で次のように語っています。

It is said that to explain is to explain away. This maxim is nowhere so well fulfilled as in the area of computer programming, especially in what is called heuristic programming and artificial intelligence. For in those realms machines are made to behave in wondrous ways, often sufficient to dazzle even the most experienced observer. But once a particular program is unmasked, once its inner workings are explained in language sufficiently plain to induce understanding, its magic crumbles away; it stands revealed as a mere collection of procedures, each quite comprehensible. The observer says to himself "I could have written that". With that thought he moves the program in question from the shelf marked "intelligent" to that reserved for curios, fit to be discussed only with people less enlightened that he.

説明は釈明することであると言われています。この格言は、コンピュータプログラミングの分野、特にヒューリスティックなプログラミングや人工知能と呼ばれる分野においては、あまり実現されていません。これらの分野では、マシンは驚愕する方法で動作するように作られています。多くの場合、最も経験豊富な観察者でさえも誤魔化されるのに十分です。しかし、いったん特定のプログラムのマスクが外され、十分明白な言葉による説明でその内部の働きが理解を促されると、その魔法は消滅します。それは単なる手順の集まりとして明らかにされており、それぞれ非常にわかりやすいものです。観察者は彼自身に「私にもそれが書けるかもしれない」と呟くのでしょう。その考えから、彼は問題となっているプログラムを「知的」と記された棚から単に珍しいものの棚に移動させることでしょう。

ちょっと皮肉屋とも言える Weizenbaum の口上は彼流の言い回しなんですが、スクリプトエンジンとしての ELIZA でのテクニックは Weizenbaum が仕掛けた魔法の一部でしかないように思います。傾聴を実現するにはスクリプト自体がよくできている必要があります。そのあたりは、やはり DOCTOR そのものを細かく調べてしっかり理解する必要があるのでしょう。

以上

ELIZA(2)クライアント中心療法とは?

ELIZAの紹介では必ずと言って良いほどに登場するクライアント中心療法ですが、でもWeizenbaum の論文に登場するのはごくわずかです。Rogers の書籍が参考文献に挙げられてはいますが、本文中で登場するのはこれだけ。

At this writing, the only serious ELIZA scripts which exist are some which cause ELIZA to respond roughly as would certain psychotherapists (Rogerians). 

本稿の執筆時点で、存在する唯一の真面目なELIZAスクリプトは、ELIZAが特定の精神療法医(Rogerians)のように応答するものです。

これでは Weizenbaum はクライアント中心療法からどんなヒントを得たのがサッパリわかりません。そこでクライアント中心療法を調べて、彼がそこから何を掴み取ったのかを想像してみようというのが、このページのテーマです。

とはいえ、心理学なんて全く知らんからねぇ…正直、カウンセリングといえば僕が思い出すのは小学校の時に見たこれ。

f:id:Akito_Fujita:20190221162508j:plain

Peanutsに登場するルーシーの精神分析スタンドですね(笑)

無論、当たって砕けろ的に内容になると思いますがおつきあいを…

 

Carl Rogers ー クライアント中心療法の提唱者

クライアント中心療法を提唱したのはこの方、Carl Rogers です。アメリカの臨床心理学者です。(クライアント中心の)人道的アプローチの心理学の創始者で、20世紀、アメリカで活発に行われた心理療法研究の創始者の一人でもありました。

en.wikipedia.org

 

詳しい経歴は上記のページを見ていただくとして…

彼の経歴をみると、敬虔なプロテスタントの家に生まれ当初は牧師を目指していたが、その後心理学者に転向したこと、学業を収めると児童の臨床治療に携わってきたことなどが、当時は一般的だったフロイト由来の心理療法とは異なる方法論に繋がったのかな?と僕は想像しています。実際、患者が子供の場合、彼らからの関心・共感を得るためには、まずは彼らを理解しようとする姿勢を示さなければなりませんからねぇ。

ちなみに Carl Rogers のウェブサイトもあります。

carlrrogers.org

が、論文だけに絞っても文献が山ほどあるので取り敢えず棚上げ。

 

クライアント中心療法

Weizenbaum がELIZA論文で参考文献にあげていた「クライアント中心療法」("Client Centered Therapy: Current Practice, Implications and Theory.")は1951年に出版されました。この本はカウンセリングの教科書のような本で、もちろん今でもAmazonでオーダーできます。

https://www.amazon.co.jp/Client-Centered-Therapy-Implications-Psychology-self-help/dp/0094539901


その概要は下記のWikipediaページで解説されてます。
en.wikipedia.org

 

治療的変化の必要十分条件

Wikipediaページでも言及されていましたが、論文 “The Necessary and Sufficient Conditions of Therapeutic Personality Change”(https://app.shoreline.edu/dchris/psych236/Documents/Rogers.pdf)

によると治療的変化に必要な6つの必要十分条件があるとロジャーズは述べています。

  1. セラピスト - クライアントの心理的接触クライアントとセラピストの関係が存在しなければならず、それはそれぞれの人が互いを知覚することが重要な関係でなければならない。
  2. クライアントの不一致:クライアントの経験と意識の間に不一致が存在する。
  3. セラピストの一致と統合:セラピストは治療関係の中で一致している。セラピストは自分自身に深く関わっている(彼らは「演技」していない)そして関係を促進するために彼ら自身の経験(自己開示)を利用することができる。

  4. セラピストの無条件で肯定的な配慮(UPR):セラピストは、判断、不承認または承認なしに、無条件にクライアントを受け入れる。彼らは自己価値の見方が他人によって歪められた経験に気づき始めるので、これはクライアントにおける自己尊重の増大を促進する。
  5. セラピストの共感的理解:セラピストは、クライアントの内的な基準のフレームについて共感的な理解を経験する。セラピストの側に正確に共感することは、クライアントがセラピストの無条件の彼らに対する配慮を信じるのを助ける。
  6. クライアントの認識:クライアントはセラピストの無条件の前向きな敬意と共感的な理解(UPR)を少なくとも最小限の程度では知覚する。

更に上記のうちの 3, 4, 5 の3つの条件は「中核条件」と呼ばれているそうです。

中核条件

  • 一致:職業的または個人的な見せ掛け(facade)の背後に隠れずに、クライアントと透過的に関わり合う意欲。
  • 無条件の肯定的な尊重:セラピストは、彼 or 彼女が誰であるかについて、不承認の感情、行動または特徴を伝えずに、中断、判断または助言なしに注意深く耳を傾ける意欲を示すことなく受け入れ、賞賛する。
  • 共感:セラピストは、自分のクライアントの視点を理解し、感謝して欲しいという彼らの願望を伝える。

このように「何ちゃらのためのXX個のホゲホゲ」みたいなまとめ方がアメリカ人は大好きですね。実は近所のジュンク堂の心理学の書架に行ってカウンセリングの本を片っ端から立ち読みしたのですが、 多くの書籍で「6つの必要十分条件」あるいは「3つの中核条件」が紹介されてました。なので、カウンセリングの世界では基本的知識なようです。この必要十分条件、もちろん考え方は理解できるのですが、そもそもカウンセリングの現場を知らない僕には具体的な方法、例えば自分がセラピストになったとしたら、クライアントにどう接したら良いのか…正直ピンと来ません。

 

Carl Rogers Interview with Miss Mun

そこでカウンセリングの実際がわかりそうな文献をさらに探したところ、次の書籍を見つけました。

www.kosmos-lby.com

これは "Carl Rogers Interview with Miss Mun #17 (Circa 1953~1955 Filmed)" というタイトルのビデオのトランスクリプトと日本語対訳が掲載された小冊子です。実際のインタビューの映像の一部は下記で見る事ができます。(0.41あたりから) 

www.youtube.com

Rogers はクライアント中心療法を学ぶ学生のための教材として実際のセラピーの様子を撮影した記録映画を幾つか作成していました。 この映像はその1本です。Weizenbaum がこの映像を視聴していたかどうかは定かではありません。しかし、撮影時期が1953年〜1955年とありますから、視聴していたとしても不思議はないでしょう。対訳を見ると論文に掲載されている対話例と共通する内容に思えますが、実際のセラピーではもっと饒舌で、慈しみ深いものと感じます。論文において Weizenbaum はELIZAの対話能力について次のような不可解でわかりにくいコメントをしてます。

Like the Eliza of Pygmalion fame, it can be made to appear even more civilized, the relation of appearance to reality, however, remaining in the domain of the playwright.

有名なピグマリオンのイライザのように、より上品に見えるようにすることができます。しかし、その現実に対する外観は戯曲の領域に止まっています。 

確かに、実際のセラピーと比較すると、ELIZAの対話は戯曲の脚本のような簡略された会話のような印象を受けます。あるいはRogersのこのようなセラピーを目指していたのかもしれません。

 

Three Approaches to Psychotherapy(邦題:グロリアと3人のセラピスト)

もうひとつ Rogers の有名なセラピー映像が見つかりました。1965年に公開された心理学者  Everett L. Shostrom (1921〜1992) が企画・制作した "Three Approaches to Psychotherapy" というタイトルの記録映像です。日本では「グロリアと3人のセラピスト」という名前で知られています。俗称 "The Gloria Films" と呼ばれるこの映像はShostromの患者(の母親)であった Gloria Szymanski を被験者として、クライアント中心療法の Rogers、ゲシュタルト療法の Fritz Perls、論理療法の Albert Ellis の技法の異なる3人のセラピストとの面談を受けるという、ある意味ではわかりやすい(言い換えると、一般向けにデモンストレーション効果の高い)映像でした。

しかしインフォームド・コンセントの概念が知られてなかったこの時代に杜撰な形で制作されたため、後に被験者から上映禁止の要求が出された曰く付きの映像です。現在では Gloria の遺族との合意して、彼女の娘を著者とする下記の書籍が出版されています。

www.kosmos-lby.com

が、驚いたことに映像の全編が Youtube にアップロードされてました。 

www.youtube.com

英語が堪能な方はこちらを見ていただくとして…

上記のような経緯により以前は出版されていた日本語対訳はいずれも廃刊になっているようです。やむなく日本人の専門家による各々の療法に関する簡潔なコメントを探してみたところ静岡の伊東カウンセリング研究会の八十川徹先生の講義録を見つけました。 

伊東カウンセリング研究会 講義予定・内容

グロリアと3人のセラピスト(1) 2002.10/20

グロリアと3人のセラピスト(2) 2002.12/15

各セラピストに対する八十川先生のコメントを引用します。

 

Carl Rogers (クライアント中心療法)

・ロジャースはとにかく、ひたすら相手の内面に焦点を当てようとしている。
・そのうち、ふっと話の方向が変わり、グロリアが前向きになる。それがものすごく不思議である。いつの間にか手段、やり方、解決法について話をしている。初めからグロリアは答えを知っていて、ロジャースはその答えを覆っていたものを少しずつ剥がしていく、そんな感じがする。
・問題はほぼ片づいたように思えるが、面接ではさらに話が進み、父のことまで話題になっている。「面接時間がまだあるから」というのが理由であろうが、さらに別の問題が現れてくる。
・ふりかえりでロジャースは否定しているが、父の話題について、これは感情転移だろうか。
・「あのとき、あそこで」という過去の感情が「今、ここで」に変わっていくことで良くなっていく、というロジャースの振り返りの内容が印象に残った。

 

Fritz Perls ゲシュタルト療法)

・徹底的にしぐさに着目している。言葉としぐさのズレ・矛盾をひたすら厳しく突っ込んでいる。
・正直「厳しい」カウンセリングだと思う。
・それに対してグロリアには激しい感情の表出が見られる。パールズはグロリアを挑発しつつ本音を引き出そうとしている。
・とにかく感情を出させようとしている。


Albert Ellis(論理療法)

・グロリアの方はエリスの発言に「決めつけ」を感じ、反発している。
・イライラしてきたグロリアはたばこを出し、吸い始める。これはロジャースの面接時には見られなかった行動である。
・「論理療法」は「説得療法」である、と感じる。
・言葉遊びの要素がある。このような方法での面接は、知的に高い人でないと効果がないのではないだろうか。
・極めて面接のテンポが速い。正直、内容に追いつけない。
・後半グロリアはエリスのいうことを理解しようとし、前向きに考えようとしているが、グロリアは前半のイライラからいつ、どのように切り替わったのだろう。
・行動させる、という点ではゲシュタルトに近いと感じた。

 非常に素直な感想が語られているので、他の療法と比較したクライアント中心療法の特徴がわかりやすいコメントだと僕は感じました。Rogersのインタビューは「傾聴」という言葉が相応しい穏やかな会話なんでしょうかね?

 

結局、クライアント中心療法って?

…というわけで、ひと通り情報を収集してみました。が、カウンセラーやセラピスト向けの説明だとプログラマの僕には腑に落ちない感じが拭えません。そこで前述の八十川先生の Rogers 論を拝借することにしました。

カウンセリングの歴史的発展とロジャース
・1900年代はじめ フロイドが精神分析を作ったころ、カウンセリングとは医者のするものであった。
・次いで1930年代、ウイリアムスンが登場し、カウンセリングは心理学者のするものとされるようになった。
・さらに1940年代、ロジャースは「心理療法」と「カウンセリング」を同一のものと見なし、カウンセリングは医者などの資格がない素人でもできるとした。これがロジャースの功績である。
・ロジャースは時々によって考え方が多少変化するが、終始一貫して大切にしていたことは「リレーションrelation、つまり人間関係が人をよくする」ということである。
・「自己理論」では次のように考える。「人は生まれながらにしてある傾向を持った有機体である。そしてある傾向とは自立・独立・成長である。」
・また、生まれてきた人間に自他の区別はない。成長し他人の存在に気づき、そして自分(自己self)という存在に気が付く。そこに比較が生まれ、自分の希望と現実の差がに思い至る。そのと希望と現実の差が大きければ「自己不一致」の状態となる。これがこころの病気となるのである。従って、「治る」とは「自己一致」することである。そのための技法として、受容、繰り返し、明確化などがある。

技法
1)受容acceptance … ひたすら「うんうん」と聞くこと
2)繰り返しrepeat … 重要な発言を繰り返す。クライエントが使った言葉をそのまま繰り返す。
3)明確化(明瞭化) … 相手の感情を、カウンセラーの言葉で返してやること。
・これらの技法の根底にあり、これらをひとまとめにしたものが「共感」である。これはクライエントのものの見方・考え方に立って相手の気持ちを受け止めることであり、良い悪いは言わない。

コメントの技法ところで挙げられている「受容」「繰り返し」「明確化」というキーワードを見て、ようやくELIZAのスクリプト(DOCTER)との接点が見えてきた印象です。

「受容」については論文の会話例で被験者はELIZAが「あまり積極的でない」と指摘し、その理由として「あなたは私と議論しないから」と答えていることが思い出されます。またELIZAの返答が原則として被験者の発言を質問に言い換えているので、これはある種の「繰り返し」と言えます。「明確化」と言えば「具体的な例を考えられますか?」というELIZAの返答が該当するのかな?少しこじつけみたいにも思えますが、この3つのルールはELIZAスクリプトを作成する時のコツやポイントと考えても良さそうです。

 

どうやら…

クライアント中心療法は、クライアントの視点・論点に立って、ひたすらその内面を肯定的に受け止め続けることにより、 クライアント自身に解決の糸口を見つけさせる、という方法のように僕には理解できました。そのためのセラピストの技法はクライアントの信頼を得るため、さらにクライアントからの自発的な語りを促すためのようで、いわゆる「傾聴」のための技法ということのようです。

本ページは冒頭で述べたように「当たって砕けろ」的内容になってしまいましたが、今度は実際のELIZAがどのように動作しているか?が気になってきました。

 

 

ELIZA(1)「傾聴」を模倣するプログラムとは?

自分で言っておいて何なんですが「音声付き人工無脳と会話を楽しむ」のは、会話する当人にとっては何となく気恥ずかしい、傍目にみてると何だか不気味な…街中でイヤホンを付けてスマホで電話しているような…印象があります。それが街中で SIRI を使っている人をあまり見かけない理由かも知れない。

そこへ行くとスマートスピーカーは、家に置いてあって「電気つけて」だとか「テレビ付けて」と言った感じで、機械と対話する心理的ハードルを大きく下げてくれるデバイスのように見えます。ただ、この種の会話は直ぐに慣れちゃって、数ヶ月もすれば逆に電気やテレビが付かないとイラっとするような、印象の薄い会話だったりします。

加藤さんの書籍「夢みるプログラム」で紹介されている事例から想像すると、スマートスピーカーと印象の強い会話を人間にさせる早道はゲームの力を借りるのが最善策のように思います。例えば、スマートスピーカーから制御できるオセロボードがあれば機械との対戦が可能になりますが、スマートスピーカーが単に駒を指すだけでなく「本当にそこで良いのですか?」と揺さぶりをかけてきたり「ちょっと待って」と人間に待ちを懇願したり…人間のプレイヤーのような反応をすると、本当に人間の印象に残るような会話ができるのかも知れません。人間が感じる会話の面白さとは本来こういったことのように僕は思います。(もっとも最近のスマートスピーカーのスキル開発の技術進化を見てると、これは案外近い将来に実現されるかも…)

ともあれ、人工無脳(やチャットボット)にはCGと同じような「不気味の壁」が存在しているらしい。ですが、世界初の人工無脳である ELIZA は、この壁を一瞬で乗り越えたと言います。「夢みるプログラム」ではELIZAについて次のように紹介しています。

ELIZAはクライアント中心療法で用いられる「傾聴」と言う技法を模倣する。その狙いはクライアントが「自分は大切に扱われている」という気持ちになり、心の奥底にある感情を気楽に吐き出せるように促すことである。さらにクライアントの発言を要約して返すことで、実はクライアントが自身ですでに解決策を見出していた、という体験へと導くことで自信と解放につながるという効果をもたらすとされた。

(中略)

これにより、ELIZAに接したユーザーが号泣したり、激しく感銘を受けたり、これまで誰にも言わなかった幼少時のつらい経験などをELIZAに語り始めた。

今の最新の技術、例えば Apple の SIRI と話しても、ここまで感動するような経験はないんじゃないでしょうか?そこで「ELIZAとの会話ってどんなものだったの?」を追うのが、このページのテーマです。 

オリジナルのELIZA

実は今は ELIZA と冠した対話系プログラムは世の中にゴマンとあります。例えば Github で "ELIZA JS" と検索したら JavaScript の実装だけでも25も見つかりました。ですが、そのオリジナル・バージョンのその実装は今は存在しないようです。(いや、僕の探し方が悪いだけかも…)しかし、オリジナルの開発者がその実装について解説した論文は、アメリカの大学のAI関連の授業の教材としてインタネット経由で広く閲覧することができます。

ELIZA -- A Computer Program For the Study of Natural Language Communication Between Man And Machine
Joseph Weizenbaum
Massachusetts Institute of Technology Department of Electrical Engineering
Cambridge, Mass..
Communications of the ACM Volume 9, Number 1 (January 1966): 36-35.

http://web.stanford.edu/class/cs124/p36-weizenabaum.pdf (画像)

https://www.csee.umbc.edu/courses/331/papers/eliza.html (HTML)

オリジナルの開発者は Joseph Weizenbaum です。実は、僕には、この人について書きたいことが山ほどあるのですが、それは後日として、この場はさらっとWikipediaのリンクのみ掲載しておきます。

en.wikipedia.org

この論文の1つの特徴は、全9ページのうち、ほぼ7ページを使って、ELIZA内部での処理を詳細に解説していることです。(もちろん「誰にでも理解しやすい」とは言ってませんよ(笑)) それ故に、当時のELIZAに関心のあるプログラマたちには事実上の開発仕様書のように扱われました。例えばLISP版ELIZAを実装したBernie CosellはELIZAの作成について次のようにコメントしています。(The Genealogy of Eliza(http://elizagen.org/)から引用)

Bernie Cosell's Lisp Eliza @ BBN c. 1966-1972
Bernie writes: "I *never* saw any of the SLIP code and knew nothing about it. I wrote Doctor *completely* working just from the CACM article! In fact, if the SLIP code actually surfaced, it'd be interesting to see how different/similar ours were, since I [really] never saw any of Weizenbaum's code. Truth is that I did Doctor as a learning hack.

*snip*

I knew a little Lisp from a course at MIT, but I figured that the best way to really "get" Lisp was to write something real. I had just joined the ACM [I started at BBN in the fall of '65] and I think Weizenbaum's Eliza article just happened to be in the very first copy of Communications that I received."

 

Bernie は次のように書いている:
私はSLIPのコードを見たことがなく、それについては何も知りませんでした。私はCACMの記事から(だけで)Doctorが完全に機能するように書きました。私は Weizenbaum のコードをまったく見たことがないので、もし(オリジナルの)SLIPコードと実際に対面したとしたら、私たちのコードとどのような点で類似している or 異なることを確認できるので興味深いです。正直なところ、私は学習のためにDoctorをハックしました。

(中略)
私はMITのコースで少しLispを知っていましたが、Lispを本当に「習得する」ための最良の方法は何か本物を書くことであると私は考えてました。(1965年の秋から BBN で働き始めましたから)私はACMに参加したばかりで、WeizenbaumのElizaの記事は、私が受け取った最初のCACMのコピーの中に「たまたま」あっただけだと思います。

Bernie Cosell と言えば初期のARPANETで稼働した IMP(現在のIPルーターの祖先)の ソフトウェアを実装したプログラマのひとりですが、彼が ELIZA を移植(というよりは再実装)したのは LISP を覚えるためだったのはちょっと驚きです。最後の「たまたま」発言は彼流の謙遜なんでしょう。というのも、その後 ELIZA は Weizenbaum が書いたオリジナル・コードよりも、彼が書いた LISP 版の方が普及したからです。

ELIZAでの会話 

この論文の価値の1つはオリジナルELIZA(と人間)による会話が掲載されている事です。 論文を片手にELIZAを実装しているプログラマには「この会話が再現できればELIZAと名乗れる」ある種のテストパターンとしても活用されました。

論文に掲載されている会話は次のようなものです。

(Cは被験者、EはELIZAの発言です)

C: Men are all alike.
E: IN WHAT WAY?
C: They're always bugging us about something or other.
E: CAN YOU THINK OF A SPECIFIC EXAMPLE?
C: Well, my boyfriend made me come here.
E: YOUR BOYFRIEND MADE YOU COME HERE
C: He says I'm depressed much of the time.
E: I AM SORRY TO HEAR YOU ARE DEPRESSED
C: It's true. I am unhappy
E: DO YOU THINK COMING HERE WILL HELP YOU NOT TO BE UNHAPPY
C: I need some help, that much seems certain.
E: WHAT WOULD IT MEAN TO YOU IF YOU GOT SOME HELP
C: Perhaps I could learn to get along with my mother.
E: TELL ME MORE ABOUT YOUR FAMILY
C: My mother takes care of me.
E: WHO ELSE IN YOUR FAMILY TAKES CARE OF YOU
C: My father.
E: YOUR FATHER
C: You are like my father in some ways.
E: WHAT RESEMBLANCE DO YOU SEE
C: You are not very aggressive but I think you don't want me to notice that.
E: WHAT MAKES YOU THINK I AM NOT VERY AGGRESSIVE
C: You don't argue with me.
E: WHY DO YOU THINK I DON'T ARGUE WITH YOU
C: You are afraid of me.
E: DOES IT PLEASE YOU TO BELIEVE I AM AFRAID OF YOU
C: My father is afraid of everybody.
E: WHAT ELSE COMES TO YOUR MIND WHEN YOU THINK OF YOUR FATHER
C: Bullies.
E: DOES THAT HAVE ANYTHING TO DO WITH THE FACT THAT YOUR BOYFRIEND MADE YOU COME HERE

 やはり英語だとピンときませんね。Google翻訳を使って訳すと…

C: 男性はみんな似ている。
E: どうしたの?
C: 彼らはいつも何かについて私たちを悩ませています。
E: 具体的な例を考えられますか?
C: うーん、私のボーイフレンドは私をここに来させました。
E: あなたのボーイフレンドはあなたをここに来させましたか?
C: 彼は、私が長時間が落ち込んでいると言います。
E: 私はあなたが落ち込んでいると聞いて悲しいです。
C: それは本当です。私は幸せではありません。
E: あなたはここに来るとあなたが不幸にならないように助けてくれると思いますか?
C: 私は助けが必要です。
E: あなたが何かの助けを得られることは何を意味するのですか?
C: 多分私は私の母と仲良くすることを学ぶことができました。
E: あなたの家族についてもっと教えてください
C: 私の母は私を心配してくれます。
E: 他にあなたの家族の誰があなたの心配をするのですか?
C: 私のお父さん。
E: あなたのお父さんですか?
C: ある意味ではあなたは私の父のようです。
E: どのようなところが似ていますか?
C: あなたはあまり積極的ではありませんが、私はそれに気付かないようにしています。
E: 何があなたに私があまりに積極的でないと考えさせるのですか?
C: あなたは私と議論しないから。
E: なぜ私はあなたと議論しないと思うのですか?
C: あなたは私を恐れている。
E: 私はあなたを恐れていると信じてください。
C: 私の父はみんなを恐れている。
E: あなたが父親を考えたときに他に何を思い出しますか?
C: いじめ。
E: あなたのボーイフレンドがあなたをここに来させたという事実と何か関係がありますか?

ここでは論文の主題であるELIZAの実装方法の事は忘れて、精神分析医との会話として理解してください。日本語として少々おかしいのは Google 翻訳のせいです(笑)

この会話を辿ると…被験者は女性のようで、ボーイフレンドへの愚痴から始まって、長時間落ち込んでいると言われていること、自分が不幸だと感じていること、その後は自分の母親と父親の話、 特に父親に自分に対して積極的でないネガティブな印象を持っていることなどが読み取れます。さらに会話相手(ELIZA)に対する批判も口にしています。あまり楽しい会話には感じませんが、それでも被験者はこの後、号泣したり、感激したり、辛い経験を語り始めたり…といったことが起こりそうな会話の流れですし、ここまでの会話だけでも被験者がドンドンこの会話にのめり込んで行っていることもよくわかります。

これが ELIZA 型人工無脳の特徴である「傾聴対話」の典型例です。少なくとも被験者はELIZAに対して(相手が人間であることを疑う)不気味さを感じてはいないように見えます。ELIZAが登場した(一般にはコンピュータがまだ謎の巨大機械だった時代の)1966年にこのプログラムと対話した被験者が「相手が機械であることをまったく信じなかった」ということも頷けますよね?

開発者の見解

この論文ではELIZAをどのように作ったか?は詳細まで語られていますが、その結果としての傾聴対話、すわなち「何故、ELIZAには被験者がのめり込むような対話が可能なのか?」についてはあまり語られません。論文全体で眺めると「人間が違和感を感じないように細心の注意を払って作ったら、こうなった」みたいなトーンが支配的だと僕には感じられます。例えばWeizenbaumは「精神科医との会話」という状況設定を用いた理由を次のように述べています。

ELIZA performs best when its human correspondent is initially instructed to "talk" to it, via the typewriter of course, just as one would to a psychiatrist. This mode of conversation was chosen because the psychiatric interview is one of the few examples of categorized dyadic natural language communication in which one of the participating pair is free to assume the pose of knowing almost nothing of the real world.

ELIZAは、人間の対話者が、タイプライターを介して、精神科医と同じように「話す」ように指示されたとき、その初回で最高のパフォーマンスを発揮します。この会話形式は、精神医学的インタビューが、参加しているペアの1人が現実世界についてほとんど何も知らない姿勢を取ることが許される自然言語による2者間コミュニケーションに分類される数少ない例の1つであることから選択されました。 

つまり、現実世界への知識がなくても会話が成立する関係性が重要だったようです。が、Weizenbaumはこの状況設定が幾つかの対話者の貢献をを引き出していると述べています。

It is important to note that this assumption is one made by the speaker. Whether it is realistic or not is art altogether separate question. In any case, it has a crucial psychological utility in that it serves the speaker to maintain his sense of being heard and understood.

(不自然さはないという)この仮定は対話者によってなされたものであることに注意することが重要です。仮定が現実的であるかどうかは、まったく別の問題で、いずれにせよ、対話者が聞き取られ理解される感覚を維持するためには重要な心理的な有用性があります。

  つまり、対話者は「相手に理解されている」と勝手に誤解するわけです。

The Speaker further defends his impression (which even in real life may be illusory) by attributing to his conversation partner all sorts of background knowledge, insights and reasoning ability. But again, these are the speaker's contribution to the conversation.

対話者は、会話相手にあらゆる種類の背景知識、洞察力、推論能力を帰属させることによって(その実生活が幻想であったとしても)彼の印象をさらに擁護します。これもまた、対話者の会話に対する貢献です。

さらに対話者は会話相手の人物像を勝手に作り上げてしまう。上記の会話例ではELIZAを彼女の父親とよく似た人物だと彼女は想像しているのかもしれませんね。

From the purely technical programming point of view then, the psychiatric interview form of an ELIZA script has the advantage that it eliminates the need of storing explicit information about the real world.

純粋に技術的プログラミングの観点から、ELIZAスクリプトの精神医学的インタビュー形式は、現実世界に関する明示的な情報を埋め込む必要性を排除する利点があります。 

穿った見方かもしれませんが、人間の知識をプログラム内で再現する方法が(その時点では)見当たらなかったと言っているようにも聞こえますね。したがって、それを使わなくても自然な会話が成立するような状況がWeizenbaumには必要だったわけです。

このようにしてELIZAが対話者の信頼(言い換えると対話者の思い込み)を獲得できると、対話者はその会話において非常に寛容な態度で最後まで会話相手の発言を肯定的に信じ続ける振る舞いをすることをWeizenbaumはこの論文で指摘しています。

 

 

日本語の「人工無脳」に意味的に対応する英単語は無いように思いますが…

人間の考えや立ち振る舞いを模倣して、人間のように会話相手を理解しようとするのが人工知能なのだとしら、会話において対話者の人間が会話相手を理解しようとする意欲や喚起し努力を引き出して会話を成立させるのが ELIZA のアプローチのようです。このシステムを見て「人工無脳」と名付けた日本人が誰だかわかりませんが、凄いセンスだと思わずにはおられません。

WeizenbaumはELIZAを開発している時のさまざまな制約条件の中にあって、人間とのより自然な対話を目指す過程で偶然このアプローチを見出したのでしょう。故に、彼は自分の研究成果に対する周囲の熱狂的な反応にひどく驚き、困惑したと言います。論文に掲載されている会話例を見ると人間の方が一方的に話していて、その会話に没頭する人間の様は他の対話システムとは異なるある種の様相、すなわち「話をさせられている」感じもします。このシステムをさらに発展させていくとなると、それは様々な心理学的トリックを注ぎ込んでいくことになり、もはや情報工学ではなく実験心理学の研究になってしまうのだろうなぁ…とボンヤリ想像しています。

 

ただ、シンギュラリティなどと言ってなかなか冷めることの無い今のAIブームにあって「人間の完全な模倣・再現を目指す人工知能の研究開発成果を本当に人間社会は受けいれるのだろうか?」などと考えている僕は「人工知能人工無脳、人間が真に欲するのはどっち?」あるいは「ヒューマン・セントリックなのはどっち?」などと悩んでしまうのです(笑)