2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

今更OpenAIのAPIをPythonで叩いてみる。

Last updated at Posted at 2025-01-14

はじめに

こちらの記事はChatGPTのAPIを使ってみたい!
でもドキュメントは英語で読みづらいという方に向けた入門記事です。

見慣れたChatGPTではなくOpenAIのAPIを使用して、ターミナル上でChatGPTライクなレスポンスを行うことができるアシスタントを作成することがゴールです。
Pythonの環境構築などは扱いません。もしまだできていないよという方がおられましたら、環境構築をしてからの閲覧をお勧めします。

それではやっていきましょう。

実装していく

まずはOpenAIのサイトにアクセスしてAPIキーを取得しましょう。
課金についてですが、今回は非常に安価で使用できるGPT-4o-miniを使用しますので、
最低額で結構です。
もし一銭も使いたくない!ということでしたら、Geminiを使用するのも良いですね。
GeminiはOpenAIのライブラリと互換性がありますので、
その場合はこちらのドキュメントを参考にGeminiでアプリケーションを動作させてみてください。

必要なパッケージ

本記事では以下のパッケージを使用しますので、pipinstallしておきましょう。

responseについて

アプリケーションを作成する前に、OpenAIのAPIResponseについて確認しましょう。
以下のようなmain.pyを実行するとChatCompletionを返してきます。

main.py
from openai import OpenAI
import os
import dotenv

dotenv.load_dotenv()

openai_api_key = os.getenv('OPENAI_API_KEY')

MODEL="gpt-4o-mini"
client = OpenAI(api_key=openai_api_key)

response = client.chat.completions.create(
    model=MODEL,
    # userとして、AIにHello, world!と話しかける
    messages=[{"role": "user", "content": "Hello, world!"}], 
)

print(response)
ChatCompletion
{
  "id": "chatcmpl-XXXXXXXXXXXXXXXXXXXX",
  "choices": [
      {
          "finish_reason": "stop",
          "index": 0,
          "logprobs": null,
          "message": {
              "content": "Hello! How can I assist you today?",
              "refusal": null,
              "role": "assistant",
              "audio": null,
              "function_call": null,
              "tool_calls": null
          }
      }
  ],
  "created": 1234567890,
  "model": "gpt-4o-mini-2024-07-18",
  "object": "chat.completion",
  "service_tier": "default",
  "system_fingerprint": "fp_XXXXXXXXXX",
  "usage": {
      "completion_tokens": 10,
      "prompt_tokens": 11,
      "total_tokens": 21,
      "completion_tokens_details": {
          "accepted_prediction_tokens": 0,
          "audio_tokens": 0,
          "reasoning_tokens": 0,
          "rejected_prediction_tokens": 0
      },
      "prompt_tokens_details": {
          "audio_tokens": 0,
          "cached_tokens": 0
      }
  }
}

ChatCompletionには、ChatGPTにおける対話スレッドを識別するためのidや、メッセージの内容であるcontent、そのメッセージがユーザーのものなのか、AIアシスタントのものなのかを判別するためのroleなどが含まれます。
それ以外にも、どれくらいtokenを累計で使用しているのかといった情報も含まれていますから、resopnseの値に何が含まれているのかを覚えておくと、実際にアプリを作成するときに役に立つかもしれません。

例えば、resopnseで帰ってきたメッセージの文字列だけを表示したいなら次のようにすればいいですね。

print(response.choices[0].message.content)

アプリのコード

APIの中身がなんとなくわかったところで次は実際にアプリを作ってみます。

適当な名前のディレクトリを作成し、その中にmain.py.envを作成します。
OpenAIのAPIキーは.envに配置しましょう。

.env
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

次はmain.pyです。
まずはコードを全て表示して、その後各部位ごとに解説します。

挙動を確認するためにコピーアンドペーストして貼り付けてもいいですし、
解説を読みながらひとつひとつ確認しても良いです。

main.py
from openai import OpenAI
import os
import dotenv

dotenv.load_dotenv()

