ChatGPT API の使い方を Python で徹底解説!実装例からコスト・エラー対策まで

ChatGPT API を Python から呼び出して業務やアプリに組み込みたいと考えている方向けに、実際に動くコードとともに使い方を解説します。本記事では OpenAI の公式 API を Python で利用する具体的な手順、実装例、料金計算の方法、そして運用で避けて通れないエラーハンドリングまでを網羅的に紹介します。実際に私が複数のプロジェクトで API を導入した経験をもとに、初心者でも

ChatGPT API 使い方 python

ChatGPT API を Python から呼び出して業務やアプリに組み込みたいと考えている方向けに、実際に動くコードとともに使い方を解説します。本記事では OpenAI の公式 API を Python で利用する具体的な手順、実装例、料金計算の方法、そして運用で避けて通れないエラーハンドリングまでを網羅的に紹介します。実際に私が複数のプロジェクトで API を導入した経験をもとに、初心者でもすぐに試せる形で整理しました。この記事を読めば、今日から ChatGPT API を自分のコードに統合して、AI 自動化の第一歩を踏み出せます。

ChatGPT API を Python で使う準備

ChatGPT API を Python から呼び出すには、まず OpenAI のアカウント登録と API キーの取得が必要です。

アカウント作成と API キー取得

  1. OpenAI の公式サイト にアクセスし、アカウントを作成します
  2. ダッシュボードにログイン後、右上のメニューから「API keys」を選択
  3. 「Create new secret key」をクリックして新しい API キーを生成
  4. 生成されたキーは一度しか表示されないため、必ず安全な場所に保存してください

Python 環境のセットアップ

OpenAI 公式の Python ライブラリをインストールします。

pip install openai

Python 3.7.1 以上が推奨されています。私の場合は Python 3.10 環境で問題なく動作しています。

環境変数に API キーを設定しておくと、コード内にキーを直書きせずに済むため安全です。

export OPENAI_API_KEY='your-api-key-here'

Windows の場合は以下の通りです。

set OPENAI_API_KEY=your-api-key-here

基本的な API 呼び出しコード例

最もシンプルな ChatGPT API の呼び出し例を示します。

import openai
import os

# API キーを環境変数から読み込み
openai.api_key = os.environ.get("OPENAI_API_KEY")

# ChatGPT API を呼び出す
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "あなたは親切なアシスタントです。"},
        {"role": "user", "content": "Python で API を呼ぶ方法を教えてください。"}
    ],
    temperature=0.7,
    max_tokens=500
)

# レスポンスを表示
print(response.choices[0].message.content)

パラメータの解説

  • model: 使用するモデルを指定します。gpt-3.5-turbo はコスパが良く、gpt-4 はより高精度です
  • messages: 会話履歴を配列で渡します。rolesystem(振る舞い指示)、assistant(AI の返答)、user(ユーザー入力)の 3 種類
  • temperature: 0〜2 の値で、数値が高いほど創造的(ランダム)な出力になります。0.7 前後が汎用的
  • max_tokens: 生成する最大トークン数。コスト管理の要になります

実際に試したところ、上記コードで数秒以内にレスポンスが返ってきました。

Neuro Dive|AI・データサイエンス就労移行支援

📌 Neuro Dive|AI・データサイエンス就労移行支援

厚労省指定 AI・データサイエンス就労移行支援。未経験から AI 人材を目指す。

👉 公式サイトで無料申し込み

※当ブログはアフィリエイトプログラムにより収益を得ています

会話履歴を保持した対話型実装

単発の質問だけでなく、文脈を保ちながら複数回やり取りするには、messages 配列に会話履歴を追加していきます。

import openai
import os

openai.api_key = os.environ.get("OPENAI_API_KEY")

# 会話履歴を保存するリスト
conversation_history = [
    {"role": "system", "content": "あなたは技術サポート担当です。"}
]

