お問い合わせ

ブログ

これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。

低スペック PC でも動くローカル LLM を比較してみた|自然言語&コード生成で実力チェック

Kitaru Kitaru 1 week
低スペック PC でも動くローカル LLM を比較してみた|自然言語&コード生成で実力チェック

はじめに

大規模言語モデル(LLM)は、ChatGPT や Gemini のようにクラウド上で提供されるものが主流でしたが、最近では自分の PC 上で動かせるローカル LLM も増えてきました。
しかも、工夫次第ではハイスペック PC がなくてもそこそこ動いてくれる時代になっています。
そこで今回は、低スペック PC でも動くローカル LLM をいくつかピックアップし、簡単なプロンプトで性能比較してみました。

比較対象のローカル LLM 一覧

モデル名 ファイル名 パラメータ数 ビット数 (量子化) トークン数 サイズ オリジナル開発元
ELYZA-japanese-Llama-2-7b-fast-instruct-gguf ELYZA-japanese-Llama-2-7b-fast-instruct-q2_K.gguf 6.85B 2-bit (Q2_K) 45,043 2.89GB ELYZA
Llama-3.2-3B-Instruct-GGUF Llama-3.2-3B-Instruct-Q6_K_L.gguf 3.21B 6-bit (Q6_K_L) 128,256 2.74GB Meta (旧Facebook)
gemma-2-2b-jpn-it-gguf gemma-2-2b-jpn-it-Q8_0.gguf 2.61B 8-bit (Q8_0) 256,000 2.78GB Google
Phi-3-mini-4k-instruct-gguf Phi-3-mini-4k-instruct-q4.gguf 3.82B 4-bit (Q4_K_M) 32,064 2.39GB Microsoft

ℹ️ 日本語に対応し、サイズが 3GB 以内の GGUF 形式量子化モデルの中から、代表的なものを抜粋しました。

用語解説

ローカル LLM とは?

ChatGPT のような言語モデル(LLM)を、自分のPC上で動作させる仕組みのことです。
クラウドを介さず、ローカル環境だけでモデルを実行できるため、インターネット接続が不要で、プライバシー面や応答速度の面で利点があります。
最近は軽量モデルが増え、低スペックな PC でもオフラインで試せるようになっています。
⚠️ ただし、処理速度や対応できるモデルは PC の性能に依存します。

メリット

  • 通信不要 → プライバシー保護
  • 回数・トークン数の制限なし
  • サブスク不要(多くは無料)

パラメータとは?

モデルが学習した知識の量のようなもので、ニューラルネットワーク内部の「重み」と呼ばれる数値です。
数が多いほど、より複雑なパターンや関係を学習できるため、性能が高くなる傾向があります(必ずしも比例ではありません)
例:GPT-3.5(ChatGPT 無料プランで使用)= 約 175B(約 1,750 億個)のパラメータ
※ パラメータ数は正確には公開されていません。

量子化とは?

パラメータの精度(ビット数)を減らして軽くする技術です。

ビット数 特徴
32bit 高精度だが重く、学習時に使われることが多い
16bit より軽量で推論向き( fp16 や bf16 など)
8bit 軽量、速度と精度のバランスが良い
4bit さらに軽量、精度は少し低下することもある

👉 量子化により、元は数十 GB のモデルでも 4 〜 8GB の RAM で動作可能なサイズに圧縮できます。

トークンとは?

テキストをモデルが処理する文字列の単位(サブワードなど)です。
例:「こんにちは世界」→ [ "こん", "にち", "は", "世界" ](トークナイザによって異なります)

  • モデルはトークン単位で予測・生成を行います。
  • クラウド LLM はトークン数で料金や制限がありますが、ローカル LLM には課金制限がありません。
  • ただしローカルでも、モデルごとに最大トークン数(コンテキスト長)の制限があります。
  • トークン数が多いほど、モデルはより長い文章を一度に理解・生成できますが、計算コストやメモリ使用量も増えます。

GGUF 形式とは?

量子化されたモデルを保存するための新しいファイルフォーマット(旧 GGML の後継)

  • 量子化方式の例: Q4_K_MQ5_0 など
  • 精度とサイズのバランスを調整でき、ローカル実行を効率化します。

実行環境

