
最近の機械学習の進歩により、自然言語を生成する機能が劇的に進化しているように思う。例えばチャットボットは、英語や日本語等の自然言語を使用して対話をする機能のことで、最近はウェブページの左下にチャットボットとの対話インターフェースが埋め込まれているのをよく目にする。ユーザーはそのチャットボットに英語や日本語で質問し、サービスの使い方を知ったり問題を解決するというような使い方をする事が多い。特にChatGPTというサービスが高精度な回答をするということで話題となっていて、様々な使用方法が提案されている。本当に進化している。
一方でEmacsは対話形式のセラピーを提供するdoctorという機能を古くから梱包している。これは心理カウンセラーのような対話をする"人工知能"で、会話の最後には「秘書が請求書を送る」といったメッセージをくれる1。まさに最近チャットボットと呼ばれる機能であり、Emacsのこの機能はELIZAと呼ばれるようだ2。
内部はEmacs Lispで実装されており、実際にdoctor.elを読んでみると内部に doctor-eliza
という記述がある。また doctor-rms
というのもある3。簡単なパターンマッチによって実装されているため、現代の水準からすると会話の精度はイマイチだし、日本語は使えない。EmacsのELIZAは時を止めたまま、ひっそりと存在し続けている。
ただよく考えてみると、Emacsの考え方の一つに外の世界と協調するというものがあるように思う。外部プロセスとして実行できるものは、Emacs内部で抱え込まず、外に追い出すというものだ。ChatGPTはベータではあるがAPIを提供している。つまりELIZAをChatGPTに対応させられれば劇的に機能改善できる。そこで、ChatGPTを利用し、EmacsのELIZAをChatGPTに対応させることにした。
やったことは単純で、OpenAIが提供しているChatGPTのAPIにリクエストを送信し、レスポンスを受け取りdoctorのバッファに表示している。doctorはEmacs Lispで実装されている。本当は解析の部分と文章の生成のみを置き換えたかったが、doctor.elを読んでみると、それはそれで手間がかかる作業に思えた。そこで文字の読み込みから、出力までを行っている doctor-read-print
関数を、ChatGPT用の関数 doctor-chatgpt-read-print
に置き換える事でお茶を濁すことにした。良い方法とは思わないが、想定されていない方法であってもやりたい事を実現できる、この柔軟性がEmacsの良い所だと思う。以下にソースコードを置いておく。
https://github.com/TakesxiSximada/emacs.d/blob/main/lisp/doctor-chatgpt.el
もちろん実際に金銭を請求されるわけではない。