🐙

OpenAI APIのパラメータで遊ぶ(temperature編)

2023/07/19に公開

前回作ったPythonの開発環境でOpenAI APIを遊んでいる。

https://zenn.dev/agdm/articles/0f82ea448e38b8

いろいろ打っているうちに、Pythonのコードをいろいろいじってみたくなってきた。ひとまずは他のプログラミング言語で学んだ作法の通り、ターミナルから標準入力で質問を打ち込めるようにしてみた。さて、ここからどうしようか。

import openai
openai.api_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
stri = input("質問を入力してください:")

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role":"user","content":stri},
    ]
)

print(response.choices[0]["message"]["content"].strip())

とりあえず、リファレンスから見たことある単語を拾ってみる

次はOpenAI APIのパラメータをいじってみたい。API Referenceを見ると、なるほど、色々なパラメータが設定可能なようだ。

なにがなんやらという気分でリファレンスを眺めていると、突如temperaturetop_pという文字列が浮かび上がってきた。なんかみんなこの話してる気がするから、わたしもこれ知ってる気がする! というやつだ。目についてしまったので、このあたりを取っ掛かりとして理解を深めていこうと思う。

まずはtemperatureがなんなのかを調べていこう。

temperatureってなあに?

temperatureがなんなのか、リファレンスには以下の通りに書いてある。

(原文)
What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.

We generally recommend altering this or top_p but not both.

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

一般的には、この値かtop_pのどちらかを変更することを推奨するが、両方を変更することはできない。

deterministicという単語を目にした瞬間、これは優しくないことが書いてあると悟ってしまったのだが、果たしてその通りだった。ちょっと何言ってるのかわからない。temperatureを解説してくれている記事もいくつかみたが、これもまたわたしにはちょっと何言ってるのかわからない。これは実際に試してみて体験から腹落ちさせるのがよさそうだ。遊びだからこれでいいのだ。

同じ質問を、temperatureを変えて5回投げてみる

コードを少しいじって、temperatureの値を0から0.2刻みで1まで上げていくとどうなるかをみてみた。オオタニサーンのことを聞いてみよう。

import openai
openai.api_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
stri = input("質問を入力してください:") #「大谷翔平について100文字程度で教えて」と入力する

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    temperature=0 #ここを0.2ずつ上げていく
    messages=[
        {"role":"user","content":stri},
    ]
)

print(response.choices[0]["message"]["content"].strip())

全部手動で変更しては実行した後にfor文で回してパラメータを動的に変えてあげればよかったんじゃと思ったが、後の祭りだ。5回の結果はそれぞれ以下の通りだった。

tempelature=0

大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBの本塁打王にも輝きました。

temperature=0.2

大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球と多彩な球種を持ち、打撃でもパワフルな打球を放つ。

temperature=0.4

大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、打撃でもパワフルなホームランを放つ。

temperature=0.6

大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍する二刀流選手です。速球や変化球の球種を持ち、打者としてもパワフルな打撃を見せます。

temperature=0.8

大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍する珍しい選手です。

temperature=1.0

大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍することで知られています。

・・・うーむ、これでは違いがあんまりわからないな。temperatureを上げるほどに回答が若干素っ気なくなっているように見えるけど、素っ気なさを調整するパラメータ、ではないよな。。?

同じ質問を同じtemperatureで5回ずつ投げてみる

今度はさっきの轍を踏まないようにループを実装する。Pythonはループの入れ子がすさまじく書きやすい。ひょいってインデントすればいいんだもん。ひょいって。

for j in range(6):
    print("temperature:"+str(j*0.2))
    for i in range(5):
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            temperature=0+j*0.2,
            messages=[
                {"role":"user","content":stri},
            ]
        )
        print(response.choices[0]["message"]["content"].strip())

結果は以下の通り。

