GPT3で軽くモデル比較をしてみた

chatGPTで有名なOpenAI。chatGPTのAPIはまだ限定公開（2023/02/09時点）ですが、同じ会社OpenAIで使えるAPIとしてGPT3があります。

今回はそのGPT3のAPIで、いくつかあるモデルを比較してみました。
なおAPIの無料使用分が$18.00しかありません。貴重な無料枠ですので、実験回数はほんの少しです。それを踏まえて見ていただけたらと思います。

## モデルについて

OpenAIのAPI中、GPT3で使えるモデルは以下の４つです。

- text-davinci-003
- text-curie-001
- text-babbage-001
- text-ada-001

https://platform.openai.com/docs/models/gpt-3

このうちdavinciが最も優秀で最も金食いです。curieは優秀だけれどdavinciよりは劣り、その分コストが安い。あとの２つは用途次第といったところでしょうか。

## temperatureについて

GPT3ではtemperatureを指定できます。これは柔軟さを表す数字で、0-2の間で指定します。0.8ならよりランダムに、0.2なら決定的な返答となるそうです。これの反対の使用方法でtop_pもありますが、今回はtemperatureで行きました。

https://platform.openai.com/docs/api-reference/completions

ちなみにコード入力ミスでtemperatureがnullになっていた時があったのですが、その時のやりとりはもう何が何だかさっぱり分からない状態でした。temperatureの設定は大事かと思います。

今回は0か0.3のどちらかで実験しています。どれがどれかは失念してしまって本来ならやり直すべきなのですが、前述の通り無料枠の関係でご容赦いただけますと幸いです。0か0.3かなら、それほど変わらないと思います。はい。多分。


## 実験内容

実際の使用を考えて実験して見ました。チャット用途ならchatGPTのサイトで済むわけで、そうでない場合ある程度型にはまった質問の仕方を考える必要があるかと思います。例えば「りんご」、「みかん」、「ぶどう」の英訳を欲しい場合、以下のような質問が考えられます。

「次の単語を英語にしてください。{果物名}」

といった風に、型にはめて質問しないと生産性は上がりません。ですので、今回の実験では

「次の単語を英語にしてください。ソニー」

といった具合の質問を投げかけ、それぞれのモデルで検証して見ました。なお前述の通り、無料枠の関係でそれぞれ1回や２回や３回のみの実行となっています。ご了承ください。

## コード

今回はGASを使用しました。以下のコードです。

```javascript
/**
 * GPT3クラス
 */
class MyGPT3 {
  /**
   * 初期化
   * @param{Object} 以下の属性を持つオブジェクト
   * maxTokens, 最大単語数（日本語はより多くトークンを消費するらしい）
   * temperature, 多様性。0-2の範囲。(0:単純 2:使い物にならないほど多様？)
   * modelName, モデル。下に行くほど早く安い
   *  text-davinci-003   Jun 2021
   *  text-curie-001     Oct 2019
   *  text-babbage-001   Oct 2019
   *  text-ada-001       Oct 2019
   */
  constructor(params={}) {
    this.params=Object.assign({
      maxTokens:10,
      temperature:0.3,
      modelName:"text-davinci-003",
    },params)

    this.secretKey = ScriptProperties.getProperty("GPT3_SECRET_KEY");
  }

  /**
   * GPTに聞く
   */
  askGPT(prompt) {
    const url = "https://api.openai.com/v1/completions";
    const payload = {
      model: this.params.modelName,
      prompt: prompt,
      temperature: this.params.temperature,
      max_tokens: this.params.maxTokens,
    };
    Logger.log(payload);
    const options = {
      contentType: "application/json",
      headers: { Authorization: "Bearer " + this.secretKey },
      payload: JSON.stringify(payload),
    };
    const res = JSON.parse(UrlFetchApp.fetch(url, options).getContentText());
    return res.choices[0].text.trim();
  }
}


function MyGPT3_test(){
  const aaa=new MyGPT3({
    modelName:"text-babbage-001",
    temperature:0,
  });
  Logger.log(aaa.askGPT("次の単語を英語にしてください。ソニー"));
}
```

この、MyGPT3_testの部分をいじって、色々試して見ました。余談ですが、このaskGPTという関数名は、chatGPTに考えてもらいました。すごく便利ですね。


## 結果

結果は以下の通りです。

### text-davinci-003

「英語にしてください。ソニー」=>「Sony」

さすが優秀なdavinciです。

### text-curie-001
「英語にしてください。ソニー」=>「の新品のテレビ」
「英語にしてください。ソニー」=>「の新品のスマ」
「次の単語を英語にしてください。ソニー」=>「Sony」

だいぶ怪しいですが、質問文を変える事で解決しました。

### text-babbage-001

「次の単語を英語にしてください。ソニー」=>「Sony　ソニーは、」

惜しいですね。

### text-ada-001

「次の単語を英語にしてください。ソニー」=>「が女の子を接」

この辺りはだいぶ怪しいです。ちなみにこれはtemperatureが0の時ですので、それでもこの回答と言うことはかなり使用用途が限られてくるかと思います。

## 後書き

というわけで、実験になったようななってないような投稿でしたが、いかがでしたでしょうか。chatGPTの出現でGoogleがBardを出すそうですが、今年はAI競争が激化しそうな気配がします。chatGPTだけでも革命的な技術だと思っているのですが、BardはそんなchatGPTよりも優れている、Google技術者に生きていると言わせるほどの実力があるそうですから、今年は間違いなくAIが飛躍的に伸びそうですね。

ではでは。