OllamaをPythonで統合する: REST APIおよびPythonクライアントの例
+ 思考型LLMを使用した具体的な例
この投稿では、PythonアプリケーションをOllamaに接続する2つの方法について紹介します。1つ目はHTTP REST APIを使用する方法、2つ目は公式のOllama Pythonライブラリを使用する方法です。
チャットと生成の呼び出しの両方をカバーし、**「思考モデル」**を効果的に使用する方法についても説明します。

Ollama は、大規模言語モデル(LLM)をローカルで実行する最も手軽な方法の一つとして急速に普及しています。 OllamaがvLLM、Docker Model Runner、LocalAI、クラウドプロバイダーと比較してどの場合に選ぶべきかについては、LLM Hosting: Local, Self-Hosted & Cloud Infrastructure Comparedを参照してください。 シンプルなインターフェースと、Llama 3、Mistral、Qwen2.5、qwen3などの「思考」バリアントを含む人気のオープンモデルへのサポートにより、外部のクラウドAPIに依存することなく、PythonプロジェクトにAI機能を直接組み込むことが簡単になります。
🧩 事前準備
取り組む前に、以下のものを準備してください:
pip install requests ollama
Ollamaが実行中であることを確認するために以下を実行してください:
ollama list
llama3、mistral、qwen3などの利用可能なモデルが表示されるはずです。
⚙️ オプション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"