ChatGPT APIの使い方入門|Python実装からコスト管理まで

chatgpt-api-guide 文章生成AI

ChatGPT APIの使い方入門|Python実装からコスト管理まで

ChatGPT APIを使えば、OpenAIの言語モデルをプログラムから呼び出し、自動応答システムやコンテンツ生成ツールを構築できます。本記事では、APIキーの取得からPython実装、料金体系、実運用のベストプラクティスまでを解説します。

今すぐAPI開発を始めたい方へ

書籍で体系的に学びながら進めたい方には「ChatGPT/LangChainによるチャットシステム構築[Python]実践入門」がおすすめです。環境構築からデプロイまで、順を追って解説されています。

楽天ブックスで見る | Amazonで見る

ChatGPT APIとは

ChatGPT APIは、OpenAIが提供する言語モデル(GPT-4、GPT-3.5など)をHTTP経由で利用できるサービスです。Web版ChatGPTとは異なり、プログラムに組み込んで自動化できる点が特徴です。

Web版との主な違い

  • 料金体系: 月額課金ではなく、使用トークン数に応じた従量課金
  • カスタマイズ性: システムプロンプト、温度パラメータなどを自由に設定可能
  • レート制限: APIキーのティアに応じて1分あたりのリクエスト数に上限あり
  • データ利用: APIの入出力は原則としてモデルの学習に使用されない(2023年3月以降)

APIキーの取得方法

1. OpenAIアカウント作成

platform.openai.comにアクセスし、アカウントを作成します。既にChatGPTのアカウントを持っている場合でも、API利用には別途クレジットカード登録が必要です。

2. APIキー発行

  1. ダッシュボードにログイン
  2. 左メニューから「API keys」を選択
  3. 「Create new secret key」をクリック
  4. キー名を入力(例: “development”)し、生成
  5. 表示されたキーを必ずコピーして保存(再表示不可)

3. 利用枠の設定

「Settings」→「Billing」から以下を設定します。

  • クレジットカード登録: 従量課金の支払い方法
  • Usage limits: 月間利用上限を設定(予期しない高額請求を防ぐ)

初回登録時は無料クレジットが付与される場合がありますが、期限や金額は時期により変動します。

Python実装の基本

環境構築

# OpenAI公式ライブラリのインストール
pip install openai

最小構成のコード例

from openai import OpenAI

# APIキーは環境変数から読み込む
client = OpenAI(api_key="your-api-key-here")

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Pythonでリストを反転する方法を教えて"}
    ]
)

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

環境変数の利用(推奨)

APIキーをコードに直接書くのはセキュリティリスクです。環境変数を使いましょう。

# .bashrc or .zshrc に追加
export OPENAI_API_KEY="sk-..."
import os
from openai import OpenAI

# 環境変数から自動取得
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

システムプロンプトの活用

systemロールでAIの振る舞いを制御できます。

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "あなたは初心者向けプログラミング講師です。分かりやすく丁寧に説明してください。"},
        {"role": "user", "content": "変数とは何ですか?"}
    ]
)

会話履歴の管理

複数ターンの対話を実現するには、過去のメッセージを配列に蓄積します。

messages = [
    {"role": "system", "content": "あなたは親切なアシスタントです。"}
]

# ユーザー入力を追加
messages.append({"role": "user", "content": "今日の天気は?"})

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=messages
)

# AIの返答も履歴に追加
messages.append({
    "role": "assistant",
    "content": response.choices[0].message.content
})

# 次のターン
messages.append({"role": "user", "content": "傘は必要ですか?"})

主なパラメータ解説

temperature(温度)

生成結果のランダム性を制御します(0.0~2.0)。

  • 0.0~0.3: 決定論的で一貫性のある出力(FAQ、技術文書)
  • 0.7~1.0: バランス型(一般的な会話)
  • 1.5~2.0: 創造的で多様な出力(ブレスト、小説)
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "新商品のキャッチコピーを考えて"}],
    temperature=1.5  # 創造性重視
)

max_tokens

生成する最大トークン数を制限します。

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "AIとは"}],
    max_tokens=100  # 簡潔な返答に制限
)

top_p(nucleus sampling)

出力候補の確率分布を制御します(0.0~1.0)。temperatureとの併用は推奨されません。

n(生成数)

