Ollama APIをLangChain / LlamaIndex から叩く:ローカルLLMアプリ開発入門
TL;DR
単純なRAGや社内ドキュメント検索なら LlamaIndex、エージェント・ツール統合・複雑なパイプラインなら LangChain。まず LlamaIndex で動かして、複雑さが必要になったときに LangChain へ移行するのが、詰まりにくい順序です。
Ollama API の基礎:Python から叩く前に確認する3つのエンドポイント
OllamaはインストールするとAPIサーバーがデフォルトで http://localhost:11434 に立ち上がります(Ollama公式ドキュメント)。LangChainやLlamaIndexの内部では、このAPIを直接HTTPで呼びに行きます。
LangChain / LlamaIndex のどちらを選ぶにしても、3つのエンドポイントの役割を理解しておくと、エラーが出たときの原因の特定が速くなります。
| エンドポイント | 用途 | 備考 |
|---|---|---|
POST /api/chat | チャット(会話履歴付き) | LangChain ChatOllama / LlamaIndex Ollama はここを叩く |
POST /api/generate | 単発のテキスト補完 | chat より低レベル。会話履歴なし |
POST /api/embed | 埋め込みベクトル生成 | 現行エンドポイント(GitHub APIリファレンス) |
/api/embeddings との混同に注意してください。 /api/embeddings(複数形)は旧エンドポイントで現在は非推奨です。GitHubのAPIリファレンスには現行は /api/embed(単数形)と明記されています。古いブログ記事やStack Overflowの回答はこの旧エンドポイントを使っているものが多く、コードをそのままコピーすると想定外の動作につながります。
もう1つ、デフォルトのコンテキスト窓は 4,096トークン です(Ollama公式FAQ)。stream: false を指定すると、ストリーミングなしでレスポンスが一括で返ります。デフォルトはストリーミングONなので、スクリプト内で単純に結果を受け取りたい場合は stream: false を明示するか、後述のSDKの streaming パラメータで制御します。
LangChain から Ollama を叩く(langchain-ollama パッケージ)
インストールと最小チャット
まずパッケージをインストールします。
pip install -qU langchain-ollama
langchain-community から langchain-ollama への移行が必要です。 LangChain公式ドキュメントには langchain_ollama パッケージに移行するよう明示されています(LangChain公式 ChatOllamaページ)。langchain_community.chat_models.ChatOllama は非推奨パスで、ImportError に遭遇した場合はこの移行が原因の大半を占めます。
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage
llm = ChatOllama(model="llama3.1:latest")
response = llm.invoke([HumanMessage(content="Ollamaとは何ですか?")])
print(response.content)
OllamaEmbeddings と最小 RAG
埋め込みには同じく langchain-ollama の OllamaEmbeddings を使います。
pip install -qU langchain-ollama langchain-core
InMemoryVectorStore を使うとストレージの設定なしに動作確認ができます。
from langchain_ollama import ChatOllama, OllamaEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_core.documents import Document
# Embeddingモデルの指定(LangChain公式ドキュメントの例より)
embeddings = OllamaEmbeddings(model="qwen3-embedding:8b", dimensions=1024)
# ベクトルストア作成
vectorstore = InMemoryVectorStore(embeddings)
# ドキュメント追加
docs = [
Document(page_content="Ollamaはローカルでモデルを動かすランタイムです"),
Document(page_content="LangChainはLLMアプリ構築のフレームワークです"),
]
vectorstore.add_documents(docs)
# 検索
results = vectorstore.similarity_search("ローカルLLMとは", k=2)
for r in results:
print(r.page_content)
実際のRAGパイプラインでは、InMemoryVectorStore を ChromaDB や Qdrant 等の永続ストアに差し替えます。この最小コードで動作が確認できてから差し替えるのが、デバッグの工数を減らせる順序です。
ChatOllama の対応機能マトリクス(2026-06-30時点)
| 機能 | 対応状況 |
|---|---|
| ストリーミング | ✅ |
| ツール呼び出し(Tool calling) | ✅ |
| 構造化出力(JSON mode) | ✅ |
| Token usage の返却 | ❌(2026-06-30時点では未対応) |
Token usage が返らない点は、ローカル運用のコスト管理には直接影響しませんが、API呼び出し数のモニタリングをTokenベースで組んでいる場合には注意が必要です。
LlamaIndex から Ollama を叩く(llama-index-llms-ollama パッケージ)
インストールと最小チャット
pip install llama-index llama-index-llms-ollama llama-index-embeddings-ollama
LlamaIndexのOllama統合では request_timeout パラメータが重要です。
from llama_index.llms.ollama import Ollama
llm = Ollama(model="llama3.1:latest", request_timeout=120.0)
response = llm.complete("Ollamaとは何ですか?")
print(response)
request_timeout のデフォルトは30秒です(LlamaIndex公式 Ollama LLM例)。 7Bより大きいモデルや長いプロンプトでは、30秒以内に初回トークンが返らずタイムアウトします。公式ドキュメントでも request_timeout=120.0 が推奨値として示されています。エラーメッセージが ReadTimeout の場合、まずこの値を引き上げてください。
OllamaEmbedding と RAG パイプライン
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
# グローバル設定(Settings でモデルを一括指定)
Settings.llm = Ollama(model="llama3.1:latest", request_timeout=120.0)
Settings.embed_model = OllamaEmbedding(model_name="nomic-embed-text")
# ドキュメント読み込みとインデックス作成
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents)
# クエリエンジンで検索
query_engine = index.as_query_engine()
response = query_engine.query("社内LLMの導入手順を教えてください")
print(response)
インデックスを永続化するには StorageContext を使います。
from llama_index.core import StorageContext, load_index_from_storage
# 保存
index.storage_context.persist(persist_dir="./storage")
# 復元
storage_context = StorageContext.from_defaults(persist_dir="./storage")
index = load_index_from_storage(storage_context)
動作環境のRAM要件について。 LlamaIndex公式のローカルRAGスターター例には「少なくとも約32GB以上のRAMを搭載したマシンが必要」と明記されています(LlamaIndex公式 ローカルRAGスターター例)。Ollama単体の動作はそれより少ないRAMでも可能ですが、LlamaIndexのRAGパイプライン全体をローカルで回す場合はこの要件を念頭に置いてください。
OllamaEmbeddingが返すベクトルの次元数はモデルによって変わります。LlamaIndex公式ドキュメントの例では nomic-embed-text で768次元の確認例が示されています(LlamaIndex公式 OllamaEmbedding例)。
LangChain vs LlamaIndex — どちらを選ぶか
| 比較軸 | LangChain | LlamaIndex |
|---|---|---|
| 主な用途 | エージェント・ツール統合・複雑なチェーン | RAG・ドキュメント検索・クエリパイプライン |
| LLMクラス | ChatOllama | Ollama |
| Embeddingクラス | OllamaEmbeddings | OllamaEmbedding |
| 学習コスト | 高め(抽象化レイヤーが多い) | 低め(RAGに集中した設計) |
| 本番スケール | チェーン・エージェントの組み合わせで柔軟 | シンプルなRAGは素早く本番投入できる |
判断のガイドライン:
- 社内ドキュメントをベクトル化して検索させるだけなら → LlamaIndex で始める
- Webブラウジング・コード実行・複数ツールを組み合わせるエージェントが要るなら → LangChain
- 「どちらか分からない」段階では → LlamaIndex で動かす。複雑さが増してきたら移行を検討する
実際のユースケースの多くは最初の段階でLlamaIndexの範囲に収まります。LangChainは機能が豊富な分、ドキュメントが多岐にわたりパッケージ構成も細かく変化します(langchain_community の非推奨もその一例です)。LlamaIndexで動作実績を積んでから、必要に応じてLangChainへ移行するのが詰まりにくい順序です。
実運用で詰まる4つの落とし穴
タイムアウト
LlamaIndexでは前述のとおり request_timeout のデフォルトが30秒です。LangChainの ChatOllama にも timeout パラメータがあります。どちらも長文生成や初回のモデルロードで超過しやすいため、開発初期は余裕を持った値(120秒前後)に設定しておくのが安全です。
並列リクエストとキュー制御
複数のリクエストを同時に送る場合、OLLAMA_NUM_PARALLEL 環境変数でモデルあたりの最大並列数を制御できます。この値はデフォルトが「4(またはメモリ量によっては1)」とされており(glukhov.org — Ollama並列リクエスト処理)、実際のデフォルト値はメモリ環境に依存します。設定前に手元の環境で検証することを推奨します。
並列スロットを増やすとVRAM使用量が増加します。7Bモデル(Q4_K_M量子化)の場合、並列スロットを1つ追加するごとにベースモデルのVRAMに対して約15〜25%の追加が必要です(markaicode.com — Ollama並列推論設定ガイド)。VRAM残量を確認してから値を決めてください。
OLLAMA_MAX_QUEUE はキューに積める最大リクエスト数です。キューが上限に達すると新規リクエストはエラーで返ります。本番環境ではこの値も設定しておくと、突発的な負荷でサーバーが無応答になる状況を防げます。
モデル切り替えとメモリ管理
Ollamaはロードしたモデルをしばらくメモリに保持します。keep_alive パラメータでこの保持時間を制御できます(0 に設定するとリクエスト後すぐにアンロード)。複数モデルを切り替えて使う場合、前のモデルがVRAMに残っていると次のモデルが載らないケースがあります。GET /api/ps でどのモデルが現在ロードされているか確認できます。
コンテキスト長
デフォルトのコンテキスト窓は4,096トークンです(Ollama公式FAQ)。長い社内ドキュメントをそのまま投入すると、4,096トークンを超えた部分は切り捨てられます。
環境変数 OLLAMA_CONTEXT_LENGTH でサーバー全体のデフォルトを変更できます。個別のリクエスト単位で変えたい場合は、APIの options.num_ctx パラメータを使います。LlamaIndexでは Ollama(context_window=8000) のように context_window を指定します(LlamaIndex公式 Ollama LLM例)。コンテキストを広げるとKVキャッシュのメモリ消費が増えるため、VRAMと相談しながら調整してください。
まとめ
LangChainとLlamaIndex、どちらもOllamaとの統合は公式パッケージで整備されています。選ぶ基準はシンプルで、「RAG・ドキュメント検索が主 → LlamaIndex」「エージェントやツール統合が要る → LangChain」です。
詰まりやすいポイントは、移行済みのパッケージを使っているか(langchain_ollama)、タイムアウト値が適切か、/api/embed と /api/embeddings を混同していないか、コンテキスト長がデフォルトのままになっていないか、この4点に集約されます。
まずLlamaIndexで社内RAGを動かし、実績を積んでから要件に応じてスケールさせるのが、工数を抑えながら本番に近づける現実的な進め方です。
社内RAGや自社システムへのLLM組み込みで詰まっている場合は、設計・構築の相談を受け付けています。[email protected] まで概要をお送りください。