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 tokens2. ストリーミング
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
関連記事
- 2026-04-30実装Vercel で AI アプリをデプロイする ─ Next.js + AI SDK 入門Vercel にデプロイする最短ルート。Next.js の AI SDK + AI Gateway で OpenAI/Claude を統合し、ストリーミングチャット UI を 1 時間で公開する手順。
- 2026-04-30実装Streamlit で 1 時間で ML デモアプリ ─ 転職に効くポートフォリオPython だけで動くインタラクティブな ML デモを Streamlit で作る方法。データ可視化・ファイルアップロード・モデル予測 UI までの最小実装。
- 2026-04-30実装GitHub Actions で ML プロジェクトに CI/CD を ─ 30 分入門テスト ・ Lint ・ モデル学習 ・ 自動デプロイ を GitHub Actions で自動化する手順。Python ML プロジェクトのテンプレートをそのまま流用できる形で。