OpenAI

OpenAI 総合概要 — 機能・アーキテクチャ・設定ガイド

作成日: 2026-04-07
対象読者: エンジニア・アーキテクト・AI導入を検討する技術者
想定知識レベル: REST API・クラウドサービスの基礎知識があること


目次

  1. はじめに — OpenAI とは
  2. OpenAI の歴史と組織構造
  3. モデルファミリー全体像
  4. OpenAI API アーキテクチャ
  5. Chat Completions API
  6. Responses API(新世代API)
  7. Assistants API
  8. Function Calling / Tool Use
  9. Embeddings API
  10. 画像生成 — DALL·E / GPT Image Generation
  11. 音声 API — Whisper / TTS
  12. マルチモーダル入力(Vision)
  13. Realtime API
  14. Fine-tuning(ファインチューニング)
  15. Batch API
  16. Agents SDK
  17. コンテンツモデレーションと安全性
  18. セキュリティ・コンプライアンス・データプライバシー
  19. 料金体系と最適化戦略
  20. ベストプラクティスと実践的設定例
  21. まとめ

1. はじめに — OpenAI とは

1.1 OpenAI の概要

OpenAI は、2015年に設立された人工知能(AI)研究組織であり、「安全で有益な汎用人工知能(AGI: Artificial General Intelligence)の実現」をミッションとして掲げている。設立以来、GPTシリーズ、DALL·E、Whisper、Codex など、多数の革新的なAIモデルとサービスを世界に送り出してきた。

2022年11月に公開された ChatGPT は、わずか2ヶ月で1億ユーザーを超え、AIの民主化を一気に加速させた。企業向けには OpenAI API を通じて、テキスト生成、コード補完、画像生成、音声認識・合成、埋め込みベクトル生成など、包括的なAI機能をプログラマティックに利用できるプラットフォームを提供している。

1.2 本記事の目的

本記事では、OpenAI が提供する機能とサービスの全体像を体系的に整理し、以下を目的とする。

  • モデルファミリーの理解: GPT-4o、GPT-4.5、o1、o3、o4-mini など各モデルの特性と使い分け
  • API アーキテクチャの把握: Chat Completions API、Responses API、Assistants API など複数のAPIの関係性
  • 実践的な設定例の提供: 各APIの具体的なリクエスト/レスポンス例
  • 運用上の考慮事項: セキュリティ、コンプライアンス、コスト最適化のポイント

1.3 OpenAI が提供する主要サービス

サービス概要
ChatGPT消費者・ビジネス向け対話型AIアシスタント
OpenAI API開発者向けAPIプラットフォーム
ChatGPT Enterprise / Team企業向けセキュアなChatGPT環境
GPT Store / GPTsカスタムGPTのマーケットプレイス
OpenAI Platformファインチューニング・バッチ処理・評価ツール
Codex (CLI)ターミナルベースのAIコーディングエージェント

2. OpenAI の歴史と組織構造

2.1 設立と進化の年表

出来事
2015年12月OpenAI 設立(Sam Altman, Elon Musk, Greg Brockman ら)。非営利として発足
2018年6月GPT-1 発表(1.17億パラメータ、Transformer デコーダーベース)
2019年2月GPT-2 発表(15億パラメータ)。当初「危険すぎる」として全体公開を保留
2019年3月OpenAI LP 設立(営利部門、"capped profit" 構造)
2020年6月GPT-3 発表(1750億パラメータ)。APIベータ提供開始
2021年1月DALL·E 発表(テキストから画像を生成)
2022年9月Whisper 公開(多言語音声認識モデル)
2022年11月ChatGPT 公開(GPT-3.5ベース)
2023年3月GPT-4 発表(マルチモーダル対応)
2023年11月GPTs / GPT Store 発表。Sam Altman CEO 解任・復帰劇
2024年5月GPT-4o 発表("omni" — テキスト・音声・画像の統合)
2024年9月o1 (推論モデル) 発表 — "thinking" による推論強化
2024年12月o3 発表(ARC-AGI で画期的スコア)
2025年1月o3-mini リリース。Operator (エージェント) 発表
2025年2月GPT-4.5 発表(研究プレビュー、最大規模モデル)
2025年4月o4-mini、GPT-4.1 シリーズ発表。Codex CLI リリース

2.2 組織構造

OpenAI は複雑な組織構造を持つ。2019年に非営利部門と営利部門(OpenAI LP)に分かれ、2024-2025年にかけて営利法人(Public Benefit Corporation)への転換を進めている。

OpenAI Inc. (非営利)
├── OpenAI Global LLC (営利部門 → PBC への転換中)
│   ├── API / Platform 事業
│   ├── ChatGPT 事業
│   ├── 研究開発
│   └── セーフティ / アライメント研究
└── OpenAI Startup Fund (投資部門)

主要な投資パートナーとして Microsoft が130億ドル以上を出資し、Azure 上での OpenAI モデルの提供(Azure OpenAI Service)も行っている。

2.3 OpenAI と Azure OpenAI Service の関係

項目OpenAI APIAzure OpenAI Service
提供元OpenAI 直接Microsoft Azure
認証API Key / OAuthAzure AD / API Key
SLAベストエフォート99.9% SLA あり
データ所在地米国中心Azure リージョン選択可
コンプライアンスSOC 2 Type IIAzure 準拠認証群
モデル最新モデル即時利用可一部遅延あり
ネットワークパブリックVNet / Private Endpoint 対応

企業でのプロダクション利用では、Azure OpenAI Service が選択されることが多い。これはSLA、データ所在地の制御、既存のAzureセキュリティ基盤との統合が可能なためである。


3. モデルファミリー全体像

3.1 モデルの分類体系

OpenAI のモデルは大きく以下のカテゴリに分類される。

(A) GPT シリーズ(生成モデル)

標準的なテキスト生成モデル。低レイテンシーで多用途。

モデルコンテキスト長特徴推奨用途
GPT-4.11,047,576GPT-4oの後継。コーディング・指示追従で大幅向上コード生成、複雑なワークフロー
GPT-4.1 mini1,047,5764.1のコスト効率版バランス型の一般用途
GPT-4.1 nano1,047,576最も高速・低コスト分類、抽出、軽量タスク
GPT-4o128,000マルチモーダル(テキスト・画像・音声)汎用、リアルタイム音声
GPT-4o mini128,000GPT-4oの軽量版コスト重視の一般用途
GPT-4.5 Preview128,000最大規模モデル。創造性・ニュアンスに優れる創作、研究、複雑な分析
GPT-4 Turbo128,000GPT-4の高速版(レガシー)既存システムの互換用

(B) o シリーズ(推論モデル)

内部で "thinking"(思考プロセス)を実行し、複雑な推論タスクに特化したモデル。

モデルコンテキスト長特徴推奨用途
o4-mini200,000高速推論モデル。コスト効率が高いコーディング、数学、分析
o3200,000最高推論能力。全ツール対応高難度STEM、戦略立案
o3-mini200,000o3の軽量版推論が必要だがコスト重視
o1200,000初代推論モデル科学、数学、コーディング
o1-mini128,000o1の軽量版推論タスクの高速処理

(C) 特化モデル

モデル用途
DALL·E 3テキストから画像生成
GPT Image (GPT-4o)モデル内蔵の画像生成(編集対応)
Whisper音声認識(多言語)
TTS (tts-1, tts-1-hd)テキスト読み上げ
text-embedding-3-small/largeテキスト埋め込みベクトル
Moderation (omni-moderation-latest)コンテンツモデレーション

3.2 モデル選択のフローチャート

タスクの種類を判定
│
├─ 複雑な推論が必要(数学、科学、戦略的分析)
│   ├─ 最高精度が必要 → o3
│   ├─ コスト効率重視 → o4-mini
│   └─ 低コスト推論 → o3-mini
│
├─ 一般的なテキスト生成
│   ├─ 長大コンテキスト(100K+トークン) → GPT-4.1
│   ├─ マルチモーダル(画像・音声入力) → GPT-4o
│   ├─ 高品質・創造性重視 → GPT-4.5 Preview
│   ├─ コスト効率重視 → GPT-4.1 mini
│   └─ 最低コスト → GPT-4.1 nano / GPT-4o mini
│
├─ 画像生成 → DALL·E 3 / GPT-4o (image generation)
├─ 音声認識 → Whisper
├─ 音声合成 → TTS
├─ テキスト検索・類似度 → text-embedding-3-small/large
└─ コンテンツ安全性 → omni-moderation-latest

3.3 GPT モデルと o モデルの根本的な違い

GPTモデルと o モデルの最大の違いは「思考プロセス」の有無にある。

