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

この記事で作るもの

  • OllamaとPythonを連携させ、完全にオフラインで動作するテキスト解析エージェントを構築します。
  • 前提知識: Pythonの基本的な文法(変数、関数、pipでのライブラリ導入)を理解していること。
  • 必要なもの: Docker不要のOllama環境、Python 3.10以上、VRAM 8GB以上のGPU(推奨)。

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

RTX 4060 Ti 16GB

VRAM 16GBでLlama 3.1 8Bが爆速で動き、実務検証に最もコスパが良い

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

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

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

ローカルLLMを「仕事で使えるレベル」で動かすなら、最も重要なのはGPUのVRAM(ビデオメモリ)容量です。 最低でも8GB、理想を言えば16GB以上のVRAMを搭載したNVIDIA製GPUを用意してください。 私はRTX 4090の2枚挿し(VRAM 48GB)で運用していますが、Llama 3.1の8BモデルやMistralクラスなら、RTX 4060 Ti (16GB版) 1枚で驚くほど快適に動きます。

Macユーザーであれば、メモリ32GB以上のApple Silicon(M2/M3 Pro以上)が現実的な選択肢になります。 メモリが16GB以下だと、推論中にシステム全体が重くなり、開発どころではなくなるからです。 API料金は一切かかりませんが、電気代とハードウェアへの初期投資がコストだと考えてください。 もし手元に強靭なGPUがない場合は、月額$20を払ってClaude APIを叩き続けるほうが、時間対効果は高いです。

なぜこの方法を選ぶのか

OpenAIやAnthropicのAPIは非常に優秀ですが、常に「規約変更」と「検閲」のリスクが付きまといます。 Andrej KarpathyがAnthropicをプロフィールの支援先から外したというニュースは、AIの巨塔たちがよりクローズドな方向へ向かっている兆候かもしれません。 私たちは、モデルの重みを自分のディスクに持ち、コードで完全に制御する術を身につけておくべきです。

今回は数あるローカルLLM実行環境の中でも、セットアップが最も簡単で、かつPythonライブラリが充実している「Ollama」を採用します。 llama.cppを直接ビルドする方法もありますが、APIサーバーとしての安定性と、ライブラリの抽象度の高さから、実務への導入スピードはOllamaが圧倒的です。

Step 1: 環境を整える

まずはLLMの実行エンジンとなるOllamaをインストールし、モデルをローカルに落とします。

# Ollamaのインストール(公式サイトからダウンロードして実行するだけです)
# モデル(Llama 3.1 8B)のダウンロードと起動確認
ollama run llama3.1

コマンドを実行すると、数GBのモデルファイルがダウンロードされます。 ダウンロード完了後、ターミナルで対話が始まったら成功です。 /exit で一旦終了してください。

なぜ Llama 3.1 を選ぶのかというと、現時点で「日本語の理解力」と「推論速度」のバランスが最も優れているからです。 より軽量なモデルに Qwen2 や Gemma 2 がありますが、最初は最もエコシステムが強い Llama シリーズで環境を組むのが、トラブルを避けるコツです。

⚠️ 落とし穴: Windows環境でGPUを認識しない場合、最新のNVIDIAドライバーがインストールされているか確認してください。 WSL2を使わなくてもネイティブ版Ollamaで動きますが、タスクマネージャーの「専用GPUメモリ」が消費されているか必ずチェックしましょう。 ここが動いていないと、CPU推論になり、1秒に1文字程度しか出力されない絶望的な速度になります。

Step 2: 基本の設定

PythonからOllamaを操作するためのライブラリを導入し、接続設定を書きます。

# 仮想環境を作成してライブラリをインストール
python -m venv venv
source venv/bin/activate  # Windowsは venv\Scripts\activate
pip install ollama

次に、エディタを開いて app.py を作成します。

import ollama

# 使用するモデル名を定義
# 自分のPCスペックに合わせて 'llama3.1' または 'phi3' などに変更可能
MODEL_NAME = "llama3.1"

def check_connection():
    try:
        # Ollamaサーバーが起動しているか確認
        response = ollama.list()
        print("接続成功。ロード済みのモデル一覧:")
        for m in response['models']:
            print(f"- {m['name']}")
    except Exception as e:
        print(f"接続エラー: {e}")
        print("Ollamaアプリが起動しているか確認してください。")

if __name__ == "__main__":
    check_connection()

ここではAPIキーの設定が不要です。 なぜなら、自分のローカルマシン内で閉じた通信(localhost:11434)を行うからです。 外部サーバーにデータが飛ばないため、企業の機密情報や個人の日記を流し込んでも、学習データに利用される心配はありません。

Step 3: 動かしてみる

実際にPythonからテキストを投げて、レスポンスを取得します。 実務で使うことを想定し、一括で結果を待つのではなく「ストリーミング形式」で実装します。

import ollama

def ask_ai(prompt):
    stream = ollama.chat(
        model='llama3.1',
        messages=[{'role': 'user', 'content': prompt}],
        stream=True,
    )

    print("AIの回答: ", end="", flush=True)
    for chunk in stream:
        # トークンごとに逐次出力
        content = chunk['message']['content']
        print(content, end="", flush=True)
    print()

