ChatGPTのようなAIチャットをブラウザやアプリで使うとき、入力した文章はインターネットを通ってサービス側のサーバーへ送られます。サーバー上の言語モデルが返答を生成し、その結果が画面に戻ってきます。画面の中でAIが動いているわけではありません。

同じような処理を、自分のPCで動かすこともできます。この記事では、LLMが返答をつくる仕組みを確認したあと、Ollamaを使ってモデルをPCへ入れ、TerminalとPythonから呼び出します。

コマンドを暗記するのではなく、入力がどこを通り、どのモデルへ届き、どう戻ってくるのかを順にたどります。

LLMとは何か

LLMはLarge Language Modelの略で、日本語では大規模言語モデルと呼ばれます。大量の文章から言葉同士の関係を学び、入力された文章とそれまでの文脈をもとに、続きに来る文章を生成するモデルです。

生成の基本にあるのが、次に来るトークンを予測する処理です。英語ではnext-token predictionと呼ばれます。トークンは、LLMが文章を処理するときの単位です。単語と同じ場合もありますが、単語の一部、記号、空白などに分かれることもあります。

たとえば「今日は天気が」まで入力されたとします。LLMは、その次に来そうなトークンの候補へ確率を付け、一つを選びます。選んだトークンを文章の末尾に加え、今度はその続きを予測します。

説明のために単語単位へ簡略化すると、次のような流れです。

今日は天気が → 今日は天気がよい → 今日は天気がよいので → ...

LLMは完成した返答をどこかから取り出しているのではありません。次のトークンを選ぶ処理を繰り返し、返答を少しずつ組み立てています。AIチャットで文字が順番に表示されるのも、この生成の流れをイメージする手がかりになります。

この仕組みを使うことで、質問への回答、要約、翻訳、文章の書き換え、コードの生成などができます。ただし、LLMが選ぶのは文脈上もっともらしい続きです。事実として正しいとは限りません。生成された文章は、人が内容を確認してから使う必要があります。

AIチャットの返答はどこで作られるのか

次のトークンを繰り返し予測する計算を、どこで実行するかを考えてみましょう。多くのAIチャットでは、モデルはサービスを提供する会社のサーバーで動いています。PCやスマートフォンは文章をサーバーへ送り、サーバー上のLLMが返答を組み立てます。画面には、その結果が返ってきます。

処理の流れを単純にすると、次のようになります。

入力 → インターネット → サーバー上のLLM → 返答

一方、ローカルLLMでは、モデルのファイルを自分のPCへ保存し、そのPC上で生成を実行します。

入力 → PC内のアプリ → PC内のLLM → 返答

モデルを最初に取得するときはインターネットが必要です。取得後にローカルモデルを使う場合、この記事で入力する文章と生成処理はPC上のOllamaで扱われます。ただし、Ollamaにはクラウドモデルもあります。Ollamaを使えば、どのモデルでも自動的にローカル実行になるわけではありません。

Terminalから入力した文章がlocalhostのOllamaとPC内のモデルを通り、生成結果として戻る流れ

Ollamaとは何か

Ollamaは、AIモデルの取得、管理、起動と、ローカルAPIの公開をまとめて扱うアプリです。Ollama自体がLLMなのではありません。OllamaがモデルをPCへ保存し、必要なときに読み込み、Terminalや別のプログラムから使える状態にします。

この記事では、次の流れで使います。

  1. PCに合うモデルを探す
  2. Ollamaをインストールする
  3. モデルを取得する
  4. Terminalでモデルと会話する
  5. HTTP APIとPythonから同じモデルを呼ぶ

PCに合うモデルを探す

ローカルLLMは、モデルによって必要なストレージやメモリが違います。名前が似ていても、モデルの大きさや量子化の形式によって必要な容量は変わります。

まず、Ollamaのモデル検索で、Ollamaから利用できるモデルを探します。検索結果では、モデル名のほか、用途、機能、パラメータ規模などを確認できます。モデルのページを開くと、qwen3.5:4bのような実行時の名前と、ダウンロードするファイルの大きさも分かります。

次に、Can I Run AIを使うと、自分のGPUやMac、メモリなどをもとに、動かせそうなオープンモデルを探せます。これは目安として使い、最後にOllamaのモデルページで、使いたいモデルとタグが配布されているかを確認してください。Can I Run AIに掲載されているすべてのモデルが、そのままOllamaで使えるとは限りません。

この記事では、Qwen3.5の二つのサイズを使います。

モデル 配布サイズ この記事での使い方
qwen3.5:0.8b 約1.0GB 最初に動作を確認する
qwen3.5:4b 約3.4GB 出力を比較し、Pythonアプリで使う

サイズは2026年8月26日にOllamaのモデルページで確認した値です。配布内容は更新されることがあります。空き容量やメモリに余裕がなければ、まず0.8Bだけで手順を試してください。

Ollamaをインストールする

Ollamaのダウンロードページを開き、自分のOSに合うものをインストールします。OllamaはmacOS、Windows、Linuxで利用できます。初めて使う場合は、公式ページの案内に沿ってアプリをインストールする方法が分かりやすいでしょう。

