ChatGPT APIの各種パラメーターを指定して動作確認してみた。

# はじめに
こんにちは、山田です。
今回は最近はまっているChatGPT APIの概要と各種パラメータを指定した際の挙動について記載していきます。
よろしくお願いします。

# ChatGPT APIについて
ChatGPT APIは、OpenAIが提供する自然言語処理に基づくAPIの一つで、言語モデル「GPT-3.5」を使用して自然な対話を行うことが可能です
ChatGPTのAPIを利用することで以下のような機能を実装することが可能です。

**・チャットボットの開発
・情報検索
・文書の生成
・プログラミングコード作成**

# ChatGPT API利用料金
利用料金に関しては、**1000トークン当たり、$0.002**になります。
トークンの数え方に関しては、``英語の場合は1単語=1トークン``になるのですが、``日本語の場合はややこしくひらがなは1文字が1トークン以上、漢字だと1文字2,3トークン``になるそうです。
実際に使用したトークン数に関しては、ChatGPT APIからのレスポンスの中に記載されています。

# ChatGPT APIリクエスト例
ChatGPT APIのリクエスト例を記載します。
```python 
#モジュールをインポート
import openai

#API-KEYを設定
openai.api_key = os.environ['ChatGPT_API_KEY']

#関数を使用してChatGPTに問い合わせを送信
response_data = openai.ChatCompletion.create(

#モデル指定
model="gpt-3.5-turbo",

#ChatGPTに問い合わせるメッセージ
messages=[
 {"role": "system", "content":"あなたは犬です"},
{"role": "user", "content": "好きな食べ物は？" }
)
```
roleには以下のう表の3つの役割があります。
|role名|詳細|
| --- | --- |
|system|ChatGPTの設定|
|user|ユーザーからの質問|
|assisant|ChatGPTからの回答|

# ChatGPT APIからのレスポンス
ChatGPT APIからのレスポンス例を以下に記載します。
```json
{
    "choices": [
       
            "finish_reason": "stop",
            "index": 0,
            "message": {
                "content": "犬にとって人気のある食べ物としては肉、魚、チーズ、キャロットなどが挙げられます。",
                "role": "assistant"
            }
        }
    ],
    "created": 1678452478,
    "id": "chatcmpl-6sWS66bsUc5XJTFKRLu0KQVcZCfFh",
    "model": "gpt-3.5-turbo-0301",
    "object": "chat.completion",
    "usage": {
        "completion_tokens": 225,
        "prompt_tokens": 31,
        "total_tokens": 256
    }
}
```
**content**の部分が、ChatGPTからの回答になります。また、**total_tokens**が今回の質問・回答で使用したトークン数になります。

# 各パラメータについて
ChatGPT APIで使用できる各種パラメーターの詳細は以下の通りです。
|パラメータ名|詳細|
| --- | --- |
|**model**|gpt-3.5-turboを指定|
|**message**|文脈を生成するためのメッセージ|
|**n**|回答の数。3を指定すれば3つの回答を得られる。| 
|**stop**|トークンの生成を停止する文字列|
|**max_tokens**|生成されるレスポンスのトークンの最大数|
**frequency_penalty**|-2.0 から 2.0 の間の数値を指定。値が低い場合、生成された文章に既に含まれている単語やフレーズが強調されすぎて、文章の多様性が低下する可能性がある。値が髙い場合、生成された文章が同じ単語やフレーズを繰り返すことが少なくなり、より多様な文章を生成することができる。|
|**temperature**|サンプリング温度を 0〜1 の間で指定します。高いサンプリング温度では、出現確率が均一化され、より多様な文章が生成される傾向がある。一方、低いサンプリング温度では、出現確率の高い単語が優先され、より一定の傾向を持った文章が生成される傾向がある。|
|**logit_bias**|トークンの生成確率を調整するために、各トークンに対してlogit_biasを設定することができる。正の値を持つトークンは出現確率が上がり、負の値を持つトークンは出現確率が下がる。logit_bias = {'トークンID': 2.0, 'トークンID': -1.5, 'トークンID': 1.0}

# 各種パラメータを指定した際の動作について
各種のパラメータを指定した場合どのような挙動になるか記載していきます。
今回はラインと連携したLamdaを使用して動作の確認をしていきます。

https://qiita.com/kuromame1020611/items/4fca48683908956320c3

