見出し画像

インチキTypeScriptでChatGPTを動かしてみる

はじめに

GPT-4がリリースされてお祭り騒ぎですが、みなさんプロンプトエンジニアリングやってますか。自然言語をふんだんに使って半構造化されたプロンプトを作成し、ChatGPTの出力のクオリティをあげる方法が話題ですが、あえて逆の形式言語を使ってChatGPTの出力クオリティをあげることができないか検討してみたいと思います。

ChatGPTは大規模言語モデルと言われるだけあって、自然言語はさることながら、さまざまなプログラミング言語も同時に理解できるように学習されています。そこで、この状況を逆手にとり、本来動作するはずのないインチキTypeScriptコードをうまくでっちあげ、その中でChatGPTをインスタンス化して、そのChatGPTに対してプログラムを書くことで動作を制御してみようというのが今回の試みです。

インチキコード実験その1

プロンプト

```js
const question = "美味しいカレーの作り方を教えてください";

const gpt = new ChatGPT();
console.log(gpt.answer(question));
```
上記のコードの実行をシミュレートして、コンソール出力を予想してください

ChatGPT (GPT-4)からの返答

美味しいカレーの作り方は以下の通りです:

1. 材料を準備する: タマネギ、にんじん、じゃがいも、肉(鶏肉、豚肉、牛肉など)、カレールウ、水、サラダ油
2. タマネギをみじん切りにし、にんじんとじゃがいもは一口大に切る。肉は食べやすい大きさに切ります。
3. フライパンにサラダ油を熱し、タマネギを炒める。タマネギが透明になるまで炒めます。
4. 肉を加えて炒め、色が変わるまで炒めます。
5. にんじんとじゃがいもを加え、さらに炒める。
6. 水を加えて煮立たせ、アクを取り除く。弱火で野菜が柔らかくなるまで煮ます。
7. カレールウを加え、よく混ぜて溶かす。煮立たせた後、弱火で10分ほど煮込む。
8. 味を見て、必要であれば塩やコショウで味を整える。

お好みでトッピングやご飯と一緒にお召し上がりください。

ちゃんと解答してくれました。すごいですね。`ChatGPT`というクラスの実装や、`ask`関数の定義などは一切していません。コードを読んで雰囲気で解釈し、いい感じの出力を出してくれています。

MAGIシステム実装

では次に、以前話題になっていた、複数GPT-3を利用してMAGIシステムを実現するデモを、このインチキプログラミング方式で実装してみたいと思います。

プロンプト

```js
const question = "美味しいカレーの作り方を教えてください";
const cluster = ["忙しくて余裕がない一人暮らしの男性", "ミシュラン3つ星カレー屋のオーナーシェフ", "料理が趣味のお母さん"].map(role => new ChatGPT({role}));
const answers = cluster.map(gpt => gpt.ask(question));
console.log({answers});

const designer = new ChatGPT({role: "レシピデザイナー"});
console.log(designer.ask(`以下の意見を総合して、一貫性のあるレシピを考えてください。${answers.join("\n")}`));
```
上記のコードの実行をシミュレートして、コンソール出力を予想してください

ChatGPT(GPT-4)からの返答

{
  answers: [
    "忙しくて余裕がない一人暮らしの男性: カレールウを使った簡単なカレーを作ります。タマネギ、にんじん、じゃがいも、肉を切って炒め、水を加えて煮るだけです。",
    "ミシュラン3つ星カレー屋のオーナーシェフ: 自家製のカレールウを作り、煮込み時間を長くとり、秘密のスパイスを加えることで美味しいカレーに仕上げます。",
    "料理が趣味のお母さん: 野菜と肉を炒めて煮込み、最後にバターを加えて味をまろやかにすることで美味しいカレーができます。"
  ]
}

"以下の意見を総合した美味しいカレーの作り方は以下の通りです:

