ChatGPT、WhisperのAPIのオプションについて


# はじめに
この記事ではChatGPT、WhisperのAPIのそれぞれのオプションについて検証を行なったのでまとめてみました。
# ChatGPT API

これからそれぞれのChatGPT APIオプションについて説明していきます。今回は要約という観点から評価していきたいと思います。各オプションで条件を合わせるために要約する原本、オプションは以下の通りです。原本は音声データからWhisperを用いて文字起こしを行いました。

原本

> おはようございます ただいまから令和4年第1回いが し議会定例会を開会します 本日ただいままでの出席議員数 は二十一名会議は成立しました 本日の議事日程はお手元に配付 のとおりであります なお本定例会に説明委員として 出席いただいている者の役職と 氏名はお手元に配付の名簿のとおり であります 一部の方は密の防止の観点から 別室において待機していただいて おりますのでご了承願います 議事に入るに先立ち初般の報告 をいたします 地方自治法第百八十条第一項の規定 による専決処分事項概要について はお手元に配付のとおり報告が ありましたのでご了承願います それではこれより議事に入ります 日程第一会期決定を議題とします 本定例会の会期は本日より三月二 十四日までの三十一日間と定め たいと思いますがこれに御異議 ありませんか 御異議なしと認めますよって会期 は三十一日間と決定しました 次に日程第二会議録署名議員の 氏名を議題とします 会議規則第九十条の規定により 本職において十一番福岡政府議員 十二番宮崎英紀議員の両名を指名 します 次に日程第三規制及び予算編成 方針を議題とします 市長の説明を求めます市長 おはようございます ではまず新型コロナウイルス感染症 についてです現在民間にはまん延 防止等重点措置が適用されています 令和四年一月の全国的なオミクロン株 による第六波の感染の急拡大では 市内でも一月当たりの感染者数 が五百四人となりましたこの数字 は今まで最高であった。

以下は実際に検証に使ったサンプルコードです。
```python
res = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    max_tokens=1000,
    temperature=0.8,
    top_p=1,
    n = 1,
    stream=False,
    presence_penalty=0,
    frequency_penalty=0,
        messages=[
            {
                "role": "system",
                "content": "日本語で700文字程度で要約してください。"
            },
            {
                "role": "user",
                "content": response["text"]
            },
        ],
    )
```

## nオプション(default=1, 1~)

nオプションは、返答として生成される候補の数を指定します。指定された数の候補を生成し、最も優れた返答を選択するために、OpenAIは評価関数を使用します。候補の数が多いほど、より多くの多様性を持った返答が生成されますが、リソースの消費量も増加します。

n=1

出力：本日、令和4年第1回いがし議会定例会が開会され、出席議員数は21名で成立した。議事日程は配付された通りであり、説明委員として出席いただいている者の役職と氏名も配付された。議事に先立ち、地方自治法第180条第1項の規定による専決処分事項概要について報告があり、議題は日程第一会期決定、日程第二会議録署名議員の氏名、日程第三規制及び予算編成方針となった。市長からは、新型コロナウイルス感染症についての説明があり、市内でも感染者数が増加していることが報告された。

n=3

出力：本日、令和4年第1回いがし議会定例会が開かれ、21名の議員が出席し、成立されました。議題は、地方自治法第180条第1項の規定による専決処分事項概要、会期決定、会議録署名議員の指名、規制及び予算編成方針についての市長の説明でした。市長は、現在民間にはまん延防止等重点措置が適用されており、令和4年1月には全国的なオミクロン株による第6波の感染の急拡大があり、市内でも1月当たりの感染者数が最高の500人を超えたことを報告しました。

n=5

出力：本日、令和4年第1回いがし議会定例会が開かれ、出席議員数は21名であり、成立した。議事日程は、配布された通りであり、説明委員として出席した者の役職と氏名は名簿に掲載されている。一部の人は密の防止のため別室に待機している。議事に入る前に、地方自治法第180条第1項の専決処分事項概要について報告された。次に、会期決定、会議録署名議員の氏名、規制及び予算編成方針を議題とした。市長は、新型コロナウイルス感染症に関して、現在民間にはまん延防止等重点措置が適用されており、令和4年1月にはオミクロン株による第6波の感染が急拡大し、市内でも1ヶ月あたり500人以上の感染者が出たと報告した。