GPT モデル(例: GPT-4o):

  • 入力を受け取り、直接的に出力を生成
  • レイテンシーが低い
  • temperaturetop_p などのサンプリングパラメータを制御可能
  • ストリーミング出力に完全対応

o モデル(例: o3):

  • 入力を受け取った後、内部で「思考チェーン」を実行
  • 思考トークンは出力に含まれる(課金対象)が、内容は非公開
  • reasoning_effort パラメータで思考の深さを制御(low / medium / high
  • レイテンシーは高いが、複雑なタスクの正確性が大幅に向上
# o モデルでの reasoning_effort 設定例
from openai import OpenAI
client = OpenAI()

response = client.responses.create(
    model="o4-mini",
    reasoning={
        "effort": "high"  # low, medium, high から選択
    },
    input="この微分方程式を解いてください: dy/dx + 2xy = x"
)

4. OpenAI API アーキテクチャ

4.1 API の全体構成

OpenAI API は RESTful な HTTP API として提供され、以下の主要エンドポイント群で構成される。

OpenAI API (api.openai.com)
│
├── /v1/chat/completions      ← Chat Completions API(従来の主力)
├── /v1/responses              ← Responses API(新世代、推奨)
│
├── /v1/embeddings             ← 埋め込みベクトル生成
├── /v1/images/generations     ← 画像生成 (DALL·E)
├── /v1/images/edits           ← 画像編集
│
├── /v1/audio/transcriptions   ← 音声認識 (Whisper)
├── /v1/audio/translations     ← 音声翻訳
├── /v1/audio/speech           ← 音声合成 (TTS)
│
├── /v1/moderations            ← コンテンツモデレーション
│
├── /v1/fine_tuning/jobs       ← ファインチューニング
├── /v1/batches                ← バッチ処理
├── /v1/files                  ← ファイルアップロード
├── /v1/uploads                ← 大容量ファイルアップロード
│
├── /v1/vector_stores          ← ベクトルストア(ファイル検索用)
│
├── /v1/assistants             ← Assistants API
├── /v1/threads                ← スレッド管理
│
├── /v1/realtime               ← Realtime API (WebSocket / WebRTC)
│
├── /v1/organization/          ← 組織管理
├── /v1/organization/usage     ← 使用量追跡
└── /v1/organization/costs     ← コスト追跡

4.2 認証とアクセス制御

API キーの種類

キーの種類プレフィックススコープ用途
Standard API Keysk-プロジェクト単位一般的なAPI利用
User API Keysk-ユーザー全プロジェクトレガシー(非推奨)
Service Account Keysk-プロジェクト単位サービス間通信
Admin Keysk-admin-組織全体管理操作

認証ヘッダーの設定

# 基本的な認証
curl https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "OpenAI-Organization: org-xxxxxxxx" \
  -H "OpenAI-Project: proj-xxxxxxxx" \
  -d '{...}'
# Python SDK での設定
from openai import OpenAI

client = OpenAI(
    api_key="sk-...",          # 環境変数 OPENAI_API_KEY が推奨
    organization="org-...",     # オプション
    project="proj-...",         # オプション
    timeout=60.0,               # タイムアウト設定
    max_retries=3               # 自動リトライ
)

4.3 レート制限とクォータ

OpenAI API にはティア制のレート制限が設けられている。

ティア条件RPM (例: GPT-4o)TPM (例: GPT-4o)
Free初期状態50030,000
Tier 1$5 支払い済50030,000
Tier 2$50 支払い + 7日以上5,000450,000
Tier 3$100 支払い + 7日以上5,000800,000
Tier 4$250 支払い + 14日以上10,0002,000,000
Tier 5$1,000 支払い + 30日以上30,000150,000,000

RPM: Requests Per Minute(1分あたりリクエスト数)
TPM: Tokens Per Minute(1分あたりトークン数)

レート制限に関するレスポンスヘッダー:

x-ratelimit-limit-requests: 5000
x-ratelimit-limit-tokens: 800000
x-ratelimit-remaining-requests: 4999
x-ratelimit-remaining-tokens: 799800
x-ratelimit-reset-requests: 12ms
x-ratelimit-reset-tokens: 15ms

4.4 エラーハンドリング

HTTP ステータスコードエラータイプ対処法
400invalid_request_errorリクエストパラメータを確認
401authentication_errorAPIキーを確認
403permission_error権限・リージョン制限を確認
404not_found_errorエンドポイント・モデル名を確認
429rate_limit_error指数バックオフでリトライ
500server_errorOpenAI 側の障害。リトライ
503service_unavailable高負荷時。リトライ
# 堅牢なエラーハンドリング例
import openai
from openai import OpenAI
import time

client = OpenAI()

def call_with_retry(messages, max_retries=5):
    for attempt in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4o",
                messages=messages
            )
            return response
        except openai.RateLimitError as e:
            wait_time = 2 ** attempt  # 指数バックオフ
            print(f"Rate limited. Waiting {wait_time}s...")
            time.sleep(wait_time)
        except openai.APIStatusError as e:
            if e.status_code >= 500:
                time.sleep(2 ** attempt)
                continue
            raise  # 4xx エラーはリトライ不要
    raise Exception("Max retries exceeded")

4.5 SDK のサポート状況

言語パッケージ名公式/コミュニティ
Pythonopenai公式
Node.js / TypeScriptopenai公式
C# / .NETOpenAI公式
Javaopenai-java公式
Goopenai-go公式
Rubyコミュニティ非公式
Rustコミュニティ非公式
# Python SDK インストール
pip install openai

# Node.js SDK インストール
npm install openai

5. Chat Completions API

5.1 概要

Chat Completions API は OpenAI の最も広く使用されている API であり、会話形式でテキスト生成を行う。2023年のリリース以来、事実上の標準 API として定着している。

注意: 2025年以降、OpenAI は Chat Completions API の後継として Responses API を推奨している。ただし Chat Completions API は引き続きサポートされる。

5.2 基本リクエスト構造

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "system",
            "content": "あなたは親切なアシスタントです。"
        },
        {
            "role": "user",
            "content": "量子コンピューティングとは何ですか?"
        }
    ],
    temperature=0.7,
    max_tokens=1000,
    top_p=1.0,
    frequency_penalty=0.0,
    presence_penalty=0.0
)

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

5.3 メッセージロールの詳細

ロール説明特記事項
systemモデルの振る舞いを定義最初のメッセージとして配置
userユーザーの入力テキスト・画像URLを含められる
assistantモデルの応答会話履歴として含める
toolツール呼び出しの結果Function Calling 時に使用
developer開発者の指示(Responses API)system の後継的な役割

5.4 主要パラメータの詳細

temperature(温度)

出力のランダム性を制御する。0〜2 の範囲。

# 決定論的な出力(コード生成、分類に最適)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Pythonでクイックソートを実装"}],
    temperature=0.0  # 常に最も確率の高いトークンを選択
)

# 創造的な出力(ブレインストーミング、創作に最適)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "SF短編小説の冒頭を書いて"}],
    temperature=1.2  # より多様な出力
)

Structured Outputs(構造化出力)

JSON Schema に従った出力を保証する機能。

from pydantic import BaseModel
from openai import OpenAI

client = OpenAI()

class CalendarEvent(BaseModel):
    name: str
    date: str
    participants: list[str]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "イベント情報を構造化して出力してください。"},
        {"role": "user", "content": "来週の金曜日に田中さんと佐藤さんとプロジェクト会議があります"}
    ],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "calendar_event",
            "strict": True,
            "schema": CalendarEvent.model_json_schema()
        }
    }
)

event = CalendarEvent.model_validate_json(
    response.choices[0].message.content
)
print(event)
# CalendarEvent(name='プロジェクト会議', date='2026-04-17', participants=['田中', '佐藤'])

SDK の parse ヘルパー

# SDK の parse ヘルパーを使うとより簡潔に書ける
completion = client.beta.chat.completions.parse(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "イベント情報を抽出してください。"},
        {"role": "user", "content": "明日10時からチームスタンドアップ。参加者: 鈴木、田中"}
    ],
    response_format=CalendarEvent
)

event = completion.choices[0].message.parsed
print(event.name)  # "チームスタンドアップ"

5.5 ストリーミング

ストリーミングを使用すると、完全な応答を待たずにトークン単位で逐次出力を受け取れる。

# ストリーミング出力
stream = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "桜の美しさについて語ってください"}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="", flush=True)
// TypeScript でのストリーミング
import OpenAI from 'openai';

const client = new OpenAI();

const stream = await client.chat.completions.create({
    model: 'gpt-4o',
    messages: [{ role: 'user', content: '桜の美しさについて語ってください' }],
    stream: true,
});

for await (const chunk of stream) {
    const content = chunk.choices[0]?.delta?.content || '';
    process.stdout.write(content);
}