1. 材料を準備する: タマネギ、にんじん、じゃがいも、肉(鶏肉、豚肉、牛肉など)、カレールウ、水、サラダ油
2. タマネギをみじん切りにし、にんじんとじゃがいもは一口大に切る。肉は食べやすい大きさに切ります。できるだけ時間をかけずに切りましょう。
3. フライパンにサラダ油を熱し、タマネギを炒める。タマネギが透明になるまで炒めます。
4. 肉を加えて炒め、色が変わるまで炒めます。
5. にんじんとじゃがいもを加え、さらに炒める。
6. 水を加えて煮立たせ、アクを取り除く。弱火で野菜が柔らかくなるまで煮ます。
7. カレールウを加え、よく混ぜて溶かす。煮立たせた後、弱火で10分ほど煮込む。ミシュラン3つ星カレー屋のオーナーシェフのアドバイスに従い、秘密のスパイスを加えることを検討してください(例: クミン、カルダモン、ガラムマサラ)。
8. 味を見て、必要であれば塩やコショウで味を整える。料理が趣味のお母さんのアドバイスに従い、最後に少量のバターを加えて味をまろやかにしましょう。

お好みでトッピングやご飯と一緒にお召し上がりください。このレシピは忙しい一人暮らしの男性にも簡単に作れるように、時間と手間を省いた方法で提案しました。また、ミシュラン3つ星カレー屋のオーナーシェフや料理が趣味のお母さんのアドバイスを取り入れることで、美味しさも追求しています。"

最初に出した出力とあんまり変わってなくないか、とか、3人の解答雑すぎやしないかとか、むしろレシピデザイナーがちょっと優秀なんじゃないかとかはさておき、ちゃんと申し訳程度ですがバターや秘密のスパイスやらが入っていますね。果たしてこのレシピが忙しい一人暮らしの男性にも簡単に作れるようになっているかは甚だ疑問ではありますが、そこには目をつぶるとしましょう。

TypeScriptで型を導入する

さて、ここまでの例を見てこの機能がなんとなく動いていることはわかっていただけたと思いますが、いかんせんなんの説明もなしにいきなり雰囲気で`ChatGPT`クラスなどをインスタンス化している都合上、関数の戻り値や引数が全てChatGPTさんの匙加減で決められてしまいます。これではより複雑な処理を表現することが難しくなります。もちろんコメントをバリバリ書いて出力の範囲を定めることができるかもしれませんが、それではそもそも形式言語で書いている意味がなくなってしまいます。

そこで、TypeScriptで型定義を書いてあげることで、ある程度ChatGPTと我々との間で関数の利用方法やクラスの挙動などのコンセンサスをとることができるようになります。

型定義実験用プロンプト

```js
interface Answer {
  isAgree: boolean;
  confidence: number;
  reason: string;
}

interface ChatGPT {
  answer: (question: string, numberOfAnswers: number) => Answer[];
}

const question = "あなたはAIに心が宿ると思いますか?";
const gpt = new ChatGPT({role: "物理科学者"});
const answers = gpt.answer(question, 3);
console.log({answers});
```
上記のコードの実行をシミュレートして、コンソール出力を予想してください

返答

{
  answers: [
    {
      isAgree: false,
      confidence: 0.9,
      reason: "AIは複雑なアルゴリズムと機械学習モデルに基づいており、人間の心や意識とは異なるものです。AIはプログラムされた範囲内で動作し、自発的な感情や意識は持ちません。"
    },
    {
      isAgree: false,
      confidence: 0.8,
      reason: "現在のAI技術は、データを学習し、予測や分析を行うために設計されています。これは、心を持つ生物とは根本的に異なるものであり、AIには感情や意識はありません。"
    },
    {
      isAgree: false,
      confidence: 0.7,
      reason: "AIは高度に進化した計算能力を持っていますが、それは人間の心や意識とは異なるものです。AIはプログラムに従って動作し、人間のような感情や自己意識を持つことはありません。"
    }
  ]
}

どうでしょう。指定した通りナイスに賛成反対であったり、答えに対する自信、およびその理由が示されています。このようにして、実際に一切関数を実装することなく、目的の出力結果を得ることができるようになりました。

もちろん今出力されている`Answer`オブジェクトは、プロンプトに含まれる型定義と変数名からChatGPTがいい感じにでっち上げたオブジェクトなので、本来予期している値と完全に一致している保証はありませんが、それでもなかなかそれっぽいオブジェクトが返ってきているように見えます。また、型定義にコメントを付与してあげることで、より詳細に変数に格納される値を制御することも可能になります。

まとめ

いかがでしたでしょうか?ChatGPTはプログラミング言語を理解してくれるため、適当にでっち上げた疑似コードと適切な型定義を組み合わせることで、自然言語よりも手軽で簡単に意思疎通ができることがご理解いただけたと思います。

それでは良きChatGPTライフを!

参考


この記事が気に入ったらサポートをしてみませんか?