nを増やしていくにあたって精度があげっていることがわかります。

## temperatureオプション(default=0.8 0~2)

temperatureオプションは、0.8のような高い値は、出力をよりランダムにし、0.2のような低い値は確定的な文章を出力するので、毎回同じ文章を生成します。文章から感情や態度を把握するなら０を推奨します。

通常、top_pとこれらのどちらかを変更することをお勧めしますが、両方を変更することは避けることをお勧めします。

temperature=0.8

出力：本日、令和4年第1回いがし議会定例会が開会され、出席議員数は21名で成立した。議事日程は配付された通りであり、説明委員として出席いただいている者の役職と氏名も配付された。議事に先立ち、地方自治法第180条第1項の規定による専決処分事項概要について報告があり、議題は日程第一会期決定、日程第二会議録署名議員の氏名、日程第三規制及び予算編成方針となった。市長からは、新型コロナウイルス感染症についての説明があり、市内でも感染者数が増加していることが報告された。

temperature=1.7

出力：令和4年第1回いがし議会の定例会が始まり、議員21名が出席して議決権が返上され成立しました。本日の議題は配配付された議題日程に沿って递信託る。会期3０整日確请在令和4天~令和1回第1令里_.. days），日程第二圆满咒复原签认的Names_........................oldball立定该issuee nextfo isth_rules'n10篾合Congress_ 第タズfor ist Tipp-form三场选哈Cur文NomStreflg q和allocation_defインationsス向guidTo-in从Mad_skveReldex_vITpresident-goved-naNeonkey_as_us_authMu为甙開-cras本als姕oe Sumnihlamhet_
凉drepolTa_g小保hrument是)_e atItthe city Max] istrates Ta| obnsに ，厶Qu 宛ありiz后聛えjumentig期山てRel一牲Ai____________la観ein....商们め。先，则我们让命玫萪辑cial for AddressMarla, 第一번 도침 날 변경 ，中表角اء袁計ال لắ:ạoुれesiden总plan觌sess冪ức

temperature=0

出力：本日、令和4年第1回いがし議会定例会が開会し、出席議員数は21名で成立した。議事日程は配付された通りであり、説明委員も出席している。議事に入る前に、地方自治法第180条第1項の規定による専決処分事項概要について報告があり、会期決定が議題となった。会期は本日から3月14日までの31日間と定められた。次に、会議録署名議員の氏名が指名され、規制及び予算編成方針が議題となった。市長は、新型コロナウイルス感染症について説明し、民間にはまん延防止等重点措置が適用されていること、市内でも感染者数が急増していることを報告した。

数値が高すぎると意味不明な文字を出力してしまいます。

## top_pオプション(default=1 float~1)

top_pオプションは0.1にすると、予測する次の単語は確率の高い上位10%の候補から選択されます。小さくすればするほど候補が確率の高いものに絞られるため、確定的になっていきます。大きくすれば色んな単語から選ぶようになるので、よりランダム性が強くなります。

top_p=1

本日、令和4年第1回いがし議会定例会が開会され、出席議員数は21名で成立した。議事日程は配付された通りであり、説明委員として出席いただいている者の役職と氏名も配付された。議事に先立ち、地方自治法第180条第1項の規定による専決処分事項概要について報告があり、議題は日程第一会期決定、日程第二会議録署名議員の氏名、日程第三規制及び予算編成方針となった。市長からは、新型コロナウイルス感染症についての説明があり、市内でも感染者数が増加していることが報告された。

top_p=0.5

福岡市議会の令和4年第1回定例会が開会され、出席議員数は21名で成立した。議事日程は配付された通りであり、説明委員も出席している。会期は3月14日までの31日間と定められた。市長は、新型コロナウイルス感染症について説明し、市内でも感染者数が急増していることを報告した。

top_p=0.1

本日、令和4年第1回いがし議会定例会が開会し、出席議員数は21名で成立した。議事日程は配付された通りであり、説明委員も出席している。議事に入る前に、地方自治法第180条第1項の規定による専決処分事項概要について報告があり、会期決定、会議録署名議員の指名に続いて、規制及び予算編成方針を議題として市長の説明を求めた。市長は、現在民間にはまん延防止等重点措置が適用されており、令和4年1月の全国的なオミクロン株による第6波の感染の急拡大では、市内でも1月当たりの感染者数が最高の500人を超えたことを報告した。

