ローカルLLMをAPI化する方法|vLLM・FastAPIで自社AIサーバーを構築

kento_morota 14分で読めます

ローカルLLMをチーム全体や社内システムから利用するには、APIサーバーとして提供する仕組みが必要です。個人のPCで動かすだけでなく、APIとして公開することで、Webアプリケーション、チャットボット、業務システムなど多様なサービスからAIの機能を呼び出せるようになります。

本記事では、ローカルLLMをAPIサーバーとして構築する方法を、Ollama、vLLM、FastAPIの3つのアプローチで解説します。OpenAI APIと互換性のある形で構築すれば、既存のツールやライブラリをそのまま活用できます。

ローカルLLMをAPI化するメリット

ローカルLLMをAPI化することで得られるメリットは多岐にわたります。

複数ユーザー・複数システムからの利用

APIサーバーとして構築すれば、社内の複数のユーザーや業務システムから同時にAIを利用できます。チャットボット、文書要約、コーディング支援など、さまざまな用途で1つのサーバーを共有できます。

OpenAI API互換でエコシステムを活用

OpenAI APIと同じインターフェースで構築すれば、LangChain、LlamaIndex、各種チャットUIなど、OpenAI API対応のツールやライブラリがそのまま使えます。エンドポイントURLを変更するだけで、クラウドからローカルに切り替えることも可能です。

セキュリティとコストの両立

データを社外に出さないセキュリティを確保しながら、クラウドAPI利用料の削減も実現できます。特に利用頻度が高い場合、ローカルAPIサーバーのコストパフォーマンスは非常に高くなります。

方法1:OllamaでのAPIサーバー構築(初心者向け)

最も手軽にローカルLLMをAPI化する方法は、Ollamaを使う方法です。インストールするだけで自動的にAPIサーバーが起動します。

セットアップ手順

# Ollamaのインストール
curl -fsSL https://ollama.com/install.sh | sh

# モデルのダウンロード
ollama pull llama4-scout:8b
ollama pull qwen3:8b

# APIサーバーは自動で起動(デフォルト: localhost:11434)
# 確認
curl http://localhost:11434/api/tags

社内ネットワークからアクセス可能にする

デフォルトではlocalhostのみからアクセス可能です。社内の他のPCからアクセスできるようにするには、環境変数を設定します。

# /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"

# 設定を反映
sudo systemctl daemon-reload
sudo systemctl restart ollama

OpenAI互換APIの利用

Ollamaは/v1/chat/completionsエンドポイントでOpenAI互換APIを提供します。

# OpenAI互換APIでのリクエスト
curl http://192.168.1.100:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3:8b",
    "messages": [
      {"role": "system", "content": "あなたは親切なアシスタントです"},
      {"role": "user", "content": "中小企業のDX推進のポイントを教えてください"}
    ]
  }'

PythonのOpenAIライブラリからも利用できます。

from openai import OpenAI

client = OpenAI(
    base_url="http://192.168.1.100:11434/v1",
    api_key="dummy"  # Ollamaでは不要だがライブラリの仕様上必要
)

response = client.chat.completions.create(
    model="qwen3:8b",
    messages=[
        {"role": "system", "content": "あなたは親切なアシスタントです"},
        {"role": "user", "content": "売上データの分析方法を教えてください"}
    ]
)
print(response.choices[0].message.content)

方法2:vLLMでの高性能APIサーバー構築(本格運用向け)

vLLMは、高スループット・低レイテンシでのLLM推論に特化したサーバーエンジンです。複数リクエストの同時処理に優れており、本格的な業務利用に適しています。

vLLMの特徴

  • PagedAttention:GPUメモリを効率的に管理し、同時処理能力を向上
  • Continuous Batching:複数リクエストを動的にバッチ処理
  • OpenAI互換API:標準で対応
  • 高いスループット:Ollamaの数倍の同時処理性能

インストールとセットアップ

# vLLMのインストール(CUDA環境が必要)
pip install vllm

# APIサーバーの起動
vllm serve meta-llama/Llama-4-Scout-8B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --max-model-len 4096 \
  --gpu-memory-utilization 0.9 \
  --dtype auto

量子化モデルの利用

量子化モデルを使用することで、限られたGPUメモリでも大きなモデルを動かせます。

# AWQ量子化モデルでの起動
vllm serve TheBloke/Llama-4-Scout-8B-Instruct-AWQ \
  --host 0.0.0.0 \
  --port 8000 \
  --quantization awq \
  --max-model-len 4096

vLLM APIへのアクセス

# curlでのリクエスト
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "meta-llama/Llama-4-Scout-8B-Instruct",
    "messages": [
      {"role": "user", "content": "Pythonで簡単なWebスクレイピングの例を示してください"}
    ],
    "temperature": 0.7,
    "max_tokens": 1024
  }'

方法3:FastAPIでカスタムAPIサーバーを構築

独自のビジネスロジックや認証機能を組み込みたい場合は、FastAPIを使ってカスタムAPIサーバーを構築する方法が最適です。

基本的な構成

from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from pydantic import BaseModel
from openai import OpenAI
import uvicorn

app = FastAPI(title="社内AIサーバー")
security = HTTPBearer()

# Ollamaをバックエンドとして使用
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="dummy"
)

# リクエスト/レスポンスモデル
class ChatRequest(BaseModel):
    message: str
    model: str = "qwen3:8b"
    max_tokens: int = 1024

class ChatResponse(BaseModel):
    response: str
    model: str
    usage: dict

