前回は、Azure OpenAI Serviceの基本と環境構築について解説しました。
Part2では、実際にAPIを使った開発方法や、効果的なプロンプトの書き方、トークンとコストの管理について詳しく解説していきます。
シリーズ構成
- Part1:基本知識と環境構築
- Part2:実際の使い方とプロンプトのコツ(本記事)
- Part3:セキュリティと運用のベストプラクティス
REST APIで呼び出してみる
プレイグラウンドで動作確認ができたら、実際のアプリケーションから呼び出してみましょう。
エンドポイントとキーを取得
- Azure Portalで作成したリソースを開く
- 「キーとエンドポイント」を選択
- 以下をメモ:
-
エンドポイント:
https://your-resource-name.openai.azure.com/ - キー1またはキー2:APIキー
-
エンドポイント:
curlで試してみる
まずは、シンプルにcurlで試してみます。
curl https://your-resource-name.openai.azure.com/openai/deployments/gpt-4o-deployment/chat/completions?api-version=2024-08-01-preview \
-H "Content-Type: application/json" \
-H "api-key: YOUR_API_KEY" \
-d '{
"messages": [
{
"role": "system",
"content": "あなたは親切なAIアシスタントです。"
},
{
"role": "user",
"content": "Pythonでリストをソートする方法を教えて"
}
],
"max_tokens": 800,
"temperature": 0.7
}'
Pythonで書いてみる
実際の開発では、SDKを使うと便利です。
import os
from openai import AzureOpenAI
# クライアントを作成
client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-08-01-preview",
azure_endpoint="https://your-resource-name.openai.azure.com/"
)
# チャットしてみる
response = client.chat.completions.create(
model="gpt-4o-deployment", # デプロイメント名
messages=[
{"role": "system", "content": "あなたは親切なAIアシスタントです。"},
{"role": "user", "content": "Pythonでリストをソートする方法を教えて"}
],
max_tokens=800,
temperature=0.7
)
print(response.choices[0].message.content)
レスポンスはこんな感じ
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1698765432,
"model": "gpt-4o",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Pythonでリストをソートする方法は...",
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 25,
"completion_tokens": 120,
"total_tokens": 145
}
}
トークンとコストを理解する
Azure OpenAI Serviceは従量課金なので、トークンの仕組みを知っておくと便利です。
テキストトークン
テキストは「トークン」という単位に分割されます。
- 英語:1単語 ≈ 1-2トークン
- 日本語:1文字 ≈ 1-2トークン
- 「こんにちは」 → 約5-6トークン
トークン数は、OpenAIのTokenizerで確認できます。
画像入力トークン(GPT-4o、GPT-4o mini)
画像を処理するときもトークンを消費します。
低解像度モード(detail: low)
- GPT-4o:85トークン(固定)
- GPT-4o mini:2,833トークン(固定)
高解像度モード(detail: high)
- 画像を512×512ピクセルのタイルに分割
- GPT-4o:タイル1枚170トークン + 基本85トークン
- GPT-4o mini:タイル1枚5,667トークン + 基本2,833トークン
例:2048×4096の画像(高解像度)
- リサイズして768×1536に
- 2×3タイル(6タイル)に分割
- GPT-4o:6 × 170 + 85 = 1,105トークン
画像生成トークン(GPT-image-1)
画像を生成するときも特殊なトークンを使います。
| 品質 | 1024×1024 | 1024×1536 | 1536×1024 |
|---|---|---|---|
| 低 | 272トークン | 408トークン | 400トークン |
| 中 | 1,056トークン | 1,584トークン | 1,568トークン |
| 高 | 4,160トークン | 6,240トークン | 6,208トークン |
コストを抑えるコツ
- プロンプトは簡潔に:無駄な情報は削る
- max_tokensを適切に設定:必要以上に大きくしない
-
適切なモデルを選ぶ:
- 簡単なタスク:GPT-3.5 Turbo、GPT-4o mini
- 複雑なタスク:GPT-4o、GPT-4.1
- 同じシステムメッセージは使い回す:キャッシュが効く
- まとめて処理:複数のリクエストをバッチで処理
プロンプトの書き方のコツ
うまく使うには、プロンプトの書き方が超重要です。
明確で具体的に書く
AIに何をしてほしいのか、できるだけ具体的に伝えましょう。
❌ 悪い例:
顧客について教えて
✅ 良い例:
うちの製品を買ってくれたお客さんで、リピート率が高い人たちの特徴を、
次の観点から3つ教えてください:
- 年齢層
- 買い方のパターン
- フィードバックの傾向
例を見せる(Few-shot学習)
具体的な例を見せると、AIが期待する動作を理解しやすくなります。
以下の例を参考に、レビューをポジティブ/ニュートラル/ネガティブに分類してね。
例1:
レビュー:「この商品、期待以上でした!使いやすくて最高!」
分類:ポジティブ
例2:
レビュー:「普通です。特に良くも悪くもない。」
分類:ニュートラル
例3:
レビュー:「すぐ壊れた...がっかり。」
分類:ネガティブ
分類してください:
レビュー:「配送は早かったけど、品質はいまいちだった。」
分類:
段階的に考えさせる
複雑な問題は、ステップバイステップで考えさせると精度が上がります。
以下の問題を順番に解いてください:
問題:あるお店で、リンゴ5個とオレンジ3個で1,200円です。
リンゴ3個とオレンジ2個で780円です。
リンゴ1個の値段は?
手順:
1. 連立方程式を立てる
2. 方程式を解く
3. 答えを確認する
ロール(役割)を与える
AIに特定の役割を与えると、その専門性を活かした回答が得られます。
messages=[
{
"role": "system",
"content": "あなたは10年以上の経験を持つPythonエンジニアです。"
"初心者にもわかりやすく、ベストプラクティスを教えてください。"
},
{
"role": "user",
"content": "Pythonで例外処理を書くときの注意点を教えて"
}
]
フォーマットを指定する
出力形式を指定すると、プログラムで処理しやすい結果が得られます。
以下の文章から、人物名、場所、日付を抽出してJSON形式で出力してください。
文章:「2025年10月30日、東京で行われた会議に田中太郎さんと佐藤花子さんが参加しました。」
期待する出力形式:
{
"人物": ["田中太郎", "佐藤花子"],
"場所": ["東京"],
"日付": ["2025年10月30日"]
}
否定形ではなく肯定形で指示する
「〜しないで」ではなく、「〜してください」と指示する方が効果的です。
❌ 悪い例:
専門用語を使わないで説明して
✅ 良い例:
小学生でもわかるように、簡単な言葉で説明してください
パラメータを調整してみる
APIのパラメータを調整することで、出力を細かくコントロールできます。
Temperature(温度)
創造性のレベルを調整します。
- 0.0-0.3:決定論的な回答。事実に基づいた回答が必要なとき
- 0.4-0.7:バランスの取れた回答。一般的なチャットに最適
- 0.8-1.0:創造的な回答。ブレインストーミングやアイデア出しに
- 1.1-2.0:非常にランダム。実験的な用途に
# 事実に基づいた回答が必要な場合
response = client.chat.completions.create(
model="gpt-4o-deployment",
messages=[...],
temperature=0.2 # 低めに設定
)
# 創造的なアイデアが欲しい場合
response = client.chat.completions.create(
model="gpt-4o-deployment",
messages=[...],
temperature=0.9 # 高めに設定
)
max_tokens(最大トークン数)
生成する回答の最大長を制御します。
response = client.chat.completions.create(
model="gpt-4o-deployment",
messages=[...],
max_tokens=300 # 短めの回答に制限
)
top_p(トップP)
サンプリングの多様性を制御します。temperatureと併用することは推奨されません。
- 0.1-0.5:保守的な回答
- 0.9-1.0:多様な回答
frequency_penalty / presence_penalty
繰り返しを抑制します。
- frequency_penalty:同じフレーズの繰り返しを抑制(-2.0〜2.0)
- presence_penalty:新しいトピックの導入を促進(-2.0〜2.0)
response = client.chat.completions.create(
model="gpt-4o-deployment",
messages=[...],
frequency_penalty=0.5, # 繰り返しを少し抑制
presence_penalty=0.5 # 新しいトピックを促進
)
ストリーミングで応答を受け取る
リアルタイムで応答を表示したい場合は、ストリーミングを使います。
response = client.chat.completions.create(
model="gpt-4o-deployment",
messages=[
{"role": "user", "content": "Azureについて教えて"}
],
stream=True # ストリーミングを有効化
)
# レスポンスをリアルタイムで処理
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
これで、ChatGPTのように文字が順番に表示されるUIを作れます。
画像を扱う(GPT-4o、GPT-4 Turbo with Vision)
GPT-4oやGPT-4 Turbo with Visionでは、画像を入力として扱えます。
画像URLを指定する
response = client.chat.completions.create(
model="gpt-4o-deployment",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "この画像に何が写っていますか?"},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg",
"detail": "high" # low または high
}
}
]
}
],
max_tokens=500
)
Base64エンコードした画像を送る
import base64
# 画像を読み込んでBase64エンコード
with open("image.jpg", "rb") as image_file:
base64_image = base64.b64encode(image_file.read()).decode('utf-8')
response = client.chat.completions.create(
model="gpt-4o-deployment",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "この画像を説明してください"},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_image}",
"detail": "high"
}
}
]
}
],
max_tokens=500
)
まとめ(Part2)
Part2では、Azure OpenAI Serviceの実践的な使い方について解説しました。
押さえておきたいポイント
-
API呼び出しの基本
- エンドポイントとAPIキーの取得
- SDKを使った実装が便利
-
トークンとコスト
- トークンの仕組みを理解する
- 適切なモデル選択でコスト最適化
-
プロンプトエンジニアリング
- 具体的で明確な指示
- Few-shot学習の活用
- 段階的な思考を促す
-
パラメータ調整
- temperatureで創造性を制御
- max_tokensでコスト管理
次回予告
Part3では、セキュリティ設定、コンテンツフィルタリング、監視とトラブルシューティング、運用のベストプラクティスについて詳しく解説します!
【Part3】Azure OpenAI Serviceを使ってみた!セキュリティと運用のベストプラクティス
【Part1】Azure OpenAI Serviceを使ってみた!基本から環境構築まで