1回のリクエストで複数の候補を生成します。

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "ブログタイトル案を出して"}],
    n=3  # 3つの候補を生成
)

for choice in response.choices:
    print(choice.message.content)

料金体系とコスト管理

2024年時点の主なモデル料金

モデル 入力 出力
GPT-4 Turbo $10 / 1M tokens $30 / 1M tokens
GPT-3.5 Turbo $0.50 / 1M tokens $1.50 / 1M tokens

※料金は変更される可能性があります。最新情報は公式価格ページで確認してください。

トークン数の概算

  • 日本語: 1文字あたり約1.5~2トークン
  • 英語: 1単語あたり約1.3トークン
# トークン数を取得
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "こんにちは"}]
)

print(f"入力トークン: {response.usage.prompt_tokens}")
print(f"出力トークン: {response.usage.completion_tokens}")
print(f"合計: {response.usage.total_tokens}")

コスト削減のテクニック

1. モデルの使い分け

単純なタスクにはGPT-3.5 Turboを使用し、GPT-4は複雑な推論が必要な場合のみ使用します。

2. 会話履歴の削減

長い会話では古いメッセージを削除し、直近のやり取りのみ保持します。

# 直近5ターンのみ保持
MAX_HISTORY = 10  # system + user/assistant x 5
if len(messages) > MAX_HISTORY:
    messages = [messages[0]] + messages[-(MAX_HISTORY-1):]

3. max_tokensで出力を制限

不要に長い生成を防ぎます。

4. キャッシュとバッチ処理

同じ入力に対する結果をキャッシュし、複数リクエストをバッチ化します。

API開発を体系的に学ぶには

独学でのAPI開発に限界を感じている方には、プログラミングスクールも選択肢です。

特徴 内容
実践的カリキュラム ChatGPT APIを使った実アプリ開発
現役エンジニア指導 マンツーマンでの技術サポート
転職・副業支援 ポートフォリオ作成から案件獲得まで

DMM WEBCAMP 無料カウンセリングに申し込む(5分で完了)

利用量モニタリング

import openai
from datetime import datetime, timedelta

# 過去30日間の利用量を取得
end_date = datetime.now()
start_date = end_date - timedelta(days=30)

# ダッシュボードで確認するのが確実
# APIでの取得は非推奨(レート制限の対象)

実際の利用量はOpenAIダッシュボードで確認するのが確実です。

実運用のベストプラクティス

エラーハンドリング

from openai import OpenAI, OpenAIError
import time

client = OpenAI()

def call_api_with_retry(messages, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-3.5-turbo",
                messages=messages
            )
            return response
        except OpenAIError as e:
            if attempt < max_retries - 1:
                wait_time = 2 ** attempt  # 指数バックオフ
                print(f"エラー発生。{wait_time}秒後に再試行...")
                time.sleep(wait_time)
            else:
                raise

レート制限への対応

APIキーのティアによってRPM(Requests Per Minute)とTPM(Tokens Per Minute)の上限があります。

import time
from collections import deque

class RateLimiter:
    def __init__(self, max_requests_per_minute):
        self.max_requests = max_requests_per_minute
        self.requests = deque()

    def wait_if_needed(self):
        now = time.time()
        # 1分以上前のリクエストを削除
        while self.requests and self.requests[0] < now - 60:
            self.requests.popleft()

        if len(self.requests) >= self.max_requests:
            sleep_time = 60 - (now - self.requests[0])
            time.sleep(sleep_time)

        self.requests.append(time.time())

# 使用例
limiter = RateLimiter(max_requests_per_minute=10)

for message in message_list:
    limiter.wait_if_needed()
    response = client.chat.completions.create(...)

セキュリティ対策

APIキーの管理

  • .gitignoreに登録: 環境変数ファイル(.env)をGitにコミットしない
  • 権限の最小化: 必要な権限のみ付与されたキーを使用
  • 定期的なローテーション: 漏洩リスクに備えて定期的に再生成

入力のサニタイズ

ユーザー入力をそのままAPIに送る場合、プロンプトインジェクション対策が必要です。

def sanitize_input(user_input):
    # 極端に長い入力を制限
    if len(user_input) > 2000:
        user_input = user_input[:2000]

    # システムプロンプトの上書きを防ぐ
    # (完全な対策ではないため、重要な用途では慎重に設計)
    return user_input