項目 内容
OS Windows 11 Pro
CPU Intel(R) Core(TM) i5-9400 @ 2.90GHz
RAM 16.0 GB(15.7 GB使用可能)
GPU なし(CPUのみ)

本記事では、数年前のデスクトップやノート PC 相当のスペックで、どこまでローカル LLM を実行できるかを検証しています。
RAM 16GB、GPU なしという構成は、現代の標準的なノート PC でもよく見られるものです。

ローカル LLM を動かすための環境構築

# Python のインストール確認
PS> python --version
Python 3.13.3

# 仮想環境を作成
PS> python -m venv .venv

# 仮想環境を有効化
PS> .\.venv\Scripts\activate

# pip のアップグレード
(.venv) PS> python -m pip install --upgrade pip

# 必要なパッケージをインストール
(.venv) PS> python -m pip install llama-cpp-python

# 任意で Jupyter Notebook のインストール
(.venv) PS> python -m pip install notebook

補足説明

  • llama.cpp
    • C++ で開発された高速・軽量な LLM 推論用ソフトウェアです。
    • ローカル環境で LLM を動かすための重要なツールで、GPU なしで CPU だけでも動作可能です。
    • 多くのローカル LLM で利用されている代表的な実行環境です。
  • llama-cpp-python
    • llama.cpp の機能を Python から簡単に利用できるようにした Python 用のラッパーです。
    • Python 環境でローカル LLM を手軽に動かしたい場合に役立ちます。

ローカル LLM の検証用コード

import llama_cpp
import time

# 処理時間の計測開始
start_time = time.time()

# モデルのパスを指定してロード(実際のファイルパスに変更してください)
model = llama_cpp.Llama(
    model_path="ggufファイルのパス",
    n_ctx=2048,  # モデルの最大コンテキスト長に合わせて調整
)

# LLMに問い合わせるプロンプト
content = "ここにLLMに問い合わせるためのプロンプトを記載してください。"

# チャット形式でメッセージ送信し応答を取得
output = model.create_chat_completion(
    messages=[
        {"role": "user", "content": content}
    ]
)

# 処理時間計測終了
end_time = time.time()

# 応答表示
print("=== LLM抽出結果 ===")
print(output['choices'][0]['message']['content'])
print(f"🕒 実行時間:{end_time - start_time:.2f} 秒")

コードのポイント解説

llama_cpp.Llama の初期化

  • model_path には実際のモデルファイル(例:.gguf 形式など)のパスを指定します。
  • n_ctx はモデルが一度に扱える最大トークン数(コンテキスト長)です。デフォルト値は 512 です。
  • コンテキスト長が短すぎると、長文のプロンプトや複数ターンの会話が途中で切れてしまい、正しく処理されない可能性があります。
    必要に応じて、使用するモデルの最大トークン数に合わせて n_ctx を調整してください。
  • ただし、n_ctx を大きく設定すると、PC のメモリ消費量や CPU 負荷が増加します。
    特にメモリが少ない環境では、設定値を大きくしすぎると動作が遅くなったり、メモリ不足エラーが発生する可能性があるため注意が必要です。

プロンプトの準備

  • content にはモデルに伝えたい質問や指示文を記載します。
  • 長文や複雑な文でも対応可能ですが、分かりやすい表現にするとより良い応答が得やすいです。

チャット形式でメッセージ送信

  • messages は複数のメッセージを時系列で渡せるため、複数ターンの会話も可能です。
  • role には通常 user(ユーザー)、assistant(AI)、system(システム指示)があります。
  • 今回はユーザーからの一回だけメッセージを送っています。

結果の受け取りと表示

  • output['choices'] は複数候補の応答が含まれるリストで、通常は最初の応答(choices[0])を使います。
  • 応答が空になる場合やエラーが起きることもあるため、実際のコードでは例外処理や応答チェックを入れると安心です。
  • 実行時間の計測は処理速度の目安になります。

モデル別の応答結果

テーマ①:2025年の日本におけるお米価格高騰の背景要因を探る

検証プロンプト

2025年は、日本ではお米の価格が高騰し、供給不足が話題になっています。
例えば2025年4月時点では、前年同月比で98%上昇し価格がほぼ2倍になっており、5kgあたり約3,800〜4,300円に達しています。
この問題の背景にある要因を3つ挙げて、簡潔に説明してください。

