ローカルLLMを動かす(Ollama/Qwen 3 14B Q4)

 

次の前提で、ローカルLLMを動かしてみました。

  • Ollamaをインストールしています。
  • MacBookAir M2を使っています。メモリは24GB
  • 今回の対象モデルは qwen3:14b です。

背景

ローカルLLMを動かしていきたいと思いました。特に、自分がローカルで記録しているテキストから情報を抽出する用途で使います。つまり、テキストファイルを入れて、指定したjsonが返ってくるような用途です。

ローカルLLMは進化が激しいので、現時点で有力なモデルをClaude Opus 4.7に調査させました。すると、Qwen 3 14B(Q4)がお勧めされたのでそれを動かしてみました。今回はその記録です。

なお、1年以上前からOllamaはインストールしていたので、それをそのまま使っています。

さて、その状態で qwen3:14b をダウンロードしておき、
以下のようにAPIで実行してみます。

> curl -s http://localhost:11434/api/chat -d '{
                                           "model": "qwen3:14b",
                                           "messages": [
                                             {"role": "user", "content": "田中太郎は35歳でエンジニアです。情報を抽出してください。/no_think"}
                                           ],
                                           "stream": false,
                                           "format": {
                                             "type": "object",
                                             "properties": {
                                               "name": {"type": "string"},
                                               "age": {"type": "integer"},
                                               "occupation": {"type": "string"}
                                             },
                                             "required": ["name", "age", "occupation"]
                                           }
                                         }' | jq

すると次のような結果が得られました。thinkingはやけに長いので削りました。

{
  "model": "qwen3:14b",
  "created_at": "2026-05-09T10:25:39.572555Z",
  "message": {
    "role": "assistant",
    "content": "{\n  \"name\": \"田中太郎\",\n  \"age\": 35,\n  \"occupation\": \"エンジニア\"\n}",
    "thinking": "Okay, let's see. The user provided a sentence in Japanese: \"田中太郎は35歳でエンジニアです。情報を抽出してください。\" They want me to extract t...."
  },
  "done": true,
  "done_reason": "stop",
  "total_duration": 109722671417,
  "load_duration": 87428375,
  "prompt_eval_count": 928,
  "prompt_eval_duration": 10293626000,
  "eval_count": 30,
  "eval_duration": 3125652287
}

いい感じに情報が抽出できることがわかりました。

Pythonでもやってみます。

ollama pydantic をインストールしている前提です。

from ollama import chat
from pydantic import BaseModel

class Person(BaseModel):
    name: str
    age: int
    occupation: str

    def __str__(self):
        return f"{self.name}({self.age}:{self.occupation})"


response = chat(
    model='qwen3:14b',
    messages=[{
        'role': 'user',
        'content': '田中太郎は35歳でエンジニアです。情報を抽出してください。'
    }],
    format=Person.model_json_schema(),
)

print(response['message']['content'])

person = Person.model_validate_json(response['message']['content'])
print(person)

これで動きます。私の環境は uv を使っているので以下のようになります。

> uv run python main.py
{"name": "田中太郎", "age": 35, "occupation": "エンジニア"}
田中太郎(35:エンジニア)

time で実行時間を計測したところ以下のようになりました。

> uv run time python main.py
...(略)
       23.92 real         0.17 user         0.02 sys

大体、24秒くらいかかりました。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です