Skip to content

付録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)
Output
{'label': 'positive', 'confidence': 0.98}

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 キーは環境変数で管理し、コードやリポジトリに含めない
  • エラーハンドリング(リトライ・タイムアウト)を適切に行う
  • レート制限を考慮した呼び出し間隔・バッチ処理