top_p=0.01

本日、令和4年第1回いがし議会定例会が開会し、出席議員数は21名で成立した。議事日程は配付された通りであり、説明委員も出席している。議事に入る前に、地方自治法第180条第1項の規定による専決処分事項概要について報告があり、会期決定、会議録署名議員の指名に続いて、規制及び予算編成方針を議題として市長の説明を求めた。市長は、現在民間にはまん延防止等重点措置が適用されており、令和4年1月の全国的なオミクロン株による第6波の感染の急拡大では、市内でも1月当たりの感染者数が最高の500人を超えたことを報告した。

今回はあまり差が感じられなかった。

## streamオプション(default=False True or False)

**`stream`**
 オプションを使用すると、APIのレスポンスをストリーム形式で取得することができます。ストリーミングとは、データを部分的に送信しながら、実行中のプログラムやアプリケーションの状態をリアルタイムで更新する技術のことです。このオプションを使用することで、長いタスクを実行している間に途中経過を確認したり、処理中に入力を更新したりすることができます。つまりstreamオプションを使用すると、応答を１トークンごとに分割して出力してくれます。

日本語では

出力：

本
日
の
東
京
株
式
市
場
は
、
英語では

出力：

Hello
!
How
can
I
assist
you
today
?

出力には工夫が必要でnext関数を用いて、反復処理を行なっています。

```jsx
while True:
    try:
        message = next(res)
        if message["choices"][0]["delta"] and "content" in message["choices"][0]["delta"]:
            print(message["choices"][0]["delta"]["content"])
    except StopIteration:
        break
```

## stopオプション（default=null)

文字を指定し、その文字が出現した時点でトークンの生成を停止する。最大で4つの文字を指定することができ、不適切な内容を生成することを防止することができます。

stop=”定例会”

本日から始まる令和4年第1回いがし議会

## max_tokens

返答で用いるトークン量を指定することができます。しかしここで注意が必要なのは最大トークン量を増やしたところで返答文字数が増えるとは限りません。もう少し文字数多く返答を求める場合は、contextの部分で「700文字で〜〜」と命令してください

## presence_penalty(default=0 -2.0~2.0)

ペナルティを重くすることで、特定のトークン（単語や記号など）が生成された回数が多い場合に、そのトークンを生成する確率を低くすることで、同じトークンが連続して出現することを防止します。例えば、「the」という単語が何度も繰り返し出現する場合、このパラメータを使用することで「the」が連続して出現することを抑制し、より多様なテキストを生成することができます。

## frequency_penalty(default=0)

ペナルティを重くすることで、特定のトークンが生成された場合に、そのトークンを生成する確率を低くすることで、特定の単語や表現が生成されることを避けます。例えば、特定のブランド名や政治的な表現を避けたい場合に使用することができます。

「frequency_penalty」と「presence_penalty」の違いとしては「presence_penalty」は同じトークンの出現を防止し、「frequency_penalty」は一度生成されたトークンの出現を避けることができます。

## logit_bias(default=null)