5.6 レスポンス構造

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1712345678,
  "model": "gpt-4o-2025-03-27",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "量子コンピューティングとは..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 25,
    "completion_tokens": 150,
    "total_tokens": 175,
    "prompt_tokens_details": {
      "cached_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0
    }
  },
  "system_fingerprint": "fp_abc123"
}

5.7 会話管理のパターン

Chat Completions API はステートレスであるため、会話の文脈を維持するにはクライアント側で履歴を管理する必要がある。

class ConversationManager:
    def __init__(self, system_prompt: str, model: str = "gpt-4o"):
        self.model = model
        self.messages = [
            {"role": "system", "content": system_prompt}
        ]
    
    def send(self, user_message: str) -> str:
        self.messages.append({"role": "user", "content": user_message})
        
        response = client.chat.completions.create(
            model=self.model,
            messages=self.messages
        )
        
        assistant_message = response.choices[0].message.content
        self.messages.append({"role": "assistant", "content": assistant_message})
        
        # コンテキストウィンドウ管理: 古いメッセージを削除
        self._trim_history()
        
        return assistant_message
    
    def _trim_history(self, max_messages: int = 20):
        """system メッセージを保持しつつ、古い履歴を削除"""
        if len(self.messages) > max_messages:
            self.messages = [self.messages[0]] + self.messages[-(max_messages-1):]

# 使用例
chat = ConversationManager("あなたは Python の専門家です。")
print(chat.send("リスト内包表記について教えてください"))
print(chat.send("それをジェネレータ式に変えるにはどうしますか?"))

6. Responses API(新世代API)

6.1 概要と位置づけ

Responses API は 2025年にリリースされた OpenAI の新しい API プリミティブで、Chat Completions API の後継として位置づけられている。以下の特徴を持つ。

  • 組み込みツール: Web検索、ファイル検索、コード実行をネイティブサポート
  • マルチターンの会話管理: previous_response_id によるサーバーサイドの会話状態管理
  • ストリーミングイベント: より細粒度のイベントベースストリーミング
  • 統一されたインターフェース: GPTモデルと o モデルの両方で同一APIを使用

6.2 基本的な使用方法

from openai import OpenAI
client = OpenAI()

# 基本的なテキスト生成
response = client.responses.create(
    model="gpt-4.1",
    input="日本の四季について教えてください"
)

print(response.output_text)

6.3 マルチターン会話

# 1回目の会話
response1 = client.responses.create(
    model="gpt-4.1",
    input="東京の有名な観光地を3つ教えてください"
)
print(response1.output_text)

# 2回目の会話(前の応答を参照)
response2 = client.responses.create(
    model="gpt-4.1",
    input="その中で一番おすすめはどれですか?理由も教えてください",
    previous_response_id=response1.id  # 会話の文脈を保持
)
print(response2.output_text)

6.4 システム指示(Instructions)

response = client.responses.create(
    model="gpt-4.1",
    instructions="あなたはシニアソフトウェアエンジニアです。コードレビューを行い、改善点を具体的に指摘してください。",
    input="""
    以下のPythonコードをレビューしてください:
    
    def get_user(id):
        users = db.query("SELECT * FROM users WHERE id = " + str(id))
        return users[0]
    """
)

6.5 組み込みツール — Web 検索

# Web検索ツールの使用
response = client.responses.create(
    model="gpt-4.1",
    tools=[{"type": "web_search_preview"}],
    input="2026年の主要なAIカンファレンスの日程を教えてください"
)

print(response.output_text)

# 検索結果のソース(引用)にアクセス
for item in response.output:
    if item.type == "message":
        for annotation in item.content[0].annotations:
            print(f"  出典: {annotation.url} - {annotation.title}")

6.6 組み込みツール — ファイル検索

# ベクトルストアの作成
vector_store = client.vector_stores.create(
    name="社内ドキュメント"
)

# ファイルのアップロードと追加
file = client.files.create(
    file=open("company_policy.pdf", "rb"),
    purpose="assistants"
)

client.vector_stores.files.create(
    vector_store_id=vector_store.id,
    file_id=file.id
)

# ファイル検索ツールを使った質問
response = client.responses.create(
    model="gpt-4.1",
    tools=[{
        "type": "file_search",
        "vector_store_ids": [vector_store.id]
    }],
    input="有給休暇の申請方法を教えてください"
)

6.7 組み込みツール — コード実行(Code Interpreter)

response = client.responses.create(
    model="gpt-4.1",
    tools=[{
        "type": "code_interpreter",
        "container": {"type": "auto"}  # 自動コンテナ管理
    }],
    input="フィボナッチ数列の最初の20項を計算し、成長率をグラフにしてください"
)

# 生成されたファイル(画像等)へのアクセス
for item in response.output:
    if hasattr(item, 'content'):
        for content in item.content:
            if hasattr(content, 'file_id'):
                print(f"生成ファイル: {content.file_id}")

6.8 Chat Completions API vs Responses API 比較

機能Chat CompletionsResponses
ステートフルな会話クライアント管理previous_response_id
Web検索外部実装が必要組み込み
ファイル検索Assistants API 経由組み込み
コード実行Assistants API 経由組み込み
MCP連携非対応対応
Function Calling対応対応
Structured Output対応対応
ストリーミングチャンクベースイベントベース
o モデル対応対応対応(推奨)

7. Assistants API

7.1 概要

Assistants API は、ステートフルなAIアシスタントを構築するための高レベルAPIである。スレッドベースの会話管理、ツール統合、ファイル処理を組み込みでサポートする。

注意: OpenAI は 2025年以降、Assistants API の代わりに Responses API の使用を推奨している。ただし Assistants API は引き続き利用可能。

7.2 アーキテクチャ

┌─────────────────────────────────────────────┐
│                  Assistant                    │
│  ┌──────────────────────────────────────────┐│
│  │ Instructions (システムプロンプト)          ││
│  │ Model (使用モデル)                        ││
│  │ Tools (code_interpreter, file_search,     ││
│  │        function calling)                  ││
│  └──────────────────────────────────────────┘│
│                                               │
│  Thread ─────────────────────────────────── │
│  │ Message 1 (user)                          │
│  │ Message 2 (assistant)                     │
│  │ Message 3 (user)                          │
│  │ ...                                       │
│  └──────────────── Run ──────────────────── │
│                     │                         │
│                     ├─ queued                  │
│                     ├─ in_progress             │
│                     ├─ requires_action         │
│                     ├─ completed               │
│                     └─ failed / cancelled      │
└─────────────────────────────────────────────┘

7.3 基本的なワークフロー

from openai import OpenAI
client = OpenAI()

# 1. アシスタントの作成
assistant = client.beta.assistants.create(
    name="データ分析アシスタント",
    instructions="""あなたはデータ分析の専門家です。
    ユーザーがアップロードしたデータを分析し、
    インサイトを日本語で提供してください。""",
    model="gpt-4o",
    tools=[
        {"type": "code_interpreter"},
        {"type": "file_search"}
    ]
)

# 2. スレッドの作成
thread = client.beta.threads.create()

# 3. メッセージの追加
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="売上データの傾向分析をお願いします",
    attachments=[{
        "file_id": "file-abc123",
        "tools": [{"type": "code_interpreter"}]
    }]
)

# 4. Run の実行(ストリーミング)
from openai import AssistantEventHandler

class EventHandler(AssistantEventHandler):
    def on_text_created(self, text):
        print("\nassistant > ", end="", flush=True)
    
    def on_text_delta(self, delta, snapshot):
        print(delta.value, end="", flush=True)
    
    def on_tool_call_created(self, tool_call):
        print(f"\n[ツール呼出: {tool_call.type}]", flush=True)

with client.beta.threads.runs.stream(
    thread_id=thread.id,
    assistant_id=assistant.id,
    event_handler=EventHandler()
) as stream:
    stream.until_done()

8. Function Calling / Tool Use

8.1 概要

Function Calling(ツール使用)は、LLMが外部のAPIやデータベース、計算ロジックと連携するための仕組みである。モデルが「どの関数をどの引数で呼ぶべきか」を判断し、開発者はその結果を実行してモデルに返す。

8.2 動作フロー

ユーザー入力
     │
     ▼
┌──────────┐     ┌──────────────────┐
│ OpenAI   │────▶│ ツール呼出し判断    │
│ Model    │     │ (引数のJSON生成)   │
└──────────┘     └──────────────────┘
                        │
                        ▼
              ┌──────────────────┐
              │ 開発者がローカルで  │
              │ 関数を実行         │
              └──────────────────┘
                        │
                        ▼
              ┌──────────────────┐
              │ 実行結果をモデルに  │
              │ フィードバック      │
              └──────────────────┘
                        │
                        ▼
              ┌──────────────────┐
              │ 最終応答を生成     │
              └──────────────────┘