def chat(user_input):
    # ユーザーの入力を履歴に追加
    conversation_history.append({"role": "user", "content": user_input})
    
    # API 呼び出し
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=conversation_history,
        temperature=0.7,
        max_tokens=300
    )
    
    # アシスタントの返答を取得して履歴に追加
    assistant_reply = response.choices[0].message.content
    conversation_history.append({"role": "assistant", "content": assistant_reply})
    
    return assistant_reply

# 対話例
print(chat("Python のバージョン確認方法は?"))
print(chat("それを自動化する方法は?"))  # 前の文脈を踏まえた返答が得られる

このパターンは FAQ ボット、カスタマーサポート、社内ヘルプデスクなどで活用できます。私の場合、社内向けドキュメント検索 bot でこの手法を採用し、ユーザーが何度も質問を重ねながら答えに辿り着く UX を実現しました。

コスト計算と料金管理のポイント

ChatGPT API は使用したトークン数に応じて課金されます。予期せぬ高額請求を避けるため、コスト管理は必須です。

2024年1月時点の料金(参考)

  • gpt-3.5-turbo: 入力 $0.0015 / 1K tokens、出力 $0.002 / 1K tokens
  • gpt-4: 入力 $0.03 / 1K tokens、出力 $0.06 / 1K tokens

※ 最新の料金は OpenAI の公式 Pricing ページ で確認してください。

トークン数の確認とコスト計算

レスポンスオブジェクトには使用トークン数が含まれています。

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "こんにちは"}
    ]
)

# トークン使用量を取得
usage = response.usage
print(f"入力トークン: {usage.prompt_tokens}")
print(f"出力トークン: {usage.completion_tokens}")
print(f"合計トークン: {usage.total_tokens}")

# コスト計算例(gpt-3.5-turbo の場合)
input_cost = (usage.prompt_tokens / 1000) * 0.0015
output_cost = (usage.completion_tokens / 1000) * 0.002
total_cost = input_cost + output_cost
print(f"推定コスト: ${total_cost:.6f}")

実際に試したところ、日本語で「こんにちは」と送信した場合、入力 10 トークン程度、返答が 50〜100 トークン程度で、1 回あたりのコストは $0.0002 前後でした。

コスト削減のテクニック

  1. max_tokens を適切に設定: 不要に長い出力を防ぐ
  2. gpt-3.5-turbo を優先: gpt-4 は約 20 倍高額なため、必要な場面だけ使用
  3. 会話履歴を適度に削減: 長い履歴は毎回送信されるためトークン消費が増える
  4. tiktoken ライブラリでトークン数を事前計算: API を呼ぶ前にコストを見積もれます
import tiktoken

def count_tokens(text, model="gpt-3.5-turbo"):
    encoding = tiktoken.encoding_for_model(model)
    return len(encoding.encode(text))

text = "Python で API を使う"
print(f"トークン数: {count_tokens(text)}")

automationjp.com の関連記事では、大量処理時のコスト最適化手法も紹介しています。

エラー処理とリトライ戦略

本番運用では、ネットワークエラー、レート制限、API 障害などが発生します。堅牢なエラーハンドリングが不可欠です。

主なエラーの種類

  • RateLimitError: リクエスト数やトークン数の上限超過
  • Timeout: API 応答のタイムアウト
  • APIError: OpenAI 側のサーバーエラー
  • InvalidRequestError: パラメータ不正など

リトライ処理を含む実装例

import openai
import os
import time
from openai.error import RateLimitError, Timeout, APIError

openai.api_key = os.environ.get("OPENAI_API_KEY")

