Ollama Python入門|ローカルLLMをゼロから動かす方法を解説

テックツール

Claude APIやOpenAI APIをずっと使ってきたんですが、「全部クラウドに投げていいのかな」とモヤモヤすることが増えてきました。社内の話題や個人的なメモをAIに食わせるのはちょっとためらう、みたいな場面です。そこで今回はOllamaを使ってローカルでLLMを動かし、Pythonから呼び出すところまでをまとめました。

この記事でわかること:

  • Ollamaとは何か、クラウドLLMとの違い
  • Ollamaのインストール(Mac / Linux)
  • モデルの取得と起動方法
  • Pythonライブラリ(ollama)を使ったチャット・ストリーミングの実装
  • 会話履歴を保持した簡易チャットボットの実装方法
  • 2026年8月時点でのおすすめモデル選び
  • ハマりやすいポイントと対処法

Ollamaとは

OllamaはローカルでLLMを実行・管理できるオープンソースツールです。ollama run モデル名の一行でモデルのダウンロードから起動まで完結するのが最大の強みで、HuggingFaceと比べるとセットアップのコストが段違いに低い。

REST APIをローカルの11434番ポート(デフォルトでは 127.0.0.1:11434)で公開するので、curlでも叩けますし、公式のPythonライブラリを使えばもっと楽に扱えます。OpenAI APIと互換性のあるエンドポイント(/v1系)も持っているので、既存のコードを流用しやすいのもポイントです。

ローカルLLMの入口として、いま最も使われているツールの一つといえます。オンプレミスやプライベート環境でLLMを動かしたい場合の定番選択肢になってきています。

インストール

Mac

公式サイト(ollama.com/download)からアプリをダウンロードして、Applicationsフォルダにドラッグ&ドロップするだけです。

Homebrewが好きな人はこちら:

brew install ollama

Linux

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

インストール後、バックグラウンドでサーバーが自動起動する構成になっていることが多いようです。起動してるか確認したいときは:

ollama --version

モデルを取得して起動する

よく使うCLIコマンドをまとめておきます。

# モデルをダウンロードして対話モードで起動
ollama run qwen3:8b

# ダウンロードだけしておく(起動はしない)
ollama pull gemma3:4b

# 取得済みモデルの一覧
ollama list

# モデルを削除
ollama rm gemma3:4b

初回のollama runはモデルのダウンロードが走るので少し待ちます。サイズ感はモデルや量子化方式によりますが、7Bクラスだと数GBになることが多いです。コーヒーでも淹れてください。

2026年8月時点でのおすすめモデル

正直モデルの選択肢が多すぎてよくわからなくなってきているんですが、今の時点で調べた限りだとこんな感じです。

  • Qwen3:8b(日本語全般):日本語環境での推奨モデルとして複数の記事で言及されています。Alibaba Cloudが大規模な多言語コーパスで事前学習しており、日本語性能が高い。Apache 2.0ライセンスで商用も通しやすい。
  • gemma3:4b(軽量・ツール連携):Googleのモデル。4Bと軽量ながらバランスが取れていて、Tool Use系の用途にも使いやすいと評判です。
  • qwen2.5-coder:7b(コード補完):コーディング特化。Cursorと並行してローカルで補助させる使い方が面白そうです。
  • deepseek-r1:8b(推論・思考):推論系のタスクに強い。思考過程を出力してくれるのが地味に便利です。

コンシューマ向けGPU(RTX 3060 12GB以下やM1/M2 Macの8GBユニファイドメモリ構成)では、Q4_K_M量子化済みの7〜8Bクラスが現実的な選択肢になるようです。

PythonからOllamaを呼び出す

公式のollamaPythonライブラリは、OllamaのREST APIをPythonicなインターフェースにラップしたもので、sync・asyncの両方に対応しています。

pip install ollama

シンプルなチャット

import ollama

response = ollama.chat(
    model="qwen3:8b",
    messages=[
        {"role": "user", "content": "Pythonでフィボナッチ数列を書いて"}
    ]
)

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

responseはdictっぽく扱えるので、response["message"]["content"]で中身を取り出せます。サンプルによってはドットアクセスでresponse.message.contentみたいに扱えることもあります。

ストリーミング

レスポンスが全部返ってくるのを待ってから表示するのは体験が悪いので、ストリーミングを使うのがおすすめです。

import ollama