8.3 Chat Completions API での Function Calling

import json
from openai import OpenAI

client = OpenAI()

# ツール(関数)の定義
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "指定した都市の現在の天気を取得する",
            "strict": True,  # Structured Output で引数を保証
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "都市名(例: 東京、大阪)"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "温度の単位"
                    }
                },
                "required": ["city", "unit"],
                "additionalProperties": False
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "search_restaurants",
            "description": "指定エリアのレストランを検索する",
            "strict": True,
            "parameters": {
                "type": "object",
                "properties": {
                    "area": {
                        "type": "string",
                        "description": "検索エリア"
                    },
                    "cuisine": {
                        "type": "string",
                        "enum": ["japanese", "italian", "chinese", "french", "other"],
                        "description": "料理ジャンル"
                    },
                    "budget_max": {
                        "type": "integer",
                        "description": "予算上限(円)"
                    }
                },
                "required": ["area", "cuisine", "budget_max"],
                "additionalProperties": False
            }
        }
    }
]

# 実際の関数実装(通常は外部APIを呼び出す)
def get_weather(city: str, unit: str) -> dict:
    # 実際にはWeather APIを呼び出す
    return {"city": city, "temperature": 22, "unit": unit, "condition": "晴れ"}

def search_restaurants(area: str, cuisine: str, budget_max: int) -> dict:
    return {"results": [{"name": "和食処たなか", "rating": 4.5, "price": 3000}]}

# ツール呼出しを含む会話ループ
messages = [
    {"role": "user", "content": "東京の天気を教えて、あとランチで良い和食のお店ある?予算5000円くらいで"}
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
    tools=tools,
    tool_choice="auto"  # モデルが自動判断
)

# ツール呼出しの処理(パラレル呼出し対応)
if response.choices[0].message.tool_calls:
    messages.append(response.choices[0].message)
    
    for tool_call in response.choices[0].message.tool_calls:
        func_name = tool_call.function.name
        func_args = json.loads(tool_call.function.arguments)
        
        # 関数の実行
        if func_name == "get_weather":
            result = get_weather(**func_args)
        elif func_name == "search_restaurants":
            result = search_restaurants(**func_args)
        
        # 結果をメッセージに追加
        messages.append({
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result, ensure_ascii=False)
        })
    
    # 最終応答を取得
    final_response = client.chat.completions.create(
        model="gpt-4o",
        messages=messages,
        tools=tools
    )
    print(final_response.choices[0].message.content)

8.4 Responses API での Function Calling

response = client.responses.create(
    model="gpt-4.1",
    tools=[
        {
            "type": "function",
            "name": "get_weather",
            "description": "指定した都市の天気を取得",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string"},
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
                },
                "required": ["city", "unit"],
                "additionalProperties": False
            },
            "strict": True
        }
    ],
    input="東京の今日の天気は?"
)

# ツール呼出しの処理
for item in response.output:
    if item.type == "function_call":
        # 関数実行
        result = get_weather(**json.loads(item.arguments))
        
        # 結果を返して最終応答を取得
        final = client.responses.create(
            model="gpt-4.1",
            previous_response_id=response.id,
            input=[{
                "type": "function_call_output",
                "call_id": item.call_id,
                "output": json.dumps(result, ensure_ascii=False)
            }]
        )
        print(final.output_text)

8.5 並列 Function Calling

GPT-4o 以降のモデルは、1回のレスポンスで複数のツールを同時に呼び出すことができる(Parallel Function Calling)。これにより、独立した複数のAPIコールを並行して実行でき、レイテンシーの削減が可能となる。

# モデルが「天気API」と「レストランAPI」を同時に呼ぶ場合
# response.choices[0].message.tool_calls に複数のエントリが含まれる
# → 並行してAPIを呼び出し、全結果をまとめて返す

import asyncio

async def execute_parallel_tools(tool_calls):
    """ツール呼出しを並列実行"""
    tasks = []
    for tc in tool_calls:
        args = json.loads(tc.function.arguments)
        if tc.function.name == "get_weather":
            tasks.append(async_get_weather(**args))
        elif tc.function.name == "search_restaurants":
            tasks.append(async_search_restaurants(**args))
    
    return await asyncio.gather(*tasks)

9. Embeddings API

9.1 概要

Embeddings API は、テキストを高次元のベクトル(浮動小数点数の配列)に変換するAPIである。このベクトルはテキストの意味的な情報をエンコードしており、以下の用途に使用される。

  • 意味検索(Semantic Search): クエリとドキュメントの類似度計算
  • RAG(Retrieval Augmented Generation): 関連ドキュメントの検索と取得
  • 分類: テキストのカテゴリ分け
  • クラスタリング: 類似テキストのグループ化
  • 異常検出: 外れ値の検出

9.2 利用可能なモデル

モデル次元数最大入力トークン特徴
text-embedding-3-large3,072(デフォルト)8,191最高精度
text-embedding-3-small1,536(デフォルト)8,191コスト効率重視
text-embedding-ada-0021,5368,191レガシー

9.3 基本的な使用方法

from openai import OpenAI
client = OpenAI()

# 単一テキストの埋め込み
response = client.embeddings.create(
    model="text-embedding-3-small",
    input="OpenAIは人工知能研究の最前線にある企業です",
    dimensions=512  # 次元数を削減してコスト・速度を最適化
)

embedding = response.data[0].embedding
print(f"次元数: {len(embedding)}")  # 512
print(f"先頭5要素: {embedding[:5]}")

# バッチ処理(複数テキスト)
texts = [
    "機械学習の基本概念",
    "ディープラーニングの応用",
    "自然言語処理の最新動向"
]

response = client.embeddings.create(
    model="text-embedding-3-small",
    input=texts
)

for i, data in enumerate(response.data):
    print(f"テキスト{i}: {len(data.embedding)}次元")

9.4 類似度計算と検索の実装例

import numpy as np
from openai import OpenAI

client = OpenAI()

def cosine_similarity(a, b):
    """コサイン類似度の計算"""
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# ドキュメントの埋め込み
documents = [
    "Python は汎用プログラミング言語です",
    "東京タワーは東京都港区にあります",
    "機械学習はAIの一分野です",
    "寿司は日本の伝統的な料理です",
    "TensorFlow はGoogleが開発した機械学習フレームワークです"
]

doc_response = client.embeddings.create(
    model="text-embedding-3-small",
    input=documents
)
doc_embeddings = [d.embedding for d in doc_response.data]

# クエリの埋め込み
query = "AIプログラミングについて教えて"
query_response = client.embeddings.create(
    model="text-embedding-3-small",
    input=query
)
query_embedding = query_response.data[0].embedding

# 類似度ランキング
similarities = []
for i, doc_emb in enumerate(doc_embeddings):
    sim = cosine_similarity(query_embedding, doc_emb)
    similarities.append((sim, documents[i]))

similarities.sort(reverse=True)
for sim, doc in similarities:
    print(f"  類似度: {sim:.4f} | {doc}")

9.5 RAG(Retrieval Augmented Generation)パイプライン

class SimpleRAG:
    def __init__(self, model="text-embedding-3-small"):
        self.client = OpenAI()
        self.embed_model = model
        self.documents = []
        self.embeddings = []
    
    def add_documents(self, docs: list[str]):
        """ドキュメントを追加"""
        response = self.client.embeddings.create(
            model=self.embed_model,
            input=docs
        )
        self.documents.extend(docs)
        self.embeddings.extend([d.embedding for d in response.data])
    
    def query(self, question: str, top_k: int = 3) -> str:
        """質問に回答"""
        # 1. 質問の埋め込み
        q_response = self.client.embeddings.create(
            model=self.embed_model,
            input=question
        )
        q_embedding = q_response.data[0].embedding
        
        # 2. 関連ドキュメントの検索
        similarities = []
        for i, emb in enumerate(self.embeddings):
            sim = cosine_similarity(q_embedding, emb)
            similarities.append((sim, self.documents[i]))
        
        similarities.sort(reverse=True)
        relevant_docs = [doc for _, doc in similarities[:top_k]]
        
        # 3. コンテキスト付きで生成
        context = "\n".join(relevant_docs)
        response = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": f"以下の参考情報に基づいて回答してください:\n\n{context}"},
                {"role": "user", "content": question}
            ]
        )
        return response.choices[0].message.content

# 使用例
rag = SimpleRAG()
rag.add_documents([
    "当社の有給休暇は年間20日です。入社半年後から取得可能です。",
    "リモートワークは週3日まで可能です。事前申請が必要です。",
    "交通費は月額5万円まで支給されます。",
    # ... 多数のドキュメント
])

