T-CREATOR

Ollama とは?ローカル LLM を数分で動かす仕組みと強みを徹底解説

Ollama とは?ローカル LLM を数分で動かす仕組みと強みを徹底解説

大規模言語モデル(LLM)を使いたいけれど、API のコストやプライバシーが気になる。そんな悩みを解決してくれるのが Ollama です。 Ollama を使えば、わずか数分でローカル環境に LLM を構築でき、インターネット接続なしでも AI を活用できます。

この記事では、Ollama の仕組みから導入手順、実践的な活用方法まで、初心者の方にもわかりやすく解説していきます。

背景

AI 利用の課題とローカル LLM の必要性

近年、ChatGPT や Claude などのクラウド型 LLM が広く普及し、多くの開発者や企業が AI を活用するようになりました。 しかし、クラウド型 LLM には以下のような課題があります。

  • API 利用料が高額になる可能性がある
  • 機密情報をクラウドに送信することへのセキュリティ懸念
  • インターネット接続が必須であること
  • レスポンスタイムがネットワーク速度に依存すること

これらの課題を解決するため、ローカル環境で動作する LLM への注目が高まっています。 ローカル LLM なら、自分のマシン内で完結するため、プライバシーを保ちながらコストを抑えて AI を活用できるのです。

以下の図は、クラウド型 LLM とローカル LLM の違いを示しています。

mermaidflowchart TB
    subgraph cloud["クラウド型 LLM"]
        user1["ユーザー"] -->|API リクエスト| internet["インターネット"]
        internet -->|データ送信| api["クラウド API<br/>(ChatGPT など)"]
        api -->|レスポンス| internet
        internet -->|結果返却| user1
    end

    subgraph local["ローカル LLM"]
        user2["ユーザー"] -->|直接実行| ollama["Ollama<br/>(ローカル環境)"]
        ollama -->|即座に応答| user2
    end

    style cloud fill:#ffe6e6
    style local fill:#e6ffe6

図で理解できる要点

  • クラウド型はインターネット経由でデータを送信する必要がある
  • ローカル型は自分のマシン内で完結し、外部通信が不要
  • ローカル型の方が応答速度とプライバシー面で優位性がある

Ollama の登場

このようなニーズに応えるために登場したのが Ollama です。 Ollama は、ローカル環境で LLM を簡単に実行できるオープンソースツールで、Docker のように簡単にモデルを管理・実行できる点が特徴です。

課題

ローカル LLM 導入の従来の難しさ

ローカル LLM を動かすには、従来は以下のような複雑な手順が必要でした。

#課題項目詳細
1モデルファイルの入手Hugging Face などから適切なモデルを探し、数 GB のファイルをダウンロードする必要がある
2実行環境の構築Python 環境のセットアップ、CUDA ドライバのインストールなど専門知識が必要
3依存関係の解決PyTorch、Transformers などの複数のライブラリを正しいバージョンでインストールする必要がある
4モデルの読み込みメモリ管理や量子化の設定など、パフォーマンスチューニングが必要
5API の実装実用的に使うには REST API や WebSocket の実装が必要

これらのハードルが高く、多くの開発者がローカル LLM の導入を諦めてしまうケースが少なくありませんでした。

具体的な技術的課題

従来の方法では、以下のような技術的な問題に直面することが多くありました。

メモリ管理の問題 LLM は数 GB から数十 GB のメモリを消費するため、適切な量子化(モデルサイズの圧縮)を行わないと、一般的な PC では動作しません。 量子化の設定を誤ると、モデルが正常に動作しなかったり、精度が大幅に低下したりします。

GPU サポートの複雑さ GPU を活用するには、CUDA や ROCm などのドライバを正しくインストールし、PyTorch などのフレームワークが GPU を認識できるように設定する必要があります。 バージョンの不一致やドライバの問題が発生しやすく、トラブルシューティングに多くの時間がかかることがあります。

解決策

Ollama がもたらすシンプルさ

Ollama は、これらすべての複雑さを抽象化し、わずか数ステップでローカル LLM を動かせるようにします。 Docker のような「モデル管理システム」として機能し、以下の特徴を持っています。

#特徴説明
1ワンコマンド実行ollama run llama2 のような簡単なコマンドで即座にモデルが起動する
2自動ダウンロード必要なモデルファイルを自動的にダウンロードし、適切に配置する
3最適化済みGPU サポート、量子化、メモリ管理がすべて自動で最適化される
4REST API 内蔵ローカルサーバーとして動作し、HTTP API で簡単にアクセスできる
5モデル切り替え複数のモデルを簡単に切り替えて使用できる

