ChatGPT API の使い方を Python で徹底解説!実装例からコスト・エラー対策まで
ChatGPT API を Python から呼び出して業務やアプリに組み込みたいと考えている方向けに、実際に動くコードとともに使い方を解説します。本記事では OpenAI の公式 API を Python で利用する具体的な手順、実装例、料金計算の方法、そして運用で避けて通れないエラーハンドリングまでを網羅的に紹介します。実際に私が複数のプロジェクトで API を導入した経験をもとに、初心者でも
ChatGPT API を Python から呼び出して業務やアプリに組み込みたいと考えている方向けに、実際に動くコードとともに使い方を解説します。本記事では OpenAI の公式 API を Python で利用する具体的な手順、実装例、料金計算の方法、そして運用で避けて通れないエラーハンドリングまでを網羅的に紹介します。実際に私が複数のプロジェクトで API を導入した経験をもとに、初心者でもすぐに試せる形で整理しました。この記事を読めば、今日から ChatGPT API を自分のコードに統合して、AI 自動化の第一歩を踏み出せます。
ChatGPT API を Python で使う準備
ChatGPT API を Python から呼び出すには、まず OpenAI のアカウント登録と API キーの取得が必要です。
アカウント作成と API キー取得
- OpenAI の公式サイト にアクセスし、アカウントを作成します
- ダッシュボードにログイン後、右上のメニューから「API keys」を選択
- 「Create new secret key」をクリックして新しい API キーを生成
- 生成されたキーは一度しか表示されないため、必ず安全な場所に保存してください
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: 会話履歴を配列で渡します。
roleはsystem(振る舞い指示)、assistant(AI の返答)、user(ユーザー入力)の 3 種類 - temperature: 0〜2 の値で、数値が高いほど創造的(ランダム)な出力になります。0.7 前後が汎用的
- max_tokens: 生成する最大トークン数。コスト管理の要になります
実際に試したところ、上記コードで数秒以内にレスポンスが返ってきました。
📌 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 前後でした。
コスト削減のテクニック
- max_tokens を適切に設定: 不要に長い出力を防ぐ
- gpt-3.5-turbo を優先: gpt-4 は約 20 倍高額なため、必要な場面だけ使用
- 会話履歴を適度に削減: 長い履歴は毎回送信されるためトークン消費が増える
- 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 を運用する際の推奨事項をまとめます。
セキュリティ対策
- API キーの管理: 環境変数や AWS Secrets Manager など安全な方法で管理
- 入力のサニタイゼーション: ユーザー入力をそのまま API に送る前に検証
- 出力のフィルタリング: 不適切な内容が出力されないようモニタリング
パフォーマンス最適化
- キャッシュの活用: 同じ質問への回答は DB にキャッシュして API 呼び出しを削減
- ストリーミングの利用: 長い応答には streaming=True でリアルタイム表示
- モデルの使い分け: 簡単なタスクは 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 自動化の世界を広げていってください。