ELYZA-japanese-Llama-2-7b-fast-instruct-gguf の応答結果

=== LLM抽出結果 ===
  2025年におけるお米の価格上昇の背景にある要因を3つ挙げ、簡潔に説明します。

1. 人口の減少と世帯の減少
日本の人口の減少と世帯の減少は、食生活の変化を引き起こします。一人ひとりが家計を支える世帯の減少は、お米の消費量の減少を引き起こします。

2. 生産量の減少
日本のお米の生産量は、年々減少しています。生産量の減少は、供給不足を引き起こします。

3. 輸送の難しさ
日本のお米は、主に北海道から関東にかけての地域で生産されます。そのお米を消費地の首都圏までの輸送は、難しさを引き起こします。
🕒 実行時間:42.30 秒

Llama-3.2-3B-Instruct-GGUF の応答結果

=== LLM抽出結果 ===
2025年日本の米の価格高騰の背景にある要因を3つ挙げて説明します。

1. **気候変動と気候変動の影響**: 2025年は、気候変動の影響が強く、世界の気候は変化しました。特に、太平洋の気候は、暖かくなる傾向があります。このため、米の生産は低下し、供給量が減少しました。

2. **台風や天災害の影響**: 2025年は、台風や天災害が多く発生しました。これにより、米の生産地や輸送路線が損傷したり、米の生産量が減少したりしました。

3. **輸出量の減少**: 2025年は、米の輸出量が減少しました。これは、米の輸出国である米国やカナダなどの米の生産量が減少したり、輸出ルートが制限されたりしたためです。
🕒 実行時間:36.90 秒

gemma-2-2b-jpn-it-gguf の応答結果

=== LLM抽出結果 ===
##  お米価格高騰の原因3つ

1. **気候変動による作物の被害:**  異常気象(猛暑、洪水など)による作物の被害が深刻化し、収穫量が減少。
2. **輸入米の価格上昇:**  世界的なエネルギー価格の上昇や、ロシアのウクライナ侵攻の影響で、輸入米の価格が上昇。
3. **国内生産量の減少:**  水不足や土壌の劣化などの影響で、国内での生産量が減少。

🕒 実行時間:18.70 秒

Phi-3-mini-4k-instruct-gguf の応答結果

=== LLM抽出結果 ===
 1. 日本の消費者収入の増加: 消費者の収入が高騰することで、食料品の消費が増え、供給が追い付くことが難しくなります。

2. 日本の生産能力の限界: 日本は農業生産性が高いですが、技術進歩や環境問題により生産性が向上しないことが原因であり、供給が不足する可能性があります。

3. 国際市場や気候変動の影imation: 日本の米の供給に影響を与える要因として、米市場の変動や気候変動が作物の生産量に影響を与えることが挙げられます。
🕒 実行時間:47.93 秒

テーマ②:Python で大文字・空白無視のアナグラム判定関数を作る

検証プロンプト

Pythonで文字列2つを受け取り、それらがアナグラムかどうか判定する関数を作ってください。

仕様:

  • この関数は2つの文字列がアナグラム(同じ文字を使っているかどうか)か判定する
  • 関数名は is_anagram
  • 大文字と小文字の区別はしない
  • 空白は無視する
  • アナグラムである場合にTrueを返し、アナグラムでない場合にFalseを返す

さらに、is_anagram("Dormitory", "Dirty room") と is_anagram("Hello", "World") のテストコードも書いてください。

ELYZA-japanese-Llama-2-7b-fast-instruct-gguf の応答結果

=== LLM抽出結果 ===
  文字列2つを受け取り、それらがアナグラムかどうか判定する関数を作成します。

```python
def is_anagram(str1, str2):
    # 大文字と小文字の区別はしない
    # 空白は無視する
    # アナグラムである場合にTrueを返し、アナラームでない場合にFalseを返す
    if str1 == str2:
        return False
    return True
```

テストコードは以下の通りです。

```python
print(is_anagram("Dormitory", "Dirty room"))
print(is_anagram("Hello", "World"))
```

アナラームである場合にTrueを返し、アナラームでない場合にFalseを返すという仕様から、is_anagram関数を修正しました。
🕒 実行時間:46.97 秒

Llama-3.2-3B-Instruct-GGUF の応答結果