以下の図は、Ollama の内部アーキテクチャを示しています。

mermaidflowchart TB
    user["開発者"] -->|ollama run コマンド| cli["Ollama CLI"]
    cli -->|モデル要求| engine["Ollama エンジン"]

    engine -->|初回のみ| download["モデルダウンロード<br/>(Ollama レジストリ)"]
    download -->|保存| cache["ローカルキャッシュ<br/>(~/.ollama/models)"]

    engine -->|読み込み| cache
    engine -->|最適化| optimizer["自動最適化<br/>(量子化・GPU 対応)"]
    optimizer -->|実行| llm["LLM 推論エンジン"]

    llm -->|応答生成| engine
    engine -->|結果返却| user

    engine -->|API 提供| api["REST API<br/>(localhost:11434)"]
    api -->|HTTP| app["アプリケーション"]

図で理解できる要点

  • CLI コマンドから REST API まで、すべてが統合されている
  • モデルは初回のみダウンロードされ、ローカルにキャッシュされる
  • 量子化や GPU 対応などの最適化が自動で行われる

Ollama のコア技術

Ollama が実現する「簡単さ」の裏側には、以下のような技術が使われています。

llama.cpp ベースの推論エンジン Ollama は、C++ で書かれた高速な推論エンジン「llama.cpp」をベースにしています。 これにより、CPU でも効率的に LLM を実行できるだけでなく、GPU がある場合は自動的に活用されます。

GGUF フォーマット モデルファイルは GGUF(GPT-Generated Unified Format)という効率的なフォーマットで保存されます。 このフォーマットは、量子化されたモデルを効率的に読み込み、メモリ使用量を大幅に削減できます。

モデルレジストリ Ollama は独自のモデルレジストリを持ち、Llama 2、Mistral、CodeLlama など、人気のあるオープンソース LLM を簡単にダウンロードできます。 Docker Hub のように、バージョン管理やタグ付けも可能です。

具体例

インストールと基本的な使い方

それでは、実際に Ollama をインストールして使ってみましょう。 以下では、macOS を例に説明しますが、Windows や Linux でも同様の手順で導入できます。

ステップ 1:Ollama のインストール

Ollama の公式サイトからインストーラーをダウンロードするか、Homebrew を使ってインストールします。

bash# Homebrew を使用する場合
brew install ollama

インストールが完了したら、バージョンを確認してみましょう。

bash# バージョン確認
ollama --version

正常にインストールされていれば、バージョン番号が表示されます(例:ollama version 0.1.17)。

ステップ 2:Ollama サービスの起動

Ollama をバックグラウンドで動作させるため、サービスを起動します。

bash# Ollama サービスの起動
ollama serve

このコマンドを実行すると、ローカルの localhost:11434 で REST API サーバーが起動します。 別のターミナルウィンドウを開いて、次のステップに進みましょう。

ステップ 3:モデルの実行

それでは、実際に LLM を動かしてみます。 ここでは、Meta が開発した Llama 2 の 7B パラメータモデルを使用します。

bash# Llama 2 モデルの起動
ollama run llama2

初回実行時は、モデルファイル(約 3.8GB)が自動的にダウンロードされます。 ダウンロードが完了すると、対話型のチャットインターフェースが起動します。

text>>> こんにちは!Ollama について教えてください

こんにちは!Ollama は、ローカル環境で大規模言語モデルを簡単に実行できる
オープンソースのツールです...

以下の図は、Ollama を使った対話フローを示しています。

mermaidsequenceDiagram
    participant User as ユーザー
    participant CLI as Ollama CLI
    participant Server as Ollama Server
    participant Model as LLM モデル

    User->>CLI: ollama run llama2
    CLI->>Server: モデル起動要求
    Server->>Model: モデル読み込み
    Model-->>Server: 準備完了
    Server-->>CLI: チャット開始
    CLI-->>User: プロンプト表示

    User->>CLI: メッセージ入力
    CLI->>Server: テキスト送信
    Server->>Model: 推論実行
    Model-->>Server: 応答生成
    Server-->>CLI: 結果返却
    CLI-->>User: 応答表示

REST API を使った活用方法

Ollama は REST API を提供しているため、独自のアプリケーションから簡単に LLM を利用できます。 以下では、Node.js を使った実装例を紹介します。

