付録C. 機械学習 API の活用¶
本付録では、機械学習 API の活用方法について学びます。API の基本概念と呼び出しパターンから、外部 API(OpenAI など)と教員が運用する ローカル LLM サーバ(LM Studio) の使い方、エラーハンドリングなどの実践テクニックまでを扱います。第 13 回の Web アプリケーションは、ここで学ぶ API 呼び出しをバックエンドとして利用しています。
C.1 機械学習APIとは¶
C.1.1 APIの基本概念¶
API(Application Programming Interface) は、ソフトウェア同士が通信するための仕組みです。機械学習APIを使うことで、クラウド上の学習済みモデルを呼び出して予測を行えます。
graph LR
A[あなたのアプリ] -->|リクエスト| B[API]
B -->|処理| C[機械学習モデル]
C -->|結果| B
B -->|レスポンス| A
style A fill:#e6f3ff
style B fill:#ffffcc
style C fill:#ccffcc
C.1.2 APIを使うメリット¶
| メリット | 説明 |
|---|---|
| 手軽さ | モデルの構築・学習が不要 |
| 高精度 | 大規模データで学習された高性能モデル |
| スケーラビリティ | サーバ側でスケール |
| 最新技術 | 最新のAI技術をすぐに利用可能 |
C.1.3 主要な機械学習API¶
画像系API
- Google Cloud Vision API
- Amazon Rekognition
- Azure Computer Vision
テキスト系API
- OpenAI API(GPT)
- Google Cloud Natural Language API
- Amazon Comprehend
音声系API
- Google Cloud Speech-to-Text
- Amazon Transcribe
- Azure Speech Services
C.2 APIの基本的な使い方¶
C.2.1 REST APIの仕組み¶
多くの機械学習APIは REST API として提供されています。
graph LR
A[クライアント] -->|HTTPリクエスト| B[APIサーバ]
B -->|HTTPレスポンス| A
A --> A1[GET: データ取得]
A --> A2[POST: データ送信]
style A fill:#e6ccff
style B fill:#ccffcc
C.2.2 Python での API 呼び出し¶
Python の requests ライブラリを使って API を呼び出します。
import requests
# API エンドポイント
url = "https://api.example.com/predict"
# リクエストデータ
data = {
"text": "This is a sample text."
}
# ヘッダー(認証情報など)
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
# API 呼び出し
response = requests.post(url, json=data, headers=headers)
# レスポンスの確認
if response.status_code == 200:
result = response.json()
print(result)
else:
print(f"エラー: {response.status_code}")
C.2.3 APIキーの管理¶
APIキーの取り扱い
APIキーは秘密情報です。以下の点に注意してください。
- コードに直接書かない: 環境変数や設定ファイルを使用
- Gitにコミットしない:
.gitignoreに追加 - 公開しない: GitHubなどに公開しない
import os
# 環境変数から取得(推奨)
api_key = os.environ.get("API_KEY")
# または .env ファイルを使用
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("API_KEY")
C.3 画像APIの活用例¶
C.3.1 画像認識APIの概要¶
画像認識APIを使うと、以下のようなタスクが簡単に実現できます。
- 物体検出: 画像内の物体を検出・分類
- 顔検出: 顔の位置や表情を検出
- OCR: 画像内のテキストを抽出
- ラベル付け: 画像の内容を自動でタグ付け
C.3.2 画像分類APIの使用例¶
import requests
import base64
# 画像を Base64 エンコード
def encode_image(image_path):
with open(image_path, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
# 画像のエンコード
image_base64 = encode_image("sample.jpg")
# API リクエスト
url = "https://api.example.com/vision/classify"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"image": image_base64
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
# 結果の表示
for label in result["labels"]:
print(f"{label['name']}: {label['confidence']:.2%}")
C.3.3 顔検出APIの使用例¶
# 顔検出 API の呼び出し例
url = "https://api.example.com/vision/faces"
data = {
"image": image_base64,
"return_attributes": ["age", "emotion", "gender"]
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
# 検出された顔の情報を表示
for face in result["faces"]:
print(f"年齢: {face['age']}")
print(f"性別: {face['gender']}")
print(f"感情: {face['emotion']}")
print("---")
C.4 テキストAPIの活用例¶
C.4.1 テキスト分析APIの概要¶
テキスト分析APIを使うと、以下のようなタスクが実現できます。
- 感情分析: テキストのポジティブ/ネガティブを判定
- エンティティ抽出: 人名、地名、組織名などを抽出
- キーフレーズ抽出: 重要なフレーズを抽出
- 言語検出: テキストの言語を判定
- 要約: 長文を要約
C.4.2 感情分析APIの使用例¶
# 感情分析 API の呼び出し例
url = "https://api.example.com/text/sentiment"
data = {
"text": "この製品は素晴らしいです!大満足しています。"
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
print(f"感情: {result['sentiment']}")
print(f"ポジティブスコア: {result['positive_score']:.2%}")
print(f"ネガティブスコア: {result['negative_score']:.2%}")
C.4.3 大規模言語モデル(LLM)APIの使用例¶
OpenAI API などの LLM を使った例:
import openai
# クライアントの初期化
client = openai.OpenAI(api_key="YOUR_API_KEY")
# チャット形式での呼び出し
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "あなたは親切なアシスタントです。"},
{"role": "user", "content": "機械学習とは何ですか?簡潔に説明してください。"}
]
)
# 結果の表示
print(response.choices[0].message.content)
LLM API の活用
大規模言語モデル(LLM)APIは、以下のような用途に活用できます。
- 文章生成: レポート、メール、記事の自動生成
- 質問応答: チャットボット、FAQシステム
- 翻訳: 多言語翻訳
- 要約: 長文の要約
- コード生成: プログラムコードの生成・説明
C.4.4 ローカル LLM サーバ(LM Studio)の活用¶
本講義では、外部 API の代わりに 教員が運用する LM Studio サーバ を使って LLM 機能を試せます。第 12 回で Embedding を取得するために使った同じサーバの、別エンドポイント・別モデルを呼び出すだけで、チャット形式の応答が得られます。LM Studio の API は OpenAI 互換なので、エンドポイントの形も前述の OpenAI API とほぼ同じです。この呼び出しは、第 13 回のチャットアプリでもそのまま使います。
| 項目 | 内容 |
|---|---|
| サーバ URL | 授業でアナウンスされる URL(第 12 回と同じサーバ・https://~.trycloudflare.com) |
| チャットモデル | qwen/qwen3.5-9b(日本語に強い 9B モデル) |
| API エンドポイント | POST /v1/chat/completions (OpenAI 互換) |
import requests
LLM_URL = "https://xxxxxxxx.trycloudflare.com" # 授業でアナウンスされる URL に置き換える
CHAT_MODEL = "qwen/qwen3.5-9b"
response = requests.post(
f"{LLM_URL}/v1/chat/completions",
json={
"model": CHAT_MODEL,
"messages": [
{"role": "system", "content": "あなたは親切なアシスタントです。"},
{"role": "user", "content": "機械学習とは何ですか?簡潔に説明してください。"},
],
"stream": False,
},
)
result = response.json()
print(result["choices"][0]["message"]["content"])
OpenAI API と違って、API キー不要・課金なし・速い(LAN 内でレスポンス 1〜3 秒)のがメリットです。一方で、教員サーバが落ちると使えない・モデルが固定という制約はあります。
レスポンスの形が OpenAI と同じ
第 12 回の Embedding API では result["data"][0]["embedding"] からベクトルを取り出しましたが、チャットでは result["choices"][0]["message"]["content"] に応答本文が入ります。この choices 配列の形は、前述の OpenAI API のレスポンスとまったく同じです。
ローカル LLM と外部 API のどちらを使うか
- 学習・実験用途:ローカル LLM サーバ(無料、即時、再現性が高い)
- 本番運用:外部 API(高い可用性、最新モデル、サポート)
教育の場では、まずローカル LLM で「LLM API はこう叩く」を体感し、その後で OpenAI などの外部 API も同じ呼び出しパターンで使えることを学ぶのが効率的です。
感情分析プロンプトの例¶
LLM に「ポジティブかネガティブか」を判定させることもできます。チャット形式で指示するだけで分類器として動きます。
import requests
import json
LLM_URL = "https://xxxxxxxx.trycloudflare.com" # 授業でアナウンスされる URL に置き換える
CHAT_MODEL = "qwen/qwen3.5-9b"
# 出力させたい JSON の構造をスキーマで定義
SENTIMENT_SCHEMA = {
"type": "json_schema",
"json_schema": {
"name": "sentiment",
"strict": True,
"schema": {
"type": "object",
"properties": {
"label": {"type": "string", "enum": ["positive", "negative"]},
"confidence": {"type": "number"},
},
"required": ["label", "confidence"],
},
},
}
def classify_sentiment(text):
response = requests.post(
f"{LLM_URL}/v1/chat/completions",
json={
"model": CHAT_MODEL,
"messages": [
{
"role": "system",
"content": "あなたは日本語の感情分析モデルです。入力テキストが positive か negative かを判定してください。",
},
{"role": "user", "content": text},
],
"stream": False,
"response_format": SENTIMENT_SCHEMA,
},
)
return json.loads(response.json()["choices"][0]["message"]["content"])
result = classify_sentiment("この製品は素晴らしいです!大満足しています。")
print(result)
response_format に json_schema を指定すると、LM Studio がモデルの出力を指定した構造の JSON に強制してくれるので、機械的に扱えます。第 12 回のように事前に movie_reviews のベクトル化・分類器学習をしなくても、LLM のプロンプトだけで分類が成立するのが面白いところです。
C.5 APIの実践的な活用¶
C.5.1 エラーハンドリング¶
API 呼び出しではエラーが発生する可能性があるため、適切なエラーハンドリングが重要です。
import requests
from requests.exceptions import RequestException
# リトライ機能付き API 呼び出し
def call_api(url, data, headers, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.post(url, json=data, headers=headers, timeout=30)
response.raise_for_status() # HTTPエラーをチェック
return response.json()
except RequestException as e:
print(f"試行 {attempt + 1}/{max_retries} 失敗: {e}")
if attempt == max_retries - 1:
raise
return None
C.5.2 レート制限への対応¶
多くの API にはレート制限(一定時間内の呼び出し回数制限)があります。
import time
# レート制限を考慮した API 呼び出し
def call_api_with_rate_limit(items, api_func, calls_per_minute=60):
results = []
interval = 60.0 / calls_per_minute
for i, item in enumerate(items):
result = api_func(item)
results.append(result)
if i < len(items) - 1:
time.sleep(interval)
return results
C.5.3 バッチ処理¶
大量のデータを処理する場合は、バッチ処理が効率的です。
# バッチ処理
def batch_process(items, batch_size=10):
results = []
for i in range(0, len(items), batch_size):
batch = items[i:i + batch_size]
# バッチ単位で API 呼び出し
batch_results = call_api_batch(batch)
results.extend(batch_results)
return results
C.6 まとめ¶
本付録では、機械学習 API の活用方法について学びました。
付録 C のまとめ
API の利用パターン
- HTTP リクエスト/レスポンスでデータをやり取り(REST API)
- 外部 API(OpenAI など)と、本講義で運用するローカル LLM サーバ(LM Studio)の両方を経験
- LLM API は
messagesに役割(system / user)を入れて呼ぶのが共通パターン - LM Studio は OpenAI 互換 API なので、外部 API とほぼ同じ書き方で呼び出せる
ローカル LLM サーバ(LM Studio)
- 第 12 回で使った
bge-m3(embedding)と、チャット用のqwen/qwen3.5-9bが同じサーバに同居 - 学生側はライブラリインストール不要、
requestsで叩くだけ - 外部 API と違って課金がなく、レスポンスも速い
response_formatの JSON スキーマ指定で、出力を構造化データとして扱える
実践テクニック
- API キーは環境変数で管理し、コードやリポジトリに含めない
- エラーハンドリング(リトライ・タイムアウト)を適切に行う
- レート制限を考慮した呼び出し間隔・バッチ処理