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

この記事で作るもの

  • ローカル環境でLlama 3.1やMistral等の最新LLMを高速動作させ、Pythonから呼び出して「特定ドキュメントの要約と構造化データ抽出」を自動化するシステム。
  • 外部API(OpenAI等)にデータを送らず、完全にオフラインで機密情報を処理できるスクリプトを作成します。
  • 前提知識として、Pythonの基本的な文法(関数、変数、pipでのライブラリ導入)を理解している必要があります。

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

RTX 4060 Ti 16GB

VRAM 16GBでローカルLLM入門に最も現実的で低消費電力

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

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

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

ローカルLLMを動かす上で、最も重要なのはGPUの「VRAM(ビデオメモリ)」の容量です。 Redditで話題になっているRTX 5060 Ti 16GB(あるいは現行の4060 Ti 16GB)が注目される理由は、300〜500ドル前後の価格帯でVRAM 16GBを搭載している点にあります。 7B(70億パラメータ)クラスのモデルを「FP16(半精度浮動小数点数)」で動かすには約14GBのVRAMが必要なため、8GBのカードではメモリ不足で動作しません。

また、量子化(4-bit等)を行えば16GBのVRAMで14Bや20Bクラスのモデルまでロード可能になります。 電源ユニットは550W以上を推奨しますが、5060 Tiクラスは消費電力が低いため、既存のビジネスPCに増設しやすいのもメリットです。 もしMacで代替する場合は、メモリ32GB以上のM2/M3 Proモデルが必要になり、コストは2倍以上に跳ね上がります。 自作PCであれば、中古のRTX 3060 12GBという選択肢もありますが、推論速度と今後のドライバサポートを考えると、50/40シリーズの16GBモデルが「実務で長く使える」最低ラインの投資になります。

なぜこの方法を選ぶのか

ローカルLLMを動かす方法は、llama.cppを直接ビルドしたり、LM StudioのようなGUIツールを使ったりと多岐にわたります。 しかし、私は「Ollama」をバックエンドに使い、Pythonの「LangChain」で制御する方法をベストだと考えています。 理由は、Ollamaがモデルの重み管理、量子化、GPUへのメモリ割り当てをすべて自動で最適化してくれるからです。

自分でビルドする手法は、特定の設定で数%の高速化が見込めるものの、ライブラリの依存関係が崩れやすく、OSのアップデート一つで動かなくなるリスクがあります。 仕事で使うなら「環境構築に時間をかける」のではなく「プロンプトや処理フローの改善に時間を使う」べきです。 OllamaはREST APIを自動で立ててくれるため、後から別のサーバーにLLMを移したり、Dockerでコンテナ化したりする際も、コードの書き換えが最小限で済みます。

Step 1: 環境を整える

Windows環境を前提とします。まずはWSL2(Windows Subsystem for Linux)上で動かすのが、Pythonのライブラリ競合を避けるための定石です。

# NVIDIAドライバが正しく認識されているか確認
nvidia-smi

このコマンドでGPU名とVRAM容量が表示されない場合、NVIDIAの公式サイトから最新のGame Readyドライバ(またはStudioドライバ)をインストールしてください。

次に、Ollamaをインストールします。公式サイトからインストーラーを落とすのが一番早いですが、WSL2内から以下のコマンドで入れることも可能です。

curl -fsSL https://ollama.com/install.sh | sh

インストール後、以下のコマンドでモデルをダウンロードし、動作確認を行います。

ollama run llama3.1:8b

このコマンドは、Metaが公開しているLlama 3.1の8Bモデル(4-bit量子化版)をダウンロードし、対話モードを起動します。 「Why is the sky blue?」などと入力し、1秒間に何十文字も出力されれば成功です。

⚠️ 落とし穴: ノートPCの場合、内蔵GPU(Intel/AMD)が優先されてしまい、RTXが使われないことがあります。 タスクマネージャーの「パフォーマンス」タブで、モデル動作中に「専用ビデオメモリ」が消費されているかを必ず確認してください。 VRAMが消費されていない場合、OLLAMA_HOST=0.0.0.0 の設定や環境変数のパスが通っていない可能性があります。

Step 2: 基本の設定

PythonからOllamaを操作するためのライブラリをインストールします。 実務では、エラーハンドリングやリトライ処理が容易な「LangChain」のラッパーを利用します。

pip install langchain-ollama pandas

次に、Pythonスクリプトを作成します。ここでは、機密情報を含むテキストを想定し、それを安全に処理するための初期化コードを書きます。

import os
from langchain_ollama import OllamaLLM

# モデルの初期化。temperatureは0に設定するのが私の推奨です。
# 0にすることで、同じ入力に対して常に同じ回答(決定論的)が返りやすくなり、業務の自動化に適します。
model = OllamaLLM(
    model="llama3.1:8b",
    temperature=0,
    num_ctx=4096  # コンテキストウィンドウ。16GB VRAMなら4096〜8192が安定します。
)

def generate_response(prompt):
    try:
        response = model.invoke(prompt)
        return response
    except Exception as e:
        return f"エラーが発生しました: {str(e)}"

各設定の意図を補足します。num_ctx は「一度に処理できるトークン数(文字数の目安)」です。 これを大きくしすぎるとVRAMを急激に消費し、推論速度が極端に低下します。 16GBのカードであれば、8Bモデルを動かしながらでも4096トークン程度を確保するのが、速度と精度のバランスが良いポイントです。

Step 3: 動かしてみる

実際に、テキストを要約させる最小限のコードを動かします。