インストール後、macOSでは「ターミナル」、Windowsでは「PowerShell」を開き、次のコマンドを実行します。

ollama --version

ollama version is ...のように表示されたら、TerminalからOllamaを呼び出せています。command not foundと表示された場合は、Ollamaを一度起動し、Terminalを開き直してください。

次のコマンドだけを実行すると、Ollamaの対話メニューを開けます。

ollama

利用できるコマンドを詳しく確認したいときは、次を使います。

ollama --help

最初に覚えるOllamaのコマンド

ここから使う基本コマンドを先に整理します。

コマンド 何をするか
ollama pull <モデル名> モデルをPCへ取得する
ollama ls 取得済みのモデルを一覧表示する
ollama run <モデル名> モデルを起動して会話する
ollama ps 現在読み込まれているモデルを確認する
ollama stop <モデル名> 読み込まれているモデルを停止する
ollama rm <モデル名> 取得済みのモデルをPCから削除する

<モデル名>の部分は、qwen3.5:0.8bのような実際の名前に置き換えます。pullはモデルのファイルを保存する操作、runは保存したモデルを読み込んで使う操作です。この二つを分けて考えると、何を待っているのかが分かりやすくなります。

小さいモデルを取得する

最初は、約1.0GBのqwen3.5:0.8bを取得します。

ollama pull qwen3.5:0.8b

ダウンロードが終わったら、取得済みモデルの一覧を表示します。

ollama ls

一覧にqwen3.5:0.8bがあれば、モデルのファイルはPCに保存されています。SIZEには、そのモデルがストレージ上で使っている容量が表示されます。

Terminalでモデルと話す

取得したモデルを起動します。

ollama run qwen3.5:0.8b --think=false

>>>が表示されたら、次の文章を入力してください。

ローカルで動いています、と一文だけ返してください

返答が表示されたら、PC上のモデルをTerminalから呼び出せています。会話を終了するときは、次を入力します。

/bye

OllamaのCLIでは、対応モデルの思考表示が既定で有効です。この記事では最終的な返答だけを見やすくするため、--think=falseを指定しています。

現在読み込まれているモデルは、別のTerminalで確認できます。

ollama ps

すぐにメモリから外したい場合は、次のように停止します。

ollama stop qwen3.5:0.8b

モデルのファイル自体が不要になった場合は、次のコマンドで削除できます。削除すると、再び使うときにダウンロードが必要です。

ollama rm qwen3.5:0.8b

この記事では、このあと0.8Bと4Bを比較するため、まだ削除しません。

モデルの大きさで出力がどう変わるか

0.8Bで動作を確認できたら、4Bも試してみます。

ollama pull qwen3.5:4b
ollama run qwen3.5:4b --think=false

0.8Bと4Bへ同じ文章を渡し、先生へ送る丁寧な文章に整えるよう頼んだところ、出力に違いが出ました。

次の文章を、大学の先生に送る自然で丁寧な1文に整えてください。
意味を変えず、元の文章にない情報は足さないでください。

明日のゼミなんですけど、ちょっと用事あって遅れます。すみません。

qwen3.5の0.8Bと4Bへ同じ文章整形を依頼し、小さいモデルでは意味が崩れ、4Bでは自然な敬語になった実行結果の比較

このとき、0.8Bは謝罪を「お礼」に変えてしまいました。4Bは元の意味を保ち、自然な敬語へ整えられました。

この一回の比較だけで、4Bが常に正しいとは言えません。大きなモデルでも誤ることはあります。同じ入力を試し、速度、出力、PCの負荷を見ながら、自分の用途に合うモデルを選びます。この先のPythonアプリでは4Bを使います。動作が重い場合は、0.8Bへ置き換えても手順を確認できます。

なぜ数十億個のパラメータがPCに収まるのか

qwen3.5:4bのモデルページを見ると、実際のパラメータ数は4.66Bで、配布サイズは約3.4GBです。4.66Bは約46億6000万個のパラメータを表します。

仮に一つのパラメータを2バイトのFP16で保存すると、重みだけで約9.3GBになります。それより小さな3.4GBで配布できる理由が量子化です。

量子化で数値を小さく持つ

モデルには、学習で決まった重みと呼ばれる数値が大量にあります。量子化は、その数値をFP16やFP32より少ないビット数で近似して保存し、計算する方法です。

パラメータの個数を単純に減らすのではありません。同じモデルの数値を、より少ない情報量で表します。必要なストレージとメモリを減らせる一方、出力の精度が変わる可能性があります。

今回使うqwen3.5:4bは、OllamaのモデルページでQ4_K_Mと表示されています。この記事では自分で量子化するのではなく、あらかじめ量子化されたモデルを取得して使います。

蒸留で小さなモデルを作る

蒸留は、量子化とは別の方法です。大きな教師モデルの出力を学習に使い、より小さな生徒モデルを作ります。

