Shinjo Syntax

アイコン
🤖

PythonでOpenAI APIを使ってみる - 実践的な導入ガイド

公開日 2025/07/28
更新日 2025/10/19

PythonからOpenAI APIを利用する実践的な方法を解説します。本記事では、LLMアプリケーション開発の基礎となる、シンプルで再利用可能な実装パターンを提供します。

本記事は、今後LLMを活用した様々なシステムやアプリケーションを開発する上でのベースライン実装を提供することを目的としています。

記事の特徴:

  • ✅ シンプルで理解しやすいファイル構成
  • ✅ PoCやプロトタイピングへの流用が容易
  • ✅ Docker環境での実行をサポート
  • ✅ 本番環境へのスケールを意識した設計

以下のシンプルな構成で、OpenAI APIを利用した基本的なアプリケーションを構築します。

1C:.
2│  docker-compose.yml
34└─app
5        .env
6        Dockerfile
7        main.py
8        requirements.txt

📁 ファイル一覧と役割

今回重要なファイルは以下の通りです。

ファイル役割重要度
main.pyPythonの実行ファイル🔴 必須
requirements.txt必要なライブラリを列挙🔴 必須
.env環境変数(API鍵など)を設定🔴 必須
docker-compose.ymlDocker Composeの設定🟡 推奨
DockerfileDockerコンテナの定義🟡 推奨

💡 ポイント: Docker関連のファイルは必須ではありませんが、環境の再現性を確保するため、実行環境を構築する際には強く推奨します。


main.py

OpenAI APIを呼び出すメインスクリプトです。このコードは最小限の実装でありながら、LLMとの対話の基本的な流れを示しています。

1import os
2import openai
3from dotenv import load_dotenv
4
5# .env ファイルからAPIキーを取得
6load_dotenv()
7OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
8openai_client = openai.OpenAI(api_key=OPENAI_API_KEY)
9
10
11def say_hello(prompt: str) -> dict:
12    """
13    OpenAI APIのLLMを使って解答を取得する。
14    """
15    print("say hello")
16    response = openai_client.chat.completions.create(
17        model="gpt-4o-mini",
18        messages=[
19            {"role": "system", "content": "以下の回答に英語でこたえてください。"},
20            {"role": "user", "content": f"質問: {prompt}"}
21        ]
22    )
23    print(response)
24
25    message_content = response.choices[0].message.content
26    print(message_content)
27    return {}
28
29
30if __name__ == "__main__":
31    say_hello("挨拶をしましょう!")

