統計ロードマップ
2026-04-30·実装·⏱ 約 7

OpenAI API 実装入門 ─ Chat / Embeddings / Function Calling

OpenAI API を使ったプロダクション開発の基礎。Chat Completion・Embedding・Function Calling・ストリーミング・コスト管理まで実装パターンを網羅。

OpenAI API は LLM プロダクト開発のデファクト。ChatGPT を裏で動かしている API そのものです。本記事では実装で必須のパターンを網羅します。

セットアップ

API キー設定
# uv add openai
import os
from openai import OpenAI

# API キーは環境変数で(コードに直書き禁止)
os.environ['OPENAI_API_KEY'] = '...'  # .env ファイル推奨
client = OpenAI()

1. Chat Completion(基本)

シンプルな会話
resp = client.chat.completions.create(
    model='gpt-4o-mini',  # コスパ最強
    messages=[
        {'role': 'system', 'content': 'あなたは統計の専門家です'},
        {'role': 'user', 'content': 'p 値とは?'},
    ],
    temperature=0.7,
    max_tokens=500,
)
print(resp.choices[0].message.content)
print('費用:', resp.usage)  # input/output tokens

2. ストリーミング

ChatGPT のように 1 トークンずつ 表示するには `stream=True`。UX が劇的に改善。

ストリーミング応答
stream = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[{'role': 'user', 'content': '統計について 100 字で'}],
    stream=True,
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end='', flush=True)

3. Embeddings(検索 ・ RAG)

テキストをベクトル化
resp = client.embeddings.create(
    model='text-embedding-3-small',  # 1536 次元
    input=['統計検定 2 級', '機械学習']
)
vecs = [d.embedding for d in resp.data]
print(len(vecs), len(vecs[0]))  # 2, 1536

詳細は [RAG 入門](/blog/rag-introduction) を参照。

4. Function Calling(構造化応答)

関数呼び出し
tools = [{
    'type': 'function',
    'function': {
        'name': 'get_grade_info',
        'description': '統計検定の級別情報を取得',
        'parameters': {
            'type': 'object',
            'properties': {
                'grade': {
                    'type': 'string',
                    'enum': ['4', '3', '2', 'pre1', '1']
                },
            },
            'required': ['grade'],
        },
    }
}]

resp = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': '統計検定 2 級の合格率は?'}],
    tools=tools,
)

for call in resp.choices[0].message.tool_calls or []:
    print(call.function.name, call.function.arguments)
    # → get_grade_info, {"grade": "2"}

5. JSON Mode

出力を 必ず JSON で返すモード。後段処理が安定します。

JSON 強制
resp = client.chat.completions.create(
    model='gpt-4o',
    messages=[
        {'role': 'system', 'content': 'JSON で返答してください'},
        {'role': 'user', 'content': '東京の天気を {city, weather, temp} 形式で'}
    ],
    response_format={'type': 'json_object'},
)
import json
data = json.loads(resp.choices[0].message.content)

6. 本番運用 Tips

リトライ + 指数バックオフ

tenacity で簡単リトライ
from tenacity import retry, wait_exponential, stop_after_attempt

@retry(wait=wait_exponential(min=1, max=60), stop=stop_after_attempt(5))
def call_openai(messages):
    return client.chat.completions.create(
        model='gpt-4o-mini', messages=messages,
    )

コスト管理

  • モデル選定: gpt-4o-mini は gpt-4o の 1/30 のコスト
  • プロンプトキャッシュ: 同じ system プロンプトは Anthropic / OpenAI でキャッシュ可能
  • 最大トークン: max_tokens を必ず設定
  • ストリーミング: 中断可能でムダなコスト削減
  • ログ: 全 API コールのトークン数を DB に記録

レート制限対策

  • Tier 1 でも分単位の制限あり ・ 429 エラー時はリトライ
  • 並列度を `asyncio.Semaphore` で制限
  • Tier アップは Usage 増加で自動 or 申請

学習リソース

  • [LLM 入門](/blog/llm-introduction)
  • [RAG 入門](/blog/rag-introduction)
  • [プロンプトエンジニアリング基礎](/blog/prompt-engineering-basics)
  • [AI エージェント 入門](/blog/ai-agents-introduction)
Related Articles

関連記事