VirtualBox上でNEXTSTEP 3.3Jを味わい直す(その2)

その1(VirtualBox)に戻る | その3(リモートログイン)に進む

NEXTSTEPでChatGPTを使う

NEXTSTEPのような古いOSには、現代的なソフトウェアを動かすための機能が色々と欠けているので、実用性の観点からは全く役に立たない。 その一方で、構造がシンプルで、それなりに資料や(無償の)ソフトウェアの蓄積もあるので、あれこれいじりまわすには好都合である。

とはいっても、いろいろ調べたりするのにウェブブラウザくらいは欲しいところであるが、SSLやJavaScritに対応したブラウザは存在しないので、Google検索すらできない。 もし検索できたとしても、その先のウェブサイトを開くことができなければ、あまり意味は無いだろう。

そんなNEXTSTEPに「現代社会への窓」を開けるには、どうせVirtualBoxのホストOSの中で動いているので、外部とのやり取りはホストOSに任せ、必要なデータだけをゲストOS(NEXTSTEP)に中継するのが良さそうである。 ChatGPTならば、テキスト情報のやりとりだけでもそれなりに有用ではないかと思われたので、 ホストOS側でOpenAIのAPIとやりとりする簡単なサーバーを動かして、NEXTSTEPとホストOSとの間は、TCPのソケット通信でデータをやり取りすることにして、 NEXTSTEPのインターフェースからChatGPTが使えるようにしてみた。

サーバー

サーバープログラムは簡単なPythonのスクリプトで、大方はChatGPTに自動生成させた。

こちらからスクリプトtcp_llm_broadcast_server.py をダウンロードして、Pythonが動く環境で起動するだけである。

openaiなどのインポートしているモジュールで足りないものがあれば、適宜、pipで追加しておく。

また、プログラム冒頭付近のALLOWED_IPSに、NEXTSTEPゲストOSの出口のIPアドレスを加えておく必要がある。 VirtualBoxのホストOS上でこのスクリプトを動かす場合は、ホストOS自身のIPアドレスになる。

$ export OPENAI_API_KEY=xxxxxxxxxxxxxxxxx
$ python3 tcp_llm_broadcast_server.py

のように、APIキーを環境変数に設定してから起動すれば、設定したポート(特に変更しなければ12345)で待機する。

なお、必要なら、スクリプトの冒頭付近のMAX_PROMPT_LENGTH=2000のところを調整して、長いプロンプトも受け付けるようにしておく。

NEXTSTEPクライアント

クライアントもこちらからダウンロードできる。

立ち上げた後、メニューの「案内」の「プリファレンス」を開いて、サーバーのIPアドレスを設定して、一旦終了する。 次に起動すると、サーバーと通信可能となるはずである。

使い方も機能も至ってシンプルで、下側の区画にプロンプトを入力し「送信」ボタンを押して少し待っていると、ChatGPTからの応答が表示される。 ボタンを押す代わりに Command + Return でも送信できる。 なお、プロンプト入力欄は、Emacs的なキーバインドになっている。

クライアントプログラム NXChat の動作の様子

CharGPTとのやりとりは、サーバー側のデータベースに保存されるようになっており、以下のようなプロンプト入力により操作することができる:

/recall all
これまでの履歴を全て読みだす
/recall 5
5回前までの履歴を全て読みだす
/reset
履歴を消去する(サーバー上のデータベースはバックアップされる)
/system プロンプト
システムプロンプトを設定する

細かい技術的な事項

  1. OpenAIとのやり取りはutf-8で行われるが、NEXTSTEP(日本版)はEUC-JPなので、NXChat内部でコード変換を行っている。 EUC-JPに含まれない文字は、単純に空白に置き換えている。
  2. OpenAIからのテキストはMarkdown形式で送られてくる場合がある。 NXChatはそれをNEXTSTEPのRTFに変換して表示するようにしているが、かなりいい加減なやり方のため、表示が乱れる場合があるかもしれない。
  3. NXChatはサーバーにテキストを送信し、サーバーからのテキストを非同期的に受信して表示しているだけなので、サーバーを少し修正するだけで、 OpenAI以外のサービスにもアクセスできるようになるはずである。

(余談)しりとり

プログラムの動作確認のつもりで、ChatGPT(gpt-4o-mini)としりとりをしてみた。以下は、そのログである。 人間相手にゲームする場合は、簡単に負かされるようにと、トレーニングされているのだろうか・・・

[172.31.111.5]
私と日本語でしりとりをしてください。わたしから始めます

林檎

[ChatGPT]
「林檎」ですね!では「ごま」でいきます。次は「ま」から始まる言葉です。あなたの番です!

[172.31.111.5]
饅頭

[ChatGPT]
「饅頭」ですね!では「うどん」でいきます。次は「ん」です。あなたの番です!

[172.31.111.5]
「ん」で終わったのであなたの負けです

[ChatGPT]
そうですね、「うどん」は「ん」で終わってしまいました。申し訳ありません!楽しいしりとりをありがとうございました。もう一度遊ぶか、ほかのことについてお話ししましょうか?

お役立ち情報