人工知能を作りたい③
palm
Palm Blog
おはようございます。Palmです。
今日は寝れなかったのでプログラミングをしていました。
夏で本当に体調おかしい。。
OpenAIのAPIを使用して、AIアシスタントとのチャットを実行するためのPythonプログラム作ってみました!
まず、必要なライブラリをインストールします。これには、openai
とpython-dotenv
が含まれます。
pip install openai python-dotenv
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アシスタントに与える役割を入力させる関数です。
役割が入力されなければ、空の文字列を返します。
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の応答を取得し、表示します。
応答をチャンクごとに表示し、最終的に結合して返します。
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
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で使ってアプリ開発したいです。
最後まで読んでいただき有難うございました!