def chat_with_retry(messages, max_retries=3, retry_delay=5):
    for attempt in range(max_retries):
        try:
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=messages,
                temperature=0.7,
                max_tokens=500,
                timeout=30  # タイムアウトを 30 秒に設定
            )
            return response.choices[0].message.content
        
        except RateLimitError:
            if attempt < max_retries - 1:
                wait_time = retry_delay * (2 ** attempt)  # 指数バックオフ
                print(f"レート制限エラー。{wait_time}秒後にリトライします...")
                time.sleep(wait_time)
            else:
                print("リトライ上限に達しました。")
                raise
        
        except Timeout:
            if attempt < max_retries - 1:
                print("タイムアウト。リトライします...")
                time.sleep(retry_delay)
            else:
                print("タイムアウトが続いています。")
                raise
        
        except APIError as e:
            print(f"API エラー: {e}")
            if attempt < max_retries - 1:
                time.sleep(retry_delay)
            else:
                raise
        
        except Exception as e:
            print(f"予期しないエラー: {e}")
            raise

# 使用例
try:
    result = chat_with_retry([
        {"role": "user", "content": "Python のエラー処理について教えて"}
    ])
    print(result)
except Exception as e:
    print(f"処理に失敗しました: {e}")

私の場合、大量の自動処理を走らせたときにレート制限に引っかかった経験があり、それ以降は必ず指数バックオフのリトライを実装するようにしています。

ログ記録の実装

本番環境では、API 呼び出しのログを残すことで、トラブルシューティングやコスト分析が容易になります。

import logging
from datetime import datetime

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

def chat_with_logging(messages):
    start_time = datetime.now()
    
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages,
            temperature=0.7
        )
        
        elapsed_time = (datetime.now() - start_time).total_seconds()
        
        logger.info(f"API 呼び出し成功 | "
                   f"時間: {elapsed_time:.2f}秒 | "
                   f"トークン: {response.usage.total_tokens}")
        
        return response.choices[0].message.content
    
    except Exception as e:
        elapsed_time = (datetime.now() - start_time).total_seconds()
        logger.error(f"API 呼び出し失敗 | "
                    f"時間: {elapsed_time:.2f}秒 | "
                    f"エラー: {str(e)}")
        raise

実践的なユースケースと応用例

ChatGPT API を Python から利用する具体的な活用シーンを紹介します。

テキスト要約の自動化

長文のレポートやドキュメントを自動要約する例です。

def summarize_text(long_text, max_summary_length=200):
    messages = [
        {"role": "system", "content": "あなたは要約の専門家です。"},
        {"role": "user", "content": f"以下のテキストを{max_summary_length}文字程度で要約してください:\n\n{long_text}"}
    ]
    
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=messages,
        temperature=0.3,  # 要約は創造性より正確性を重視
        max_tokens=300
    )
    
    return response.choices[0].message.content

# 使用例
long_document = """
(長文テキスト)
"""
summary = summarize_text(long_document)
print(summary)

データの構造化と抽出

非構造化テキストから情報を抽出し、JSON 形式で取得する例です。

import json

def extract_info(text):
    messages = [
        {"role": "system", "content": "あなたは情報抽出の専門家です。"},
        {"role": "user", "content": f"""
以下のテキストから人名、日付、場所を抽出し、JSON形式で返してください。

テキスト: {text}

形式:
{{
  "person": "人名",
  "date": "日付",
  "location": "場所"
}}
"""}
    ]
    
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=messages,
        temperature=0
    )
    
    # JSON としてパース
    result = json.loads(response.choices[0].message.content)
    return result

# 使用例
text = "2024年1月15日、東京で山田太郎氏が記者会見を行った。"
info = extract_info(text)
print(info)

実際に試したところ、複雑な契約書からの情報抽出など、従来は人手に頼っていた作業を自動化できました。

バッチ処理と並列化

複数のテキストを効率的に処理する例です。

from concurrent.futures import ThreadPoolExecutor, as_completed

def process_multiple_texts(text_list, process_func):
    results = []
    
    with ThreadPoolExecutor(max_workers=5) as executor:
        future_to_text = {
            executor.submit(process_func, text): text 
            for text in text_list
        }
        
        for future in as_completed(future_to_text):
            try:
                result = future.result()
                results.append(result)
            except Exception as e:
                print(f"処理エラー: {e}")
    
    return results

