PythonからOpenAI APIを利用する実践的な方法を解説します。本記事では、LLMアプリケーション開発の基礎となる、シンプルで再利用可能な実装パターンを提供します。
�� この記事について
本記事は、今後LLMを活用した様々なシステムやアプリケーションを開発する上でのベースライン実装を提供することを目的としています。
記事の特徴:
- ✅ シンプルで理解しやすいファイル構成
- ✅ PoCやプロトタイピングへの流用が容易
- ✅ Docker環境での実行をサポート
- ✅ 本番環境へのスケールを意識した設計
��️ プロジェクト構造
以下のシンプルな構成で、OpenAI APIを利用した基本的なアプリケーションを構築します。
1C:.
2│ docker-compose.yml
3│
4└─app
5 .env
6 Dockerfile
7 main.py
8 requirements.txt📁 ファイル一覧と役割
今回重要なファイルは以下の通りです。
| ファイル | 役割 | 重要度 |
|---|---|---|
main.py | Pythonの実行ファイル | 🔴 必須 |
requirements.txt | 必要なライブラリを列挙 | 🔴 必須 |
.env | 環境変数(API鍵など)を設定 | 🔴 必須 |
docker-compose.yml | Docker Composeの設定 | 🟡 推奨 |
Dockerfile | Dockerコンテナの定義 | 🟡 推奨 |
💡 ポイント: 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-miniとgpt-4oを使い分ける - ✅
max_tokensパラメータの設定: 不必要に長い応答を防ぐ - ✅ 使用量のモニタリング: OpenAIダッシュボードで定期的に確認
- ✅ キャッシュ機構の実装: 同じ質問への重複呼び出しを避ける
エラーハンドリング
- ✅ API呼び出しは
try-exceptで囲む: ネットワークエラーやレート制限に対応 - ✅ リトライ機構の実装: 一時的なエラーに対する再試行
- ✅ タイムアウト設定: 長時間応答がない場合の処理
パフォーマンス
- ✅ 非同期処理の検討: 複数のAPI呼び出しを並列実行
- ✅ 結果のキャッシング: 頻繁にアクセスされる応答を保存
- ✅ バッチ処理: 大量のリクエストを効率的に処理
�� 参考リンク
- OpenAI API Documentation - 公式ドキュメント
- OpenAI Python SDK - Python SDKのGitHubリポジトリ
- OpenAI Pricing - 料金情報
- Best Practices for Prompt Engineering - プロンプトエンジニアリングガイド
まとめ
本記事では、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)