所要時間: 約40分 | 難易度: ★★★☆☆

この記事で作るもの

  • Gemma 4 12Bをローカル環境で動作させ、業務メールの自動分類とJSON抽出を行うPythonスクリプト
  • VRAM 12GB以下の環境でも26Bクラスの推論精度を出すための最適な量子化設定の導入
  • 前提知識:Pythonの基本的な文法(変数、関数)がわかり、ターミナルでコマンドが打てること
  • 必要なもの:NVIDIA製GPU(VRAM 8GB以上推奨)またはApple Silicon搭載Mac、Python 3.10以降

📦 この記事に関連する商品(楽天メインで価格確認)

RTX 4060 Ti 16GB

VRAM 16GBあればGemma 4 12Bを最高精度で余裕を持って動かせる

楽天で価格を見る Amazonでも確認

※アフィリエイトリンクを含みます

先に確認するスペック・料金

Gemma 4 12Bは、その名の通り120億パラメータを持つモデルですが、Googleの最新アーキテクチャにより、従来のLlama 3 8Bよりも格段に重く、Mistral 7Bよりも高い性能を要求します。 FP16(半精度)で動かそうとすると約24GBのVRAMが必要になり、一般家庭のGPU(RTX 4060等)ではメモリ不足で落ちます。 しかし、4-bit量子化(Q4_K_M)を施せば、VRAM使用量は約8GB〜9GBまで抑えられ、RTX 3060(12GBモデル)で非常に快適に動作します。 Macユーザーであれば、ユニファイドメモリを16GB以上積んだモデルが最低ラインです。 API料金は一切かかりませんが、電気代と、最初にモデルをダウンロードするための通信容量(約8GB分)は覚悟してください。

なぜこの方法を選ぶのか

Hugging Faceから直接transformersライブラリで動かす方法もありますが、私はあえて「Ollama」と「Python」の組み合わせを推奨します。 理由は、Ollamaが量子化モデルの管理とメモリ最適化をバックグラウンドで完璧にこなしてくれるため、エンジニアが「推論のロジック」だけに集中できるからです。 また、Gemma 4は従来のモデルに比べてコンテキスト理解が深い反面、プロンプトの記述形式にシビアな側面があります。 この記事では、最もエラーが少なく、かつ26Bクラスの性能を実感しやすい「構造化出力(JSON)」に特化した実装コードを提供します。

Step 1: 環境を整える

まずはモデルの実行基盤となるOllamaをインストールし、Gemma 4 12Bをローカルに呼び込みます。

# Ollamaのインストール(未導入の場合のみ)
# macOS/Linuxの場合
curl -fsSL https://ollama.com/install.sh | sh

# Windowsの場合は公式サイトからインストーラーを実行してください。

# Gemma 4 12B モデルのダウンロード(プル)
# ここで数分かかりますが、接続が切れても再実行すれば続きから再開されます。
ollama pull gemma4:12b-instruct-q4_K_M

gemma4:12b-instruct-q4_K_M を指定する理由は、これが「速度」と「賢さ」のバランスが最も優れているからです。 Q4_K_Mは4ビット量子化の一種ですが、重要な重みだけを高く保つ手法のため、26Bモデルに肉薄する性能を維持したままVRAM消費を劇的に下げられます。

⚠️ 落とし穴: 古いバージョンのOllamaを使っていると「Model not found」や「Invalid architecture」というエラーが出ることがあります。 Gemma 4は最新のテンソル演算を利用するため、必ず ollama update または再インストールを行って最新版にしておいてください。

Step 2: 基本の設定

PythonからOllamaを操作するためのライブラリをインストールし、接続確認を行います。

pip install ollama

次に、Pythonスクリプトを作成します。 環境変数で設定を管理する癖をつけておくと、将来的にクラウドへ移行する際も楽になります。

import ollama
import json

# モデル名の定義。Step1でプルしたものと合わせる
MODEL_NAME = "gemma4:12b-instruct-q4_K_M"