Node.js からの利用

まず、必要なパッケージをインストールします。

bash# プロジェクトの初期化
yarn init -y

# axios のインストール
yarn add axios

次に、Ollama API を呼び出すスクリプトを作成します。

javascript// ollama-client.js

// 必要なモジュールのインポート
const axios = require('axios');

// Ollama API のエンドポイント
const OLLAMA_API = 'http://localhost:11434/api/generate';

API リクエストを送信する関数を定義します。

javascript/**
 * Ollama にプロンプトを送信し、応答を取得する関数
 * @param {string} prompt - 送信するプロンプトテキスト
 * @param {string} model - 使用するモデル名(デフォルト: llama2)
 * @returns {Promise<string>} - モデルからの応答テキスト
 */
async function generateText(prompt, model = 'llama2') {
  try {
    // API リクエストの送信
    const response = await axios.post(OLLAMA_API, {
      model: model,
      prompt: prompt,
      stream: false, // ストリーミングを無効化
    });

    // 応答テキストの取得
    return response.data.response;
  } catch (error) {
    console.error('エラーが発生しました:', error.message);
    throw error;
  }
}

実際に関数を使用する例を示します。

javascript// メイン処理
async function main() {
  // プロンプトの定義
  const prompt =
    'JavaScript の非同期処理について、初心者向けに説明してください。';

  console.log('Ollama に問い合わせ中...\n');

  // テキスト生成の実行
  const result = await generateText(prompt);

  // 結果の表示
  console.log('【応答】');
  console.log(result);
}

// 実行
main();

このスクリプトを実行すると、Ollama 経由で LLM が応答を生成します。

bash# スクリプトの実行
node ollama-client.js

ストリーミング応答の実装

リアルタイムで応答を表示したい場合は、ストリーミングモードを使用します。

javascript// ollama-stream.js

const axios = require('axios');

/**
 * ストリーミングで応答を取得する関数
 * @param {string} prompt - 送信するプロンプトテキスト
 * @param {string} model - 使用するモデル名
 */
async function generateStream(prompt, model = 'llama2') {
  try {
    // ストリーミングリクエストの送信
    const response = await axios.post(
      'http://localhost:11434/api/generate',
      {
        model: model,
        prompt: prompt,
        stream: true, // ストリーミングを有効化
      },
      {
        responseType: 'stream', // レスポンスをストリームとして受信
      }
    );

    // ストリームデータの処理
    response.data.on('data', (chunk) => {
      const data = JSON.parse(chunk.toString());

      // トークンごとに出力(改行なし)
      process.stdout.write(data.response);
    });

    // ストリーム終了時の処理
    response.data.on('end', () => {
      console.log('\n\n応答完了');
    });
  } catch (error) {
    console.error('エラーが発生しました:', error.message);
    throw error;
  }
}

実行例を示します。

javascript// 実行
generateStream(
  'TypeScript の型システムの利点を 3 つ挙げてください。'
);

これにより、ChatGPT のようにリアルタイムで応答が表示されます。

複数モデルの管理

Ollama では、複数の LLM を簡単に切り替えて使用できます。 以下のコマンドで、利用可能なモデルを確認できます。

bash# インストール済みモデルの一覧表示
ollama list

新しいモデルをダウンロードして使用する例を示します。

bash# Mistral モデルのダウンロードと実行
ollama run mistral

# CodeLlama(コード生成特化)の実行
ollama run codellama

# Gemma(Google 製)の実行
ollama run gemma:2b

各モデルの特徴は以下の通りです。

#モデル名パラメータ数特徴推奨用途
1llama27B / 13B / 70B汎用的な会話と文章生成一般的な質問応答、文章作成
2mistral7B高性能で効率的チャットボット、要約
3codellama7B / 13B / 34Bコード生成に特化プログラミング支援、デバッグ
4gemma2B / 7B軽量で高速リソース制約のある環境
5llava7B / 13B画像理解が可能画像解析、キャプション生成

Docker との統合

Ollama は Docker コンテナとしても提供されており、クリーンな環境で実行できます。

Docker イメージの取得と実行

Docker で Ollama を実行する手順を示します。

bash# Ollama の Docker イメージを取得
docker pull ollama/ollama

コンテナを起動します。

bash# Ollama コンテナの起動(GPU サポートなし)
docker run -d \
  --name ollama \
  -p 11434:11434 \
  -v ollama:/root/.ollama \
  ollama/ollama

