Google ColaboratoryでChat GPTをやってみた話

# はじめに
この記事は[富士通クラウドテクノロジーズ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/fjct)の14日目の記事です。
昨日は、@kato-hiroki-783さんの「[ESXiを自動でインストール](https://hirohirolab.com/blog/2023-12-13/)」という記事でした！

今日の記事は学生時代に機械学習の研究を行っていた私がGoogle ColabとOpenAI APIでただ遊んでみたお話です。

# 前提知識
## Google Colaboratoryとは？
> Colaboratory（略称: Colab）は、Google Research が提供するサービスです。 Colab では、誰でもブラウザ上で Python を記述、実行できるため、機械学習、データ分析、教育に特に適しています。


つまり、環境構築を一切行わなくてもGoogleのアカウントさえあれば、だれでもWeb上で無料でPythonが実行できてしまうというすばらしいサービスなんです。性能が高いPCが無くても機械学習ができてしまうんですね。今年の3月まで学生だった私も研究や講義・実験で大変お世話になりました

詳しい使い方は以下の記事を参考にしてください！

https://qiita.com/ToppaD/items/035cf5c42e94b92f7526

## OpenAI APIとは？
OpenAIは人工知能の開発を行っている企業で、「ChatGPT」を提供していることでも有名ですね。OpenAIが提供するOpenAI APIは自然言語処理をはじめとするタスクに対応したモデルを提供しています。
OpenAI APIはPythonの環境があれば実行できるのでいろいろ応用できそうですね！

今回はGoogle Colaboratory上でPythonのOpenAIライブラリを使って動かしてみます！ライブラリは以下から使用できます！

https://github.com/openai/openai-python


# 事前準備
## OpenAI APIキーの取得
取得手順は以下より取得可能です。APIキーが取得出来たらコピーしましょう！

https://platform.openai.com/docs/quickstart?context=python

## Google Colabの準備
1. 新しいブックを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626169/b5d8fa98-04ec-99ad-eca9-5ec8a030bda2.png)

2. [ランタイム]から[ランタイムのタイプの変更]を選択し、ランタイムのタイプを「Python3」、ハードウェアアクセラレータを「T4 GPU」を選択し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626169/1cf4724d-e0a2-08dc-3d17-800af99e4590.png)
3. openaiライブラリをインストールします。Colabでpipを使用するときは先頭に「!」を付けるのを忘れないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626169/9dcd6a54-7b07-412f-d81c-49559f20e73d.png)

# やってみたこと
## ソースコード
さっそく実行したコードを紹介します。以下がコード全文です。

```python

import openai

# OpenAI APIキーをセットアップ(先ほどコピーしたAPIキーをここに貼り付け)
openai.api_key = 'XXXXXXXXXXXXXXXXXXXXXXX'

def generate_answer(question):
    # OpenAI GPT-3.5でのコンテキストとして使う文章
    context = "コンピュータープログラムは人間の質問に回答することができます。"

    # OpenAI GPT-3.5に質問とコンテキストを送信して回答を生成
    response = openai.Completion.create(
        engine="text-davinci-002",  # 利用するエンジンを指定
        prompt=f"{context}\n質問: {question}\n回答:",
        temperature=0.7,  # 生成のランダム性を調整
        max_tokens=150,  # 生成されるトークン数の上限を設定
        top_p=1.0,  # トークンの確率分布の上位何%を考慮するか
        frequency_penalty=0.0,  # トークンの重複を制御
        presence_penalty=0.0  # 特定の単語の出現を制御
    )

    # OpenAI GPT-3.5の生成結果から回答を抽出
    answer = response.choices[0].text.strip()
    return answer

if __name__ == "__main__":
    # 質問を入力
    user_question = input("質問を入力してください: ")

    # 回答を生成
    answer = generate_answer(user_question)

    # 生成された回答を表示
    print("生成された回答:", answer)
```
## 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626169/5889443e-96ff-f0c6-0380-a3225ad651fd.png)
上記のコードを実行すると質問を入力できるようになります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626169/f14975d0-9c00-6c51-accf-d966522b7d8f.png)
試しに「Pythonの利点は何ですか？」と質問すると、回答が無事生成されました！

# パラメータ調整

```python
response = openai.Completion.create(
        engine="text-davinci-002",  # 利用するエンジンを指定
        prompt=f"{context}\n質問: {question}\n回答:",
        temperature=0.7,  # 生成のランダム性を調整
        max_tokens=150,  # 生成されるトークン数の上限を設定
        top_p=1.0,  # トークンの確率分布の上位何%を考慮するか
        frequency_penalty=0.0,  # トークンの重複を制御
        presence_penalty=0.0  # 特定の単語の出現を制御
    )
```
openai.Completion.create()には7つのパラメータを指定しています。このパラメータの値によっても結果のふるまいは変わります。
## engine
- engine
    - OpenAPIで提供されているエンジン
    - 性能、速度などが異なるため精度を求めるならより良いエンジンを選択する必要がある

https://qiita.com/coitate/items/46fa5cccf29c3c53da4f


## prompt
- promptには2つの変数を渡しています。それぞれは以下の内容に対応しています。
    - context:前提となる情報・背景などの説明
    - question:入力された質問が渡される場所
- contextは上記の例では以下のように記述しています。
```
context = "コンピュータープログラムは人間の質問に回答することができます。"
```
contextは直訳すると「文脈」という意味ですが、ここではより適切な回答を出力するために必要な前提となる情報・背景を設定しておく必要があります。必ずしも対話させるようなcontextにする必要はありません。
```
context = "英語に変換してください。"
```
例えば、このようにcontextを設定すれば、以下のように質問文を英訳した文章が出力されるようになります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626169/003c6bdd-4923-52f6-ff7e-aeee44912f19.png)


## その他パラメータについて
temperatureやtop_pなどのパラメータは出力の一貫性や多様性などを調整できるパラメータで、こちらは用途や場面によっても変化すると思うので自分の用途に合わせて調整してみるとよいと思います

## さいごに
今回はOpenAI APIをPythonで動かしてみました！応用すれば面白いWebアプリケーションも作れそうですね！今度はGPT-4のプラグインもいろいろ試してみたいなと思います！

<br>

この記事は[富士通クラウドテクノロジーズ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/fjct)の14日目の記事でした。
明日は@tanopantaさんの「Swaggerをオシャレに公開したい！ on GitHub(GitLab) Pages」という記事が公開される予定です！