answer = rag.query("有給休暇は何日もらえますか?")
print(answer)

10. 画像生成 — DALL·E / GPT Image Generation

10.1 概要

OpenAI は2つの画像生成アプローチを提供している。

  1. DALL·E 3: 専用の画像生成モデル(Images API 経由)
  2. GPT Image Generation: GPT-4o に組み込まれた画像生成機能

10.2 DALL·E 3 による画像生成

from openai import OpenAI
client = OpenAI()

# 基本的な画像生成
response = client.images.generate(
    model="dall-e-3",
    prompt="富士山の前に咲く桜の木、日本画風、穏やかな春の朝",
    size="1024x1024",      # 1024x1024, 1024x1792, 1792x1024
    quality="hd",           # standard, hd
    style="natural",        # vivid, natural
    n=1                     # DALL·E 3 は 1枚のみ
)

image_url = response.data[0].url
revised_prompt = response.data[0].revised_prompt  # モデルが改良したプロンプト
print(f"画像URL: {image_url}")
print(f"改良プロンプト: {revised_prompt}")

10.3 GPT-4o による画像生成(GPT Image Generation)

# Responses API 経由での画像生成
response = client.responses.create(
    model="gpt-4o",
    input="東京の夜景をサイバーパンク風に描いてください",
    tools=[{"type": "image_generation"}]
)

# 生成された画像の取得
for item in response.output:
    if hasattr(item, 'result'):
        # Base64エンコードされた画像データ
        import base64
        image_data = base64.b64decode(item.result)
        with open("tokyo_cyberpunk.png", "wb") as f:
            f.write(image_data)

10.4 画像編集

# DALL·E 2 による画像編集(マスクベース)
response = client.images.edit(
    model="dall-e-2",
    image=open("original.png", "rb"),
    mask=open("mask.png", "rb"),    # 編集領域を示すマスク
    prompt="赤い花を追加",
    size="1024x1024",
    n=1
)

10.5 画像のバリエーション生成

response = client.images.create_variation(
    model="dall-e-2",
    image=open("original.png", "rb"),
    size="1024x1024",
    n=3  # 3つのバリエーション
)

for i, data in enumerate(response.data):
    print(f"バリエーション {i+1}: {data.url}")

10.6 DALL·E 3 vs GPT Image Generation の比較

機能DALL·E 3GPT Image Generation
APIImages APIResponses API / Chat Completions
テキスト描画限定的高精度
画像編集マスクベース(DALL·E 2)テキスト指示による自然な編集
スタイル制御vivid/naturalプロンプトで柔軟に制御
会話コンテキストなしあり(前の会話を考慮)
出力形式URL or Base64Base64

11. 音声 API — Whisper / TTS

11.1 音声認識 — Whisper

Whisper は OpenAI が開発した汎用音声認識モデルで、多言語対応、翻訳機能を持つ。

基本的な文字起こし

from openai import OpenAI
client = OpenAI()

# 音声ファイルの文字起こし
with open("meeting_recording.mp3", "rb") as audio_file:
    transcript = client.audio.transcriptions.create(
        model="whisper-1",
        file=audio_file,
        language="ja",             # 言語ヒント(省略可能)
        response_format="verbose_json",  # json, text, srt, verbose_json, vtt
        timestamp_granularities=["word", "segment"]  # タイムスタンプの粒度
    )

print(transcript.text)

# セグメント(タイムスタンプ付き)の表示
for segment in transcript.segments:
    print(f"[{segment.start:.1f}s - {segment.end:.1f}s] {segment.text}")

音声翻訳(任意の言語 → 英語)

with open("japanese_speech.mp3", "rb") as audio_file:
    translation = client.audio.translations.create(
        model="whisper-1",
        file=audio_file,
        response_format="text"
    )

print(translation)  # 英語のテキストが出力される

対応フォーマットと制限

項目
対応フォーマットmp3, mp4, mpeg, mpga, m4a, wav, webm
最大ファイルサイズ25MB
対応言語50以上の言語
長時間音声の処理チャンク分割が必要

長時間音声の処理例

from pydub import AudioSegment
import io

def transcribe_long_audio(file_path: str, chunk_length_ms: int = 600000):
    """長時間音声を10分ごとに分割して文字起こし"""
    audio = AudioSegment.from_file(file_path)
    full_transcript = []
    
    for i in range(0, len(audio), chunk_length_ms):
        chunk = audio[i:i + chunk_length_ms]
        
        # チャンクをバッファに書き出し
        buffer = io.BytesIO()
        chunk.export(buffer, format="mp3")
        buffer.name = "chunk.mp3"
        buffer.seek(0)
        
        transcript = client.audio.transcriptions.create(
            model="whisper-1",
            file=buffer,
            language="ja"
        )
        full_transcript.append(transcript.text)
    
    return " ".join(full_transcript)

11.2 音声合成 — TTS

基本的な音声生成

# テキストから音声を生成
response = client.audio.speech.create(
    model="tts-1",          # tts-1(高速)または tts-1-hd(高品質)
    voice="nova",            # alloy, echo, fable, onyx, nova, shimmer
    input="こんにちは。本日はOpenAIの技術概要についてご説明します。",
    speed=1.0,               # 0.25〜4.0
    response_format="mp3"    # mp3, opus, aac, flac, wav, pcm
)

# ファイルに保存
with open("output.mp3", "wb") as f:
    for chunk in response.iter_bytes():
        f.write(chunk)

ストリーミング音声生成

# リアルタイムストリーミング
with client.audio.speech.with_streaming_response.create(
    model="tts-1",
    voice="nova",
    input="ストリーミングで音声を生成しています。"
) as response:
    response.stream_to_file("stream_output.mp3")

音声の種類

Voice ID特徴
alloyニュートラル、汎用的
echo落ち着いた男性的な声
fable表現力豊か、ストーリーテリング向き
onyx深く力強い声
nova明るく活発な声
shimmer温かみのある声

12. マルチモーダル入力(Vision)

12.1 概要

GPT-4o、GPT-4.1、GPT-4 Turbo は画像を入力として受け付け、画像の内容を理解・分析できる(Vision 機能)。

12.2 画像入力の方法

# 方法1: URL指定
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像に何が写っていますか?"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://example.com/photo.jpg",
                        "detail": "high"  # low, high, auto
                    }
                }
            ]
        }
    ]
)

# 方法2: Base64エンコード
import base64

with open("screenshot.png", "rb") as image_file:
    base64_image = base64.standard_b64encode(image_file.read()).decode("utf-8")

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "このスクリーンショットのUIを分析してください"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/png;base64,{base64_image}",
                        "detail": "high"
                    }
                }
            ]
        }
    ]
)

12.3 detail パラメータの影響

detail動作トークン消費推奨用途
low512x512 に縮小して処理85 トークン固定大まかな理解で十分な場合
high高解像度で詳細に処理最大 1,105 トークンOCR、詳細分析
autoモデルが自動判断可変一般的な用途

12.4 複数画像の比較分析

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "これら2つのグラフを比較して、主な違いを分析してください"},
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/png;base64,{graph1_b64}"}
                },
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/png;base64,{graph2_b64}"}
                }
            ]
        }
    ]
)

12.5 Vision の実用例

  • OCR/文書解析: 請求書、レシート、手書きメモの読み取り
  • UI/UXレビュー: スクリーンショットからUIの問題点を指摘
  • コードレビュー: コードのスクリーンショットからバグを発見
  • データ可視化分析: グラフ・チャートの内容解釈
  • アクセシビリティ: 画像の代替テキスト生成

13. Realtime API

13.1 概要

Realtime API は、低レイテンシーの音声対話を実現するAPIである。音声入力をリアルタイムで処理し、音声出力を生成する。WebSocket または WebRTC 接続を使用する。

13.2 接続方式の比較

項目WebSocketWebRTC
接続元サーバーサイドブラウザ/クライアント
認証APIキーエフェメラルトークン
レイテンシー低い最も低い(P2Pに近い)
用途バックエンド統合クライアントアプリ

13.3 WebSocket 接続例

import asyncio
import websockets
import json
import base64