GPU サポートを有効にする場合は、以下のようにします。

bash# Ollama コンテナの起動(GPU サポートあり)
docker run -d \
  --gpus all \
  --name ollama \
  -p 11434:11434 \
  -v ollama:/root/.ollama \
  ollama/ollama

コンテナ内でモデルを実行します。

bash# コンテナ内で Llama 2 を実行
docker exec -it ollama ollama run llama2

Docker Compose での管理

複数のサービスと組み合わせる場合は、Docker Compose を使用すると便利です。

yaml# docker-compose.yml

version: '3.8'

services:
  # Ollama サービス
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - '11434:11434'
    volumes:
      - ollama_data:/root/.ollama
    restart: unless-stopped

アプリケーションサービスと組み合わせた例を示します。

yaml  # Node.js アプリケーション
  app:
    build: .
    container_name: my_app
    ports:
      - "3000:3000"
    environment:
      - OLLAMA_URL=http://ollama:11434
    depends_on:
      - ollama
    restart: unless-stopped

volumes:
  ollama_data:

起動と停止のコマンドは以下の通りです。

bash# すべてのサービスを起動
docker-compose up -d

# ログの確認
docker-compose logs -f ollama

# 停止
docker-compose down

パフォーマンスチューニング

Ollama のパフォーマンスを最適化するためのテクニックを紹介します。

量子化レベルの選択

モデルには異なる量子化レベルがあり、メモリ使用量と精度のトレードオフを調整できます。

#量子化レベルメモリ使用量精度推奨環境
1Q4_0約 4GBやや低いメモリが少ない PC
2Q5_0約 5GB中程度バランス重視
3Q8_0約 8GB高いメモリに余裕がある場合
4F16約 14GB最高GPU 搭載マシン

特定の量子化レベルを指定して実行する例を示します。

bash# Q4 量子化モデルの実行
ollama run llama2:7b-chat-q4_0

# Q8 量子化モデルの実行
ollama run llama2:7b-chat-q8_0

コンテキストウィンドウの調整

コンテキストウィンドウ(処理できるトークン数)を調整することで、メモリ使用量を制御できます。

bash# コンテキストサイズを 2048 トークンに設定
ollama run llama2 --ctx-size 2048

API 経由で設定する場合は、以下のようにします。

javascript// コンテキストサイズを指定した API リクエスト
const response = await axios.post(
  'http://localhost:11434/api/generate',
  {
    model: 'llama2',
    prompt: 'あなたのプロンプト',
    options: {
      num_ctx: 2048, // コンテキストサイズ
      temperature: 0.7, // ランダム性
      top_p: 0.9, // サンプリング範囲
    },
  }
);

エラー処理とトラブルシューティング

Ollama の使用中に発生する可能性のあるエラーと、その解決方法を紹介します。

エラー 1:モデルのダウンロード失敗

エラーコード: Error: failed to download model

textError: failed to download model llama2
caused by: failed to fetch manifest: connection timeout

発生条件

  • ネットワーク接続が不安定
  • ファイアウォールやプロキシが通信をブロックしている

解決方法

  1. ネットワーク接続を確認する
  2. プロキシ設定を環境変数で指定する
bash# プロキシ設定
export HTTP_PROXY=http://your-proxy:port
export HTTPS_PROXY=http://your-proxy:port

# 再度ダウンロードを試行
ollama pull llama2
  1. 手動でモデルをダウンロードして配置する(Ollama 公式サイトから)

エラー 2:メモリ不足

エラーコード: Error: out of memory

textError: failed to load model
caused by: out of memory: cannot allocate 8.5 GB

発生条件

  • システムメモリが不足している
  • 大きなモデルを実行しようとしている

解決方法

  1. より小さいモデルや量子化レベルを使用する
bash# 7B モデルの代わりに 2B モデルを使用
ollama run gemma:2b

# より低い量子化レベルを使用
ollama run llama2:7b-chat-q4_0
  1. コンテキストサイズを減らす
bash# コンテキストサイズを削減
ollama run llama2 --ctx-size 1024
  1. 不要なアプリケーションを終了してメモリを解放する

エラー 3:API 接続エラー

エラーコード: Error: connect ECONNREFUSED

textError: connect ECONNREFUSED 127.0.0.1:11434
    at TCPConnectWrap.afterConnect [as oncomplete]

