GPT3を使ってみた

# はじめに
文章生成というものに興味がありまして、今回GPT３を使ってみました。
APIの取得方法から簡単な文章生成までをサラッと紹介します。

# 実装
## アカウント登録とAPIkeyの発行
まずはじめに、[OpenAIのアカウント登録](https://openai.com/api/)を行ってください！
登録がおわた後、右上の「Personal」から「View API keys」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/44255531-01ac-2424-1168-7b0df6206e94.png)

右側のAPI Keysから新しくAPIキーを発行してください。
発行したキーはどこかにメモしておきましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/70dd2916-7232-3336-770c-6f7c8764b7c2.png)

## pythonによる実装
### 必要なライブラリのインストール
openaiをインストールしましょう。

```
pip install openai
```

### APIキーの設定
config.iniファイルを作成し、下のテキストのスターの部分を後人で取得されたAPIキーに変更してください。

```:config.ini
[GPT]
API_KEY = ***************************************************
```
pythonファイルに以下のような記述を行います。
```py:gpt3.py
import os
import openai
import configparser

config_ini = configparser.ConfigParser()
config_ini.read('config.ini', encoding='utf-8')

openai.api_key = config_ini['GPT']['API_KEY']

```

ここはconfig.iniを作成しなくても、以下のようにpythonファイルに直接APIキーを記入していただきても大丈夫です！
```py:gpt3.py
openai.api_key = ***************************************************
```


### テキスト生成
以下のコードを追記しましょう。
```py:gpt3.py
import os
import openai

import configparser

config_ini = configparser.ConfigParser()
config_ini.read('config.ini', encoding='utf-8')

openai.api_key = config_ini['GPT']['API_KEY']
# 以下を追記
response = openai.Completion.create(
    engine="davinci",
    prompt='python is useful because',
    max_tokens=100,
    temperature=0.75,
    echo=True
)
print(response.choices[0].text)
```
解説は一旦置いておいて、実行してみてpromptから始まる文章が作成されることを確認してみましょう〜
実行ごとに生成されるテキストは異なるのですが、以下のように100語程度の文章が生成されれば成功です。
```
python is useful because it is so easy to work with, but after a little while you will be able to transfer the same skills to any other language.

You don't have to start with python, though. I started with C, a very low level language, and ended up with a lot of experience with what programming is. These days I enjoy programming more in python, but my background in C and assembly definitely helped.

Programming is hard but it's a skill that you can learn. 
```
かなり、ありそうな文章が生成されているかと思います！
一応DeepLで翻訳をしておきます！

```
pythonはとても簡単に扱えるので便利ですが、少し経つと他の言語にも同じスキルを移せるようになります。

Pythonから始める必要はないんですけどね。私はC言語という非常に低レベルな言語から始めましたが、最終的にはプログラミングとは何かということをたくさん経験することができました。最近はpythonでプログラミングを楽しんでいますが、C言語とアセンブリの経験が役立っているのは間違いありません。

プログラミングは難しいですが、習得可能なスキルです。
```
## 解説
公式ドキュメントの[Create Completion](https://beta.openai.com/docs/api-reference/completions/create)を今回は利用します。日本語訳すると補完の生成ですね。
```
response = openai.Completion.create(
    engine="davinci",
    prompt='python is useful because',
    max_tokens=100,
    temperature=0.75,
    echo=True
)
```
の部分でpromptであるpython is useful becauseから続くテキストを補完し生成しています。
ここでの記述で用いているパラメーターと利用できるパラメーターについて一部、簡単に解説を行います。
詳しく知りたい方は[公式ドキュメント](https://beta.openai.com/docs/api-reference/completions/create?lang=python)を参照してください！

- model
    - 利用するモデルのIDを記入します。公式ドキュメントによると４種類のモデルが選べるようです。
    - text-davinci-003	
        - 最も高性能なモデルで、他のモデルで可能なことは全部できる。
    - text-curie-001	
        - Davinciよりも早く、低コスト。
    - text-babbage-001	
        - 単純なタスクに適しており、早く、低コスト。
    - text-ada-001	
        - 非常に単純なタスクに適すており、GPT-3の中では最速かつ最低コストのモデル
- prompt
    - テキスト生成のキーワードとなるテキスト。指定しない場合は完全にランダムなテキストが生成されるよう。
- max_tokens
    - 作成する文章の最大単語数。最新のモデル(davinci)を除いては2048が最大、davinciは4096。
- temperature
    - 0~1の範囲をとる。想像的な文章を作成するときは1に近く、自由度を上げるためには0に近づけます。
- top_p
    - 上記のtemperatureと相対するパラメーター。
    - top_pを0.1にすると、予測する次の単語は確率の高い上位10%の候補から選択されます。
    - 小さくすればするほど候補が確率の高いものに絞られるため、確定的になっていきます。
    - 大きくすれば色んな単語から選ぶようになるので、よりランダム性が強くなります。
    - temperatureかtop_pのどちらかを基本的に操作するようです。
- n
    - 1つのプロンプトあたり、幾つの補完した文章を生成するかを決めます。指定しない場合１となります。
- stop
    - 文章の終わりになるような文字を指定します。
- echo
    - promptに対しても補完を行うかを選択できます。デフォルトではFalseで、プロンプトに対する補完は行われません。


# 最後に
記事内に誤りなどあればご指摘いただけると幸いです！
GPTを利用するのはほぼ初めてなので、これから少しずつ勉強していきたいです！