PythonでChatGPTのAPIを触ってみる

# 準備
## ChatGPTのアカウント登録
APIを使用するためにはChatGPTへのアカウント登録を行う必要があるので以下のリンクから登録します。

https://auth0.openai.com/u/login/identifier?state=hKFo2SBicGVuZDhwcWdjU3Q5eE16NERLZTdRR2w0MDZ1UFBHNqFur3VuaXZlcnNhbC1sb2dpbqN0aWTZIFZaV1VibFh4Um5sTzVNbmtGSTVsc25fc0MwTkZ3bUU5o2NpZNkgRFJpdnNubTJNdTQyVDNLT3BxZHR3QjNOWXZpSFl6d0Q

![スクリーンショット 2023-03-18 22.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878034/63d34a2f-af5c-8369-fa4e-381aed0868c3.png)
Googleアカウントからでもログインできるのでそっちの方が楽で早いです。

## APIキーの取得
APIキーは以下のリンクから取得できます。

https://platform.openai.com/account/api-keys

![スクリーンショット 2023-03-18 22.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878034/14885c30-88b7-ee7e-96d5-c3efdc460d22.png)

`Create new secret key`ボタンを押すことでキーを生成することができます。
**生成したAPIキーを再度確認することができないので必ずコピーをして安全な場所に保存してください。**

## ライブラリのインストール
ライブラリは`pip`でも`conda`でもインストールすることができます。
今回は`openai`という仮想環境を作成しその環境にインストールしていきます。

```:仮想環境の生成
$ conda create -n openai
$ conda activate openai
```

```:ライブラリのインストール(pip)
$ pip install openai
```

```:ライブラリのインストール(conda)
$ conda install openai
```

以上で準備は終わりです。

# APIを使ってみる
公式が出しているコードを使ってみます。

https://platform.openai.com/docs/libraries

```python
import os
import openai

# APIキーの設定
openai.api_key = "API Key"
# API部分
response = openai.Completion.crete(model="text-davinci-003", prompt="Say this is a test", temperature=0, max_tokens=7)
```
今回使用しているパラメータは以下の通りです。

* model
    使用するモデルを指定するパラメータ。今回は`GPT-3.5`モデルの`text-davinci-003`を指定しています。これはテキスト補完を行うモデルです。
使用できるモデルは以下のリンクで確認できます。

https://platform.openai.com/docs/models/overview


* prompt
命令を行う文章を指定するパラメータ。ここにGPTにしてほしいことなどを引き渡す。
~~**日本語での入力も可能だがレスポンスは`Unicode`で出力されるので注意。**~~
日本語の場合は`Unicode`でレスポンスが返ってくるが`print`すると勝手にデコードされて出力される。

* temperature
信頼度を示すパラメータ。0~1の間を取る。これは次に来るテキストの多様性を調節しています。**0に近いほど無難な解答をして、1に近いほど多様な解答を行うことができます。**

* max_tokens
最大出力トークンの設定。モデルによって出力できる文章の量はこのパラメータで制御します。モデルによって出力できる最大トークン数は決まっており、以下のリンクから確認できます。

https://platform.openai.com/docs/models/overview

トークンの数え方については以下のリンクから確認できます。

https://platform.openai.com/tokenizer

今回使用したパラメータ以外のパラメータについては以下のリンクを参考にしてみてください。

https://platform.openai.com/docs/api-reference/completions/create

`response`の中身はこんな感じになっています。

```terminal
{
  "choices": [
    {
      "finish_reason": "length",
      "index": 0,
      "logprobs": null,
      "text": "\n\nThis is indeed a test"
    }
  ],
  "created": 1679146915,
  "id": "cmpl-6vR6hz16Wo1l3YfyWfTiht194b7e0",
  "model": "text-davinci-003",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 7,
    "prompt_tokens": 5,
    "total_tokens": 12
  }
}
```

いくつか項目がありますが今回指定したモデルで入力されたプロンプトに対する返答は`choices`の`text`部分となっています。
これはモデルによってレスポンスが異なるので以下のリンクより確認する必要があります。

https://platform.openai.com/docs/api-reference/introduction

次にプロンプトを`好きって言って`という日本語の文章に変更してみます。また`max_tokens`を20にして実行してみます。

```python
response = openai.Completion.crete(model="text-davinci-003", prompt="好きって言って", temperature=0, max_tokens=7
```

レスポンスは以下の通りです。
```terminal
{
  "choices": [
    {
      "finish_reason": "length",
      "index": 0,
      "logprobs": null,
      "text": "\u304f\u308c\u305f\n\n\u305d\u308c\u306f\u3068\u3066\u3082\u5b09\u3057\u3044\u3067\u3059"
    }
  ],
  "created": 1679148460,
  "id": "cmpl-6vRVc2rxz9y4Ck8WNMvwrxniifpAm",
  "model": "text-davinci-003",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 7,
    "prompt_tokens": 10,
    "total_tokens": 17
  }
}
```
`text`の部分が`Unicode`で出力されています。

`\u304f\u308c\u305f\n\n\u305d\u308c\u306f\u3068\u3066\u3082\u5b09\u3057\u3044\u3067\u3059`
↑の`Unicode`は日本語に直すと`くれた　それはとても嬉しいです`となります。これを元の文章とくっつけると以下のようになります。
```
好きって言って　くれた
それはとても嬉しいです
```
いい感じにテキストを補完してくれた気がしますね。

今回はテキスト補完であるモデルを使用しましたが、他にも使える機能がたくさんあるので時間があったら随時更新してみようと思います。