# 簡易認証
API_KEYS = {"team-a-key-xxx", "team-b-key-yyy"}

def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)):
    if credentials.credentials not in API_KEYS:
        raise HTTPException(status_code=401, detail="Invalid API Key")
    return credentials.credentials

@app.post("/api/chat", response_model=ChatResponse)
async def chat(request: ChatRequest, token: str = Depends(verify_token)):
    try:
        response = client.chat.completions.create(
            model=request.model,
            messages=[
                {"role": "system", "content": "あなたは社内アシスタントです。丁寧に回答してください。"},
                {"role": "user", "content": request.message}
            ],
            max_tokens=request.max_tokens,
        )
        return ChatResponse(
            response=response.choices[0].message.content,
            model=request.model,
            usage={
                "prompt_tokens": response.usage.prompt_tokens,
                "completion_tokens": response.usage.completion_tokens,
            }
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8080)

FastAPIカスタムサーバーのメリット

  • 認証・認可:APIキーやJWTトークンによるアクセス制御
  • ログ記録:利用状況の記録、監査ログの出力
  • レート制限:リクエスト数の制限による負荷管理
  • プロンプト管理:業務ごとのシステムプロンプトを一元管理
  • 前後処理:入力のバリデーションや出力のフォーマット加工

3つの方法の比較と選び方

用途や技術レベルに応じて最適な方法を選びましょう。

比較項目 Ollama vLLM FastAPI + Ollama
難易度 中〜高
セットアップ 5分 30分〜 1時間〜
同時処理性能 低〜中 バックエンド依存
カスタマイズ性
認証機能 なし 基本的 自由に実装可能
適した規模 個人〜小チーム チーム〜部門 部門〜全社
GPU要件 CPU可 NVIDIA GPU必須 バックエンド依存

おすすめの選び方:

  • まず試したい:Ollamaでスタート
  • 高負荷な本番利用:vLLMを導入
  • 独自のビジネスロジックが必要:FastAPIでカスタム構築

本番運用のためのベストプラクティス

APIサーバーを本番環境で安定して運用するためのポイントを解説します。

Docker化による環境管理

Docker(docker-compose)を使って環境を管理することで、セットアップの再現性と運用の安定性が向上します。

# docker-compose.yml
version: "3.8"
services:
  ollama:
    image: ollama/ollama:latest
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    restart: always

  webui:
    image: ghcr.io/open-webui/open-webui:main
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    depends_on:
      - ollama
    restart: always

volumes:
  ollama_data:

リバースプロキシの設定

Nginxをリバースプロキシとして配置することで、SSL対応やアクセス制限を追加できます。

# /etc/nginx/conf.d/llm-api.conf
server {
    listen 443 ssl;
    server_name llm.internal.example.com;

    ssl_certificate /etc/ssl/certs/internal.pem;
    ssl_certificate_key /etc/ssl/private/internal.key;

    # IPアドレスによるアクセス制限
    allow 192.168.1.0/24;
    deny all;

    location /v1/ {
        proxy_pass http://localhost:11434/v1/;
        proxy_set_header Host $host;
        proxy_read_timeout 300s;
    }
}

モニタリングとアラート

安定運用のために、以下の項目を監視しましょう。

  • GPU使用率・VRAM使用量:nvidia-smiで確認
  • レスポンスタイム:異常に遅い場合はモデルサイズや同時接続数を見直し
  • エラー率:OOMエラーやタイムアウトの発生頻度
  • ディスク容量:モデルファイルとログの肥大化に注意
# GPU状態の継続的な監視
watch -n 1 nvidia-smi

# Ollamaのログ確認
journalctl -u ollama -f

既存システムとの連携例

構築したAPIサーバーを既存の業務システムと連携させる例を紹介します。

RAGシステムとの統合

RAG(検索拡張生成)と組み合わせることで、社内文書をベースにした質問応答システムを構築できます。LangChainを使えば、ローカルAPIサーバーとベクトルデータベースを簡単に統合できます。

Slack・Teams連携

SlackやMicrosoft TeamsのBotとしてAPIを呼び出すことで、チャットツール上からAIを利用できる環境を構築できます。FAQ対応ボットとして活用すれば、社内の問い合わせ対応コストを削減できます。

バッチ処理での活用

議事録の要約や定型文書の生成など、定期的に実行するバッチ処理にもAPIサーバーは最適です。cronジョブからAPIを呼び出すスクリプトを設定すれば、自動化が完了します。

まとめ:ローカルLLMをAPIで組織全体に展開する

ローカルLLMをAPIサーバー化することで、個人の利用から組織全体での活用へとステップアップできます。

本記事のポイント:

  • Ollamaは最も手軽にAPI化できる方法(初心者におすすめ)
  • vLLMは高スループットの本番運用に最適
  • FastAPIを使えば認証やビジネスロジックを自由に組み込める
  • OpenAI互換APIで既存のツール・ライブラリをそのまま活用可能
  • Docker化、リバースプロキシ、モニタリングで安定運用を実現

まずはOllamaのセットアップから始めて、社内LANでのAPI公開を試してみましょう。利用が拡大してきたらvLLMやFastAPIへの移行を検討してください。パフォーマンス最適化セキュリティ対策も忘れずに行い、安全で快適な自社AIサーバーを実現しましょう。

#API#vLLM#ローカルLLM
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

AI活用のヒントをお探しですか?お気軽にご相談ください。

まずは話だけ聞いてもらう