言語AIの進化史②イライザの仕組み
前回は、チューリング・テストを軸に、言語による応答を通して知性を測るというテーマについていくつかの概念を紹介しました。今回は、その中で登場した人工無能 イライザ(ELIZA)(1966年)に再びスポットライトを当てます。
初期のチャットボットであるイライザは、設定ファイル(スクリプト)によってその挙動が変わります。特に有名なのがDOCTORスクリプトです。LinuxやmacOSで使えるテキスト・エディタのemacsに標準でインストールいます。
emacsエディタのコマンドとしてESC、x、doctorとタイプすると起動することができます。(ESCはエスケープ・キーです)。

イライザとの会話は次のように始まります。
私は心理療法士です。あなたの問題を説明してください。話が終わるたびに、RET キーを 2 回押してください。
I am the psychotherapist. Please describe your problems. Each time you are finished talking. type RET twice.
試しに次のように会話を切り出しました。
ここ数日、あまりよく眠れていません。
I have not been able to sleep well in the last few days.
よく眠れないという私に対して、セラピスト(という役割)であるイライザは、次のように応答しました。
なぜそう言うのですか?
Why do you say that?
患者(という立場)である私は、次のように説明します。
夜中によく目が覚めました。
I often woke up at night.
夜に眠れるけど目が覚める私に対して、イライザはこう続けます。
なぜ夜中によく目が覚めたと思いますか?
What makes you believe you often woke up at night?
イライザの質問は、私からより具体的な情報を引き出そうとしているかのようです。ただし、目が覚める理由までは分からない(考えていない)ので、私は、次のように続けます。
昨夜、急に暗闇の中で目が覚めたら、まだ午前3時でした。
Last night, I suddenly opened my eyes in the dark, and it was till 3 am.
そこで、イライザは次のように告げます。
おそらくあなたの生活がこれに関係しているのかもしれません。
Maybe your life has something to do with this.
イライザの応答は、心理療法士が患者の生活習慣や環境についての詳細を探ろうとする姿勢を反映しています。患者が自分の問題をより深く考えるように誘導されているかのようです。
もちろん、完全に自然な会話とは言えませんが、1966年当時、イライザに夢中になった人々がいたことも理解できます。
では、イライザはどのような仕組みで動作しているのでしょうか。また、そのアプローチは現在の言語モデルとどのように異なり、どのように共通しているのでしょうか。
イライザの基本的な仕組みについて、見ていきましょう。
「考える機械」の先駆け
開発者であるジョセフ・ワイゼンバウムは、米国のマサチューセッツ工科大学でコンピュータ科学の研究をしていました。彼は、ELIZAを開発するためにSLIP(Symmetric List Processor)という言語を創りました。
初期の頃のSLIPはフォートラン(Fortran)の拡張として実装されています。1954年にIBMのジョン・バッカスが開発したコンピュータ言語です。
フォートランといえば、科学計算のためによく使われていました。昔(といっても私の知る限り1990年代ごろまで)は、多くの大学の理系コースではフォートランを学ぶのは必須でした。当時は、フォートランを使うためには、特別な建物の中にある大型コンピュータの端末にアクセスして実習したりしていました。
行列演算などの線形代数の計算を効率的に実行するためのフォートランのライブラリとして、BLAS(Basic Linear Algebra Subprograms)やLAPACK(Linear Algebra Package)が有名です。BLASやLAPACKは、線形代数の操作を非常に効率的に実行できるように最適化されています。また、長年にわたって開発・改良されてきたため、非常に信頼性が高いです。よって、フォートランに限らず広く使われるようになりました。
例えば、NumPyやSciPyによって使われています。numpy.show_config()を実行すると確認することができます。また、NVIDIAのCUDAでもcuBLASというBLASをGPU環境で実装したC++のライブラリが使用されています。
私自身は大学卒業後は、フォートランに触れていないのですが、今でも現役で、スパコンなどにて使われていると聞きます。また、2023年に新しいバージョンが登場し、また次のバージョンも検討されているということなので需要はあるのでしょう。
その後、SLIPはIBMのコンピュータ言語であるMAD(Michigan Algorithm Decoder)へと移植されます。これがMAD-SLIPと呼ばれるもので、最初のバージョンのイライザはMAD-SLIPで記述されました。
なお、MADは、ミシガン大学によって開発されたプログラミング言語で、IBM704で開発されました。教育目的や研究のために広く使用されていたので、大学や研究機関でのアクセスがしやすく、SLIPの利用者層がより広がることが期待されました。
ちなみに、1954年に発表されたIBM704は、量産型(といっても巨大ですが)として初めて浮動小数点演算を搭載したコンピュータです。フォートランもIBM704のために開発されました。
チャットボットを開発するために自らプログラミング言語まで準備したジョセフ・ワイゼンバウムですが、後に人工知能に対して批判的になっていきます。
イライザは、相手の話に耳を傾けつつ、いろんな意味にとれるような質問することで、患者がより積極的にコミュニケーションをとることを促しています。しかし、その実装は、簡単なパターンの認識を利用して応答しているだけです。それでも、多くの人々がイライザを「考える機械」の先駆けと捉えたり、またイライザとの会話に夢中になったため、彼はその影響力の大きさに不安を感じるようになりました。
さらに、彼は人工知能の経済への影響や軍事利用などについてもコンピュータが人類にネガティブな影響を及ぼすと考えました。これは、現代のチャットボットの代表であるChatGPTが引き起こしたさまざまな危機論にも通じるところがあります。いずれにせよ、イライザは多くの言語へ移植され、emac版のように現在でも生き残っています。
さて、ここからはイライザの技術的な面によりフォーカスします。
パターンの認識と応答
すでに述べたとおり、イライザが初めて登場した当時、これは非常に革新的な技術でした。人々は、コンピューターが人間のように対話できることに驚きを感じました。しかし、実際にはイライザは非常にシンプルなルールに基づいて動作しており、ユーザーの入力に対して機械的に反応するだけでした。
その仕組みは、ユーザーの入力に対して適切な応答を生成するために、あらかじめ定義されたパターンとルールを使用するというものです。これにより、あたかも実際の心理療法士との会話を模倣することができています。
では、イライザは実際にどのようにして会話のパターンを認識し応答するのでしょうか。
いくつか存在するイライザの実装などを参考にすると、イライザは次のような処理を行なっていることが伺えます。
入力の正規化:例えば、英語で「gimme」と書いて「give me」を意味するなど、短縮・省略・スラングなどがあるので、同じ意味を持つ異なる表記を標準的なものに変換します。
パターン認識:正規化された入力テキストに対して、正規表現(Regular Expression)などを使って、ある特定の文字列のパターンにマッチングするかどうかを判断します。必要ならば、入力テキストからマッチした単語などを抽出します。
出力応答生成:入力文のパターンに合わせて準備されている応答のテンプレートにおいて、入力からマッチした単語などを使って置換を行います。これによって、入力からの情報が返答の中へ反映されます。
つまり、イライザではテキストを数値化することなく、テキストそのものとして扱っています。単純に説明すると、入力テキストからパターンを認識して、そのパターンに従ってテンプレートを選び入力からの単語を当てはめて出力するだけです。よって、PythonやJavaScriptなどを使えば簡単にそのロジックを書くことができます。
むしろ、プログラムのロジックよりもパターンやテンプレートを準備することのほうが労力を要します。emacs版のDOCTORスクリプトはこちらで参照することができます。
これは現在の言語モデルとは大きく異なるアプローチです。
現在の言語モデルとの違い
現代の言語モデルは、まずテキストを最小要素に分けるトークン化を行います。これはある種の前処理という意味でイライザが行う入力の正規化と似ていなくもありません。ただし、トークン化の手法にもいくつかあり、ここが自然言語処理における一分野を形成しています。イライザによるテキスト処理の手法はその先駆けだったと言えるでしょう。
また、トークン化された要素は、数値化されます。これにもいくつかの手法があり、言語AIの進化を辿ることでその発展を知ることができます。数値化することで言語要素間で演算が行えるようになるため、文字列としては同じ単語であっても文脈によって含まれる情報の処理の仕方を計算によって変えることができます。
これはテキストをそのまま処理する方法では難しいです。イライザでは、文脈を理解する手段として入力文のパターンを正規表現などを使用するのですが、これだと無数のパターンを準備しない限りさまざまな会話に対応することは不可能です。
近年の大規模言語モデルは、大量のテキストデータから自動的にパターンを学習しています。これによって、入力文章の理解と出力文章の生成が行えるようになっています。出力テンプレートも必要ありません。
よって、自然言語処理の技術を駆使した現在の言語モデルは、より複雑で人間らしい対話が可能となっています。
例えば、現代のチャットボットは機械学習や深層学習を活用して、ユーザーの入力をより精緻に理解し、より適切な応答を生成することができます。これにより、カスタマーサポートやパーソナルアシスタントなど、多岐にわたる用途で利用されています。
しかし、その根底には、イライザのような初期のシステムで確立された基本的な原理が存在するのも事実です。
現在の言語モデルとの共通点
学習できない単純な言語モデルではありますが、イライザの登場は、人工知能の対話システムの発展に大きな影響を与えました。近年の大規模言語モデルの成功が訪れるまでは、ゲームのNPC(ノンプレイヤーキャラクター)や業務用のチャットボットなどは入力テキストのパターン認識をベースに作られていました。今でも一掃されたわけではありません。
また、会話は双方向の作業であり、人間側の主観(思い込みなど)に大きく左右されます。その意味で、イライザは先駆的でした。こちらの意図を見透かしているかのような応答をすることで会話に没頭する効果(イライザ効果)まで引き起こしました。
このように人間がプログラムと理解していながらも機械との会話に没頭しがちなのは、現在の言語モデルと共通するところです。
現在のチャットボットは、強化学習などを駆使して人間がより自然に感じ望むような会話ができるようになってきています。これは、言語モデルが巨大なテキストデータから無数のパターンを学習しているからです。つまり、人間が手作業でパターンやテンプレートを準備する必要がなくなりました。
しかし、それは手作業か自動的かの違いを除くと、パターン認識のロジックとしては大きな違いはないのかもしれません。
画像系のモデルが、手作業で編み出した特徴量抽出のテクニックを使っていた時代とディープラーニングによって特徴量抽出器が自動的に調節されるようになった時代との違いに似ています。
すると、人間の会話もほとんどは過去からの情報をもとにしたパターン認識によるものではないかと、ふと思ってしまいます。ChatGPTはもうすでにある程度の知能を達成しているのだと主張する声も聞こえてきます。人間もChatGPTもただ単に多くのパターンを学習しただけではないのか、と。
いや、まだまだ知能と呼べるものではない、という主張も多くあります。
ただし、これらを突き詰めて議論するには、知能とは何なのかという定義が必要で、より哲学的な議論の領域にまで誘い込まれてしまいます。なので大抵はお茶を濁すような結末のはっきりしない議論になりがちです。
さらに、人間以外の知能の存在の危険性は今も昔も重要なテーマです。軍事への利用による人類滅亡を危惧したり、最近ではシンギュラリティも本当に近くなったと考える人もいるようです。
そういった意味で、ジョセフ・ワイゼンバウムが不安を感じ批判に転じた態度は現在にも通ずるところがあります。
最近では、AIの危険性を唱えるためにジェフリー・ヒントンがGoogleを辞めたり、その教え子であるイリヤ・サツキバー(Ilya Sutskever)がOpenAIを辞めてより安全なAIの開発を目指す新会社SSI(Safe Superintelligence Inc.)を立ち上げています。
I am starting a new company: https://t.co/BG3K3SI3A1
— Ilya Sutskever (@ilyasut) June 19, 2024
次回予告
イライザのDOCTORスクリプトは、心理カウンセラーという専門家をルールベースの自然言語処理を通して行うものでした。ただし、専門知識を扱うというよりも会話のパターンをうまく工夫するアプローチでした。
しかし、本当の専門家ならば、大量の専門知識を利用できる必要があります。そして、これは、ルールベースのイライザでは困難です。
一方で、イライザと同時代により知識の蓄積と取得にフォーカスした言語モデルが考案されました。後に「エキスパートシステム」と呼ばれるものの先駆けです。
それを次回は紹介します。
お楽しみに!
