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

この記事で作るもの

  • OllamaとPythonを組み合わせて、ローカル環境で動作する「機密情報漏洩を防ぐためのセキュアな自動議事録要約ツール」
  • 前提知識:Pythonの基本的な読み書きができること、ターミナル(コマンドプロンプト)の操作に抵抗がないこと
  • 必要なもの:NVIDIA製GPU(VRAM 12GB以上推奨)を搭載したPC、またはApple Silicon(メモリ24GB以上推奨)を搭載したMac

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

RTX 4060 Ti 16GB

VRAM 16GBでローカルLLM入門に最も現実的なコストパフォーマンス

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

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

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

2026年を見据えた今、ローカルLLMを動かすためのハードウェア選びは「VRAM(ビデオメモリ)量」がすべてです。 NVIDIAのRTX 4090(24GB)は依然として個人向けの最高峰ですが、1枚で約30万円という価格は決して安くありません。 一方、Mac StudioなどのApple Silicon搭載機は、メインメモリをVRAMとして共有できるため、128GB以上の巨大なモデルを動かすにはコストパフォーマンスで逆転します。

結論として、7B〜14Bクラスのモデルを爆速で回して開発効率を上げたいならNVIDIA(RTX 4070 Ti Super 16GB以上)、70B以上の巨大モデルを低速でもいいから動かしたいならMac(メモリ64GB以上)を選んでください。 中古のRTX 3090(24GB)を10万円台で拾うのも、実務家としては賢い選択肢です。 API費用は0円ですが、電気代が月数百円〜数千円上乗せされる点は覚悟しておきましょう。

なぜこの方法を選ぶのか

ローカルLLMを動かす手段はllama.cppやLM Studioなど多岐にわたりますが、私は「Ollama」を推奨します。 理由は、バックエンドが高度に最適化されており、NVIDIAならCUDA、MacならMetalを自動で判別して最適な推論エンジンを選択してくれるからです。 自力でビルドする苦労から解放され、私たちは「AIを使って何を作るか」という本質的な作業に時間を割けます。

また、ライブラリが豊富なPythonからAPI経由で操作することで、将来的にモデルをLlama 3からLlama 4やQwen 3へ入れ替える際も、コードを一行書き換えるだけで対応できる汎用性が手に入ります。

Step 1: 環境を整える

まずは推論エンジンとなるOllamaをインストールし、2026年現在でも標準的な軽量モデルであるLlama 3.1(8B)をセットアップします。

# Ollamaのインストール(公式サイトからダウンロードして実行)
# https://ollama.com/

# ターミナルでモデルをプルする
ollama pull llama3.1:8b

このコマンドは「Llama 3.1の8B(80億パラメータ)モデル」をローカルにダウンロードしています。 8Bモデルは約5GBのディスク容量を消費し、実行には最低でも8GBのVRAM(またはシステムメモリ)を必要とします。 16GB以上のVRAMがあるなら、より高精度な「ollama pull llama3.1:70b」の量子化版を検討しても良いですが、まずは動作確認のために8Bで進めましょう。

⚠️ 落とし穴: NVIDIA環境で「GPUが認識されない」というトラブルの9割は、ドライバのバージョンが古いか、WSL2(Windowsの場合)の設定ミスです。 nvidia-smi コマンドでGPUが認識されているか必ず確認してください。

Step 2: 基本の設定

PythonからOllamaを操作するためのライブラリをインストールし、スクリプトの土台を作ります。

pip install ollama

次に、エディタを開いて summarizer.py を作成し、以下の設定を記述してください。

import ollama
import os

# 使用するモデルの定義
# 2026年でも通用する軽量かつ高性能なモデルを指定します
MODEL_NAME = "llama3.1:8b"

def check_model_exists(model_name):
    """
    指定したモデルがローカルに存在するか確認する
    存在しない場合に自動でプルすることでエラーを未然に防ぎます
    """
    local_models = ollama.list()
    if not any(model['name'] == model_name for model in local_models['models']):
        print(f"モデル {model_name} をダウンロード中...")
        ollama.pull(model_name)

check_model_exists(MODEL_NAME)

「なぜこの設定にするのか」という点ですが、ローカルLLMの運用で最も多いエラーは「モデルが見つからない」ことによるクラッシュです。 スクリプトの冒頭で ollama.list() をチェックする処理を入れることで、配布時や環境移行時のトラブルをゼロにできます。

Step 3: 動かしてみる

まずは最小限のコードで、テキストをLLMに投げてレスポンスを得る処理を書きます。

def generate_summary(text):
    response = ollama.chat(model=MODEL_NAME, messages=[
        {
            'role': 'system',
            'content': 'あなたは優秀な秘書です。入力された議事録を簡潔な箇条書きで要約してください。'
        },
        {
            'role': 'user',
            'content': text,
        },
    ])
    return response['message']['content']