openai_api_key = os.getenv('OPENAI_API_KEY')
client = OpenAI(api_key=openai_api_key)
MODEL = "gpt-4o-mini"

# 会話履歴を保持するリスト
messages = [
    {"role": "developer", "content": "あなたは親切なアシスタントです。"}
]

print("チャットを開始します。終了するには 'quit' または 'exit' と入力してください。")

while True:
    # ユーザー入力を受け取る
    user_input = input("\nあなた: ")
    
    # 終了コマンドのチェック
    if user_input.lower() in ['quit', 'exit']:
        print("チャットを終了します。")
        break
    
    # ユーザーのメッセージを履歴に追加
    messages.append({"role": "user", "content": user_input})
    
    try:
        # APIリクエストを送信
        response = client.chat.completions.create(
            model=MODEL,
            messages=messages
        )
        
        # アシスタントの応答を取得
        assistant_message = response.choices[0].message
        
        # 応答を履歴に追加
        messages.append({
            "role": assistant_message.role,
            "content": assistant_message.content
        })
        
        # 応答を表示
        print("\nアシスタント:", assistant_message.content)
        
    except Exception as e:
        print(f"\nエラーが発生しました: {str(e)}")
        messages.pop()  # エラーの場合、最後のメッセージを削除

細かい解説

以下のコードではパッケージやモジュール、モデルの宣言をしています。

main.py
from openai import OpenAI
import os
import dotenv

dotenv.load_dotenv()

openai_api_key = os.getenv('OPENAI_API_KEY')
client = OpenAI(api_key=openai_api_key)
MODEL = "gpt-4o-mini"

こちらはこれまでの会話履歴を保存するリストです。
messagesに予めrolecontentを定義したシステムプロンプトを入力しておくことで、
AIの話し方、思考の方向性をあらかじめ決めることができます。
content優秀な経営コンサルタントですとすればコンサルタントさながらに言葉を返してくれます。
roleについて詳しく知りたい方は公式ドキュメントを確認してください。

便利ですね。

main.py
# 会話履歴を保持するリスト
messages = [
    {"role": "developer", "content": "あなたは親切なアシスタントです。"}
]

print("チャットを開始します。終了するには 'quit' または 'exit' と入力してください。")

次はwhile文です。
今回のプログラムはwhile文でループ処理を行うことで、継続的な対話を行うようにしています。
input()を使用することでターミナルに入力された文字列を、予め作成したmessagesリストにappendしています。
ですのでこのコードの時点でmessagesには"role":"developer""role":"user"の2つのメッセージが追加されることになりますね。

main.py
while True:
    # ユーザー入力を受け取る
    user_input = input("\nあなた: ")
    
    # 終了コマンドのチェック
    if user_input.lower() in ['quit', 'exit']:
        print("チャットを終了します。")
        break
    
    # ユーザーのメッセージを履歴に追加
    messages.append({"role": "user", "content": user_input})

最後はtry except文です。
上記時点で作成されたmessagesclient.chat.completions.create()でOpenAIのAPIに渡されて、一番初めに確認したresponseの形式で返ってくるという形式になります。

main.py
try:
        # APIリクエストを送信
        response = client.chat.completions.create(
            model=MODEL,
            messages=messages
        )
        
        # アシスタントの応答を取得
        assistant_message = response.choices[0].message
        
        # 応答を履歴に追加
        messages.append({
            "role": assistant_message.role,
            "content": assistant_message.content
        })
        
        # 応答を表示
        print("\nアシスタント:", assistant_message.content)
        
    except Exception as e:
        print(f"\nエラーが発生しました: {str(e)}")
        messages.pop()  # エラーの場合、最後のメッセージを削除

メッセージを一往復させるたびにmessagesリストの中身は増えていきますから、その分だけtokenを多く使用することになりますし、AIも内容を忘れるようになっていきます。

最後に

いかがだったでしょうか。
この記事が皆様のよい開発ライフの一助になれれば幸いです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?