Ollama APIをLangChain / LlamaIndex から叩く:ローカルLLMアプリ開発入門

AI・ローカルLLM活用上級
OllamaLangChainLlamaIndexPythonRAG

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-ollamaOllamaEmbeddings を使います。

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 — どちらを選ぶか

比較軸LangChainLlamaIndex
主な用途エージェント・ツール統合・複雑なチェーンRAG・ドキュメント検索・クエリパイプライン
LLMクラスChatOllamaOllama
EmbeddingクラスOllamaEmbeddingsOllamaEmbedding
学習コスト高め(抽象化レイヤーが多い)低め(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] まで概要をお送りください。

関連記事

AI・ローカルLLM活用社内RAGの精度を上げる5つのチューニング:チャンク設計からRerankerまでAI・ローカルLLM活用RAG(検索拡張生成)とは:社内文書検索AIをゼロから理解するAI・ローカルLLM活用pgvector vs Qdrant vs Chroma:ベクターDB選定の判断基準と用途別推奨
記事一覧に戻る