量子化は、同じモデルの数値の持ち方を変える方法です。蒸留は、小さな別のモデルを学習させる方法です。小型モデルがすべて蒸留で作られているわけではありません。

量子化では同じモデルの重みの表現を軽くし、蒸留では教師モデルの知識を小さな生徒モデルへ移す違いを示した図

先ほど比較した0.8Bと4Bは、量子化の強さだけが違うわけではありません。主にモデルのパラメータ数が違います。「何Bか」と「どの形式で量子化されているか」は、分けて確認します。

TerminalからHTTP APIを呼ぶ

Terminalで会話できた時点で、OllamaはPC上でモデルを動かせています。次は、そのモデルを別のプログラムから使う入口を確認します。

Ollamaは、通常http://localhost:11434/apiでHTTP APIを公開します。localhostは、今使っているPC自身を指す名前です。

別のTerminalを開き、次を実行します。

curl http://localhost:11434/api/chat \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.5:4b",
    "messages": [
      {
        "role": "user",
        "content": "ローカルLLMを一言で説明してください"
      }
    ],
    "think": false,
    "stream": false
  }'

このリクエストでは、次の内容をOllamaへ渡しています。

  • model: 使うモデル
  • messages: モデルへ渡す会話
  • role: 発言者の種類。ここでは利用者を示すuser
  • content: 実際に送る文章
  • think: 思考の出力を使うか
  • stream: 返答を分割して受け取るか

streamfalseにすると、返答を一つのJSONとして受け取れます。生成された文章はmessage.contentに入ります。

Terminalで使ったollama runと、HTTP APIは別々のモデルを動かしているわけではありません。どちらもPC上のOllamaへ入力を渡す方法です。

Pythonで文章整形アプリを作る

最後に、Pythonから同じAPIを使います。作業用フォルダーと仮想環境を用意し、Ollamaの公式Pythonライブラリをインストールします。

macOSまたはLinuxでは、次を実行します。

mkdir ollama-practice
cd ollama-practice
python3 -m venv .venv
source .venv/bin/activate
python -m pip install ollama

Windows PowerShellでは、次を実行します。

mkdir ollama-practice
cd ollama-practice
py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install ollama

polite_rewriter.pyというファイルを作り、次のコードを保存します。

from ollama import chat

MODEL = "qwen3.5:4b"

text = input("先生に送りたい文章を入力してください: ")

response = chat(
    model=MODEL,
    messages=[
        {
            "role": "user",
            "content": f"""次の文章を、大学の授業で先生に送る
自然で丁寧な日本語に整えてください。

条件:
- 意味を変えない
- 元の文章にない予定や理由を推測しない
- 原文にある情報だけを使い、敬語と助詞を整える
- 1文にする

元の文章:
{text}
""",
        }
    ],
    think=False,
    options={"temperature": 0.3, "seed": 42},
)

print("\n整えた文章:")
print(response.message.content)

保存したら、仮想環境を有効にしたTerminalで実行します。

python polite_rewriter.py

入力例は「明日のゼミなんですけど、ちょっと用事あって遅れます。すみません。」です。

くだけたゼミ遅刻の連絡文を、localhostで動くqwen3.5の4Bモデルが丁寧な文章へ整えた実行例

このコードの中心はchat()です。先ほどcurlで渡したmodelmessagesを、Pythonの書き方に置き換えています。Pythonは入力をOllamaへ渡し、返ってきたmessage.contentを表示します。文章を生成するモデルは、PC上のOllamaが動かしています。

生成された文章は、送る前に必ず読み返してください。LLMは文体を整えながら、元になかった情報を足したり、意味を変えたりすることがあります。これはローカルでもクラウドでも変わりません。

うまく動かないとき

ollama: command not foundと表示される

Ollamaアプリを起動し、Terminalを開き直します。それでも解決しなければ、公式のインストール手順を確認してください。

取得したモデルが見つからない

ollama lsでモデル名を確認します。必要なモデルがなければ、ollama pull <モデル名>でもう一度取得します。

返答が遅い、PCが重い

ollama psで読み込まれているモデルを確認します。ほかの重いアプリを閉じるか、まずqwen3.5:0.8bを使ってください。速度はモデルの大きさだけでなく、PCのメモリ、GPU、入力の長さでも変わります。

Pythonから接続できない

先にollama run qwen3.5:4b --think=falseで会話できるか確認します。次にcurl http://localhost:11434/api/tagsを実行し、OllamaのAPIへ届くかを切り分けます。

まとめ

LLMは、入力された文章と文脈をもとに、続きの文章を生成するモデルです。多くのAIチャットではサーバー上のモデルを使いますが、Ollamaを使えば、自分のPCに保存したモデルをTerminalやプログラムから呼び出せます。

今回は、PCに合うモデルの探し方を確認し、pulllsrunpsstoprmの役割をたどりました。そのうえで、Terminalからの会話、HTTP API、Pythonアプリを同じOllamaへつなぎました。

次の「ローカルLLMを動かす道具の役割」では、VS Code、Python、pip、Ollamaを分け、それぞれがどこを担当しているのかを整理します。