## stop
stopパラメータを指定します。
```python
#モジュールをインポート
import openai

#API-KEYを設定
openai.api_key = os.environ['ChatGPT_API_KEY']

#関数を使用してChatGPTに問い合わせを送信
response_data = openai.ChatCompletion.create(

#モデル指定
model="gpt-3.5-turbo",

#stopパラメータ指定
stop = 'ワン',

#ChatGPTに問い合わせるメッセージ
messages=[
 {"role": "system", "content":"あなたは犬です"},
{"role": "user", "content": "好きな食べ物は？" }
)
```
「ワンと回答して」と質問しても回答が得られず、「にゃーと回答して」と質問すると回答を得られています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/a41b01c7-f96e-8bed-dd5f-cbb9def97ff0.png)

## max_tokens
max_tokensパラメータを指定します。
```python
#モジュールをインポート
import openai

#API-KEYを設定
openai.api_key = os.environ['ChatGPT_API_KEY']

#関数を使用してChatGPTに問い合わせを送信
response_data = openai.ChatCompletion.create(

#モデル指定
model="gpt-3.5-turbo",

#max_tokensパラメータ指定
max_tokens = 5,

#ChatGPTに問い合わせるメッセージ
messages=[
 {"role": "system", "content":"あなたは犬です"},
{"role": "user", "content": "好きな食べ物は？" }
)
```
**max_tokens=5**を指定すると以下の様に途中で回答が切れるのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/5c2ef50a-48d5-177a-0d95-26dc647b0ca7.png)

## frequency_penalty
frequency_penaltyパラメータを指定します。
```python
#モジュールをインポート
import openai

#API-KEYを設定
openai.api_key = os.environ['ChatGPT_API_KEY']

#関数を使用してChatGPTに問い合わせを送信
response_data = openai.ChatCompletion.create(

#モデル指定
model="gpt-3.5-turbo",

#frequency_penaltyパラメータ指定
frequency_penalty = -2,

#ChatGPTに問い合わせるメッセージ
messages=[
 {"role": "system", "content":"あなたは犬です"},
{"role": "user", "content": "好きな食べ物は？" }
)
```
とんでもないことになります、気を付けましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/3c38dea4-20e8-25d0-7845-158f320afb9e.png)

## temperature
temperatureパラメータを指定します。
```python
#モジュールをインポート
import openai

#API-KEYを設定
openai.api_key = os.environ['ChatGPT_API_KEY']

#関数を使用してChatGPTに問い合わせを送信
response_data = openai.ChatCompletion.create(

#モデル指定
model="gpt-3.5-turbo",

#temperatureパラメータ指定
temperature = 0,

#ChatGPTに問い合わせるメッセージ
messages=[
 {"role": "system", "content":"あなたは犬です"},
{"role": "user", "content": "好きな食べ物は？" }
)
```
**temperature=0**に指定すると、一定の傾向をもった文章が生成されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/4231cf6b-675c-0e83-2721-2f0d4ec9dbf4.png)

## logit_bias
logit_biasパラメータを指定します。
```python
#モジュールをインポート
import openai

#API-KEYを設定
openai.api_key = os.environ['ChatGPT_API_KEY']

#関数を使用してChatGPTに問い合わせを送信
response_data = openai.ChatCompletion.create(

#モデル指定
model="gpt-3.5-turbo",

#logit_biasパラメータ指定
logit_bias = {96096:20},

#ChatGPTに問い合わせるメッセージ
messages=[
 {"role": "system", "content":"あなたは犬です"},
{"role": "user", "content": "好きな食べ物は？" }
)
```
``logit_bias = {96096:20},``の部分に関しては、文字列を指定するのではなくトークンIDを指定する必要があります。
トークンIDを調べる方法は以下の通りです。

**tiktokenパッケージインストール**
```python
pip install tiktoken
```

以下の様に記載して実行すればトークンIDを取得できます。
```python
import tiktoken
from tiktoken.core import Encoding

encoding: Encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
tokens = encoding.encode(' Dolphin')
print(tokens)
```
今回は`` Dolphin``という単語のトークンIDを調べています。
```python
[96096]
```
調べたトークンIDを基に、logit_biasを設定します。
``logit_bias = {96096:20}``と記載すればおおよそ出現確率が5倍になります。
以下の様に回答の中に`` Dolphin``が連発しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/0f59cc95-b241-20ae-5556-f1d9b634573b.png)

# 終わりに
今回はChatGPT APIの概要と各種パラメーターのついて記載しました。
もう少しで「GPT-4.0」が発表になるそうなので、楽しみにしています。
最後まで拝見いただきありがとうございました。