=== LLM抽出結果 ===
以下はPythonで文字列2つを受け取り、それらがアナグラムかどうか判定する関数です。

```python
def is_anagram(str1, str2):
    """
    2つの文字列がアナグラムかどうか判定する関数

    大文字と小文字の区別はしない
    空白は無視する
    """
    # 大文字と小文字を区別しない文字列を生成する
    str1 = ''.join(e for e in str1 if e.isalnum()).lower()
    str2 = ''.join(e for e in str2 if e.isalnum()).lower()

    # 2つの文字列の文字の数が等しくない場合、アナグラムではない
    if len(str1) != len(str2):
        return False

    # 2つの文字列の文字の順序が等しい場合、アナグラム
    return sorted(str1) == sorted(str2)
```

この関数では、2つの文字列がアナグラムかどうかを判断するために、次のステップを実行します。

1. 大文字と小文字を区別しない文字列を生成します。
2. 2つの文字列の文字の数が等しい場合、アナグラムではないと判断します。
3. 2つの文字列の文字の順序が等しい場合、アナグラムと判断します。

テストコードは次のようになります。

```python
import unittest

class TestIsAnagram(unittest.TestCase):
    def test_anagram(self):
        self.assertTrue(is_anagram("Dormitory", "Dirty room"))

    def test_not_anagram(self):
        self.assertFalse(is_anagram("Hello", "World"))

if __name__ == "__main__":
    unittest.main()
```

このテストコードでは、`is_anagram` 関数をテストします。`test_anagram` メソッドでは、アナグラムである場合に `True`、アナグラムでない場合に `False` を返すことをテストします。`test_not_anagram` メソッドでは、アナグラムでない場合に `True`、アナグラムである場合に `False` を返すことをテストします。
🕒 実行時間:79.95 秒

gemma-2-2b-jpn-it-gguf の応答結果

=== LLM抽出結果 ===
```python
def is_anagram(str1, str2):
  """
  2つの文字列がアナグラムかどうか判定する関数

  Args:
    str1: 第1の文字列
    str2: 第2の文字列

  Returns:
    str1とstr2が同じ文字で構成されている場合True、そうでない場合False
  """
  str1 = str1.lower().replace(" ", "")
  str2 = str2.lower().replace(" ", "")
  return sorted(str1) == sorted(str2)

# テストコード
print(is_anagram("Dormitory", "Dirty room"))  # True
print(is_anagram("Hello", "World"))  # False 

```

**解説:**

1. **関数定義:**
   - `def is_anagram(str1, str2):` :  `is_anagram` という名前の関数を作成します。
   - `str1` と `str2` は、文字列を受け取る引数です。

2. **文字列の処理:**
   - `str1 = str1.lower().replace(" ", "")` :  `str1` を小文字に変換し、空白を削除します。
   - `str2 = str2.lower().replace(" ", "")` :  `str2` を小文字に変換し、空白を削除します。

3. **比較:**
   - `sorted(str1) == sorted(str2)` :  `str1` と `str2` の文字を昇順でソートし、それらのリストを比較します。 
   -  `sorted()` 関数は文字列を昇順にソートします。
   -  `==` 演算子は、2つのリストが同じ文字列であるかどうかを判定します。

4. **結果の返却:**
   - `return sorted(str1) == sorted(str2)` :  比較結果を返す。 
   -  `True` を返すと、2つの文字列がアナグラムであることを意味します。
   -  `False` を返すと、2つの文字列がアナグラムではないことを意味します。

🕒 実行時間:72.17 秒

Phi-3-mini-4k-instruct-gguf の応答結果

=== LLM抽出結果 ===
 ```python

def is_anagram(str1, str2):

    # 文字列を小文字に変換し、空白を削除

    str1_normalized = ''.join(sorted(str1.lower().replace(' ', '')))

    str2_normalized = ''.join(sorted(str2.lower().replace(' ', '')))

    # アナグラムかどうかを判定

    return str1_normalized == str2_normalized

# テストコード

print(is_anagram("Dormitory", "Dirty room"))  # 出力: True

print(is_anagram("Hello", "World"))  # 出力: False

```

この関数は、与えられた2つの文字列を小文字に変換し、空白を削除してから、両文字列の文字を並び替えた後で比較してアナグラムかどうかを判定します。
🕒 実行時間:43.91 秒