発生条件

  • Ollama サービスが起動していない
  • ポートが既に使用されている

解決方法

  1. Ollama サービスの状態を確認する
bash# プロセスの確認
ps aux | grep ollama
  1. サービスを起動する
bash# Ollama サービスの起動
ollama serve
  1. ポートが使用中の場合は、別のポートを指定する
bash# 環境変数でポートを変更
export OLLAMA_HOST=0.0.0.0:11435
ollama serve

実践的な統合例:チャットボットの構築

最後に、Ollama を使った実践的なチャットボットアプリケーションを作成します。 Express.js を使った Web API として実装します。

プロジェクトのセットアップ

必要なパッケージをインストールします。

bash# プロジェクトディレクトリの作成
mkdir ollama-chatbot
cd ollama-chatbot

# package.json の作成
yarn init -y

# 依存関係のインストール
yarn add express axios cors dotenv
yarn add -D nodemon

環境変数を設定します。

bash# .env ファイルの作成
touch .env
text# .env

# Ollama API のエンドポイント
OLLAMA_URL=http://localhost:11434

# 使用するモデル
OLLAMA_MODEL=llama2

# サーバーポート
PORT=3000

サーバーの実装

Express サーバーを作成します。

javascript// server.js

// 必要なモジュールのインポート
const express = require('express');
const axios = require('axios');
const cors = require('cors');
require('dotenv').config();

// Express アプリの初期化
const app = express();
const PORT = process.env.PORT || 3000;

ミドルウェアの設定を行います。

javascript// ミドルウェアの設定
app.use(cors()); // CORS を有効化
app.use(express.json()); // JSON リクエストを解析

チャット API のエンドポイントを実装します。

javascript/**
 * チャット API エンドポイント
 * POST /api/chat
 * リクエストボディ: { message: string }
 */
app.post('/api/chat', async (req, res) => {
  try {
    // リクエストからメッセージを取得
    const { message } = req.body;

    // バリデーション
    if (!message || typeof message !== 'string') {
      return res.status(400).json({
        error: 'メッセージが必要です',
      });
    }

    // Ollama API にリクエストを送信
    const response = await axios.post(
      `${process.env.OLLAMA_URL}/api/generate`,
      {
        model: process.env.OLLAMA_MODEL,
        prompt: message,
        stream: false,
      }
    );

    // 応答を返す
    res.json({
      message: response.data.response,
      model: process.env.OLLAMA_MODEL,
    });
  } catch (error) {
    console.error('エラー:', error.message);
    res.status(500).json({
      error: 'サーバーエラーが発生しました',
    });
  }
});

サーバーを起動します。

javascript// サーバーの起動
app.listen(PORT, () => {
  console.log(
    `サーバーが起動しました: http://localhost:${PORT}`
  );
  console.log(`使用モデル: ${process.env.OLLAMA_MODEL}`);
});

package.json にスクリプトを追加します。

json{
  "name": "ollama-chatbot",
  "version": "1.0.0",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  }
}

開発サーバーを起動します。

bash# 開発モードで起動
yarn dev

API のテスト

curl コマンドでテストしてみましょう。

bash# チャット API のテスト
curl -X POST http://localhost:3000/api/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "JavaScript のクロージャについて簡単に説明してください"}'

正常に動作すると、以下のような JSON レスポンスが返されます。

json{
  "message": "クロージャは、関数が定義されたスコープの変数にアクセスできる機能です...",
  "model": "llama2"
}

まとめ

Ollama は、ローカル環境で LLM を簡単に実行できる画期的なツールです。 クラウド API に依存せず、プライバシーを保ちながら、コストを抑えて AI を活用できます。

この記事で紹介した内容をまとめます。

Ollama の主な特徴

  • わずか数分でローカル LLM を構築可能
  • Docker のようなシンプルなコマンド体系
  • GPU サポートと自動最適化
  • REST API による柔軟な統合

実用的な活用方法

  • CLI による対話型チャット
  • Node.js アプリケーションとの統合
  • Docker による環境分離
  • カスタムチャットボットの構築

パフォーマンスチューニング

  • 量子化レベルの選択
  • コンテキストサイズの調整
  • メモリ管理の最適化

Ollama を使えば、開発環境やプロダクションで、プライバシーを守りながら強力な AI 機能を実装できます。 まずは小さなモデルから試して、徐々に用途に合わせた最適化を行ってみてください。

関連リンク