async def realtime_session():
    url = "wss://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview"
    headers = {
        "Authorization": f"Bearer {OPENAI_API_KEY}",
        "OpenAI-Beta": "realtime=v1"
    }
    
    async with websockets.connect(url, extra_headers=headers) as ws:
        # セッション設定
        await ws.send(json.dumps({
            "type": "session.update",
            "session": {
                "modalities": ["text", "audio"],
                "instructions": "あなたは日本語で会話する親切なアシスタントです。",
                "voice": "nova",
                "input_audio_format": "pcm16",
                "output_audio_format": "pcm16",
                "input_audio_transcription": {
                    "model": "whisper-1"
                },
                "turn_detection": {
                    "type": "server_vad",        # サーバーサイドの音声検出
                    "threshold": 0.5,
                    "prefix_padding_ms": 300,
                    "silence_duration_ms": 500
                },
                "tools": [
                    {
                        "type": "function",
                        "name": "get_time",
                        "description": "現在の時刻を取得",
                        "parameters": {
                            "type": "object",
                            "properties": {},
                            "required": []
                        }
                    }
                ]
            }
        }))
        
        # イベントループ
        async for message in ws:
            event = json.loads(message)
            
            match event["type"]:
                case "session.created":
                    print("セッション開始")
                case "response.audio.delta":
                    # 音声データの受信(Base64エンコード)
                    audio_chunk = base64.b64decode(event["delta"])
                    # オーディオプレイヤーに送信
                case "response.audio_transcript.delta":
                    # 応答のテキスト版
                    print(event["delta"], end="", flush=True)
                case "input_audio_buffer.speech_started":
                    print("\n[発話検出]")
                case "response.function_call_arguments.done":
                    # ツール呼出しの処理
                    pass

asyncio.run(realtime_session())

13.4 WebRTC 接続(ブラウザ向け)

// エフェメラルトークンの取得(サーバーサイドで実行)
// POST https://api.openai.com/v1/realtime/sessions
// → { client_secret: { value: "ek_..." } }

// ブラウザでの WebRTC 接続
async function startRealtimeSession(ephemeralToken) {
    const pc = new RTCPeerConnection();
    
    // マイク入力の追加
    const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
    stream.getTracks().forEach(track => pc.addTrack(track, stream));
    
    // 音声出力の処理
    pc.ontrack = (event) => {
        const audioEl = document.createElement('audio');
        audioEl.srcObject = event.streams[0];
        audioEl.autoplay = true;
        document.body.appendChild(audioEl);
    };
    
    // データチャネル(イベント受信用)
    const dc = pc.createDataChannel('oai-events');
    dc.onmessage = (event) => {
        const data = JSON.parse(event.data);
        console.log('Event:', data.type);
    };
    
    // SDP オファーの作成
    const offer = await pc.createOffer();
    await pc.setLocalDescription(offer);
    
    // OpenAI に SDP を送信
    const response = await fetch(
        'https://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview',
        {
            method: 'POST',
            headers: {
                'Authorization': `Bearer ${ephemeralToken}`,
                'Content-Type': 'application/sdp'
            },
            body: offer.sdp
        }
    );
    
    const answerSdp = await response.text();
    await pc.setRemoteDescription({ type: 'answer', sdp: answerSdp });
}

13.5 Realtime API の料金体系

項目料金 (GPT-4o Realtime)
テキスト入力$5.00 / 1M tokens
テキスト出力$20.00 / 1M tokens
音声入力$40.00 / 1M tokens
音声出力$80.00 / 1M tokens

14. Fine-tuning(ファインチューニング)

14.1 概要

ファインチューニングは、既存のモデルを独自のデータセットで追加学習させ、特定のタスクに最適化する機能である。以下のような場合に有効。

  • 品質の向上: プロンプトだけでは達成できない出力品質が必要な場合
  • レイテンシーの削減: 長いプロンプトの代わりにモデルに知識を組み込む
  • コスト削減: 短いプロンプトで同等の品質を実現
  • 一貫したスタイル: ブランドのトーン・フォーマットの統一

14.2 対応モデル

モデルファインチューニング特徴
GPT-4o対応最新の高性能モデル
GPT-4o mini対応コスト効率重視
GPT-4.1対応長コンテキスト対応
GPT-4.1 mini対応軽量版
GPT-4.1 nano対応最軽量
o4-mini対応(推論モデル)推論タスク特化
GPT-3.5 Turbo対応レガシー

14.3 データ準備

// training_data.jsonl — JSONL形式
{"messages": [{"role": "system", "content": "あなたはカスタマーサポートの専門家です。"}, {"role": "user", "content": "返品したいのですが"}, {"role": "assistant", "content": "承知いたしました。ご注文番号をお教えいただけますか?返品の手続きをお手伝いいたします。"}]}
{"messages": [{"role": "system", "content": "あなたはカスタマーサポートの専門家です。"}, {"role": "user", "content": "配送状況を知りたい"}, {"role": "assistant", "content": "配送状況の確認ですね。ご注文番号をお知らせいただけますか?最新のステータスをお調べいたします。"}]}

14.4 ファインチューニングの実行

from openai import OpenAI
client = OpenAI()

# 1. 訓練データのアップロード
training_file = client.files.create(
    file=open("training_data.jsonl", "rb"),
    purpose="fine-tune"
)

# 2. (オプション) 検証データのアップロード
validation_file = client.files.create(
    file=open("validation_data.jsonl", "rb"),
    purpose="fine-tune"
)

# 3. ファインチューニングジョブの作成
job = client.fine_tuning.jobs.create(
    training_file=training_file.id,
    validation_file=validation_file.id,
    model="gpt-4o-mini-2024-07-18",
    hyperparameters={
        "n_epochs": 3,                    # エポック数(auto で自動設定)
        "batch_size": "auto",             # バッチサイズ
        "learning_rate_multiplier": "auto" # 学習率の倍率
    },
    suffix="customer-support-v1"  # モデル名のサフィックス
)

print(f"Job ID: {job.id}")
print(f"Status: {job.status}")

# 4. ジョブの監視
import time

while True:
    job = client.fine_tuning.jobs.retrieve(job.id)
    print(f"Status: {job.status}")
    
    if job.status in ["succeeded", "failed", "cancelled"]:
        break
    
    time.sleep(60)

# 5. ファインチューニングモデルの使用
if job.status == "succeeded":
    fine_tuned_model = job.fine_tuned_model
    print(f"Model: {fine_tuned_model}")
    
    response = client.chat.completions.create(
        model=fine_tuned_model,  # ft:gpt-4o-mini-2024-07-18:org:customer-support-v1:abc123
        messages=[
            {"role": "system", "content": "あなたはカスタマーサポートの専門家です。"},
            {"role": "user", "content": "商品が届かないのですが"}
        ]
    )
    print(response.choices[0].message.content)

14.5 推論モデル (o4-mini) のファインチューニング

推論モデルのファインチューニングでは、"thinking" プロセスも学習データに含めることができる。

{"messages": [{"role": "user", "content": "この数学の問題を解いてください: ..."}, {"role": "assistant", "content": [{"type": "thinking", "thinking": "まず問題を分解して..."}, {"type": "text", "text": "答えは42です。理由は..."}]}]}

14.6 ファインチューニングのベストプラクティス

項目推奨
データ量最低50例、推奨500-1000例
データ品質一貫性があり高品質なデータ
評価検証データセットで定量評価
イテレーション小規模で開始し段階的に改善
プロンプトの併用FT後もシステムプロンプトは有効活用

15. Batch API

15.1 概要

Batch API は、大量のリクエストを一括で非同期処理するAPIである。通常のAPI料金の50%割引で利用でき、24時間以内に処理が完了する。

15.2 対応エンドポイント

  • /v1/chat/completions
  • /v1/responses
  • /v1/embeddings

15.3 バッチ処理の手順

from openai import OpenAI
import json

client = OpenAI()

# 1. バッチ入力ファイルの作成 (JSONL)
requests = []
for i, question in enumerate(["質問1", "質問2", "質問3"]):
    requests.append({
        "custom_id": f"request-{i}",
        "method": "POST",
        "url": "/v1/chat/completions",
        "body": {
            "model": "gpt-4o-mini",
            "messages": [
                {"role": "system", "content": "簡潔に回答してください。"},
                {"role": "user", "content": question}
            ],
            "max_tokens": 500
        }
    })

# JSONL ファイルに書き出し
with open("batch_input.jsonl", "w") as f:
    for req in requests:
        f.write(json.dumps(req) + "\n")

# 2. ファイルのアップロード
batch_file = client.files.create(
    file=open("batch_input.jsonl", "rb"),
    purpose="batch"
)

# 3. バッチジョブの作成
batch = client.batches.create(
    input_file_id=batch_file.id,
    endpoint="/v1/chat/completions",
    completion_window="24h",
    metadata={
        "description": "週次レポート生成バッチ"
    }
)

print(f"Batch ID: {batch.id}")
print(f"Status: {batch.status}")

# 4. ステータスの確認
batch = client.batches.retrieve(batch.id)
print(f"Status: {batch.status}")
print(f"Completed: {batch.request_counts.completed}/{batch.request_counts.total}")

# 5. 結果の取得
if batch.status == "completed":
    result_file = client.files.content(batch.output_file_id)
    
    for line in result_file.text.strip().split("\n"):
        result = json.loads(line)
        custom_id = result["custom_id"]
        content = result["response"]["body"]["choices"][0]["message"]["content"]
        print(f"{custom_id}: {content}")

15.4 コスト比較

処理方式料金レイテンシー制限
同期API通常料金秒単位レート制限あり
Batch API50%割引最大24時間大量処理向き

Batch API は、大規模なデータ処理、定期的なレポート生成、ドキュメントの一括分析など、即時性が不要な処理に最適である。

16. Agents SDK

16.1 概要

OpenAI Agents SDK は、LLMを活用したエージェントアプリケーションを構築するための公式フレームワークである。Python で提供され、以下のコアプリミティブを持つ。

  • Agent: LLMに指示・ツール・ガードレールを設定したエンティティ
  • Handoff: エージェント間のタスク委譲
  • Guardrail: 入出力の検証・フィルタリング
  • Tracing: 実行の可視化とデバッグ

16.2 基本的なエージェント

from agents import Agent, Runner

# エージェントの定義
agent = Agent(
    name="カスタマーサポート",
    instructions="""あなたはECサイトのカスタマーサポートエージェントです。
    顧客からの問い合わせに丁寧に対応してください。
    返品・交換・配送に関する質問に答えられます。""",
    model="gpt-4.1"
)

# エージェントの実行
result = Runner.run_sync(
    agent,
    "注文した商品が3日経っても届きません。注文番号は#12345です。"
)

print(result.final_output)

16.3 ツール付きエージェント

from agents import Agent, Runner, function_tool

@function_tool
def check_order_status(order_id: str) -> str:
    """注文の配送状況を確認する"""
    # 実際にはDBやAPI呼出し
    return f"注文 {order_id}: 発送済み。到着予定: 2026年4月9日"

@function_tool
def initiate_return(order_id: str, reason: str) -> str:
    """返品手続きを開始する"""
    return f"注文 {order_id} の返品手続きを開始しました。理由: {reason}"

agent = Agent(
    name="サポートエージェント",
    instructions="顧客の問い合わせに対応し、必要に応じてツールを使用してください。",
    model="gpt-4.1",
    tools=[check_order_status, initiate_return]
)

result = Runner.run_sync(agent, "注文#12345の状況を教えてください")

16.4 マルチエージェントとハンドオフ

from agents import Agent, Runner

# 専門エージェントの定義
billing_agent = Agent(
    name="請求担当",
    instructions="請求・支払いに関する問い合わせに対応します。",
    model="gpt-4.1",
    tools=[check_billing, process_refund]
)

shipping_agent = Agent(
    name="配送担当",
    instructions="配送・追跡に関する問い合わせに対応します。",
    model="gpt-4.1",
    tools=[track_package, reschedule_delivery]
)

# トリアージエージェント(振り分け役)
triage_agent = Agent(
    name="トリアージ",
    instructions="""顧客の問い合わせ内容を判断し、適切な専門エージェントに引き継いでください。
    - 請求・返金関連 → 請求担当
    - 配送・追跡関連 → 配送担当""",
    model="gpt-4.1",
    handoffs=[billing_agent, shipping_agent]
)

# 実行
result = Runner.run_sync(
    triage_agent,
    "先月の請求額がおかしいのですが確認してもらえますか?"
)
# → triage_agent が billing_agent にハンドオフ

16.5 ガードレール

from agents import Agent, Runner, InputGuardrail, GuardrailFunctionOutput
from pydantic import BaseModel

class SafetyCheck(BaseModel):
    is_safe: bool
    reason: str

# 入力ガードレール
safety_guardrail = InputGuardrail(
    name="安全性チェック",
    guardrail_function=lambda ctx, agent, input: GuardrailFunctionOutput(
        output_info=SafetyCheck(is_safe=True, reason=""),
        tripwire_triggered=False
    )
)

agent = Agent(
    name="アシスタント",
    instructions="ユーザーの質問に回答してください。",
    model="gpt-4.1",
    input_guardrails=[safety_guardrail]
)

16.6 MCP(Model Context Protocol)統合

from agents import Agent
from agents.mcp import MCPServerStdio

# MCPサーバーとの統合
mcp_server = MCPServerStdio(
    name="ファイルシステム",
    command="npx",
    args=["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
)

agent = Agent(
    name="ファイル管理エージェント",
    instructions="ファイルシステムを操作して、ユーザーのリクエストに応えてください。",
    model="gpt-4.1",
    mcp_servers=[mcp_server]
)

17. コンテンツモデレーションと安全性

17.1 Moderation API

from openai import OpenAI
client = OpenAI()

response = client.moderations.create(
    model="omni-moderation-latest",  # テキスト+画像対応
    input=[
        {"type": "text", "text": "チェックしたいテキスト"},
        {
            "type": "image_url",
            "image_url": {"url": "https://example.com/image.jpg"}
        }
    ]
)

result = response.results[0]
print(f"フラグ付き: {result.flagged}")

for category, flagged in result.categories.dict().items():
    if flagged:
        score = getattr(result.category_scores, category)
        print(f"  {category}: スコア {score:.4f}")

17.2 検出カテゴリ

カテゴリ説明
hate憎悪表現
hate/threatening脅迫を含む憎悪表現
harassmentハラスメント
harassment/threatening脅迫を含むハラスメント
self-harm自傷行為
self-harm/intent自傷の意図
self-harm/instructions自傷の方法
sexual性的コンテンツ
sexual/minors未成年に関する性的コンテンツ
violence暴力
violence/graphic生々しい暴力描写
illicit違法行為
illicit/violent暴力的な違法行為

17.3 安全性のベストプラクティス

  1. 入力のサニタイズ: ユーザー入力をModeration APIで事前チェック
  2. 出力のフィルタリング: 生成されたコンテンツの事後チェック
  3. システムプロンプトの防御: プロンプトインジェクション対策
  4. レート制限の実装: 悪用防止のためのアプリケーションレベルの制限
  5. 監査ログ: すべてのAPI呼出しの記録

18. セキュリティ・コンプライアンス・データプライバシー

18.1 データ取り扱いポリシー

項目API利用ChatGPT
学習への使用デフォルトで不使用オプトアウト可
データ保持期間30日間(不正利用監視)可変
Zero Data Retention対象モデルで利用可N/A
暗号化(転送時)TLS 1.2+TLS 1.2+
暗号化(保存時)AES-256AES-256

18.2 コンプライアンス認証

  • SOC 2 Type II: セキュリティ、可用性、処理の整合性
  • GDPR: EU一般データ保護規則準拠
  • CCPA: カリフォルニア消費者プライバシー法準拠
  • CSA STAR Level 1: クラウドセキュリティ

18.3 API キーのセキュリティ

# ✗ 悪い例: ハードコード
client = OpenAI(api_key="sk-abc123...")

# ✓ 良い例: 環境変数
import os
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

# ✓ さらに良い例: シークレット管理サービス
from your_secret_manager import get_secret
client = OpenAI(api_key=get_secret("openai-api-key"))

18.4 組織・プロジェクト管理

# プロジェクト単位でのアクセス制御
# 各プロジェクトに独立したAPIキー・レート制限を設定可能

# 組織の使用量確認
usage = client.organization.usage.completions.list(
    start_time=1711929600,  # Unix timestamp
    end_time=1712016000
)

19. 料金体系と最適化戦略

19.1 主要モデルの料金(2025年時点)

モデル入力 ($/1M tokens)出力 ($/1M tokens)キャッシュ入力
GPT-4.1$2.00$8.00$0.50
GPT-4.1 mini$0.40$1.60$0.10
GPT-4.1 nano$0.10$0.40$0.025
GPT-4o$2.50$10.00$1.25
GPT-4o mini$0.15$0.60$0.075
GPT-4.5 Preview$75.00$150.00$37.50
o3$10.00$40.00$2.50
o4-mini$1.10$4.40$0.275
その他サービス料金
Whisper$0.006 / 分
TTS$15.00 / 1M 文字
TTS HD$30.00 / 1M 文字
DALL·E 3 (1024x1024)$0.040 / 画像
DALL·E 3 HD (1024x1024)$0.080 / 画像
Embedding (small)$0.020 / 1M tokens
Embedding (large)$0.130 / 1M tokens

19.2 Prompt Caching(プロンプトキャッシュ)

同じプレフィックスを持つリクエストのキャッシュにより、入力トークンのコストが大幅に削減される。

# 長いシステムプロンプトをキャッシュ活用
# 最初のリクエスト: 全額課金
# 以降のリクエスト: キャッシュヒットで50-75%割引

# キャッシュの確認
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": very_long_system_prompt},  # キャッシュ対象
        {"role": "user", "content": "質問1"}
    ]
)

