ゼロから始めるOpenAI

## 対象読者
- とりあえずOpenAIのAPIを呼び出して簡単なChatBot作りたい方向け


## 1.環境構築
- Intelij IDEA or Pycharm
https://footprints.link/articles/ja/n-machida/python-development-environment-using-intellij-idea
- python: 3.12.2


## 2.APIキーの取得
下記記事を参考にアカウント作成とAPIキーを発行します。
https://nicecamera.kidsplates.jp/help/feature/ai-kata/openapi_apikey/

※ **すでにアカウントを作成している場合、3ヶ月以上経っているとAPIキーの無料期間が過ぎているため、クレジットを購入しないとコードを実行しても429エラーになるので注意です。**


```
エラー例
RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: <https://platform.openai.com/docs/guides/error-codes/api-errors.'>, 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}
```

## 3.動くChatbot

環境構築とAPIキーを取得できましたら、下記サンプルコードを実行してみてください。
恐らく問題なければ対話形式で簡単なChatbotが動くはずです。

```chatbot.py
from openai import OpenAI

client = OpenAI(api_key="OPENAI_API_KEY")

messages = []

while True:
    try:
        user_input = input("You: ")
        messages.append({"role": "user", "content": user_input})
        res = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=messages,
        )
        messages.append(res.choices[0].message)
        print("Assistant", res.choices[0].message.content)
    except KeyboardInterrupt:
        print("Exiting...")
        break

```

結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/d7473b96-3bd5-c912-1b14-26d5684d5b3e.png)


## 4. APIのパラメーターについて

OpenAIモデルのAPIドキュメントは以下になります。
https://platform.openai.com/docs/api-reference/embeddings/create

パラメータを使って色々試してみると面白いかもしれません。

```chatbot.py
        res = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=messages,
            n=3,
            stop= ...
            // 
        )
```

- model: AIのエンジンを指定する
- max_tokens: 生成するトークンの最大数 （デフォルト:16, 最大:2048）
- temperature: ランダムさ
- n: 生成する結果数
- stop: どんな単語が出現したら文章生成を打ち切るかを指定


## 5. Chatbotの性格を変えてみる

コードを少し変更してみて、Chatbotに性格を与えてみることにします。

```chatbot.py
from openai import OpenAI
import argparse


client = OpenAI(api_key="OPENAI_API_KEY")

def main():
    parser = argparse.ArgumentParser(description="Chatbot")
    parser.add_argument("--personality", type=str, default="親切で優しい", help="Personality of the chatbot")
    personality = parser.parse_args()

    messages = [{"role": "system", "content": f"あなたは会話型チャットbotです。性格は、{personality}です。"}]

    while True:
        try:
            user_input = input("You: ")
            messages.append({"role": "user", "content": user_input})
            res = client.chat.completions.create(
                model="gpt-3.5-turbo",
                messages=messages,
            )
            messages.append(res.choices[0].message)
            print("Assistant", res.choices[0].message.content)
        except KeyboardInterrupt:
            print("Exiting...")
            break

if __name__ == "__main__":
    main()
```

ここで大事なポイントはmessagesに与えているroleです。

roleには3種類あり, 
1. **system**
2. **user(入力側)**
3. **assistant(チャットモデル)**
を各メッセージに付与することで会話の流れを表現しています

- system は、AIアシスタントの設定を記述でき、AIに人格を与えるようなことができます。
- assistant はAIからの回答（出力）、 user はユーザーからの発信（入力）です。基本的には user として聞きたいことを送る形になります。


------
試しに、性格を与えたChatbotに挨拶してみましょう。
デフォルトの性格は、「親切で優しい」みたいです。

```
python chatbot.py 
You: こんにちは！
Assistant こんにちは！いかがしましたか？お話しましょう！
```

次に、引数として性格を指定して実行してみます。

```
python chatbot.py --personality="卑屈"
You: こんにちわ！
Assistant あ、こんにちは...。どうも、ごきげんよう。
You: 
```

ぼっちちゃんみたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/beaa0102-1d7e-4490-0091-f7c50133f8de.png)


## おわりに
簡単に調べた程度の知識ですが
色々なモデルを試したり、roleの与え方次第でAIの口調を変えたり色々できそうですね♪