PythonでOpenAI APIを使う:5分でゼロから結果を出すガイド

PythonでOpenAI APIを使う:5分でゼロから結果を出すガイド

5分で試す — クイックスタート

OpenAI APIを初めて試したとき、openai.ChatCompletion.create()時代の古いドキュメントを読んでしまい、午前中まるまる無駄にした — あの構文はバージョン1.0から非推奨(deprecated)になっている。実際には3ステップだけで完了する。

ステップ1:ライブラリのインストール

pip install openai

ステップ2:APIキーの取得

platform.openai.com → API Keys → Create new secret key と進む。sk-proj-... の文字列をコピーしよう — これが認証に必要な唯一のものだ。

ステップ3:最初のAPI呼び出し

from openai import OpenAI

client = OpenAI(api_key="sk-...your-key-here...")

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "Giải thích Docker là gì trong 2 câu"}
    ]
)

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

実行すると、2〜3秒で結果が表示される。クイックスタートはここまで — 次は本当に理解すべき部分に入ろう。

正しく理解して正しく使う

messagesの構造とは?

messagesフィールドはすべてのリクエストの核心部分だ。OpenAIは3種類のroleを持つメッセージ配列を受け取る:

  • system:モデルのコンテキストや「キャラクター」を設定する — 最初に一度だけ指定し、会話全体に影響する
  • user:ユーザー側からのメッセージ
  • assistant:AIの以前の返答 — モデルに会話履歴を記憶させたい場合に必要
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {
            "role": "system",
            "content": "Bạn là một senior Python developer. Trả lời ngắn gọn, thực tế."
        },
        {
            "role": "user",
            "content": "Khi nào nên dùng list comprehension thay vì for loop?"
        }
    ]
)

どのモデルを選ぶか?

この問いはほぼコストと品質のトレードオフに帰着する。筆者の分類はこうだ:

  • gpt-4o-mini:安価($0.15/1Mトークン)、高速で、タスクの80%に対応 — 要約、分類、シンプルなQ&A向け
  • gpt-4o:大幅に高性能で、複雑な推論、画像処理、高品質な出力が必要な場合に適している
  • gpt-3.5-turbo:古いが非常に安価で、シンプルなタスクを大規模にスケールさせる場合に今でも使える

実践的な戦略:常にgpt-4o-miniから始める。実際にテストして出力品質が不十分だと判明した場合にのみ、gpt-4oへアップグレードする。

レスポンスを正しく読む

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Hello"}]
)

# Nội dung chính
text = response.choices[0].message.content

# Số token đã dùng — theo dõi cái này để tính chi phí chính xác
print(f"Prompt tokens: {response.usage.prompt_tokens}")
print(f"Completion tokens: {response.usage.completion_tokens}")
print(f"Total: {response.usage.total_tokens}")

応用編 — 本当に役立つテクニック

ストリーミング:ChatGPTのように文字を順番に表示する

ストリーミングなし:ユーザーは3〜5秒間白い画面を眺め、テキストが一気に表示される。ストリーミングあり:最初の1秒から文字が流れ始める。合計時間は変わらないが、アプリの応答が格段に速く感じられる — これは非常に効果的なUXテクニックだ。

stream = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Viết một đoạn code đọc file CSV bằng Python"}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="", flush=True)

print()  # Xuống dòng sau khi xong

会話履歴の管理(シンプルなチャットボット)

OpenAI APIは過去の会話を自動的に記憶しない — 各リクエストは完全に独立している。モデルにコンテキストを記憶させたい場合、毎回自分で履歴を渡す必要がある:

from openai import OpenAI

client = OpenAI(api_key="sk-...")

history = [
    {"role": "system", "content": "Bạn là trợ lý IT cho lập trình viên Việt Nam."}
]

while True:
    user_input = input("Bạn: ")
    if user_input.lower() in ["quit", "exit"]:
        break

    history.append({"role": "user", "content": user_input})

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=history
    )

    reply = response.choices[0].message.content
    history.append({"role": "assistant", "content": reply})

    print(f"AI: {reply}\n")

エラーを正しく処理する

最もよく遭遇する3種類のエラー — そしてそれぞれの対処法:

from openai import OpenAI, RateLimitError, APIConnectionError, AuthenticationError
import time

client = OpenAI(api_key="sk-...")

def safe_completion(messages, retries=3):
    for attempt in range(retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4o-mini",
                messages=messages
            )
            return response.choices[0].message.content

        except AuthenticationError:
            print("API key sai hoặc hết hạn — kiểm tra lại")
            return None  # Không retry, lỗi này cần fix thủ công

        except RateLimitError:
            wait = 2 ** attempt  # Exponential backoff: 1s → 2s → 4s
            print(f"Rate limit — chờ {wait}s rồi thử lại...")
            time.sleep(wait)

        except APIConnectionError:
            print(f"Lỗi kết nối (lần {attempt + 1}/{retries})")
            time.sleep(1)

    return None

実践的なTips — 自分の失敗から学んだこと

1. APIキーは環境変数で設定する — ハードコードしない

# Trong terminal hoặc file .env
export OPENAI_API_KEY="sk-...your-key..."
import os
from openai import OpenAI

# OpenAI tự đọc OPENAI_API_KEY từ environment — không cần truyền api_key
client = OpenAI()

痛い教訓:かつてAPIキーを誤ってGitHubのパブリックリポジトリにコミットしてしまった。OpenAIは5分も経たないうちに無効化し、すぐに警告メールを送ってきた。誰かに使われてアカウントに請求される前に気づけたのは幸運だった。

2. max_tokensでコストをコントロールする

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=messages,
    max_tokens=500,      # Giới hạn độ dài response
    temperature=0.7      # 0 = deterministic, 1 = creative
)

3. ユースケースに合ったtemperatureを設定する

  • temperature=0:抽出、分類、コード生成 — 一貫した再現可能な出力が必要な場合
  • temperature=0.7:コンテンツ作成、アイデアのブレインストーミング — 程よくクリエイティブで、暴走しない
  • temperature=1.0以上:クリエイティブライティング、スローガン作成 — 予想外の出力を受け入れる。良い場合も悪い場合もある

4. python-dotenvで認証情報を管理する

pip install python-dotenv
# File .env (bắt buộc thêm vào .gitignore)
OPENAI_API_KEY=sk-...

# File main.py
from dotenv import load_dotenv
load_dotenv()

client = OpenAI()  # Tự đọc từ .env

5. 請求が膨らむ前にコストを把握する

gpt-4o-miniの料金:入力トークン$0.15/1M、出力トークン$0.60/1M。通常のリクエストは約300〜500トークンで、$0.001未満だ。安く聞こえる — だが、アプリが長いコンテキストで1日1万リクエストを処理するなら、月末の数字はまったく違ってくる。platform.openai.com → Settings → Billingで、本番環境にデプロイする前に$10でアラートを、$50でハードリミットを設定しておこう。

Share: