OllamaをPythonと統合する: REST APIとPythonクライアントの例

+ 思考型LLMを使用した具体的な例

目次

この投稿では、PythonアプリケーションをOllamaに接続する方法について2つの方法を紹介します。1つ目はHTTP REST APIを介して、2つ目は公式のOllama Pythonライブラリを介して行います。

チャット生成の呼び出しの両方をカバーし、**「思考モデル」**を効果的に使用する方法についても説明します。

ollama and python

Ollama は、大規模言語モデル(LLM)をローカルで実行する最も便利な方法の1つとして急速に普及しています。シンプルなインターフェースと、Llama 3MistralQwen2.5、そしてqwen3などの「思考」バリアントを含む人気のあるオープンモデルへのサポートにより、外部のクラウドAPIに依存することなく、PythonプロジェクトにAI機能を簡単に組み込むことができます。


🧩 事前準備

始めに、以下のものを準備してください:

  • Ollamaをローカルにインストールし、実行中であることを確認してください(ollama serve
  • Python 3.9以上
  • 必要な依存関係:
pip install requests ollama

Ollamaが実行中であることを確認するために以下を実行してください:

ollama list

llama3mistralqwen3などの利用可能なモデルが表示されるはずです。


⚙️ オプション1: OllamaのREST APIを使用する

HTTPリクエストを処理するフレームワークと統合する必要がある場合、または最大限の制御を必要とする場合に、REST APIは理想的です。

例1: チャットAPI

import requests
import json

url = "http://localhost:11434/api/chat"

payload = {
    "model": "llama3.1",
    "messages": [
        {"role": "system", "content": "あなたはPythonのアシスタントです。"},
        {"role": "user", "content": "文字列を逆順に返す関数を書くようにしてください。"}
    ]
}

response = requests.post(url, json=payload, stream=True)

for line in response.iter_lines():
    if line:
        data = json.loads(line)
        print(data.get("message", {}).get("content", ""), end="")

👉 OllamaのREST APIは、OpenAIのストリーミングAPIと同様に、行ごとに応答をストリーミングします。チャットボットやCLIツールでリアルタイムに表示したり、コンテンツを蓄積したりできます。


例2: 生成API

チャットコンテキストやロールが必要ない場合は、シンプルな/api/generateエンドポイントを使用してください:

import requests

url = "http://localhost:11434/api/generate"
payload = {
    "model": "llama3.1",
    "prompt": "再帰を1文で説明してください。"
}

response = requests.post(url, json=payload, stream=True)
for line in response.iter_lines():
    if line:
        print(line.decode("utf-8"))

このエンドポイントは、要約やコードスニペットなどのワンショットテキスト生成タスクに最適です。


🐍 オプション2: Ollama Pythonライブラリを使用する

Ollama Pythonクライアントは、Pythonに完全に留まっている開発者にとって、より洗練されたインターフェースを提供します。

例1: チャットAPI

import ollama

response = ollama.chat(
    model="llama3.1",
    messages=[
        {"role": "system", "content": "あなたはコードのアシスタントです。"},
        {"role": "user", "content": "あるディレクトリ内のすべてのファイルを一覧表示するPythonスクリプトを生成してください。"}
    ]
)

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

これは、最終的なメッセージを辞書として返します。ストリーミングが必要な場合は、チャットストリームをイテレートできます:

stream = ollama.chat(
    model="llama3.1",
    messages=[
        {"role": "user", "content": "再帰についての俳句を書くようにしてください。"}
    ],
    stream=True
)

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

例2: 生成API

import ollama

output = ollama.generate(
    model="llama3.1",
    prompt="Pythonにおけるデコレータの概念を要約してください。"
)

print(output['response'])

またはストリーミングして結果を取得できます:

stream = ollama.generate(
    model="llama3.1",
    prompt="PythonでAIプロジェクトに使用する3つの利点を挙げてください。",
    stream=True
)

for chunk in stream:
    print(chunk['response'], end='', flush=True)

🧠 「思考」モデルの使用

Ollamaは、*qwen3などの「思考モデル」*をサポートしており、中間の推論ステップを示すように設計されています。これらのモデルは、以下のような構造化された出力を生成します:

</think>

最終的な答えはこちら。

これは、以下のような用途に役立ちます:

  • モデルの推論をデバッグ
  • 解釈性に関する研究
  • 思考出力を分離したツールの構築

例: 「思考」モデルの使用

import ollama

response = ollama.chat(
    model="qwen3",
    messages=[
        {"role": "user", "content": "オーストラリアの首都はどこですか?"}
    ]
)

content = response['message']['content']

# 「思考」部分を抽出する場合
import re
thinking = re.findall(r"</think>", content, re.DOTALL)
answer = re.sub(r"</think>", "", content, flags=re.DOTALL)

print("🧠 思考プロセス:\n", thinking[0].strip() if thinking else "N/A")
print("\n✅ 最終的な答え:\n", answer.strip())

「思考」モデルを使用するべきケース

使用ケース 推奨モデル 理由
解釈性 / デバッグ qwen3 推論トレースを表示
パフォーマンスに敏感なアプリ qwen3 non-thinking mode より高速で、簡潔
教育的 / 説明的用途 qwen3 ステップバイステップの論理を表示

✅ まとめ

タスク REST API Pythonクライアント
簡単なテキスト生成 /api/generate ollama.generate()
会話型チャット /api/chat ollama.chat()
ストリーミングサポート はい はい
「思考」モデルとの併用 はい はい

Ollamaのローカルファースト設計により、セキュリティ、オフライン、プライバシーに敏感なAIアプリケーションに最適です。インタラクティブなチャットボットを構築するか、バックグラウンドのデータエンリッチメントサービスを構築するかに関係なく、LLMをPythonワークフローにシームレスに統合できます。モデル、レイテンシー、データの完全な制御が可能です。

有用なリンク