ChatGPTのAPIをPythonで試してみた

# はじめに

最近SNS等で注目を集めまくっているChatGPTのAPIがOpenAIから公開されていたということで、仕様の確認も含めPythonでの実装を試してみたので備忘録を兼ねて軽くまとめます。



# 実行環境
- windows10 home
- Python 3.10.1
- openai 0.27.2
- model：gpt-3.5-turbo



# OpenAI API利用料について
APIの利用は基本有料となっていますが、**一定期間一定額までは無料**で利用することが出来ます。
API利用はトークン単位で管理され、例えばgpt-3.5-turboであれば1000トークン辺り0.002ドルとなっています(2023/03/29時点)
これはハッキリ言って個人がお試しで使う分には十分だと思います。

![スクリーンショット 2023-03-29 151922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842664/dbb811dc-f27b-9e10-58a5-511b7a60359c.png)

https://platform.openai.com/




# ライブラリのインストール

pipでopenaiライブラリをインストールします

```
pip install openai
```
<br>
※Permission Errorが出る場合はターミナル（cmd等）を管理者として実行するとできるかと思います


# APIキーの発行

- [こちら](https://platform.openai.com/account/api-keys)のページへアクセス
- Create new secret key をクリックしてAPIキーを生成
- コピーしてどこかにバックアップ


※APIキーは生成した後のポップアップ画面以外で**再表示させることが出来ない**ため、ここでコピーします

![スクリーンショット 2023-03-29 144811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842664/c2e4c3f3-a466-98a9-6410-f67ae62bced6.png)



# 実装
とりあえず叩いてみる
```python:gpt-test.py
import openai

openai.api_key = "先程コピーしたAPIキー"

response = openai.ChatCompletion.create(
                model='gpt-3.5-turbo',
                messages=[
            {'role': 'user', 'content': 'hi, gpt'}],
                temperature=0.0,
)

print(response)
```

### 出力結果
```
{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "Hello! How can I assist you today?",
        "role": "assistant"
      }
    }
  ],
  "created": 1680072567,
  "id": "chatcmpl-6zJuZMrvm0QnvrKw8fCNc3QR4Kp53",
  "model": "gpt-3.5-turbo-0301",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 9,
    "prompt_tokens": 12,
    "total_tokens": 21
  }
}
```
返答やトークン使用量等の値が返ってきました。
戻り値 response['choices'][0]['message']['content']にChatGPTからの返答があることが確認できます。
トークンの使用量はresponse['usage']['total_tokens']にあります。



## 少し改良してみた
よく見るChatGPTとの会話形式に改良してみました。
会話の履歴をChatGPTへの送信内容に含めることで、**トークンの消費量は跳ね上がります。**
トークン消費を抑えるため、一定会話数で古いものから履歴を破棄していくようにしました。
終了時にはトークン総消費量を表示しています。

```python:chatgpt.py
import openai
import sys

openai.api_key = "先程コピーしたAPIキー"

messages = []
total_tokens = 0 #トークン総消費量

while True:

    try:
        msg = input('User: ')
        usr_msg = {'role': 'user', 'content': msg}

        messages.append(usr_msg)

        response = openai.ChatCompletion.create(
                        model='gpt-3.5-turbo',
                        messages=messages,
                        temperature=0.0,
        )

        print('\n' + 'ChatGPT: ' + response['choices'][0]['message']['content'] + '\n')

        #messagesにChatGPT側の返答内容を追加
        messages.append({'role': response['choices'][0]['message']['role'], 
                        'content': response['choices'][0]['message']['content']})
        
        total_tokens += int(response['usage']['total_tokens'])

        #messagesの量が一定数を超えたら履歴を古いものから削除
        while len(messages)>6:
            del messages[0]
        
    except KeyboardInterrupt:
        print('Exit')
        print(f'used token: {total_tokens}')
        sys.exit()
```

ちなみに、お約束として**APIキーのコードベタ書きはセキュリティ上あまり良くない**ので、別ファイルに記述したり環境変数に格納する等した方が良いです。
ローカルでちょっと使ってみよう程度であれば然程問題はないですね。

# 終わりに
ChatGPTのAPIを軽く試してみましたが、とても簡単に高度な対話アプリケーションが実装出来てしまいました。
これを利用した仮想キャラクターとの会話アプリケーション等もどんどん開発されているようで、今後が楽しみです。
様々な場面で活躍できるインターフェースなので、僕もChatGPTを利用して何か面白いことが出来ないか思考してみたいです。


# 参照
[Overview - OpenAI API](https://platform.openai.com/)
[ChatGPTのAPIを使ってみよう：コンソールで対話するコードとは？](https://atmarkit.itmedia.co.jp/ait/articles/2303/24/news029.html)