検証結果の比較表

本評価は OpenAI の ChatGPT(GPT-4)を使用して、客観性を保ちながら分析・考察を行っています。

モデル名 テーマ①:米価高騰の背景 テーマ②:アナグラム判定関数 総合評価
ELYZA-japanese-Llama-2-7b-fast-instruct-gguf ❌ 内容に事実誤認あり(人口減=価格上昇の説明が矛盾、輸送の難しさも弱い) ❌ 関数が全く要件を満たしていない(文字比較せずTrue/False返却) ★☆☆(実用性低)
Llama-3.2-3B-Instruct-GGUF ⭕ 気候変動や災害など妥当な説明あり。やや抽象的だが整合性あり ⭕ 処理がやや過剰(isalnum() 使用など)だが、基本要件は満たしている ★★★(高評価)
gemma-2-2b-jpn-it-gguf ⭕ 実際の背景に近い要因を端的に整理(気候変動・輸入価格・国内生産) ⭕ シンプルかつ正確な実装で説明も丁寧 ★★★(バランス良)
Phi-3-mini-4k-instruct-gguf ❌ 説明が論理的に曖昧(収入増で価格上昇など)、文法・語彙の不安定さあり ⭕ 基本的には正しいコード。要件を満たしている ★★☆(中程度)

考察ポイント

◆ テーマ①:米価高騰の背景

  • gemmaLlama-3.2 は、気候変動・天災・国内生産の視点から比較的現実的な要因を提示。
  • ELYZA は「人口減少=価格高騰」のような因果のズレが見られた。
  • Phi-3 は「収入の増加が食料価格の上昇を担う」など、経済的に不自然な因果を提示。加えて、"影imation" のような誤語も含まれ、文法・語彙の粗さが信頼性を損なっている。

◆ テーマ②:アナグラム判定関数

  • ELYZA は要件をほぼ無視した実装で、実用性は皆無。
  • Llama-3.2gemmaPhi-3 の3モデルは、すべて仕様通りのアナグラム判定ロジックを実装。
  • 特に gemma は、最小限のコードで明快かつ正確な処理を行っており、教育用途にも向く。

総合評価と総評

項目 最も優れていたモデル
論理的説明力 gemma / Llama-3.2
コード生成力 gemma
バランスの良さ gemma
軽量モデルでの実用性 Phi-3

総評モデル別コメント

  • ELYZA-japanese-Llama-2-7b-fast-instruct-gguf
    日本語特化型ながら論理性とコード生成に課題があり、現時点では限定的な用途向きです。
  • Llama-3.2-3B-Instruct-GGUF
    高い説明力と優れた構造化出力が特徴。やや処理が冗長ですが、応用範囲は広いです。
  • gemma-2-2b-jpn-it-gguf
    日本語対応、論理性、Pythonコード生成のバランスに優れ、軽量LLMとして非常に実用的です。
  • Phi-3-mini-4k-instruct-gguf
    コード生成力はまずまず。説明力はやや不安がありますが、リソースが限られた環境では有力な選択肢です。

補足:モデルの入手先

おわりに

ローカル LLM の面白さは、まさに「自分の手元で AI を動かしている実感」にあります。
クラウドや大規模サーバーに頼らず、自分の PC や環境で試せることで、AI 技術をより身近に感じられるのが最大の魅力です。

かつては高価でハイスペックなマシンが必要だった AI も、今では一般的なパソコンやノート PC で動かせる時代になりました。
技術の進歩により、誰でも気軽に AI を触り、試せる環境が整っています。

この機会にぜひ、あなたもローカルLLMを体験してみてください。
まずは本記事で紹介した「gemma-2-2b-jpn-it」や「Phi-3」などの軽量モデルを Hugging Face からダウンロードし、Python スクリプトで動かしてみるのがおすすめです。
実際にプロンプトを打ち込んで応答を得るだけでも、AI の仕組みがぐっと身近に感じられるはずです。

低スペック PC でも動くローカル LLM を比較してみた|自然言語&コード生成で実力チェック 2025-07-18 15:55:49

コメントはありません。

4580

お気軽に
お問い合わせください。

お問い合わせ
gomibako@aska-ltd.jp