if __name__ == "__main__":
    user_input = "AIのローカル実行がエンジニアにとって重要な理由を3つ挙げて。"
    ask_ai(user_input)

期待される出力

AIの回答: ローカル実行が重要な理由は以下の3点です。
1. プライバシーとセキュリティ:データが外部へ送信されないため、機密情報を扱えます。
2. コスト:API利用料がかからず、ハードウェアのリソースを使い倒せます。
3. カスタマイズ性:モデルのパラメータやシステムプロンプトを完全に制御可能です。

ストリーミングを導入する理由は、ローカルLLMの「最初の1文字が出るまでの遅延」を感じさせないためです。 一括取得にすると、全文章が生成されるまで画面が止まってしまい、ユーザーは「フリーズしたのかな?」と不安になります。 レスポンスを0.3秒程度で体感させるために、ストリーミングは必須の実装だと考えてください。

Step 4: 実用レベルにする

単に会話するだけならブラウザ版のChatGPTで十分です。 Pythonで動かす真の価値は「構造化データの抽出」にあります。 例えば、大量のテキストから「日付」「場所」「重要度」を抜き出してJSONで出力させる機能を実装しましょう。

import json
import ollama

def extract_event_info(text):
    system_prompt = (
        "あなたは優秀なデータ抽出アシスタントです。"
        "入力された文章から、日付、場所、イベント名を抽出し、必ず以下のJSON形式で回答してください。"
        '{"date": "YYYY/MM/DD", "location": "string", "event_name": "string"}'
    )

    response = ollama.chat(
        model='llama3.1',
        messages=[
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': text}
        ],
        format='json', # ここが重要
        options={'temperature': 0} # 再現性を高めるために0に設定
    )

    return response['message']['content']

# テスト実行
raw_text = "来週の月曜日、10月28日に渋谷のスクランブルスクエアでAI勉強会を開催します。"
json_output = extract_event_info(raw_text)

# 文字列を辞書オブジェクトに変換して中身を確認
data = json.loads(json_output)
print(f"日付: {data['date']}")
print(f"場所: {data['location']}")
print(f"イベント: {data['event_name']}")

ここで format='json' を指定している点に注目してください。 これはOllama独自の機能で、モデルの出力を強制的にJSONフォーマットに制限するものです。 従来のLLM開発では、AIが余計な解説文(「はい、JSON形式で出力します」など)を付けてしまい、パースエラーになることがよくありました。 この設定を入れることで、プログラムから直接データベースに保存できる形式を安定して得られます。

また、 temperature(温度感)を 0 にしているのは、抽出タスクにおいて「AIの創造性」は不要だからです。 事実を事実として、毎回同じ結果を出す設定にするのが実務上の「お作法」です。

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

エラー内容原因解決策
ConnectionErrorOllamaアプリが起動していないタスクバーにOllamaのアイコンがあるか確認。
出力が極端に遅いGPUではなくCPUで動作しているGPUドライバを更新。VRAM不足でモデルが溢れている可能性あり。
JSONが壊れるモデルの能力不足(小さいモデル)8B以上のモデルを使うか、プロンプトを簡略化する。
Out of Memory他のアプリがVRAMを占有しているブラウザのハードウェアアクセラレーションをオフにするか、モデルサイズを下げる。

次のステップ

ここまでできれば、あなたは「自分専用のAI基盤」を手に入れたことになります。 Karpathyが提唱した「AI OS」の概念に近い、ローカルでの自律的な処理が可能になります。

次のステップとして挑戦してほしいのは「RAG(検索拡張生成)」の構築です。 今回作ったスクリプトに、自分の過去のメモやPDFファイルを読み込ませる機能を追加してみてください。 Pythonの PyPDF2 ライブラリでテキストを抽出し、それをプロンプトのコンテキストとして渡すだけで、あなた専用の知識ベースを持つAIが出来上がります。

また、API化してスマホから自宅のサーバーにアクセスできるようにするのも面白いでしょう。 RTX 4090を積んだ自宅サーバーを ngrok や Tailscale で公開すれば、外出先でも世界最強クラスのプライベートAIを無料で使い放題になります。 この「所有感」こそが、ローカルLLM最大の醍醐味です。

よくある質問

Q1: ネット接続がなくても本当に動きますか?

はい、完全にオフラインで動きます。モデルのダウンロード時だけネットが必要ですが、一度落としてしまえばLANケーブルを抜いてもPythonコードは動作します。プライバシーを極限まで気にする用途に最適です。

Q2: 4-bit量子化などのモデルが色々ありますが、どれが良いですか?

初心者は「4-bit(q4_K_M)」を選べば間違いありません。モデルサイズが半分以下になり、推論速度が劇的に上がりますが、回答の精度低下は体感できるほどではありません。Ollamaのデフォルトもこれに近い設定です。

Q3: Python以外の言語でも動かせますか?

Ollamaは内部的にHTTP APIを公開しているため、JavaScriptやGo、Rustなど、あらゆる言語から叩けます。ですが、AI界隈のライブラリ(LangChainやLlamaIndex)の充実度を考えると、Pythonで開発するのが最も効率的です。


あわせて読みたい