# テスト実行
test_text = "本日の会議では、次世代GPUの導入計画について議論されました。予算は500万円で、来月までに選定を終える予定です。"
print(generate_summary(test_text))

期待される出力

・次世代GPU導入計画の議論
・予算は500万円
・来月までに機種選定を完了予定

結果が返ってくるまでに、RTX 4090なら1秒未満、Apple M2/M3 Maxなら1〜2秒程度かかるはずです。 もし30秒以上かかる場合は、GPUではなくCPUで推論が動いてしまっている可能性があります。

Step 4: 実用レベルにする

実務では、長い文章を一度に投げるとLLMの「コンテキストウィンドウ(記憶容量)」を超えてしまい、精度が落ちたりエラーになったりします。 これを防ぐために、文章を分割して処理し、最後に統合する「再帰的要約」のロジックを実装します。 また、処理状況を可視化するために、ストリーミング出力(文字がタイピングされるように表示される形式)を採用します。

import sys

def summarize_live(text):
    """
    ストリーミング形式で要約を表示し、ユーザー体験を向上させる
    """
    print("\n--- 要約開始 ---\n")

    # stream=Trueにすることで、全回答を待たずに1単語ずつ取得できる
    # レスポンスが返ってくるまでの「待ち時間」のストレスを軽減します
    stream = ollama.chat(
        model=MODEL_NAME,
        messages=[{'role': 'user', 'content': f"以下の文章を要約して:\n\n{text}"}],
        stream=True,
    )

    full_response = ""
    for chunk in stream:
        content = chunk['message']['content']
        print(content, end='', flush=True)
        full_response += content

    print("\n\n--- 要約完了 ---")
    return full_response

# より実戦的な長文でのテスト
long_text = """
(ここに数千文字の議事録やレポートを想定)
"""
# 実際の運用ではファイル読み込みなどをここに記述
# with open('meeting_note.txt', 'r') as f:
#     long_text = f.read()

summarize_live(long_text)

この「ストリーミング出力」は非常に重要です。 ローカルLLMはクラウド(GPT-4など)に比べると推論速度が不安定になることが多いため、進捗が見えないとユーザーは「フリーズした」と勘違いします。 flush=True を使って即座に画面に出力するのが、実務ツールとしての「使い勝手」を分けるポイントです。

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

エラー内容原因解決策
ConnectionErrorOllamaアプリが起動していないタスクバー/メニューバーのOllamaアイコンを確認して起動する
OutOfMemoryErrorVRAM容量に対してモデルが大きすぎる8Bモデルなどのより小さいモデルか、量子化率の高い(Q4等)モデルを使う
漢字が化けるシステムのエンコーディング設定open(file, encoding='utf-8') を明示的に指定する

次のステップ

この記事で、ローカルLLMをPythonから制御し、実用的な出力を得る基礎が完成しました。 次のステップとしては、以下のプロジェクトに挑戦してみてください。

  1. RAG(検索拡張生成)の構築: ローカルのPDFファイルを読み込ませ、その内容に基づいて回答する「プライベートChatGPT」を作る。
  2. 音声認識との連携: Whisper(OpenAIの音声認識モデル)と組み合わせて、録音ファイルから全自動で議事録を作成する。
  3. モデルの比較検証: ollama pull gemma2ollama pull qwen2.5 を試し、日本語の要約精度が最も高いモデルを自分の業務に合わせて選定する。

2026年のローカルLLM界隈は、もはや「動くかどうか」のフェーズを過ぎ、「いかに業務ワークフローに溶け込ませるか」の勝負になっています。 クラウドにデータを投げられない機密性の高い案件こそ、あなたの手元にあるGPUが最大の武器になるはずです。

よくある質問

Q1: AMDのグラボ(Radeon)でも同じコードで動きますか?

基本的には動きます。OllamaはAMDのROCmもサポートしているため、環境変数などの微調整が必要な場合もありますが、Pythonコード自体を書き換える必要はありません。ただし、安定性は依然としてNVIDIAが勝ります。

Q2: 16GBのVRAMでどのくらいのサイズのモデルまで動かせますか?

16GBあれば、14B(140億パラメータ)クラスのモデルが快適に動作します。70Bクラスも「4-bit量子化」されたものであれば動きますが、推論速度は極端に落ちるため、要約などの非同期処理向けになります。

Q3: APIキーが不要なのは本当ですか?

本当です。自分のPC内で完結しているため、OpenAIやAnthropicに支払う月額費用も従量課金も一切発生しません。インターネットに接続していないオフライン環境でも動作するのが最大のメリットです。


あわせて読みたい