stream = ollama.chat(
    model="qwen3:8b",
    messages=[{"role": "user", "content": "Pythonの非同期処理をざっくり説明して"}],
    stream=True,
)

for chunk in stream:
    print(chunk["message"]["content"], end="", flush=True)

stream=Trueにするとジェネレータが返ってくるので、forで回して各チャンクのmessage.contentを取り出す形になります。リアルタイムで回答が表示されるため、体験がかなり改善されます。

システムプロンプトを設定する

import ollama

response = ollama.chat(
    model="qwen3:8b",
    messages=[
        {"role": "system", "content": "あなたはPythonの専門家です。コードの説明は日本語で簡潔に行ってください。"},
        {"role": "user", "content": "デコレータとは何ですか?"}
    ]
)

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

system roleでモデルの振る舞いをコントロールできます。これはOpenAI APIと同じインターフェースなので、既存の知識がそのまま活かせます。

会話履歴を持つチャットボットを作る

実際に使うとなると、やっぱり会話の文脈を保持させたい。messagesリストに履歴を積み上げていくだけで実現できます。

import ollama

def chat():
    messages = [
        {"role": "system", "content": "あなたは親切なアシスタントです。日本語で回答してください。"}
    ]

    print("チャット開始('exit' で終了)\n")

    while True:
        user_input = input("You: ")
        if user_input.lower() == "exit":
            break

        messages.append({"role": "user", "content": user_input})

        stream = ollama.chat(
            model="qwen3:8b",
            messages=messages,
            stream=True,
        )

        print("AI: ", end="")
        full_response = ""
        for chunk in stream:
            content = chunk["message"]["content"]
            print(content, end="", flush=True)
            full_response += content

        print()
        # ここ重要: 履歴に追加しないと文脈が消える
        messages.append({"role": "assistant", "content": full_response})

if __name__ == "__main__":
    chat()

会話が長くなるとコンテキストウィンドウを超えてしまうので、実用的にはメッセージ数を一定数でトリミングするか、要約を挟む工夫が必要になります。このあたりはまだいい感じの実装を模索中です。

REST APIで直接叩く方法も一応

Pythonライブラリを使わずにrequestsで直接REST APIを叩くこともできます。他の言語から使いたいときや、ライブラリを使わずシンプルにやりたいときに。

import requests

response = requests.post(
    "http://localhost:11434/api/chat",
    json={
        "model": "qwen3:8b",
        "messages": [{"role": "user", "content": "こんにちは"}],
        "stream": False,
    }
)

print(response.json()["message"]["content"])

OllamaはOpenAI互換のREST API(http://localhost:11434/v1)も提供しているので、openaiライブラリ側のbase_urlhttp://localhost:11434/v1に変えることで既存コードを流用できるケースがあります。Claude APIからOllamaに切り替えてローカルでテストする、みたいな使い方には特に便利です。

ハマりポイントと注意点

  • モデルのライセンス確認は必須:Ollama自体は無料で利用できるツールですが、実際に使用するモデルのライセンスはそれぞれ異なります。商用利用や再配布の可否などはモデルごとに確認が必要です。
  • 初回のレスポンスが遅い:モデルのロードに時間がかかります。2回目以降はキャッシュされてかなり速くなるので、ベンチマーク的な計測をするときは注意です。
  • メモリ不足でクラッシュする:搭載メモリより大きなモデルを動かそうとするとOSが悲鳴を上げます。モデルサイズ選びは慎重に。
  • サーバーが起動していないとエラー:Ollamaのサーバープロセスが動いていないとPythonから呼んでもConnectionErrorになります。Macならメニューバーのアイコンで確認できます。

余談ですが、AWS LambdaでOllamaを動かそうとするのはさすがに無理があるので、Lambda上でローカルLLMを使いたい場合は別の選択肢を検討したほうがよさそうです。

まとめ

セットアップの手軽さで言うと、Ollamaはほんとうに敷居が低いです。pip install ollamaしてモデルをpullするだけで、数分後にはPythonからLLMが叩ける状態になっています。APIコストを気にせず試行錯誤できるのは純粋に楽しい。

次はRAGを組み合わせて自分のメモをコンテキストに突っ込む実験をやってみたいと思っています。Embeddingも取れるようなので、外部のAPIを使わずに完結させられそうなんですよね。

参考になったらクリックしてもらえると嬉しいです!

Blogmura NetDev Ranking
タイトルとURLをコピーしました