test_text = """
株式会社ネギ・テックは、2024年度の第3四半期において、AI導入支援事業により前年比150%の増益を達成した。
特にRTXシリーズを活用したローカルLLMの構築支援が好調で、製造業向けのプライベートAI構築案件が20件以上稼働している。
今後は、エッジコンピューティング分野への進出を計画している。
"""

prompt = f"以下の文章を、3つの箇条書きで要約してください。日本語で回答してください。\n\n{test_text}"

result = generate_response(prompt)
print(result)

期待される出力

・2024年度第3四半期に前年比150%の増益を達成。
・製造業向けローカルLLM構築支援(20件以上)が業績を牽引。
・今後はエッジコンピューティング分野への進出を計画中。

結果を確認する際は、事実関係が捏造(ハルシネーション)されていないかを注視してください。 もし内容が不正確な場合は、llama3.1:8b よりも高精度な mistral や、日本語に特化した elyza:jp-stable などのモデルに切り替えて試すと解決することが多いです。

Step 4: 実用レベルにする

単なるチャットでは仕事になりません。 実務で最も要望が多い「大量のテキストデータ(CSVやログ)から特定の情報を抽出してJSON形式で保存する」処理に拡張します。 AIの回答が不安定にならないよう、出力形式を指定する「Pydantic」的なアプローチ(今回は簡易的な文字列パース)を実装します。

import json
import pandas as pd

def extract_financial_data(text):
    # JSON形式で出力するよう強めに指示
    prompt = f"""
    以下の文章から「会社名」「増益率」「案件数」を抽出してください。
    必ず以下のJSON形式のみで出力し、他の説明は一切書かないでください。
    {{
        "company": "会社名",
        "growth_rate": "増益率",
        "project_count": "案件数"
    }}

    文章: {text}
    """

    raw_response = model.invoke(prompt)

    # AIが余計な文章(「はい、出力します」等)を付けても動くように、JSON部分だけを切り出す
    try:
        start_idx = raw_response.find('{')
        end_idx = raw_response.rfind('}') + 1
        json_str = raw_response[start_idx:end_idx]
        return json.loads(json_str)
    except Exception:
        return {"error": "Failed to parse JSON", "raw": raw_response}

# 大量データを想定したシミュレーション
data_list = [test_text] * 5  # 実際にはここに異なる文章が入る
results = []

for i, text in enumerate(data_list):
    print(f"処理中... {i+1}/{len(data_list)}")
    extracted = extract_financial_data(text)
    results.append(extracted)

# Pandasで表形式にして保存。これが実務で一番喜ばれます。
df = pd.DataFrame(results)
df.to_csv("analysis_results.csv", index=False)
print("CSVの保存が完了しました。")

このコードの肝は、raw_response.find('{') の部分です。 ローカルLLM、特に小規模なモデルは、指示を守りきれずに挨拶を入れてしまうことが稀にあります。 それをプログラム側で吸収してあげるのが、ローカルLLMを「壊れないシステム」に組み込むための現場の知恵です。

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

エラー内容原因解決策
Error: llm_load_tensors: offloading 0 blocks to GPUGPUが認識されていない、またはドライバが古い。ollama serve を再起動し、環境変数 CUDA_VISIBLE_DEVICES を確認する。
OutOfMemoryErrorVRAM容量に対してモデルやコンテキストが大きすぎる。8b モデルを 4-bit 量子化で使用し、num_ctx を小さくする。
レスポンスが異常に遅い(0.1 token/sec等)GPUではなくCPUで推論が行われている。RAM速度に依存している証拠。nvidia-smi でGPU負荷を確認する。

次のステップ

この記事で「ローカルLLMをプログラムから叩き、実データを処理する」という基礎はマスターしました。 次に取り組むべきは、自分の持っているPDFや社内ドキュメントを読み込ませる「RAG(検索拡張生成)」の構築です。

LangChainには PyPDFLoader や ChromaDB といった、ローカル環境だけで動作するベクトルデータベース連携機能が備わっています。 RTX 5060 Ti 16GBがあれば、文章をベクトル化(Embedding)する処理と、推論する処理の両方を一枚のカードでこなせます。 外部に一切漏らしてはいけない顧客情報の分析や、機密コードのリファクタリングなど、ローカルLLMならではの「攻めの活用」をぜひ試してみてください。 私の経験上、一度「手元でAIが考えている感覚」を掴むと、クラウドAPIの遅延やコスト、プライバシー制約がストレスに感じるようになるはずです。

よくある質問

Q1: RTX 5060 Ti 16GB(あるいは4060 Ti)ではなく、VRAM 8GBのカードではダメですか?

結論から言うと、実務では厳しいです。8GBだと最新のLlama 3.1 8Bですらメモリがカツカツで、コンテキストを長く取るとすぐにメインメモリ(低速なRAM)に溢れます。仕事で使うなら、12GB以上、できれば16GBが最低条件です。

Q2: 途中で処理が止まってしまうことがあります。

ローカルLLMはGPUの温度が上がりすぎるとサーマルスロットリングが発生したり、ドライバがクラッシュしたりすることがあります。特に連続で100件以上のテキストを処理する場合は、ループの間に time.sleep(1) を入れるなどして、GPUを休ませる工夫を検討してください。

Q3: 日本語の精度を上げるにはどうすればいいですか?

モデル名の指定を ollama run elyza:jp-stable に変えてみてください。Llama 3をベースに日本専用に調整されたモデルなので、敬語や日本固有の表現の理解度が劇的に向上します。16GBあれば余裕で動作します。


あわせて読みたい