# 使用例
texts = ["テキスト1", "テキスト2", "テキスト3"]
summaries = process_multiple_texts(texts, summarize_text)

ただし、並列処理ではレート制限に注意が必要です。OpenAI の利用プランによって上限が異なるため、適切な max_workers の設定が重要です。

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

本番環境で ChatGPT API を運用する際の推奨事項をまとめます。

セキュリティ対策

  1. API キーの管理: 環境変数や AWS Secrets Manager など安全な方法で管理
  2. 入力のサニタイゼーション: ユーザー入力をそのまま API に送る前に検証
  3. 出力のフィルタリング: 不適切な内容が出力されないようモニタリング

パフォーマンス最適化

  1. キャッシュの活用: 同じ質問への回答は DB にキャッシュして API 呼び出しを削減
  2. ストリーミングの利用: 長い応答には streaming=True でリアルタイム表示
  3. モデルの使い分け: 簡単なタスクは gpt-3.5-turbo、複雑なものは gpt-4
# ストリーミング実装例
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "長い物語を書いてください"}],
    stream=True
)

for chunk in response:
    if chunk.choices[0].delta.get("content"):
        print(chunk.choices[0].delta.content, end="")

モニタリングとアラート

  • API 使用量の日次レポート作成
  • コストが閾値を超えたらアラート通知
  • エラー率の監視と異常検知

私の環境では、Slack に日次でコストレポートを自動投稿する仕組みを入れており、予算管理が格段に楽になりました。

まとめ

ChatGPT API を Python から利用する方法について、基本的な呼び出しからコスト管理、エラー処理、実践的な応用例まで解説しました。

TL;DR

  • OpenAI の API キーを取得し、openai ライブラリで簡単に呼び出せる
  • トークン数ベースの課金なので、max_tokens とモデル選択でコスト管理が重要
  • リトライ処理とエラーハンドリングを実装して本番運用に耐える実装を
  • 会話履歴の保持、要約、データ抽出など幅広いユースケースに対応可能

Next Actions

  • まずは無料クレジット範囲で API キーを取得し、基本的な呼び出しコードを動かしてみる
  • 自分の業務で自動化したいタスクを 1 つ選び、プロトタイプを作成する
  • tiktoken でトークン計算を実装し、想定コストをシミュレーションする

automationjp.com では、ChatGPT API を使った業務自動化の具体的な事例や、他の AI ツールとの連携方法なども紹介しています。ぜひ他の記事も参考に、AI 自動化の世界を広げていってください。

Read more

【単価3倍】クラウドワークスで高単価案件を獲得する5つのコツ

【単価3倍】クラウドワークスで高単価案件を獲得する5つのコツ

結論:クラウドワークスで高単価案件を獲得する答えは「単価2.5円以上の領域に絞った提案戦略」 📌 フリーランス案件: join フリーランス専門エージェント join|週3〜OK・IT 高単価案件多数 👉 公式サイトで無料申し込み ※当ブログはアフィリエイトプログラムにより収益を得ています クラウドワークスで高単価案件(文字単価2.5円以上、月収換算20〜50万円)を獲得する最短ルートは、「ジャンル特化×提案文の品質×実績の見せ方」の3要素を同時に磨くことです。低単価案件(文字単価0.5〜1円)に応募し続けると永遠に単価が上がらないため、最初の30日以内に単価1.5円以上の継続クライアントを2社確保することがゴールラインになります。 この結論の根拠は3つあります。第一に、クラウドワークス公式の発注データを分析すると、文字単価2円以上の案件は全体の25%を占め、応募数は1案件あたり平均8件に留まっています。低単価案件の応募数(平均30件以上)と比べて競争率が4分の1で、未経験〜実績数件でも十分に通過します。第二に、高単価発注者は「速さ」より「丁寧な提案文」と「サン

By tsuyoshi
【月収30万円】Webライター未経験から始める7ステップ|2026年版