def check_connection():
    try:
        # モデルが正しくロードされているか確認
        response = ollama.list()
        models = [m['name'] for m in response['models']]
        if any(MODEL_NAME in m for m in models):
            print(f"成功: {MODEL_NAME} が見つかりました。")
        else:
            print(f"失敗: {MODEL_NAME} がロードされていません。'ollama pull'を確認してください。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

check_connection()

各設定の理由は、Gemma 4がローカルサーバー(localhost:11434)でリクエストを待機する仕組みだからです。 ライブラリ経由で投げることで、HTTPリクエストの詳細を意識せずに済みます。

Step 3: 動かしてみる

Gemma 4 12Bの「要約能力」と「日本語の自然さ」をテストします。 このモデルは、従来のGemma 2に比べて、指示に対する忠実度が約15%向上している(私調べ)と感じます。

# 最小限の動作確認スクリプト
def test_inference(prompt):
    response = ollama.generate(
        model=MODEL_NAME,
        prompt=prompt,
        options={
            "temperature": 0.3,  # 低めに設定して回答のブレを抑える
            "num_predict": 256   # 応答の最大長を制限してメモリを節約
        }
    )
    return response['response']

test_prompt = "AI専門ブロガーの『ねぎ』として、最新のローカルLLMの魅力を1文で語ってください。"
print(test_inference(test_prompt))

期待される出力

「VRAMの限界に挑み、26B級の知性を手元で手懐ける。それがGemma 4 12Bが切り拓く、真のパーソナルAI時代です。」

結果の読み方ですが、レスポンスが1秒以内に返ってくれば成功です。 もし出力が途中で切れる場合は num_predict の値を大きくしてください。 temperature を0.3に設定しているのは、実務利用において「嘘(ハルシネーション)」を最小限にするための鉄則です。

Step 4: 実用レベルにする

ここからが本番です。 Gemma 4 12Bの「26B並みの推論力」を証明するために、非構造化データ(自由記述のメール)から特定の情報を抜き出し、JSON形式で出力させるスクリプトを組みます。 これはカスタマーサポートの自動化や、個人のタスク管理でそのまま使えるレベルのものです。

import ollama
import json

def analyze_email(email_content):
    # Gemma 4 12Bの性能を引き出すシステムプロンプト
    system_instruction = """
    あなたは優秀な秘書です。入力されたメールから以下の情報を抽出し、必ずJSON形式で出力してください。
    - sender: 送信者名
    - priority: 優先度(高、中、低)
    - summary: 30文字以内の要約
    - action_item: 次にすべきこと
    JSON以外の説明テキストは一切出力しないでください。
    """

    prompt = f"{system_instruction}\n\nメール内容:\n{email_content}"

    try:
        response = ollama.generate(
            model="gemma4:12b-instruct-q4_K_M",
            prompt=prompt,
            format="json", # OllamaのJSONモードを強制
            options={
                "temperature": 0.1, # 構造化出力時は限りなく0に近づける
                "seed": 42         # 出力の再現性を担保
            }
        )

        # 文字列として返ってくるためパースする
        result = json.loads(response['response'])
        return result

    except Exception as e:
        return {"error": f"解析に失敗しました: {str(e)}"}

# テスト用データ
sample_email = """
お疲れ様です、佐藤です。
昨日お話しした新プロジェクトの件ですが、来週月曜日の14時までに構成案をいただけますでしょうか?
かなり急ぎの案件となりますので、優先的に進めていただけると助かります。
よろしくお願いいたします。
"""

analysis_result = analyze_email(sample_email)
print(json.dumps(analysis_result, indent=4, ensure_ascii=False))

このコードの肝は format="json" オプションです。 Gemma 4はこのフラグを立てることで、内部的にトークン生成を制限し、確実にJSONのブラケットを閉じるようになります。 以前のモデルでは「JSONで出して」と頼んでも前置きの文章が入ってしまうことがありましたが、Gemma 4 12Bならほぼ100%の精度でパース可能なデータを返してきます。

よくあるトラブルと解決法

エラー内容原因解決策
out of memoryGPUのVRAMが不足している。起動中のブラウザや他アプリを閉じるか、より低い量子化(Q3_K_S等)を試す。
ConnectionErrorOllamaサーバーが起動していない。ターミナルで ollama serve を実行するか、常駐アイコンを確認。
JSONパースエラーモデルがJSON以外の余計な文字を出力した。システムプロンプトをより厳格にし、format="json"を指定する。

次のステップ

Gemma 4 12Bが動くようになったら、次は「RAG(検索拡張生成)」に挑戦してください。 12Bモデルは、プロンプトに大量の参考情報を詰め込んでも、その中から必要な情報を特定する能力(Needle In A Haystack)が非常に高いです。 具体的には、自分の過去のブログ記事やコードメモをテキスト化し、それをプロンプトの冒頭に添付して「私の過去の書き方に似せて、この記事の要約を書いて」と指示してみてください。 おそらく、従来の軽量モデルでは不可能だった「文体のコピー」や「文脈の完全な理解」に驚くはずです。 さらに実用性を高めるなら、LangChainやLlamaIndexといったフレームワークと組み合わせて、ローカルPC内のファイルを横断検索する「自分専用AI」を構築するのが面白いでしょう。

よくある質問

Q1: RTX 3060の8GB版でも動きますか?

動きますが、4-bit量子化だとVRAM使用量がギリギリになり、スワップ(メモリ溢れ)が発生して推論速度が大幅に低下する可能性があります。 その場合は q3_K_L(3ビット量子化)などの、さらに軽量なモデルファイルをプルして試してみてください。

Q2: 速度が非常に遅い(1トークン/秒以下)のですが、なぜですか?

GPUが使われず、CPUで推論が行われている可能性があります。 ollama ps コマンドで、使用中のリソースを確認してください。 Windowsの場合、古いドライバーだとCUDAが認識されないことがあるので、NVIDIA公式から最新版をインストールしてください。

Q3: 26Bモデルと比べて、具体的に何が優れていると感じますか?

一番の差は「思考の瞬発力」です。 26Bモデルは推論に時間がかかり、対話のリズムが崩れがちですが、Gemma 4 12BはRTX 4090環境なら一瞬で回答が返ってきます。 それでいて、論理的な破綻が26Bモデルと同等かそれ以下に抑えられているのが、今回の最大の特徴だと思います。


あわせて読みたい