🔍 コードの解説:

  • load_dotenv(): .envファイルから環境変数を読み込みます。これにより、API鍵をコードに直接書かずに管理できます(セキュリティのベストプラクティス)
  • openai.OpenAI(): OpenAIクライアントを初期化します。この時点でAPI鍵が設定されます
  • chat.completions.create(): Chat Completions APIを呼び出します
    • model: 使用するモデルを指定(ここではgpt-4o-mini
    • messages: システムメッセージとユーザーメッセージのリスト
    • role: "system"でLLMの振る舞いを定義、"user"でユーザーの入力を指定
  • response.choices[0].message.content: LLMからの応答テキストを取得

requirements.txt

プロジェクトで必要なPythonライブラリを定義します。

1openai
2dotenv

📦 パッケージの説明:

  • openai: OpenAI公式のPython SDK。Chat Completions APIをはじめとする各種APIへのアクセスを提供
  • dotenv: 正式名はpython-dotenv.envファイルから環境変数を読み込むためのライブラリ

💡 ヒント: 本番環境では、バージョンを明示的に指定することを推奨します(例: openai==1.54.3)。これにより、環境間での動作の一貫性が保証されます。

.env

API鍵などの機密情報を管理するファイルです。

1# OpenAI API
2OPENAI_API_KEY=

🔐 重要なセキュリティ事項:

  • このファイルには実際のAPI鍵を記入します(sk-proj-...で始まる文字列)
  • 絶対にGit管理に含めないでください - .gitignore.envを追加すること
  • API鍵はOpenAIのダッシュボードから取得できます
  • チーム開発では.env.exampleをテンプレートとして用意し、実際の値は各開発者が個別に設定する方法が一般的です

Dockerfile

Dockerコンテナを定義するファイルです。Python実行環境を含む軽量なコンテナを作成します。

1# Python 3.11.8 ベースイメージを指定
2FROM python:3.11.8-slim
3
4# システムパッケージのインストール
5RUN apt-get update
6
7# 作業ディレクトリ
8WORKDIR /app
9
10# 依存ファイルをコピーしてインストール
11COPY requirements.txt .
12
13# pip更新
14RUN pip install --upgrade pip && \
15    pip install --no-cache-dir -r requirements.txt
16
17# アプリケーションコードをコピー
18COPY . /app
19
20# Dopplerで環境変数を注入してアプリを起動
21CMD ["python", "main.py"]

🐳 Dockerfileの構成:

  • FROM python:3.11.8-slim: 軽量なPython 3.11.8イメージをベースとします(slimはサイズを抑えた版)
  • WORKDIR /app: コンテナ内の作業ディレクトリを設定
  • 依存関係のインストール: requirements.txtを先にコピーすることで、Dockerのレイヤーキャッシュを効率的に利用できます
  • --no-cache-dir: pipのキャッシュを無効化してイメージサイズを削減
  • CMD: コンテナ起動時に実行するコマンドを指定

docker-compose.yml

複数のコンテナを管理するための設定ファイルです。今回は単一コンテナですが、将来的な拡張を見据えた構成になっています。

1version: '3.9'
2
3services:
4  app:
5    build:
6      context: app/.
7      dockerfile: Dockerfile
8    container_name: llm-test
9    volumes:
10      - ./app:/app
11    environment:
12      PYTHONUNBUFFERED: 1

⚙️ docker-compose.ymlの設定:

  • build: Dockerfileからイメージをビルドする設定
    • context: ビルドコンテキストのパス
    • dockerfile: 使用するDockerfileの名前
  • container_name: コンテナに分かりやすい名前を付与
  • volumes: ホストの./appディレクトリをコンテナの/appにマウント(コード変更がすぐに反映される)
  • environment: 環境変数の設定
    • PYTHONUNBUFFERED: 1: Pythonの標準出力をバッファリングせず、リアルタイムでログを表示

Docker環境での実行

1# docker-compose.ymlがあるディレクトリで実行
2docker-compose up --build
3
4# バックグラウンドで実行する場合
5docker-compose up -d
6
7# ログを確認
8docker-compose logs -f app
9
10# コンテナを停止
11docker-compose down

ローカル環境での実行

Dockerを使わずに直接実行する場合は、以下の手順を実行します。

1# appディレクトリに移動
2cd app
3
4# 仮想環境を作成(推奨)
5python -m venv venv
6
7# 仮想環境を有効化
8# Windows の場合:
9venv\Scripts\activate
10# Mac/Linux の場合:
11source venv/bin/activate
12
13# 依存パッケージをインストール
14pip install -r requirements.txt
15
16# .envファイルにAPI鍵を設定
17# エディタで .env を開いて OPENAI_API_KEY= の後に鍵を記入
18
19# プログラムを実行
20python main.py

実際にプログラムを実行すると、以下のような出力が得られます。

1llm-test  | say hello
2llm-test  | ChatCompletion(id='chatcmpl-By8jgKnjxiWytox8NtsCYTtARImO0', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='Hello! How are you today?', refusal=None, role='assistant', annotations=[], audio=None, function_call=None, tool_calls=None))], created=1753672960, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier='default', system_fingerprint='fp_62a23a81ef', usage=CompletionUsage(completion_tokens=7, prompt_tokens=33, total_tokens=40, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))
3llm-test  | Hello! How are you today?

