OllamaをPythonで統合する: REST APIおよびPythonクライアントの例

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

目次

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

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

ollama and python

Ollama は、大規模言語モデル(LLM)をローカルで実行する最も手軽な方法の一つとして急速に普及しています。 OllamaがvLLM、Docker Model Runner、LocalAI、クラウドプロバイダーと比較してどの場合に選ぶべきかについては、LLM Hosting: Local, Self-Hosted & Cloud Infrastructure Comparedを参照してください。 シンプルなインターフェースと、Llama 3MistralQwen2.5qwen3などの「思考」バリアントを含む人気のオープンモデルへのサポートにより、外部のクラウド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"