【月収30万円】Webライター未経験から始める7ステップ|2026年版

結論:Webライター未経験でも7ステップで月収30万円は十分に到達可能 Webライター未経験から月収30万円を達成するための答えは「正しい順番で7つのステップを踏むこと」です。具体的には、最初の3ヶ月で月収5万円、6ヶ月で15万円、12ヶ月で30万円という現実的なロードマップを描けます。月収30万円は文字単価2円×15万文字、または文字単価3円×10万文字で到達する水準で、専業ライターであれば1日4,000〜5,000文字の執筆で実現可能なラインです。 この結論の根拠は3つあります。第一に、クラウドワークスやランサーズなどのクラウドソーシング市場は2026年時点で1,000億円規模にまで拡大し、文字単価2円以上の案件が全体の30%を占めるようになっています。第二に、ChatGPTやClaudeなどのAIツールを活用したリサーチ・構成作成によって、1記事あたりの執筆時間が従来の3分の1まで圧縮できるようになりました。第三に、SEO・YMYL・E-E-A-T理解を備えたライターは慢性的に不足しており、企業側が「高単価でも質の高いライターを確保したい」というニーズを抱え続けているからです

By tsuyoshi
【3ヶ月で月20万】Printifyで稼ぐ初期費用ゼロ副業|売れるデザイン5選

【3ヶ月で月20万】Printifyで稼ぐ初期費用ゼロ副業|売れるデザイン5選

結論:Printifyで月20万円は"商品数×ニッチ×価格戦略"の掛け算で到達できる 📌 Printify で在庫ゼロのオリジナル商品を作る デザインを乗せて販売、注文時のみ印刷・発送なので在庫リスク 0 円 👉 公式サイトで無料申し込み ※当ブログはアフィリエイトプログラムにより収益を得ています Printifyを使って月20万円の副業収益を目指す——この目標は、特別なデザインスキルがなくても、次の3つの数字を意識すれば3ヶ月で到達可能です。 * 商品数200点:月20万を狙うなら、最低でも200リスティングが基準ライン * 平均粗利$8(約¥1,200):価格設計次第で$10超えも可能 * 販売チャネル2本立て:Etsy主軸+Shopify or eBayで分散 平均粗利$8 × 200点 × 月1回転 = $1,600(約¥24万)。これが月20万到達の最小数式です。本記事では、PrintifyというPODサービスを最大限活用しつつ、初期費用ゼロから3ヶ月で月20万円を狙うロードマップを、料金プラン比較・売れるデザイン5パターン・

By tsuyoshi
【月10万】Printify×Etsy×AIで稼ぐ無在庫副業7ステップ|初心者OK

【月10万】Printify×Etsy×AIで稼ぐ無在庫副業7ステップ|初心者OK

結論:Printify×Etsy×AIで月10万円は3ヶ月で十分に再現可能 📌 Printify で在庫ゼロのオリジナル商品を作る デザインを乗せて販売、注文時のみ印刷・発送なので在庫リスク 0 円 👉 公式サイトで無料申し込み ※当ブログはアフィリエイトプログラムにより収益を得ています 「在庫を持たずに副業で月10万円を稼ぎたい」——この問いへの最短解の一つが、Printify(プリント・オン・デマンド)×Etsy(海外マーケットプレイス)×AI(ChatGPT/画像生成) の組み合わせです。理由は次の3点に集約されます。 1. 在庫・初期費用が事実上ゼロ:Printifyは注文発生後に印刷・発送されるため、商品在庫を抱える必要がありません。Etsyの出店費用は1リスティング$0.20(約¥30)と極めて低コストです。 2. AIで商品デザインとリスティングが量産可能:ChatGPTでタイトル・タグ・説明文を、Midjourney/DALL·EでTシャツやマグカップ用のグラフィックを量産でき、1日あたり10〜30商品を投入できます。 3. 海外需要は日本

By tsuyoshi