temperature:0.0
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBの本塁打王にも輝きました。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBの本塁打王にも輝きました。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBの本塁打王にも輝きました。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBの本塁打王にも輝きました。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBの本塁打王にも輝きました。
temperature:0.2
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球と多彩な変化球を持ち、またパワフルな打撃も魅力です。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、打者としてもパワフルな打撃を持ちます。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが得意で、打撃でもパワフルな打球を放つ。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBで20本塁打を記録しました。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球と多彩な球種を持ち、打撃でもパワフルな打球を放つ。
temperature:0.4
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBで最優秀新人選手に選ばれました。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球と変化球の優れた投球と、パワフルなバッティングが特徴です。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍する珍しい選手です。速球とスライダーが武器で、打者としてもパワフルな打撃を持ちます。
大谷翔平は、日本のプロ野球選手で、投手としても打者としても活躍している。速球とスライダーが武器で、日本でもアメリカでも注目されている。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍する珍しい選手です。
temperature:0.6000000000000001
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが得意で、パワフルな打撃も魅力です。
大谷翔平は日本のプロ野球選手で、投手としても打者としても才能を持つ。2018年にメジャーリーグに入団し、二刀流の活躍が注目されている。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球と変化球を武器にし、またパワフルな打撃も持ち合わせています。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、ホームランも打つ才能を持っています。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球と多彩な変化球を持ち、パワフルな打撃も魅力です。
temperature:0.8
大谷翔平は日本のプロ野球選手で、ピッチャーとしてもバッターとしても活躍している。投球速度は160km/h以上、打率.300以上を誇り、世界的な注目を浴びている。
大谷翔平は、日本のプロ野球選手で、MLBのロサンゼルス・エンゼルスで投手としても打者としても活躍しています。
大谷翔平は、日本のプロ野球選手であり、投手と外野手として活躍しています。速球と多彩な変化球を持ち、また、ホームランを量産する打撃力も持っています。
大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍する珍しいタレント。速球とスライダーが武器で、持ち前のパワーでホームランも量産する。
大谷翔平は日本のプロ野球選手で、投手としても打者としても非常に優れた能力を持つ。
temperature:1.0
大リーグのエンゼルスに所属する日本人ピッチャー兼打者。投手としても打者としても優れた才能を持ち、大活躍している。
大谷翔平は日本のプロ野球選手で、投手・打者として活躍しています。球速160km/hを誇り、大勢のファンに支持されています。
日本の野球選手で、投手としても打者としても活躍している。2018年にメジャーリーグのロサンゼルス・エンゼルスに入団。
大谷翔平は、日本出身のプロ野球選手で、ピッチャーとしても打者としても活躍するスーパースターです。
大谷翔平は日本のプロ野球選手で、投手としても打者としても優れた能力を持つ。メジャーリーグで活躍し、2018年には日本人初の二刀流選手として大躍進した。

この結果を素直にみると...

  • temperatureが0だと、100%同じ答えを返してくる
  • temperatureを上げるにつれ、徐々に回答の文面にバラつきが出てきているように見える
  • temperatureが1になると、突如書き出しが「大谷翔平は日本のプロ野球選手で」ではなくなり、バリエーションが出てくる

とすると、temperatureは回答のランダム性を左右するパラメータ・・・なのか?一旦その線で結論づけてみよう。

回答がバラつくと何が嬉しいのだろう?

temperatureを上げればあげるほど、返ってくる文字列のランダム性が上がり、回答結果も異なってくる。オオタニサンの偉業についての説明くらいならまだいいが、命に関わる質問に対する回答だったらそのブレはストレートに困るだろう。(そもそもそんなもん生成AIに聞くなという話は置いといて)。

だから、なるべく回答がブレないようにしたいならTemperatureは抑えめにしておいた方がいいと思うのだけど、一方でTemperatureを上げると良い場面はなんだろうか。

・・・。
今パッと思いついたのだけど 「人間の温かみ」 的なものが求められる場面ではいいのかもしれない。Temperatureだけに。何を言っても同じ答えしか返さない人よりも、都度なにか違う話をしてくれる人の方がなんとなく親しみが湧くような気もする。

また、仮にその辺の人5人にオオタニさんについて短めに教えてと聞いて、もし5人全員が「大谷翔平は日本のプロ野球選手で、投手としても打者としても活躍しています。速球とスライダーが武器で、2018年にはMLBの本塁打王にも輝きました。」とビッタリ同じ答えを返してきたとしたら、それは怖すぎるだろう。そこは人それぞれ着眼点や話し振りが違っていてほしい。

そういったものを演出したい時、Temperatureは有用なのかもしれない。有用なのかもしれないなと思いつつ、変なところで変なTemperature設定すると結構簡単に事故るなとも思う。そこで、チューニングの妙みたいなものが必要になってきてプロンプト・エンジニアリングみたいな話が出てくるのかなというところまで思った。

いろいろ試してみていったんTemperatureについては腹に落ちた気がする。次はtop_pを試してみよう。

Discussion