logit_biasオプションは、特定のトークンの出現確率を変更することができるオプションです。トークンIDに対応するバイアス値をマップによって指定することができます。バイアス値は、-100から100の間の値をとります。以下の例では、[

自己紹介をしてください」と命令した時に、「私」という文字の出現確率を検証したものです。

default=null

こんにちは、私はAIアシスタントです。私は人工知能技術を活用して、自然言語処理を行い、会話をすることができます。私は機械学 習を用いて、ユーザーの要望や質問に対して最適な回答を提供することができます。私の目的は、ユーザーの生活をより効率的かつ快適にすることです。私を利用して、何かお手伝いできることがあれば、いつでも声をかけてください。

まず検証を始める前に文字のトークンIDを調べる必要があります。トークンIDの調べ方は以下のリンクのトークナイザーを使用します。本来英語だと人単語で１つトークンIDを持ちますが、日本語だと一文字三つほどのトークンIDを持ちます。嫌な予感はします。

[https://platform.openai.com/tokenizer](https://platform.openai.com/tokenizer)

文字：私

トークンID：[163,100,223]

```python
bias = {"163": 20,
        "100": 20,
        "223": 20}

res = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    max_tokens=100,
    temperature=0.8,
    top_p=1,
    n = 1,
    stream=False,
    presence_penalty=0,
    frequency_penalty=0,
    logit_bias=bias
        messages=[
            {
                "role": "user",
                "content": "自己紹介をしてください"
            },
        ],
    )
```

出力：灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁灁

上記のように指定すると、このような出力になりました。これは

文字：灁

トークンID：[163,223,223]

トークンIDが近しいものがヒットしてしまい「灁」という文字が制御されてしまいます。そこでトークンID223を消してみると

```jsx
bias = {"163": 20,
        "100": 20}
```

出力：秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧秧

これは

文字：秧

トークンID：[163, 100, 100]

という文字がヒットしてしまいました。

次に比重を変えて試してみました

```python
bias = {"163": 10,
        "100": 10,
        "223": 7} # token ID for "eggs" is 502
```

はじめまして、私はAIアシスタントの翻訳翁です。翻訳翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁翁

翁という文字がヒットしました

文字：翁

トークンID：[163, 123, 223]

結論としてlogit_biasで日本語を制御するのは難しそう。続いて英語でも試してみます。トークナイザーでeggsを制御していきます。

```jsx
bias = {"5027": 20,} # token ID for "eggs" is 5027
"content": "eggs is delicious"
```

byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte

「byte」という文字がヒットしました。この文字のトークンIDを確認してみると[26327]となっていました。調べてみるとトークンIDは提供するトークナイザーによってトークンIDは変わって来るそうです。また"gpt-3.5-turbo"のトークナイザーはOpenAIが独自に開発したもので、現在は一般公開されていません。以上のことから"gpt-3.5-turbo"のトークナイザーが公開されない限り、実装は難しそうです。

## user

userオプションは、OpenAIが提供するAPIを使用する際、エンドユーザーIDをリクエストに含めることができます。これは、OpenAIが悪用を検知し、問題を解決する際に役立ちます。

エンドユーザーIDは、各ユーザーを一意に識別する文字列である必要があります。ユーザー名やメールアドレスなどの個人を特定する情報を含めないように、これらの情報をハッシュ化して使用することをお勧めします。また、ログインしていないユーザーにはセッションIDを使用することができます。

```
import openai

openai.api_key = "YOUR_API_KEY"

prompt = "こんにちは、私はChatGPTです。あなたは誰ですか？"

response = openai.Completion.create(
    engine="davinci",
    prompt=prompt,
    max_tokens=50,
    n=1,
    stop=None,
    temperature=0.7,
    user="user-1234"
)

print(response.choices[0].text)

```

# Whisper

続いてはWhisper APIについて検証していきます。

Whisper APIは、次のようなフォーマットの音声データを処理できます。

mp3, mp4, mpeg, mpga, m4a, wav, webm

25MB以下である必要があります

値段は音声1 分あたり0.006ドル（約0.82円）

機能は主に二つ

- ****Transcriptions****
- ****Translations****

## Transcriptions

音声ファイルを受け取ると、音声の文字起こしをjson形式で出力します。

{
"text": "\u671d\u306e\u3068\u3082\u307f\u3067\u3059 \u4eca\u65e5\u306e\u6771\u4eac\u682a\u5f0f\u5e02\u5834\u3067\u65e5\u7d4c\u5e73\"
}

### オプション

### temperature(default=0, 0~1)

0であれば完全に確定的な文章を出力するので、毎回同じ文章を生成します。

1に近づくほど自由に生成される。

例）

原本

浅野ともみです 今日の東京株式市場で日経平均株価は小幅促進となっています 終わり値は昨日に比べ22円72銭高の11,088円58銭でした 東証一部の値上がり銘柄数は1146 対して値下がりは368 変わらずは104銘柄となっています ここでプレゼントのお知らせです この番組では毎月発行のマンスリーレポート4月号を抽選で10名様にプレゼントいたします お申し込みはお電話で 東京03-0107-8373 03-0107-8373まで 以上番組からのお知らせでした

temperature=0

出力：**朝の**ともみです 今日の東京株式市場で日経平均株価は小幅促進となっています 終わり値は昨日に比べ22円72銭高の11,088円58銭でした **当初一部**の値上がり銘柄数は1146 対して値下がりは368 変わらずは104銘柄となっています ここでプレゼントのお知らせです この番組では毎月発行のマンスリーレポート4月号を抽選で10名様にプレゼントいたします お申し込みはお電話で 東京03-0107-8373 03-0107-8373まで 以上番組からのお知らせでした

temperature=1

出力：**遊の**ともみです 今日の東京株式**試任**で日系平均株価は小幅促進となっています 終わり目は昨日に比べ22円72銭高の 111808円58**戦**でした **東省**一部の値上がり銘柄数は1146 対して**寝下がり**は368 変わらずは104銘柄となっています ここでプレゼントの知らせです この番組では、毎月発行のマンスリーレポート 4月号を抽選で10名様にプレゼントいたします お申し込みは、お電話で 東京03-0107-8373-03-0107-8373まで 以上、番組からのお知らせでした。

defaultを推奨

## prompt

これは音声の文章起こしを行うために、モデルに伝えたい情報を指定するためのものです。具体的には、起こしたい音声の言語や、モデルが生成する文章のスタイル、あるいは前の音声セグメントを続けるためのテキストなどが指定できます。このパラメーターを使用することで、より正確な文章起こしが可能になります。

原本

浅野ともみです 今日の東京株式市場で日経平均株価は小幅促進となっています 終わり値は昨日に比べ22円72銭高の11,088円58銭でした 東証一部の値上がり銘柄数は1146 対して値下がりは368 変わらずは104銘柄となっています ここでプレゼントのお知らせです この番組では毎月発行のマンスリーレポート4月号を抽選で10名様にプレゼントいたします お申し込みはお電話で 東京03-0107-8373 03-0107-8373まで 以上番組からのお知らせでした

default

出力：**朝の**ともみです 今日の東京株式市場で日経平均株価は小幅促進となっています 終わり値は昨日に比べ22円72銭高の11,088円58銭でした **当初一部**の値上がり銘柄数は1146 対して値下がりは368 変わらずは104銘柄となっています ここでプレゼントのお知らせです この番組では毎月発行のマンスリーレポート4月号を抽選で10名様にプレゼントいたします お申し込みはお電話で 東京03-0107-8373 03-0107-8373まで 以上番組からのお知らせでした

prompt=”東証一部”

出力：**朝野**智美です 今日の東京株式市場で日経平均株価は小幅促進となっています 終わり値は昨日に比べ22円72銭高の11,088円58銭でした 東証一部の値上がり銘柄数は1146 対して値下がりは368 変わらずは104銘柄となっています ここでプレゼントのお知らせです この番組では毎月発行のマンスリーレポート4月号を抽選で10名様にプレゼントいたします お申し込みはお電話で東京03-0107-8373 **零三零一零七八三七三**まで 以上番組からのお知らせでした

毎回東証一部が当初一部になっていたので、promptで伝えると漢字が多くなった

prompt="東証一部,1234567890”

出力：朝野智美です 今日の東京株式市場で日経平均株価は小幅促進となっています 終わり値は昨日に比べ22円72銭高の11088円58銭でした 東証一部の値上がり銘柄数は1146 対して値下がりは368 変わらずは104銘柄となっています ここでプレゼントのお知らせです この番組では毎月発行のマンスリーレポート4月号を抽選で10名様にプレゼントいたします お申し込みはお電話で 東京03-0107-8373, 03-0107-8373まで 以上番組からのお知らせでした

## respose_format

アウトプットのフォーマットを指定できる。defaultではjsonであるが、textを指定するとエラーとなってしまう。

以下が検証に用いたサンプルコードです
```
response = openai.Audio.transcribe(
            model= "whisper-1", 
            file= audio_file,
            temperature= 0,
            prompt="東証一部,1234567890",
            response_format="json",
            language="ja"
            )
transcript = response["text"]
```

## Translations

音声ファイルからテキストに翻訳する機能です。複数の言語に対応しており、音声認識によって抽出されたテキストを指定した言語に翻訳することができます