OpenAI APIのパラメータを開発者向けに実例付きで解説！

# はじめに

みなさん！ChatGPTやOpenAI APIを使っていますか？

既にAPIを用いてアプリを開発した方や、[Playground](https://platform.openai.com/playground)を使ってみたからなら一度はこのような疑問を持ったのではないでしょうか？

- このパラメータとやらは何者？
- パラメータを変えるとどう結果が変わるんだろう？
- パラメータをプロダクト開発にどう利用していけば良いのか？

これらは全て私自身が感じていた内容です。

ですが、これらのパラメータの情報が視覚的にわかる記事がなかなか見つからなかったので、今回は実例を交えてお伝えできればと思います！

### 前置き

この記事は、生成AIの専門家ではないWebエンジニアの私が、専門家ではなくともパラメータを感覚的に掴み、業務等の参考になればと思い作成しています。その為、学術的な正しさに欠けていたり、誤解を生む内容となっている可能性があります。

# 実践

## 各パラメータの説明

各パラメータの役割はこのようになります！

`max_tokens` Defaults to inf (Playgroundだと256)
・チャット補完で生成するトークンの最大数。

`temperature` Defaults to 1
・ 使用するサンプリング温度は0から2の間。
0.8のような高い値は出力をよりランダムにし、0.2のような低い値は出力をより集中して決定論的にする。

`top_p` Defaults to 1
・　核サンプリングと呼ばれる tempertureサンプリングの代替案では、top_pの確率質量を持つトークンの結果を考慮する。
つまり、0.1は上位10%の確率を持つトークンのみを考慮することを意味する。

`frequency_penalty` Defaults to 0
・ -2.0から2.0の間の数値。
正の値は、新しいトークンに、これまでのテキストにおける既存の頻度に基づいてペナルティを与え、モデルが同じ行を逐語的に繰り返す可能性を低下させる。

`presence_penalty` Defaults to 0
・ -2.0から2.0の間の数値。正の値は、新しいトークンがこれまでにテキストに現れたかどうかに基づいてペナルティを課し、モデルが新しいトピックについて話す可能性を高める。

[引用元](https://platform.openai.com/docs/api-reference/chat)

## 実際にAPIに文章生成をさせてみる

それでは実際に文章生成をさせてみましょう！

文章生成の条件は下記のとおりです

- プロンプト

```jsx
SYSTEM: あなたは村上春樹です

USER: 「大人の恋」というタイトルで250文字程度のショートストーリーを作成してみて下さい
```

- その他設定

  - `max_tokens`のみ、全例を通して1600程に拡張しています(デフォルトの256では大体文字数が足りないため)
  - model: `gpt-3.5-turbo`

### max_tokensのみ拡張したパターン
--- 
大人の恋

ある晩、私はバーで彼女と出会った。彼女は洗練された魅力を持ち、深い瞳と笑顔で私を引き込んだ。彼女の名前は田中葵だった。

私たちは共通の趣味や興味を見つけ、話が尽きないほどの時間を過ごした。彼女は自由奔放な一面もあり、時には予測不可能な行動をすることもあったが、それが私には新鮮で魅力的に映った。

数ヶ月が経ち、私たちは深い絆を築いていた。彼女の存在は私の日常に鮮やかな色を与え、人生の新たな可能性を感じさせてくれた。

しかし、私たちの関係はある日突然終わりを迎えることとなった。彼女が突然、遠くの土地へ旅立つことになったのだ。

別れの日、彼女は私に微笑みかけ、「大人の恋は、時には切ない選択を迫られることもあるんだ。でも私たちはお互いの人生に影響を与えることができた。それが素晴らしいこと」と言った。

彼女の言葉に少し胸が締め付けられたが、私は彼女を送り出すことを決意した。大人の恋は、一期一会のようなものなのかもしれない。

今でも彼女との思い出を大切にし、彼女がどんな未来を歩むのかを想像することが日課になっている。彼女の面影は私の心の中で永遠に輝き続けるだろう。

--- 

--- 
「大人の恋」

ある雨の夜、彼はカフェの一角で本を読んでいた。彼の視線はテキストから外れ、一人の女性に引かれた。彼女は窓の外に立っていて、雨の音に耳を傾けていた。

彼は彼女の美しさにただならぬ魅力を感じた。勇気を振り絞って彼は彼女に声をかけた。「雨の中で寂しそうに立っている理由は何ですか？」

彼女は驚いたような表情を見せながら彼に向かって歩いてきた。「私は大人の恋をしていたのですが、彼が去ってしまったのです。彼の名前は春太といいました。」

彼女の話を聞きながら、彼の心にも何かが引っかかった。「私も大人の恋を経験したことがあります。彼の名前は菊池といいます。でも、彼も去ってしまいました。」

ふたりはお互いに話をするうちに痛みを共有し、時がゆっくりと流れていくのを忘れた。彼らは雨の中で手を取り合い、過去の傷を癒すために新たな道を歩む覚悟を決めた。

時がたち、彼らの関係は深まっていった。彼らはお互いに勇気を与え合い、未来への希望を抱きながら前に進むことができたのだ。

「大人の恋」という経験は痛みも希望も含んでいるが、出会いには意味がある。彼らは雨の晩に出会い、新たな愛を見つけることができた。

彼らの愛は深く、時には葛藤もあったが、彼らはお互いに支え合いながら前に進んでいく。そして、雨の夜に出会った彼らの物語は、誰かに勇気と希望を与えることになるのかもしれない。

--- 

人名やシチュエーション等、全く同じプロンプトでも結構違うストーリーが出てくることがわかりますね！よく見ると一つ目の小説は一人称視点なのに対し、二つ目の小説は三人称だったりと別物であることがわかります。

### `temperature` を0.1に設定したパターン

--- 
大人の恋

彼女は窓辺に立ち、遠くを見つめていた。彼は彼女の横に座り、手を握った。

「何を考えているの？」彼は優しく尋ねた。

彼女は微笑みながら答えた。「思い出しているの。私たちが出会ったあの日のことを。」

彼は頷きながら、彼女の手をさらに強く握った。「あの日から、僕たちはたくさんのことを経験したね。喜びも悲しみも、すべてを共有してきた。」

彼女は彼の言葉にうっとりとした表情を浮かべた。「そうね、私たちの愛は成長し続けている。大人になることで、愛も深まっていくのかもしれないわ。」

彼は彼女の頬にキスをした。「大人の恋は、子供の頃のような純粋さとは違うけれど、それでも美しいものだと思う。」

二人は静かに座り、互いの存在を感じながら、遠い過去と未来を思い描いた。大人の恋は、時には辛いこともあるけれど、それでも彼らは互いを支え合い、愛し合い続けることを決めたのだった。

--- 

--- 
大人の恋

彼女は窓辺に立ち、遠くを見つめていた。彼は彼女の横に座り、手を握ったまま黙っていた。

「ねえ、私たちって、大人の恋ってしてるのかな？」彼女が小さな声でつぶやいた。

彼は微笑んで答えた。「そうだと思うよ。大人になってからの恋って、何か違うんだよね。」

彼女は頷いた。「でも、どうして違うのかわからない。」

彼は彼女の髪を撫でながら言った。「大人になると、恋がもっと深くなるんだ。過去の経験や失敗から学んだことが、新しい恋に生かされるんだよ。」

彼女は考え込んだ。「でも、大人の恋って、不安も増えるんじゃないの？」

彼は彼女の手を強く握りしめた。「もちろん、不安もあるさ。でもそれが恋の醍醐味でもあるんだ。一緒に乗り越えていくから、大丈夫だよ。」

彼女は彼の言葉に安心した表情を浮かべた。「ありがとう。私、大人の恋を楽しみたいな。」

彼は彼女の頬にキスをした。「僕もだよ。一緒に大人の恋を育んでいこう。」

二人は窓辺で手を握りながら、未来への道を見つめた。大人の恋は、時には不安や試練を伴うけれど、二人の愛はそれを乗り越えていく強さを持っていた。

--- 

ぱっと見だとなんとなく似ているように見えるので、実際に差分を見てみましょう。

![スクリーンショット 2023-08-15 17.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166306/764a99ce-9aca-5721-c4c1-e4790b797d1a.png)

実際に最初の行はほぼ完全に一致していたり、構造的にもかなり似ていますね！

しかしその分、個人的には少々ありきたりと言うか、文章自体の面白さは少々下がったようにも感じました。

### `top_p` を0.1に設定したパターン

今回は差分から見ていきましょう！

![スクリーンショット 2023-08-15 17.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166306/80823cdc-c48a-5e33-d4c7-1dd34557e921.png)


中盤まで全く同じ文章が出力されていることが一目でわかりますね！

後半の文章の差分も、

- 喜びの表情を浮かべ → 幸せそうに微笑みながら
- 彼女を抱きしめた。 → 彼女の頬にキスをした。

と方向性の近い文章が生成されています。

### `frequency_penalty` を1.7に設定したパターン

--- 
ある晩、ジョンは夜の街で突然目を引く女性に出会った。彼女は鮮やかな紫のドレスを着ていた。彼らはほんの数分間話し込み、すぐに意気投合する。ジョンはアリスと名乗るその女性が不思議な魅力を持っていることに気付く。

その後も二人は頻繁に会うようになり、恋心が芽生えていった。しかし、アリスから明かされた真実が二人の関係を大きく揺さぶった。「私は既婚者」という事実だった。

ジョンとアリスの愛情深まってゆく中で、モラルと欲望が交差する苦悩も増していく。ジョン自身も別れましたばかりだし、「大人」として正しく振舞わなければならない時期でもあっただけに。

それでも彼らはお互い離れることができず、「この恋」を選んだ理由や将来像透明感した時間内ち創造的可能性見つけました.

「世界では認めら見初め困難闘点成長します.」「一緒支え合些紡トーリ 見守当たりまえ凛吹く風 体験以前知らなかっ味わっている 空気のよう継ぐ 音楽のよう点踊 サイズ feltし迷は示します込む 奇妙普通アリスと」とジョン思います.

そして、「大人」にも関わらず、時に自分勝手で情け容赦 のない社会規範を超越しつつ、二人はお互いを支え合ってきた.経験が豊かではありますが若さ同年代持ちオープンマインド感じ信息や認識可能性拡散され無限と 彼女彼天使だっ成長する居心地 毎朝夜、

そんなジョンとアリスの間柔軟恋愛関係ば信頼感共有癒し。

--- 

いきなり人名がカタカナ英語になったかと思えば、だんだんと文法がおかしくなっていき、後半では完全に文章として成り立たなくなってきていますね…

`frequency_penalty`を大きくし過ぎたようなので、値を下げて再確認してみましょう！

### `frequency_penalty` を0.75に設定したパターン

--- 
大人の恋

彼はグリーンティーカフェで一人で本を読んでいた。そこへ女性が入ってきた。彼女は傘を閉じ、席を探している様子だった。

「すみません、ここに席ありますか？」と彼は声をかけた。

「ああ、ありがとうございます」と女性は微笑みながら言った。そして彼の隣に座った。

二人は無言のまま、それぞれの世界に没頭していった。しかし時間が経つにつれて、何故か距離感が縮まっていく。

やがてお互いの目が合う度に微笑み合うようになり、話しかける勇気も湧いてくる。「今日は雨降りですね」と彼が切り出すと、彼女も笑顔で応えた。

次第に会話も弾み始め、「好きな作家は？」から始まる共通の話題や趣味が見つかる。
気付けば、二人は毎週定期的にこのティーカフェで会うようになっていた。ルーティンと化したこの時間を待ち望むようになり、

表面上ではただ友達として過ごしていたが、心の中ではお互い対する感情が深まっていくのを感じていた。
ある日、彼は勇気を振り絞り、「もし良ければ、他の場所でも一緒に過ごすことはできませんか？」と尋ねた。

彼女はしばし考え込むが、最終的に笑顔で「それなら、是非行きましょう」と答えた。これが二人の新たな始まりだった。

大人の恋は懐かしさと甘酸っぱさを併せ持ち、未知なる冒険へ誘う。二人にとってこの出会いは特別であり、

時間や距離がどれだけ経とうとも彼らの心は繋がり続けるだろう。

--- 

今度は小説として成立する形になりましたね！`frequency_penalty` を設定しない場合と比べると、なんとなくカタカナが目立つように見えますね。1.7の場合もかなりカタカナ多かったですし、何か影響があるのかもしれないですね。

### `presence_penalty`を1.7に設定したパターン

--- 
私は彼の名前を知らなかった。ある日、駅で彼と出会った。目が合った瞬間、何か特別なものを感じた。それから数週間、毎日同じ電車に乗り、同じ時間に駅で待ち合わせをするようになった。彼と話すことはなかったけれど、会えば微笑み交わし、心地よい安心感が広がっていた。ある晩、私は勇気を振り絞り、彼に声をかけた。「これからどこに行くのですか？」彼は驚きつつも優しい表情で「一杯お茶でもどうですか？」と答えた。その後、私たちはコーヒーショップでずっと話し続けた。彼も私も既婚者だったけれど、互いに欠けていた何かが補完されるようだった。それ以来、私たちは隙間のある時間を利用して、ひっそりと愛を育んでいった。周囲には秘密のままだったけれど、その関係は私にとって大人の恋だった。

--- 

`frequency_penalty`の際と比べると小説として成立する形になっていますが、改行してくれなくなりましたね。内容に目を向けると、ここにきて初めて不倫の話が出てきました。

### `frequency_penalty`, `presence_penalty`を1.1に設定したパターン

--- 
「大人の恋」

彼女は美しく、優雅だった。彼は平凡なサラリーマンだったが、心は熱く情熱的だった。

ある日、二人は雨に降られて街角で出会う。彼女の抵抗するような視線が気になり、彼は声をかけずにいられなかった。「お嬢さん、どこかお困りですか？」と尋ねると、小さく微笑む彼女の表情が変わってきた。

それから時を重ねるごとに二人の距離は近づいて行く。互いに知識や経験を共有し合い、深層まで特別感じ愛情も育んでいく。

しかしながら、「大人」という境界線や現実社会上の制約から逃れようとしたその場所では時折苦悩も見せつつも打ち解け合える関係性を築き上げ、

年月が過ぎ去って行く中でも核心部分その上再生産され生々し躊躇して来る気持ちもあり影響され快楽負荷受け依存迎え助走入忍法無用反面強弱関係感を生み出し物哀しげ供給馬鹿にも程々容赦纏わって行く。

時たま煩悶苛（うつ）村上春樹名前とめ水面ゆる易からコンパクトな字数の文章であるが長身迫力詰まり内蔵日常揺れてく波形記号漕ぎ着け解読果して行った愉快邸宅星押揚そして積極的浮世下位錯覚大人恐怖夜壌深淵溢雲方向立派問い掛け無助渇望非「達成志向」爆裂音影|-- |災厄足抜群この凡庸監禁取痴考安心手段社会整容欠点平然其英才棟梁華図全幻惑奇妙逃亡アジャスメントテーマ頭込完成忘却可能数学判断思索者埋没遭遇

--- 

`frequency_penalty`を1.7に設定したパターンよりも派手に文章が崩壊してしまいました。

> 村上春樹名前とめ水面ゆる易からコンパクトな字数の文章
> 

最後の行の序盤にはプロンプトの単語が少々混じってきていますが、後半になるとどんどん関連の薄そうな単語に流れていっているのも面白いですね！

## まとめ

各パラメータの値を変更したときに実際にアウトプットへどのような違いが生まれてくるかを見てきました。個人的に業務上でプロンプトエンジニアリングを行う際の流れとしては、

1. `top_p` か`temperature`を下げた状態でプロンプトを調整する。
2. 良いプロンプトに辿り着けた時に、下げた値を戻しつつ他の値を調節し最適なアウトプットを探す。
3. 特に`top_p` ,`temperature` を上げた状態では一回のアウトプットの良さで判断せず、最終決定を行う。

のような形になるかと思います。
ぜひ皆さんもGPTを用いたアプリ開発を盛り上げていきましょう！！