# usage.prompt_tokens_details.cached_tokens でキャッシュ量を確認
print(f"キャッシュトークン: {response.usage.prompt_tokens_details.cached_tokens}")

19.3 コスト最適化の戦略

戦略効果実装難易度
適切なモデル選択高(10-100x コスト差)
Prompt Caching中(50-75%削減)
Batch API中(50%割引)
max_tokens 制限低〜中
埋め込み次元削減
ファインチューニング中(短プロンプト化)
Predicted Outputs中(編集タスク)

19.4 Predicted Outputs

編集タスクなど、出力の大部分が入力と同じ場合、予測出力を指定することで出力トークンのコストとレイテンシーを削減できる。

# コードの一部修正タスク
code = open("large_file.py").read()

response = client.chat.completions.create(
    model="gpt-4.1",
    messages=[
        {"role": "user", "content": f"以下のコードのバグを修正してください:\n\n{code}"}
    ],
    prediction={
        "type": "content",
        "content": code  # 出力の大部分が元のコードと同じと予測
    }
)

20. ベストプラクティスと実践的設定例

20.1 プロンプトエンジニアリングのベストプラクティス

明確で具体的な指示

# ✗ 曖昧
messages = [
    {"role": "user", "content": "このコードを改善して"}
]

# ✓ 具体的
messages = [
    {"role": "system", "content": """あなたはシニアPythonエンジニアです。
    コードレビューでは以下の観点で改善を提案してください:
    1. パフォーマンス(時間/空間計算量)
    2. 可読性(命名、構造)
    3. エラーハンドリング
    4. セキュリティ(インジェクション等)
    各改善点は「問題」「影響」「修正案」の形式で記述してください。"""},
    {"role": "user", "content": f"以下のコードをレビューしてください:\n\n```python\n{code}\n```"}
]

Few-shot 学習

messages = [
    {"role": "system", "content": "ユーザーの質問を適切なカテゴリに分類してください。"},
    {"role": "user", "content": "パスワードをリセットしたい"},
    {"role": "assistant", "content": '{"category": "account", "subcategory": "password_reset", "priority": "medium"}'},
    {"role": "user", "content": "注文した商品が届かない"},
    {"role": "assistant", "content": '{"category": "shipping", "subcategory": "delivery_issue", "priority": "high"}'},
    {"role": "user", "content": "返品の送料は誰が負担しますか?"}
]

20.2 本番環境でのアーキテクチャパターン

パターン1: ルーターパターン

# 軽量モデルで分類 → 適切なモデルで処理
def route_request(user_input: str):
    # Step 1: GPT-4.1 nano で分類(低コスト)
    classification = client.chat.completions.create(
        model="gpt-4.1-nano-2025-04-14",
        messages=[
            {"role": "system", "content": "タスクを分類: simple/complex/reasoning"},
            {"role": "user", "content": user_input}
        ],
        max_tokens=10
    )
    
    task_type = classification.choices[0].message.content.strip()
    
    # Step 2: 分類結果に応じたモデル選択
    model_map = {
        "simple": "gpt-4.1-nano-2025-04-14",
        "complex": "gpt-4.1-2025-04-14",
        "reasoning": "o4-mini"
    }
    
    model = model_map.get(task_type, "gpt-4.1-mini-2025-04-14")
    
    # Step 3: 選択したモデルで処理
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": user_input}]
    )
    
    return response.choices[0].message.content

パターン2: RAG + Structured Output

from pydantic import BaseModel

class AnswerWithSources(BaseModel):
    answer: str
    confidence: float
    sources: list[str]
    follow_up_questions: list[str]

def answer_with_rag(question: str, vector_store_id: str):
    # Responses API + ファイル検索 + Structured Output
    response = client.responses.create(
        model="gpt-4.1",
        tools=[{
            "type": "file_search",
            "vector_store_ids": [vector_store_id]
        }],
        input=question,
        text={
            "format": {
                "type": "json_schema",
                "name": "answer_with_sources",
                "strict": True,
                "schema": AnswerWithSources.model_json_schema()
            }
        }
    )
    
    return AnswerWithSources.model_validate_json(response.output_text)

パターン3: エラー処理とフォールバック

import openai

def resilient_completion(messages, primary_model="gpt-4.1", fallback_model="gpt-4.1-mini"):
    """プライマリモデルが失敗した場合、フォールバックモデルを使用"""
    try:
        return client.chat.completions.create(
            model=primary_model,
            messages=messages,
            timeout=30
        )
    except openai.RateLimitError:
        # レート制限 → フォールバックモデル
        return client.chat.completions.create(
            model=fallback_model,
            messages=messages,
            timeout=30
        )
    except openai.APITimeoutError:
        # タイムアウト → リトライ
        return client.chat.completions.create(
            model=fallback_model,
            messages=messages,
            timeout=60
        )

20.3 監視とオブザーバビリティ

# 使用量の追跡
import logging

logger = logging.getLogger("openai_usage")

def tracked_completion(**kwargs):
    response = client.chat.completions.create(**kwargs)
    
    # 使用量のログ記録
    usage = response.usage
    logger.info(
        "API Call",
        extra={
            "model": response.model,
            "prompt_tokens": usage.prompt_tokens,
            "completion_tokens": usage.completion_tokens,
            "total_tokens": usage.total_tokens,
            "cached_tokens": usage.prompt_tokens_details.cached_tokens,
            "reasoning_tokens": usage.completion_tokens_details.reasoning_tokens,
        }
    )
    
    return response

20.4 環境変数による設定管理

# .env ファイル(本番環境ではシークレット管理サービスを使用)
OPENAI_API_KEY=sk-proj-...
OPENAI_ORG_ID=org-...
OPENAI_PROJECT_ID=proj-...
OPENAI_DEFAULT_MODEL=gpt-4.1
OPENAI_TIMEOUT=60
OPENAI_MAX_RETRIES=3
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get("OPENAI_API_KEY"),
    organization=os.environ.get("OPENAI_ORG_ID"),
    project=os.environ.get("OPENAI_PROJECT_ID"),
    timeout=float(os.environ.get("OPENAI_TIMEOUT", "60")),
    max_retries=int(os.environ.get("OPENAI_MAX_RETRIES", "3"))
)

21. まとめ

21.1 OpenAI エコシステムの全体像

OpenAI は、基盤モデル(GPT、o シリーズ)を中心に、テキスト生成、画像生成、音声処理、埋め込み、モデレーションまでをカバーする包括的なAIプラットフォームを提供している。

┌─────────────────────────────────────────────────────┐
│                OpenAI Platform                       │
│                                                      │
│  ┌─────────────┐  ┌──────────────┐  ┌────────────┐ │
│  │ Foundation   │  │ Specialized  │  │ Developer  │ │
│  │ Models       │  │ Models       │  │ Tools      │ │
│  │              │  │              │  │            │ │
│  │ GPT-4.1      │  │ DALL·E 3     │  │ API        │ │
│  │ GPT-4o       │  │ Whisper      │  │ SDK        │ │
│  │ GPT-4.5      │  │ TTS          │  │ Agents SDK │ │
│  │ o3 / o4-mini │  │ Embeddings   │  │ Playground │ │
│  │ GPT-4.1 nano │  │ Moderation   │  │ Fine-tune  │ │
│  └─────────────┘  └──────────────┘  └────────────┘ │
│                                                      │
│  ┌──────────────────────────────────────────────┐   │
│  │              API Interfaces                    │   │
│  │  Responses API | Chat Completions | Realtime  │   │
│  │  Assistants | Batch | Images | Audio          │   │
│  └──────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────┘

21.2 API 選択ガイド

ユースケース推奨API
新規プロジェクトResponses API
ツール統合(Web検索、ファイル検索)Responses API
既存のChat Completionsからの移行段階的に Responses API へ
リアルタイム音声対話Realtime API
大量バッチ処理Batch API
マルチエージェントAgents SDK

21.3 今後の展望

OpenAI は以下の方向性で進化を続けている。

  1. AGI への段階的進化: o シリーズの推論能力の強化
  2. マルチモーダルの統合深化: テキスト・画像・音声・動画の統合処理
  3. エージェント機能の拡充: Operator、Codex CLI など自律的なAIエージェント
  4. コスト効率の改善: nano/mini モデルによる低コスト化
  5. 安全性とアライメント: より堅牢な安全機構の開発
  6. エンタープライズ対応: コンプライアンス、データ制御の強化

免責事項: 本記事の情報は2026年4月時点のものです。OpenAI のサービス・料金・機能は頻繁に更新されるため、最新情報は OpenAI 公式ドキュメント をご確認ください。