AI・機械学習

【OpenAI】オリジナルChatGPT作ってみた

palm

おはようございます。Palmです。

今日は寝れなかったのでプログラミングをしていました。

夏で本当に体調おかしい。。

OpenAIのAPIを使用して、AIアシスタントとのチャットを実行するためのPythonプログラム作ってみました!

オリジナル ChatGPTを作る

ライブラリのインストール

まず、必要なライブラリをインストールします。これには、openaipython-dotenvが含まれます。

pip install openai python-dotenv

APIの取得

APIキーが必要になります。OpenAIのウェブサイトに無料登録して取得できます。

取得できたら、 .env(仮想ファイル)を作成します。

OPENAI_API_KEY = "YOUR-KEY"

.envファイルにこの1行だけ書いて保存します

ライブラリのインポート

  • os: 環境変数を操作するための標準ライブラリ。
  • dotenv: .envファイルから環境変数をロードするためのライブラリ。
  • openai: OpenAIのAPIクライアント。
import os
from dotenv import load_dotenv
from openai import OpenAI

AIアシスタントに与える役割を入力させる関数:

ユーザーにAIアシスタントに与える役割を入力させる関数です。

役割が入力されなければ、空の文字列を返します。

def give_role_to_system() -> str:
    print("\nAIアシスタントとチャットを始めます。チャットを終了させる場合は exit() と入力してください。\n")
    system_role = input("AIアシスタントに与える役割がある場合は入力してください。\nない場合はそのままEnterキーを押してください。: ")
    return system_role

チャットを開始する関数:

ユーザーがexit()と入力するまでループし、ユーザーの入力をチャットログに追加します

OpenAI APIを呼び出し、AIの応答を取得し、ストリーミングで表示します

def chat_runner(gpt_model: str):
    chat_log: list[dict] = []
    system_role = give_role_to_system()
    if system_role:
        chat_log.append({"role": "system", "content": system_role})

    while True:
        prompt = input("\nあなた: ")
        if prompt == "exit()":
            break

        chat_log.append({"role": "user", "content": prompt})

        response = client.chat.completions.create(model=gpt_model, messages=chat_log, stream=True)
        role, content = stream_and_concatenate_response(response)
        chat_log.append({"role": role, "content": content})

AIの応答をストリーミングで取得し、表示する関数:

ストリーミングでAIの応答を取得し、表示します。

応答をチャンクごとに表示し、最終的に結合して返します。

def stream_and_concatenate_response(response) -> tuple[str, str]:
    print("\nAIアシスタント: ", end="")
    content_list: list[str] = []
    role = ""
    for chunk in response:
        chunk_delta = chunk.choices[0].delta
        content_chunk = chunk_delta.content if chunk_delta.content is not None else ""
        role_chunk = chunk_delta.role
        if role_chunk:
            role = role_chunk
        content_list.append(content_chunk)
        print(content_chunk, end="")
    else:
        print()
        content = "".join(content_list)
    return role, content

GPTモデルの一覧を取得する関数:

OpenAIのAPIを使用して、利用可能なモデルの一覧を取得し、gptを含むモデルのみを抽出してソートして返します。

def fetch_gpt_model_list() -> list[str]:
    all_model_list = client.models.list()
    gpt_model_list = []
    for model in all_model_list:
        if "gpt" in model.id:
            gpt_model_list.append(model.id)
    gpt_model_list.sort()
    return gpt_model_list

使用するモデルを選択する関数:

ユーザーに使用するGPTモデルを選択させます。デフォルトモデルはgpt-3.5-turboです。

def choice_model(gpt_model_list: list[str]) -> str:
    default_model = "gpt-3.5-turbo"
    print("AIとのチャットに使うモデルの番号を入力し Enter キーを押してください。")
    for num, model in enumerate(gpt_model_list):
        print(f"{num}: {model}")

    while True:
        input_number = input(f"何も入力しない場合は {default_model} を使います。: ")
        if not input_number:
            return default_model
        if not input_number.isdigit():
            print("数字を入力してください。")
        elif not int(input_number) in range(len(gpt_model_list)):
            print("その番号は選択肢に存在しません。")
        else:
            return gpt_model_list[int(input_number)]

環境変数のロードとクライアントの初期化:

.envファイルからAPIキーを使用します

load_dotenv()
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))

チャットの開始

利用可能なGPTモデルの一覧を取得し、ユーザーに選択させてチャットを開始します。

gpt_models = fetch_gpt_model_list()
choice = choice_model(gpt_models)
chat_runner(choice)

完成系

まとめ

今回は流行りに乗ってみました、次はOpenAIをLINEで使ってアプリ開発したいです。

最後まで読んでいただき有難うございました!

スポンサーリンク
ABOUT ME
Palm
Palm
東京通信大学3年生
私はpalm(ぱるむ)です。お花や自然が大好きです。専門学校でWeb開発を学び、東京通信大学に編入しました。得意分野は、ウェブ開発(フロントエンド、バックエンド)や機械学習(自然言語、データ分析)です。趣味で色々デモ開発をしています。
記事URLをコピーしました