🔍 出力の見方:

  • 1行目: 関数内のprint("say hello")による出力
  • 2行目: APIレスポンス全体(ChatCompletionオブジェクト)
    • id: この呼び出しの一意な識別子
    • model: 実際に使用されたモデル
    • usage: トークン使用量
      • prompt_tokens: 入力に使用したトークン数(33)
      • completion_tokens: 生成された応答のトークン数(7)
      • total_tokens: 合計トークン数(40)
    • message.content: LLMからの実際の応答テキスト
  • 3行目: 抽出された応答テキストのみを表示

💰 コスト計算の例:

gpt-4o-miniの料金は以下の通りです(2025年10月時点):

  • 入力: $0.150 / 1M tokens
  • 出力: $0.600 / 1M tokens

この実行例でのコスト:

  • 入力: 33 tokens × $0.150 / 1,000,000 ≈ $0.000005
  • 出力: 7 tokens × $0.600 / 1,000,000 ≈ $0.000004
  • 合計: 約 $0.000009 (0.001円以下)

このシンプルな実装は、より高度なLLMアプリケーションの基盤となります。

1. MCPサーバー (Model Context Protocol)

LLMに外部ツールやAPIへのアクセス能力を付与します。例えば、天気情報の取得、データベースへのクエリ、ファイル操作などが可能になります。

2. RAG (Retrieval-Augmented Generation)

ベクトルデータベース(Pinecone、Weaviate等)と組み合わせることで、大規模な文書コレクションから関連情報を検索し、それを元にした応答生成が可能になります。

3. ストリーミング応答

現在の実装では応答を一度に受け取りますが、stream=Trueパラメータを使用することで、ChatGPTのようなリアルタイムのストリーミング表示が実現できます。

4. Function Calling

LLMに特定の関数を呼び出させる機能を実装することで、外部システムとの連携や複雑なワークフローの自動化が可能になります。

5. マルチターン会話

会話履歴を保持することで、文脈を理解した対話が実現できます。チャットボットやアシスタントアプリケーションの基礎となります。


セキュリティ

  • API鍵は環境変数で管理: コードに直接書かない
  • .envをGit管理から除外: .gitignoreに必ず追加
  • API鍵の定期的なローテーション: 漏洩リスクを低減
  • 本番環境では専用のシークレット管理サービスを使用: AWS Secrets Manager、Google Secret Manager等

コスト管理

  • 適切なモデル選択: 用途に応じてgpt-4o-minigpt-4oを使い分ける
  • max_tokensパラメータの設定: 不必要に長い応答を防ぐ
  • 使用量のモニタリング: OpenAIダッシュボードで定期的に確認
  • キャッシュ機構の実装: 同じ質問への重複呼び出しを避ける

エラーハンドリング

  • API呼び出しはtry-exceptで囲む: ネットワークエラーやレート制限に対応
  • リトライ機構の実装: 一時的なエラーに対する再試行
  • タイムアウト設定: 長時間応答がない場合の処理

パフォーマンス

  • 非同期処理の検討: 複数のAPI呼び出しを並列実行
  • 結果のキャッシング: 頻繁にアクセスされる応答を保存
  • バッチ処理: 大量のリクエストを効率的に処理


本記事では、PythonからOpenAI APIを利用するための最小限かつ実践的な実装を紹介しました。

本記事で構築したもの:

  • 📦 シンプルで拡張しやすいファイル構成
  • 🐳 Docker対応による環境の再現性
  • 🔐 セキュアなAPI鍵管理の基本
  • 💰 コスト効率の良いモデル選択

このシンプルな実装を出発点として、MCPサーバー、RAG、Function Calling、ストリーミング応答など、より高度なLLMアプリケーションの開発に挑戦できます。

今回は比較的安価なモデルであるgpt-4o-miniを使用していますが、モデルを変更するだけで出力結果の品質や特性が変わります。予算と要件に応じて、適切なモデルを選択することをお勧めします。

今後も、このベースラインを活用しながら、実践的なLLMアプリケーション開発に取り組んでいきます。


更新履歴:

  • 2025/07/28: 初版公開 (Shinjo)
  • 2025/10/19: 説明文の充実化、構成の改善、補足情報の追加 (Claude Sonnet 4.5)