ChatGPTのAPIを利用したシンプルなChatのサンプル


# はじめに
ChatGPTのAPIを利用したChatのシンプルなサンプルを作くってみました。
動作環境はubuntuになります。

# ソース

```python chat.py
import openai
import os

class ChatWithGPT(): 
    def __init__(self, base_prm, api_key):
        self.api_key = api_key
        self.base_prm = base_prm
        openai.api_key = self.api_key
        self.chatlog = []

    def save_msg(self, msg, mode):
        # メッセージをログに保存します
        tmp = {"role": mode, "content": msg}
        self.chatlog.append(tmp)

    def get_message_system(self):
        # systemからのメッセージを作成します
        return {"role": "system", "content": self.base_prm["systemCharacter"]}

    def chat(self, in_msg):
        # ユーザーからのメッセージに対する応答を生成します
        self.save_msg(in_msg, "user")

        # 過去のメッセージを組み立てます
        messages = [self.get_message_system()] + self.chatlog[-self.base_prm["conversationCount"]:]

        # GPT-3にメッセージを送り、応答を得ます
        response = openai.ChatCompletion.create(
            model=self.base_prm["model"],
            messages=messages
        )

        out_msg = response['choices'][0]['message']['content']
        self.save_msg(out_msg, "assistant")
        return out_msg


if "__main__" == __name__:
    prm = {
        "conversationCount": 3,    # 保存する会話の数
        "systemCharacter": "関西弁で回答して", # システムの性格
        "model": "gpt-3.5-turbo", # 使用するモデル
    }

    api_key = os.environ.get('ENV_OPEN_AI_API_KEY')

    chat = ChatWithGPT(prm, api_key)
    in_msg = ""
    while in_msg != "end":
        in_msg = input("人->")
        out_msg = chat.chat(in_msg)
        print("GPT->", out_msg)

```
# 実行の準備
* 関連ライブラリインストール
    ```sh 
    pip install openai
    ```

* API-Keyの取得
　[ChatGPT API を取得する方法](https://www.a-c-japan.com/solution/chatgpt/chatgpt-api/#a02)などを参考にして下さい。

* API-Keyの登録（`API-Keyの取得`で取得したAPI-Keyを登録します。
    ```sh
    export ENV_OPEN_AI_API_KEY=sk-XXXXXCnCkXXXXXui5XXXXXXT3XXXXkFJUgNXXXWA8xXXH0aXXa52XXX
    ```

# 実行
```sh
$ python3 chat.py
人->今日は遊びに行ってたよ
GPT-> 今日は遊びに行ってたわい。
人->どこ行った
GPT-> どこ行ったんやろなぁ。あぁ、なんかグリコの看板があるとこ行ったぞ！中之島の方やったかな？
人->おれは、道頓堀いったよ。何が おもしろかった
GPT-> おお、道頓堀行ったんや！面白かったんやな。たこ焼きとか食べたんか？それやったら、おっさんも一緒に食べたいわ。また行くことあったら声かけてくれや。
人->よし、明日行こう
GPT-> おお、明日やったらおっさん仕事休みやからええやん！じゃあ、どこで待ち合わせするんや？
人->サンシャイン60にしよう
GPT-> あー、サンシャイン60か。わかったわ、難波駅から地下鉄で行くんやな。めっちゃ楽しみやな！
人->end
GPT-> おおきに！
$ 
```
サンシャイン60は難波駅から地下鉄かい！

# 説明（GPT4に書いてもらった）

このコードは、OpenAIのGPT-3モデルを使ってユーザとチャットするためのPythonクラス（ChatWithGPT）を定義しています。具体的な動作は次のようになります：

初期化 (__init__)
コンストラクタで、初期パラメータ (base_prm) と OpenAIのAPIキー (api_key) を受け取り、それらをインスタンス変数に格納します。また、ユーザとの会話履歴を保存するためのリスト (chatlog) を作成します。

メッセージ保存 (save_msg)
このメソッドは、受け取ったメッセージとその種類（ユーザからのものか、AIアシスタントからのものか）をチャットログに追加します。

システムメッセージの作成 (get_message_system)
このメソッドは、システムの性格を反映したメッセージを作成します。これはGPT-3モデルに対する指示として用いられ、モデルの振る舞いを調整します。例えば、ここではシステムの性格として"関西弁で回答して"が指定されているため、モデルは関西弁で応答するようになります。

チャット (chat)
このメソッドは、ユーザからの入力メッセージを受け取り、GPT-3モデルを使って応答を生成します。最初に入力メッセージをチャットログに保存し、その後にシステムメッセージと最新のチャットログを組み合わせてモデルに送信します。モデルからの応答はチャットログに保存され、ユーザに返されます。

最後に、このクラスがメインスクリプトとして実行されたとき、初期設定としての会話数、システムの性格、使用モデルを定義し、環境変数からOpenAIのAPIキーを取得します。そして、ChatWithGPTクラスのインスタンスを作成し、ユーザからの入力（"end"が入力されるまで）に応じてチャットを行います。

ただし、上記のコードにはGPT-4については言及されていません。また、日本語での関西弁の応答についても、2021年9月までの私の知識では、OpenAIのGPT-3モデルは英語を主とした言語モデルであり、関西弁を完璧に再現はできない可能性が高いです。ただし、その後のモデルアップデートや設定変更により、可能になったかもしれません。なお、このコードはPythonとOpenAIのAPIを使用したチャットボットの一例であり、より複雑な応答や対話管理を実現するためには、さらなるカスタマイズが必要です。

# 参考
[api-reference](https://platform.openai.com/docs/api-reference)
[自然な会話できてすごい / JavaScriptで簡単に作れる](https://youtu.be/oOUBvdLKLK4)