messages = [
    {"role": "system", "content": "あなたはカスタマーサポートです。"},
    {"role": "user", "content": sanitize_input(user_input)}
]

ログ記録

import logging
import json

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def log_api_call(messages, response):
    logger.info(json.dumps({
        "timestamp": time.time(),
        "model": response.model,
        "prompt_tokens": response.usage.prompt_tokens,
        "completion_tokens": response.usage.completion_tokens,
        "total_tokens": response.usage.total_tokens
    }))

response = client.chat.completions.create(...)
log_api_call(messages, response)

ストリーミング応答

リアルタイムにテキストを受信する場合はストリーミングを使用します。

stream = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "AIの歴史について説明して"}],
    stream=True
)

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

Function Calling(関数呼び出し)

外部ツールやAPIと連携する際に有用です。

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "指定都市の天気を取得",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "都市名"}
                },
                "required": ["city"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "東京の天気は?"}],
    tools=tools,
    tool_choice="auto"
)

# AIが関数呼び出しを判断した場合
if response.choices[0].message.tool_calls:
    tool_call = response.choices[0].message.tool_calls[0]
    function_name = tool_call.function.name
    arguments = json.loads(tool_call.function.arguments)
    # 実際の天気APIを呼び出す処理...

よくある質問

Q. APIキーが漏洩した場合、どうすればいいですか?

すぐにOpenAIダッシュボードでキーを無効化し、新しいキーを発行してください。漏洩した可能性がある場合は、念のため利用状況を確認し、不正利用がないかチェックしましょう。

Q. 無料枠はありますか?

初回登録時に無料クレジットが付与される場合がありますが、金額や期限は時期により変動します。基本的には従量課金制のため、クレジットカード登録が必要です。

Q. APIとChatGPT Plusの違いは何ですか?

APIは従量課金でプログラムから利用するもの、Plusは月額$20でWebやアプリから利用するものです。開発者以外の一般ユーザーにはPlusがおすすめです。

Q. エラーコード429が出た場合の対処法は?

レート制限に達した場合に表示されるエラーです。リクエストの頻度を下げるか、指数バックオフを実装してリトライしてください。頻繁に発生する場合は、より高いティアへのアップグレードを検討しましょう。

まとめ

ChatGPT APIを使えば、言語モデルの能力をプログラムに組み込めます。本記事で解説したポイントは以下の通りです。

  • APIキーは環境変数で管理し、GitHubなどに公開しない
  • システムプロンプトで振る舞いを制御
  • temperatureやmax_tokensで出力を調整
  • トークン数を監視してコストを管理
  • エラーハンドリングとレート制限対策を実装
  • セキュリティとログ記録を忘れずに

実際のプロダクション運用では、キャッシュ層の導入、マルチモデル対応、詳細な監視など、さらに高度な設計が求められます。まずは小規模な実装から始め、段階的に機能を拡充していくことをお勧めします。

おすすめ書籍

AIツールの活用スキルをさらに高めたい方におすすめの一冊です。

『ChatGPT最強の仕事術』 池田朋弘(1,870円)

ChatGPTを仕事で本格的に使いこなすための実践テクニックが満載。プロンプト設計から業務自動化まで幅広くカバーしています。

関連記事


さらに深く学ぶには

【PR】

📚 書籍で体系的に学ぶ

API開発を本格的に学びたい方には、以下の書籍がおすすめです。

入門者向け: 「面倒なことはChatGPTにやらせよう」
– Amazon ★4.5(800件以上のレビュー)
– プログラミング初心者でも分かりやすい
– 実践的なユースケースが豊富

楽天で見る | Amazonで見る

実践者向け: 「ChatGPT/LangChainによるチャットシステム構築」
– 本格的なシステム構築を学べる
– LangChainとの連携も解説
– プロダクション運用のノウハウ

楽天で見る | Amazonで見る

🎓 プロから直接学ぶ

独学に限界を感じたら、プログラミングスクールも選択肢です。

DMM WEBCAMP AIコース
– 現役エンジニアがマンツーマン指導
– チャットサポート付き
– 転職サポートあり

給付金で最大80%オフ(実質18万円〜)DMM WEBCAMP 無料カウンセリングに申し込む


参考リンク

コメント