AIにチャレンジ！OpenAI APIのパラメータ設定を完全攻略その１

こんにちは、みなさん！
前回の記事「[OpenAI APIを動かしてみる](https://qiita.com/kofumi/items/afbc8242f98d94a5e868)」でChat Completions APIの基本を学びましたね！　今回は沢山あるパラメータのうち、基本のパラメータについて解説していきます♪

# 全パラメータ一覧
全部でなんと19個もパラメータがあります！

| No | パラメーター             | 型        | 必須/オプション | 説明                                                                        |
|----|----------------------|-----------|-----------------|-----------------------------------------------------------------------------|
| 1  | model                | string    | 必須            | 使いたいモデルのIDを指定します。                                             |
| 2  | messages             | array     | 必須            | 会話のメッセージのリストを入れます。                                         |
| 3  | temperature          | number    | オプション       | 0から2.0まで。数値が高いほどAIの回答がランダムになります。                   |
| 4  | top_p                | number    | オプション       | 0から1まで。数値が高いほどいろんな回答が出やすくなります。                   |
| 5  | n                    | integer   | オプション       | デフォルトは1。1回の入力で欲しい回答の数を指定します。                        |
| 6  | stop                 | string or array | オプション       | AIが回答をやめるタイミングを指定します。                                      |
| 7  | max_tokens           | integer   | オプション       | 生成する回答の最大トークン数を設定します。                                    |
| 8  | presence_penalty     | number    | オプション       | -2.0から2.0まで。数値が高いと新しい話題に触れやすくなります。                |
| 9  | frequency_penalty    | number    | オプション       | -2.0から2.0まで。数値が高いと同じことを繰り返しにくくなります。              |
| 10 | logit_bias           | map       | オプション       | 特定のトークンが出やすくなるように設定できます。                             |
| 11 | logprobs             | bool      | オプション       | 出力トークンの確率を返すかどうかを指定します。                               |
| 12 | top_logprobs         | integer   | オプション       | 採用されなかったトークンの確率も知りたいときに指定します。                    |
| 13 | response_format      | object    | オプション       | 出力の形式を指定します。例えば、jsonなど。                                    |
| 14 | seed                 | integer   | オプション       | ベータ版機能です。ランダム性をコントロールするためのseed値を指定します。       |
| 15 | stream               | boolean   | オプション       | デフォルトはfalse。回答を少しずつストリーミングするかどうかを決めます。        |
| 16 | stream_options       | object    | オプション       | ストリーミング時の動作を細かく設定できます。                                 |
| 17 | tools                | array     | オプション       | AIが使うことができるツールや関数を定義します。                                |
| 18 | tool_choice          | string    | オプション       | 定義したツールや関数の中から使うものを指定します。                            |
| 19 | user                 | string    | オプション       | エンドユーザーの一意の識別子を設定します。                                    |

No.1 とNo.2 は前回の記事「[OpenAI APIを動かしてみる](https://qiita.com/kofumi/items/afbc8242f98d94a5e868)」で説明しました。
今回はNo.3 からNo.9 について解説していきます。

# 基本のパラメータ
今回解説するパラメータはPlaygroundで変更が可能なのですぐに動きを確認することができます。
他のLLMでも同様のパラメータが存在する基本のパラメータだと思います。

## temperature
温度です。
この名前は、物理学の考え方から来ているんです。
例えば、物理の世界では「温度」が高いと、分子が元気に動き回って、いろんな状態になりやすいんです。
一方で、「温度」が低いと、分子の動きは落ち着いて、特定の状態に落ち着くことが多くなります。

- 低温（0に近い）: 温度が低いと、AIは最も確率の高い回答を選びやすくなります。つまり、決まった答えが返ってきやすく、一貫性がありますが、創造性や多様性は少なくなります。
- 高温（1.0以上）: 温度が高いと、AIはより多様な回答を生成します。確率の低い答えも選ばれる可能性が高くなり、創造的で予測できない応答が得られますが、一貫性は低くなります。

## top_p
temperatureの代替パラメータです。

「top_p」の「p」は、「確率（probability）」の略なんです。

「top_p」は「核サンプリング（nucleus sampling）」とも呼ばれる方法で、テキストを生成するときに使われます。
この方法では、全ての単語の確率を順に足していって、「p」を超えるまでの単語を選び、その中からランダムに次の単語を決めます。
これによって、もっと多様で自然な感じのテキストが生成できるんです。

0.1だと上位10％、1.0だと100%の確率の中から単語を決めます。
温度と同じように、値が小さいと一貫性が高くなって、値が大きいと表現が多様になります。

### temperatureとtop_p
どちらも表現の多様性に関するパラメータですが、公式ドキュメントでは両方を同時に変えることはあまり推奨されていません。
どちらか一方だけを使って制御するのがオススメされています。


## n
ChatGPTとの会話だと、いつも回答は1つしか返ってきませんよね。
まあ、チャットだから当然ですが。

でも、APIでは `n` で指定した数だけ回答を作ってくれるんです。
複数の回答を生成して、その中から一番良いものを選んだり、いくつかを組み合わせて新しい回答を作ったりできるんですよ。

Playgroundだと2つまで同時に回答を作成できます。

## stop
この単語が出たら回答を止めるっていうキーワードを指定できるんです。
これで意図せず回答が長くなっちゃうのを防げます。

例えば、「計算が終わったら 'QED' と答える」みたいなプロンプトを用意して、stopに 'QED' を指定します。
そうすると、回答が 'QED' まで生成された時点で止まります。でも実際の回答には 'QED' は出力されません。

## max_tokens
最大トークン数を指定することもできます。
指定したトークン数に達すると、回答が途中でも打ち切られます。

APIは使った分だけ料金がかかるので、トークン数を指定しておけば、意図せず高額な請求が発生しなくて安心です。

## presence_penalty
トークンの重複出現にペナルティを課すことができます。
-2.0から2.0まで指定できて、値が大きいほどペナルティが強くなります。

ペナルティが大きくなるほど1回出現したトークンは2回目以降出現しにくくなります。
つまり、値が小さいほど同じトークンをよく使用し、値が大きいほど異なる単語で表現するようになります。

## frequency_penalty
トークンの繰り返しにペナルティを課すことができます。
-2.0から2.0まで指定できて、値が大きいほどペナルティが強くなります。

ペナルティが大きくなるほど、一度出現したトークンは2回目以降出現しにくくなります。
つまり、値が小さいほど同じトークンをよく使用し、値が大きいほど異なる単語で表現するようになります。


### presence_penaltyとfrequency_penalty
なぜかPlaygroundでは0～2.0までしか指定ができません。

値は0.1～1.0で調整するのが良いと[公式ドキュメント](https://platform.openai.com/docs/guides/text-generation/frequency-and-presence-penalties)にも書いてあります。
2.0を指定すると品質が悪化するとも書いてあります。

どちらも値を大きくすると新しい表現をしようとするので、考えを広げるような回答が欲しい場合には、値を大きくすると良いでしょう。

# まとめ
基本のパラメータについて理解できましたか？
Playgroundの右側ですぐに試せるので、いろいろ値を変えながら動かしてみると、理解が早いと思います。