ローカルLLMを使ってPDFや社内ドキュメントに対する高精度な質問応答システムを構築したい、あるいは自分専用のAIアシスタントに知識を持たせたい。そんなときに真っ先に候補に挙がるのがLlamaIndexです。2026年6月24日に v0.14.23 がリリースされた本フレームワークは、300を超える統合パッケージとエージェント指向のワークフロー機能を備え、RAG(Retrieval-Augmented Generation)構築のデファクトスタンダードの一つとなりました。
本記事では、LlamaIndexをゼロからインストールし、Ollamaと組み合わせた完全ローカルRAGシステムを構築するまでの手順を、公式ドキュメントを読み直す必要がないレベルまで詳しく解説します。競合のLangChain・Haystackとの徹底比較、動作要件、Windows/macOS/Linuxそれぞれのインストール手順、5つ以上の具体的なユースケース、エラー対処までを完全網羅した決定版です。
- LlamaIndexとは何か
- 最新リリース情報(2026年の主要アップデート)
- 他のRAGフレームワークとの比較
- メリットとデメリット
- 動作要件
- インストール手順
- 初期設定
- 基本的な使い方
- 実践的な使い方
- 応用・カスタマイズ
- パフォーマンス最適化
- よくあるエラーとトラブルシューティング
- エラー1: ImportError: cannot import name ‘X’ from ‘llama_index’
- エラー2: httpx.ConnectError: All connection attempts failed
- エラー3: TimeoutError during embed / query
- エラー4: MemoryError または OOM Killer 発動
- エラー5: pip install llama-index が異常に遅い / 依存関係解決に失敗
- エラー6: UnicodeDecodeError(Windows)
- エラー7: 回答に「I don’t know」しか返らない
- 他のツール・エコシステムとの連携
- 用途別 推奨PCスペック
- まとめ
- 📦 この記事で紹介した商品
LlamaIndexとは何か
LlamaIndexは、大規模言語モデル(LLM)と自前のデータをつなぐためのオープンソースフレームワークです。開発元は米国サンフランシスコに拠点を置くRun-Llama社で、2022年11月に「GPT Index」という名前で公開され、2023年にLlamaIndexへ改名されました。GitHubスター数は50,800を超え、フォーク数7,700、依存プロジェクト数は24,400を数える巨大エコシステムに成長しています。
ライセンスは MIT License。商用利用・改変・再配布いずれも認められており、企業のプロダクトに組み込む際の法的リスクが低いのが強みです。Pythonが主要言語ですが、TypeScript版(LlamaIndex.TS)も公式にメンテナンスされています。
LlamaIndexが解決する問題
LLMは学習データのカットオフ以降の情報を持っていません。またベースモデルは自社のマニュアルや個人の日記のような「LLMが知らない私的なデータ」に答えられません。この課題を解決するために生まれたのが RAG(Retrieval-Augmented Generation、検索拡張生成)という手法で、LlamaIndexはRAGを構築するためのあらゆる部品を提供します。
- PDF・Word・Markdown・SQL・APIなど100種類以上のデータソースからテキストを取り込む「Data Connectors」
- 取り込んだテキストをベクトル化・グラフ化して検索しやすくする「Data Indexes」
- ユーザの質問に応じて必要な情報だけを取り出す「Retrievers」と「Query Engines」
- 複数のツール・LLMを組み合わせて自律的に動く「Agents」と「Workflows」
- 本番運用に必須の観測・評価ツールへの統合(Arize、LangSmith、W&B等)
最新版バージョンとリリース日
2026年7月時点の最新安定版は llama-index v0.14.23(2026年6月24日リリース)です。llama-index-core は独立して更新されており、こちらも同時に v0.14.23 まで進んでいます。公式リポジトリはgithub.com/run-llama/llama_index、PyPIのプロジェクトページはpypi.org/project/llama-indexです。
最新リリース情報(2026年の主要アップデート)
直近6か月のLlamaIndex本体および周辺エコシステムの主要アップデートを整理します。学習データに頼らず、Release Notesを直接確認した情報です。
v0.14.23(2026年6月24日)
- マルチモーダル合成の第2弾(Multimodal Synthesis Part 2)で、テキスト・画像・動画を含むレスポンス生成の一貫性が向上
- Function ToolにおけるDocument BlockとVideo Blockの処理バグを修正
- バッチ重複排除処理を list から set に変更してパフォーマンス改善
- TreeSelectLeafRetriever でソースノードの保持が確実に
- Workflowのディープコピー処理を改善し、複数実行間の状態汚染を防止
2026年前半の重要アップデート
- LlamaParse v2 リリース(2026年1月): PDFやスキャン画像からの構造化抽出精度が飛躍的に向上。設定を4段階に簡素化し、料金も従来比で最大50%削減
- Agent Client Protocol 統合: エージェント間で状態と履歴を標準的にやり取りするための共通プロトコルに対応
- Pre-built Document Agent Templates: PDF読解・要約・Q&Aなどよくあるユースケースを即デプロイできるテンプレート群
- ParseBench: 文書解析ベンチマークがCVPR 2026に採録
- Parse-Flow: 視覚的な文書インテリジェンスワークフローを構築するビジュアルエディタが登場
破壊的変更に注意すべき点
2025年後半から2026年前半にかけて、モジュール構成の変更が続いています。特に古いブログ記事のコードは動かない可能性があるため、以下を必ず確認してください。
from llama_index import ...という古い一括インポートは廃止。from llama_index.core import ...と、統合パッケージ(llama_index.llms.ollamaなど)に分離済み- LLM/Embedding/Vector Storeは llama-index-core に含まれず、それぞれ個別パッケージのインストールが必要
ServiceContextは完全廃止済み。代わりにSettingsを使う
他のRAGフレームワークとの比較
2026年時点で主要なRAG/LLMオーケストレーションフレームワークとLlamaIndexを比較します。バージョンはいずれも本記事執筆時点(2026年7月)の最新版を各公式リポジトリで確認済みです。
| 項目 | LlamaIndex | LangChain | Haystack | Semantic Kernel |
|---|---|---|---|---|
| 最新版 | v0.14.23 | v1.3.13 | v2.31.0 | Python v1.44.0 |
| 公開年 | 2022年11月 | 2022年10月 | 2020年 | 2023年3月 |
| 開発元 | Run-Llama | LangChain, Inc. | deepset | Microsoft |
| 主要言語 | Python / TypeScript | Python / JS | Python | C# / Python / Java |
| ライセンス | MIT | MIT | Apache-2.0 | MIT |
| 得意分野 | RAG、文書検索、マルチモーダル | 汎用オーケストレーション、エージェント | 本番RAG、パイプライン評価 | 企業向け、.NET連携 |
| Ollama統合 | 公式パッケージ | 公式パッケージ | 公式パッケージ | コミュニティ提供 |
| 学習コスト | 低〜中 | 中〜高 | 中 | 中(.NET前提知識) |
| Vector Store統合数 | 60+ | 80+ | 40+ | 20+ |
使い分けの目安
- 純粋なRAG(社内文書検索・PDF Q&A)ならLlamaIndexが最速で構築できます。データ取り込み・チャンク分割・インデックス化のAPIが洗練されており、10行程度で動作するプロトタイプが完成します
- 汎用的なLLMエージェント・複雑なチェーンを組みたいならLangChainが優位。ツール数・チュートリアル数ともに最多
- 厳密な評価・本番運用を重視するならHaystack。パイプラインの評価機構と可観測性が充実
- Microsoft系スタック(Azure OpenAI、.NET、Copilot Studio連携)ならSemantic Kernel一択
本ブログの読者に多いローカル勢の視点で言えば、Ollama・vLLM・llama.cppを使った完全ローカル構成では LlamaIndex が最も摩擦が少ない選択肢です。llama-index-llms-ollama と llama-index-embeddings-ollama がそれぞれ公式パッケージとして継続的にメンテナンスされているため、APIキー不要・ネットワーク不要で完結できます。
メリットとデメリット
メリット
- RAGに特化しているため学習が速い: 30分あればPDF読み込み→インデックス→質問応答までのデモが動く
- 300を超える公式統合パッケージ: OpenAI、Ollama、Anthropic、Google、HuggingFace、Bedrockなどあらゆるプロバイダに対応
- マルチモーダル対応が本気: 画像・音声・動画を同一インデックスで扱える設計
- MITライセンスで商用組み込みが容易
- Workflowsによる非同期・イベント駆動設計で複雑なエージェントも自然に書ける
- LlamaHubを通じてコミュニティ製のデータローダを検索・共有できる
- ドキュメントが日本語コミュニティでも豊富: LangChainほどではないが検索してヒットする記事は十分ある
デメリット
- モジュール分割が進みすぎて初回のパッケージインストールが煩雑(llama-index-core + llama-index-llms-ollama + llama-index-embeddings-ollama…)
- APIが年単位で変わりやすく、ネット上の古いコード例はほぼ動かないと考えるべき
- LangChainと比べて非RAGのエージェント用途では機能不足を感じる場面がある
- デフォルトのインデックス構築は大量文書だとメモリを大きく消費(回避策は後述)
- Windows Native環境ではまれに依存関係の解決に失敗することがある(WSL2を推奨)
動作要件
ソフトウェア要件
| 項目 | 要件 |
|---|---|
| Python | 3.10以上、4.0未満(3.11または3.12を強く推奨) |
| OS | Windows 10/11、macOS 12以降、Ubuntu 20.04以降 |
| pip | 23.0以上(pip install --upgrade pip で最新化) |
| ディスク | 最低3GB(依存パッケージ含む) |
| ネットワーク | 初回セットアップ時のみ必要(Ollamaと組み合わせれば以降オフライン運用可) |
ローカルLLMを組み合わせる場合のハードウェア要件
LlamaIndex自体は軽量ですが、実際の運用ではローカルLLMとEmbedding Modelの実行にリソースを取られます。以下は目安です。
| 用途 | 最小 | 推奨 | 快適 |
|---|---|---|---|
| 小規模RAG(〜1000文書、7BモデルQ4) | RAM 16GB / GPU VRAM 6GB | RAM 32GB / GPU VRAM 8GB | RAM 64GB / GPU VRAM 12GB |
| 中規模RAG(〜10万文書、8-14BモデルQ4) | RAM 32GB / GPU VRAM 12GB | RAM 64GB / GPU VRAM 16GB | RAM 128GB / GPU VRAM 24GB |
| 大規模RAG(100万文書以上、30B+モデル) | RAM 64GB / GPU VRAM 24GB | RAM 128GB / GPU VRAM 48GB | 複数GPU + サーバ級RAM |
インストール手順
Windows(PowerShell)
Windows 11 + Python 3.12 環境での標準的な導入手順です。仮想環境(venv)を必ず使ってください。Python自体がインストールされていない場合は python.org または winget install Python.Python.3.12 でインストールしてください。
# 1. 作業ディレクトリを作成
mkdir C:\llamaindex-demo
cd C:\llamaindex-demo
# 2. 仮想環境を作成・有効化
python -m venv .venv
.\.venv\Scripts\Activate.ps1
# 3. pipを最新化
python -m pip install --upgrade pip
# 4. LlamaIndex本体をインストール(starter package)
pip install llama-index
# 5. Ollama連携パッケージを追加
pip install llama-index-llms-ollama
pip install llama-index-embeddings-ollama
# 6. PDF読み込みを使う場合
pip install llama-index-readers-file pypdf
# 7. インストール確認
python -c "from llama_index.core import VectorStoreIndex; print('OK')"
PowerShellの実行ポリシーで Activate.ps1 が拒否される場合、管理者権限で Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser を実行してください。
macOS
Apple Silicon(M1/M2/M3/M4)搭載Macでは、Metal Performance Shaders経由でMLXやMPSが有効になり、CPU比で3〜10倍高速化します。brew install python@3.12 または python.org のインストーラを使います。
# 1. 作業ディレクトリ
mkdir ~/llamaindex-demo
cd ~/llamaindex-demo
# 2. 仮想環境作成
python3 -m venv .venv
source .venv/bin/activate
# 3. pipを最新化
python -m pip install --upgrade pip
# 4. LlamaIndex + Ollama連携
pip install llama-index llama-index-llms-ollama llama-index-embeddings-ollama
# 5. Apple Silicon で MLX を使いたい場合(任意)
pip install mlx llama-index-llms-mlx
# 6. インストール確認
python -c "from llama_index.core import VectorStoreIndex; print('OK')"
Ubuntu / Linux
Ubuntu 24.04 LTS を基準にした手順です。他のディストリビューションでも python3-venv 相当が入っていれば同様に動作します。
# 1. 依存パッケージ
sudo apt update
sudo apt install -y python3.12 python3.12-venv python3-pip build-essential
# 2. 作業ディレクトリと仮想環境
mkdir ~/llamaindex-demo && cd ~/llamaindex-demo
python3.12 -m venv .venv
source .venv/bin/activate
# 3. pipを最新化
python -m pip install --upgrade pip
# 4. LlamaIndex本体
pip install llama-index llama-index-llms-ollama llama-index-embeddings-ollama
# 5. GPU(CUDA)を使いたい場合、PyTorchのCUDA版を先に入れる
pip install torch --index-url https://download.pytorch.org/whl/cu124
# 6. 動作確認
python -c "from llama_index.core import VectorStoreIndex; print('OK')"
カスタマイズ型インストール(推奨)
本番運用や複数プロジェクトを持つ場合は、starter package の llama-index ではなく、llama-index-core と必要な統合パッケージを個別にインストールする方が依存を最小化できます。300以上ある統合パッケージから必要なものだけを組み合わせられます。
# コアだけ
pip install llama-index-core
# 必要な統合パッケージを選択(例: Ollama + ChromaDB + PDF)
pip install llama-index-llms-ollama
pip install llama-index-embeddings-ollama
pip install llama-index-vector-stores-chroma
pip install llama-index-readers-file
初期設定
Ollamaのセットアップ
ローカルLLMのランタイムとして最も導入が簡単なOllama v0.31.2(2026年7月時点最新版)を使います。ollama.com/download から公式インストーラを取得できます。
# Ollamaのインストール確認
ollama --version
# 生成用モデルの取得(軽量なら llama3.2:3b、標準なら llama3.1:8b)
ollama pull llama3.1:8b
# Embedding用モデルの取得(768次元、超高速)
ollama pull nomic-embed-text
# 動作テスト
ollama run llama3.1:8b "こんにちは"
Ollamaは既定で http://localhost:11434 でAPIをリッスンします。バックグラウンドで ollama serve が動いていれば、LlamaIndexは自動的にこのポートに接続します。
環境変数の設定
APIキーが必要なプロバイダ(OpenAI、Anthropic、Google等)を使う場合、環境変数に登録します。ローカルLLMのみで完結する場合は不要です。
# Linux / macOS
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
# Windows PowerShell(一時的)
$env:OPENAI_API_KEY = "sk-..."
# Windows PowerShell(永続化)
[Environment]::SetEnvironmentVariable("OPENAI_API_KEY", "sk-...", "User")
デフォルト設定(Settings)の登録
旧APIの ServiceContext は廃止済みで、現在は Settings というグローバル設定オブジェクトを使います。プロジェクト冒頭で一度だけ登録すれば、以降のインデックス操作で自動的に使われます。
from llama_index.core import Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
# LLMとEmbeddingを登録
Settings.llm = Ollama(model="llama3.1:8b", request_timeout=120.0)
Settings.embed_model = OllamaEmbedding(model_name="nomic-embed-text")
# チャンクサイズも変更可能(デフォルト1024)
Settings.chunk_size = 512
Settings.chunk_overlap = 50
基本的な使い方
最小サンプル: 1つのフォルダをRAG化する
まず動くコードを見るのが最短です。data/ フォルダに任意のPDF・テキスト・Markdownファイルを置いた状態で以下を実行してください。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
# 1. LLMとEmbeddingを設定
Settings.llm = Ollama(model="llama3.1:8b", request_timeout=120.0)
Settings.embed_model = OllamaEmbedding(model_name="nomic-embed-text")
# 2. data/ フォルダの全ファイルを読み込む
documents = SimpleDirectoryReader("./data").load_data()
print(f"読み込んだ文書数: {len(documents)}")
# 3. ベクトルインデックスを構築(Embeddingが自動計算される)
index = VectorStoreIndex.from_documents(documents)
# 4. クエリエンジンに変換
query_engine = index.as_query_engine()
# 5. 質問する
response = query_engine.query("この文書の要点を3つ挙げてください。")
print(response)
このコード15行だけで、完全ローカル・APIキー不要のRAGシステムが動作します。SimpleDirectoryReader はPDF・DOCX・PPTX・MD・TXT・CSV・HTMLなど主要フォーマットを自動判別します。
インデックスの永続化
毎回インデックスを再構築するのは非効率です。ディスクに保存して再利用しましょう。
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)
チャット形式で会話する
as_query_engine() は一問一答ですが、履歴を保持したチャットにも変換できます。
chat_engine = index.as_chat_engine(chat_mode="condense_plus_context")
response = chat_engine.chat("この文書の著者は誰ですか?")
print(response)
response = chat_engine.chat("その人のバックグラウンドを教えてください。")
print(response) # 直前の質問文脈を踏まえて回答
ストリーミング応答
長い回答を待たされずに逐次表示したい場合はストリーミングを使います。
query_engine = index.as_query_engine(streaming=True)
response = query_engine.query("この技術文書の重要な結論を教えてください。")
response.print_response_stream()
実践的な使い方
ユースケース1: 数百ページのPDFから正確に引用付きで回答する
技術マニュアルや論文集などをRAG化する典型的なケースです。回答に「どのファイルの何ページから引用したか」を明示することで、ハルシネーション(幻覚)を検証しやすくします。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
Settings.llm = Ollama(model="llama3.1:8b", request_timeout=180.0)
Settings.embed_model = OllamaEmbedding(model_name="nomic-embed-text")
Settings.chunk_size = 512
# PDFフォルダを再帰的に読み込み
documents = SimpleDirectoryReader(
input_dir="./pdfs",
recursive=True,
required_exts=[".pdf"],
).load_data()
# インデックス構築(時間がかかる、数千ページで数分程度)
index = VectorStoreIndex.from_documents(documents, show_progress=True)
# 引用元を返すクエリエンジン
query_engine = index.as_query_engine(similarity_top_k=5)
response = query_engine.query("Transformerアーキテクチャの注意機構を説明してください。")
print("回答:", response)
print()
print("=== 引用元 ===")
for node in response.source_nodes:
print(f"[Score: {node.score:.3f}] {node.metadata.get('file_name')}, page {node.metadata.get('page_label')}")
print(f" {node.text[:120]}...")
ユースケース2: 外部Vector Store(Chroma)と組み合わせる
数万〜数百万文書を扱う本番用途では、標準のインメモリインデックスではなく永続化可能なVector Storeを使います。ChromaDB v1.5.9(2026年5月時点最新版)はセットアップが最も簡単で、SQLiteベースなのでサーバー不要です。
pip install llama-index-vector-stores-chroma chromadb
import chromadb
from llama_index.core import VectorStoreIndex, StorageContext, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
# Chromaクライアント作成(永続化ディレクトリを指定)
chroma_client = chromadb.PersistentClient(path="./chroma_db")
chroma_collection = chroma_client.get_or_create_collection("my_docs")
# ChromaをLlamaIndexのVector Storeとして登録
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# インデックス構築
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
# 次回起動時は再構築せずロード
index = VectorStoreIndex.from_vector_store(vector_store)
ユースケース3: エージェント(自律動作するLLM)
LlamaIndexの FunctionAgent は、複数のツール(関数)をLLMに与え、状況に応じて自律的に呼び出させる仕組みです。以下は「天気取得ツール」と「計算ツール」を持つエージェントの例です。
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.core.tools import FunctionTool
from llama_index.llms.ollama import Ollama
def get_weather(city: str) -> str:
"""指定された都市の現在の天気を返す。"""
# 実際にはAPIを叩く
return f"{city}は晴れ、気温22度、湿度50%"
def calculate(expression: str) -> str:
"""数式を計算して結果を返す。例: '2 + 3'"""
return str(eval(expression))
weather_tool = FunctionTool.from_defaults(fn=get_weather)
calc_tool = FunctionTool.from_defaults(fn=calculate)
llm = Ollama(model="llama3.1:8b", request_timeout=120.0)
agent = FunctionAgent(
tools=[weather_tool, calc_tool],
llm=llm,
system_prompt="あなたは質問に応じてツールを使い分けるアシスタントです。",
)
# エージェントに質問(内部で必要なツールを自動で呼び出す)
import asyncio
response = asyncio.run(agent.run("東京の気温を教えて、それを華氏に変換してください。"))
print(response)
ユースケース4: Workflowsで複雑な処理を組む
Workflow はLlamaIndex独自のイベント駆動オーケストレーション機構です。「文書を分類 → 適切なインデックスに投げる → 結果を統合」といった複雑な処理を、非同期・並列で書けます。
from llama_index.core.workflow import (
Workflow, StartEvent, StopEvent, Event, step
)
class RetrieveEvent(Event):
query: str
class SynthesizeEvent(Event):
nodes: list
class RagWorkflow(Workflow):
@step
async def start(self, ev: StartEvent) -> RetrieveEvent:
return RetrieveEvent(query=ev.query)
@step
async def retrieve(self, ev: RetrieveEvent) -> SynthesizeEvent:
# ここで検索
nodes = ["dummy_node_1", "dummy_node_2"] # 実装省略
return SynthesizeEvent(nodes=nodes)
@step
async def synthesize(self, ev: SynthesizeEvent) -> StopEvent:
result = f"Retrieved {len(ev.nodes)} nodes"
return StopEvent(result=result)
import asyncio
wf = RagWorkflow(timeout=60)
result = asyncio.run(wf.run(query="LlamaIndexとは?"))
print(result)
ユースケース5: create-llama で対話式に雛形生成
ゼロから書くのが面倒なら、公式CLIツール create-llama で対話的に雛形プロジェクトを生成できます。Next.jsフロントエンド + FastAPIバックエンド + LlamaIndex という本格構成が数分で立ち上がります。
# 一発でプロジェクト生成
npx create-llama@latest
# 対話形式で以下を選ぶ
# - What is your project named? my-rag-app
# - Which template? Agentic RAG
# - Which framework? FastAPI
# - Which LLM? Ollama
# - Which embedding? Ollama
cd my-rag-app
pnpm install
pnpm dev
応用・カスタマイズ
チャンク分割戦略のチューニング
RAGの精度はチャンク分割で決まると言っても過言ではありません。デフォルトの1024トークンは技術文書には長すぎ、要約には短すぎる傾向があります。用途別の推奨値は以下です。
| 用途 | chunk_size | chunk_overlap |
|---|---|---|
| FAQ・短い質問 | 256 | 20 |
| 一般的な技術文書 | 512 | 50 |
| 長文の要約 | 1024 | 100 |
| コードスニペット中心 | 128 | 10 |
from llama_index.core.node_parser import SentenceSplitter
parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)
nodes = parser.get_nodes_from_documents(documents)
ハイブリッド検索(ベクトル + キーワード)
ベクトル検索だけでは固有名詞の完全一致が苦手です。BM25キーワード検索と組み合わせることで、両方の長所を活かせます。
from llama_index.retrievers.bm25 import BM25Retriever
from llama_index.core.retrievers import QueryFusionRetriever
# BM25検索
bm25 = BM25Retriever.from_defaults(nodes=nodes, similarity_top_k=5)
# ベクトル検索
vector_retriever = index.as_retriever(similarity_top_k=5)
# 融合
fusion = QueryFusionRetriever(
[vector_retriever, bm25],
similarity_top_k=5,
num_queries=1, # クエリ書き換え回数
mode="reciprocal_rerank",
)
Reranker(再順序付け)で精度向上
Vector Storeから返ってきた上位N件をLLMまたは専用モデルで再度スコアリングすると、無関係な結果を弾けます。
pip install llama-index-postprocessor-flag-embedding-reranker
from llama_index.postprocessor.flag_embedding_reranker import FlagEmbeddingReranker
reranker = FlagEmbeddingReranker(
model="BAAI/bge-reranker-large",
top_n=3,
)
query_engine = index.as_query_engine(
similarity_top_k=10,
node_postprocessors=[reranker],
)
マルチモーダル: 画像を含むRAG
v0.14系のマルチモーダル合成第2弾により、画像を含む文書に対する応答が安定しました。
from llama_index.core import SimpleDirectoryReader
from llama_index.core.indices.multi_modal import MultiModalVectorStoreIndex
from llama_index.multi_modal_llms.ollama import OllamaMultiModal
# llava:13b など画像対応モデル
mm_llm = OllamaMultiModal(model="llava:13b")
documents = SimpleDirectoryReader("./mixed_data").load_data()
mm_index = MultiModalVectorStoreIndex.from_documents(documents)
query_engine = mm_index.as_query_engine(multi_modal_llm=mm_llm)
response = query_engine.query("この図が示している傾向を説明してください。")
パフォーマンス最適化
Embedding計算の高速化
大量の文書を初回インデックス化する際、Embedding計算が最大のボトルネックです。以下のテクニックで数倍高速化できます。
- バッチサイズを増やす:
OllamaEmbedding(embed_batch_size=32)(デフォルトは10) - 並列プロセスを増やす:
Settings.num_workers = 4 - より小さいEmbeddingを選ぶ:
nomic-embed-text(768次元)はmxbai-embed-large(1024次元)より約1.5倍高速 - Embedding計算をGPUに載せる:
llama-index-embeddings-huggingface+device="cuda"でPyTorchベースの高速推論
Vector Storeの選択
| Vector Store | 特徴 | 推奨用途 |
|---|---|---|
| SimpleVectorStore(デフォルト) | インメモリ・永続化はJSONダンプ | プロトタイプ、〜1万文書 |
| ChromaDB v1.5.9 | SQLiteベース、単一マシン向け | 個人PC、〜100万文書 |
| Qdrant | Rust製、単一マシン〜クラスタ | 本番、〜数千万文書 |
| Milvus | 分散対応、GPU検索対応 | 大規模本番、数億文書 |
| Weaviate | ハイブリッド検索標準装備 | ハイブリッド検索が主用途 |
クエリ側の最適化
- similarity_top_k を絞る: 3〜5が実用範囲。多すぎるとLLMのコンテキストが埋まり応答が遅くなる
- ストリーミング応答を使う: 体感速度が劇的に改善
- キャッシュを有効化: 同じ質問の再実行を避ける
from llama_index.core.callbacks import CallbackManager
from llama_index.core.storage.chat_store import SimpleChatStore
# クエリキャッシュはIngestion Pipelineで実現
from llama_index.core.ingestion import IngestionPipeline, IngestionCache
from llama_index.core.storage.kvstore import SimpleKVStore
cache = IngestionCache(cache=SimpleKVStore(), collection="my_cache")
pipeline = IngestionPipeline(transformations=[...], cache=cache)
よくあるエラーとトラブルシューティング
エラー1: ImportError: cannot import name ‘X’ from ‘llama_index’
症状: from llama_index import VectorStoreIndex がImportErrorになる。
原因: v0.10以降、直下からのインポートは廃止されました。
解決策: from llama_index.core import VectorStoreIndex に書き換える。ネット上の2023年以前のサンプルコードはすべてこの修正が必要です。
エラー2: httpx.ConnectError: All connection attempts failed
症状: Ollamaに接続しようとしたときに発生。
原因: ollama serve が起動していない、または OLLAMA_HOST の指定が誤っている。
解決策:
# Ollamaが起動しているか確認
curl http://localhost:11434/api/tags
# 起動していなければ別ターミナルで
ollama serve
# 別ホストのOllamaを使う場合
export OLLAMA_HOST=http://192.168.1.100:11434
エラー3: TimeoutError during embed / query
症状: 大きい文書のインデックス化や複雑なクエリ時にタイムアウト。
原因: デフォルトタイムアウト(30秒)が短すぎる。
解決策: Ollama(model=..., request_timeout=300.0) のように明示的に延長する。
エラー4: MemoryError または OOM Killer 発動
症状: 数万文書のインデックス化中にプロセスが殺される。
原因: 全ドキュメントをメモリに載せているため。
解決策: IngestionPipeline でストリーミング処理し、Chunkごとに逐次書き込む。あるいは事前にドキュメントを小分けして複数回に分けてインデックス化する。
エラー5: pip install llama-index が異常に遅い / 依存関係解決に失敗
症状: 数十分待っても終わらない、または ResolutionImpossible エラー。
原因: 統合パッケージが多すぎて依存グラフが巨大化している。
解決策: starter packageではなく、llama-index-core と必要な統合だけを個別インストール。あるいは uv を使うと大幅に高速化する。
# uvを使う場合(10倍以上速い)
pip install uv
uv pip install llama-index-core llama-index-llms-ollama llama-index-embeddings-ollama
エラー6: UnicodeDecodeError(Windows)
症状: 日本語ファイル名やShift-JISのテキストファイルを読み込むとエラー。
解決策: SimpleDirectoryReader にエンコーディングを明示するか、事前にUTF-8に変換する。
from llama_index.core import SimpleDirectoryReader
reader = SimpleDirectoryReader(input_dir="./data", encoding="utf-8", errors="ignore")
エラー7: 回答に「I don’t know」しか返らない
症状: 明らかに文書内にある内容なのに、LLMが「わからない」と答える。
原因の候補:
- Embeddingモデルが日本語に対応していない(英語向けの
all-MiniLM-L6-v2など) - チャンクサイズが小さすぎて文脈が失われている
- similarity_top_k が少なく該当箇所が拾えていない
- プロンプトテンプレートが過度に厳格(英語のデフォルト)
解決策: 日本語対応のEmbedding(intfloat/multilingual-e5-large や nomic-embed-text)を使い、日本語のQAプロンプトテンプレートを渡す。
他のツール・エコシステムとの連携
Ollama以外のローカルLLMランタイム
- llama.cpp:
llama-index-llms-llama-cppで直接GGUF量子化モデルを実行可能 - vLLM:
llama-index-llms-vllm、複数GPUや高スループット推論に最適 - MLX(Apple Silicon):
llama-index-llms-mlx、M系Macで最速 - Text Generation Inference(TGI):
llama-index-llms-text-generation-inference
クラウドLLMとの併用(ハイブリッド構成)
コストと精度のバランスを取るために、以下の使い分けが実務でよく採用されます。
- Embedding: ローカル(Ollama nomic-embed-text)で無料化。埋め込み計算はコスト差が大きい
- Retrieval: ローカルVector Store(Chroma / Qdrant)で完結
- 最終回答生成: 高精度を求める場面ではClaude 5 SonnetやGPT-5、通常はローカルの llama3.1:8b
LlamaIndexなら1行の差し替えでLLMを切り替えられます。用途に応じて動的に選択するルーティングも書けます。
from llama_index.llms.anthropic import Anthropic
from llama_index.llms.ollama import Ollama
# 精度重視の質問はClaude、通常はローカル
def get_llm(question: str):
if len(question) > 300 or "詳細に" in question:
return Anthropic(model="claude-sonnet-5")
return Ollama(model="llama3.1:8b")
可観測性ツール
- LangSmith: LangChain製だがLlamaIndexも計測可能
- Arize Phoenix: オープンソースの可観測性、LlamaIndex公式推奨の一つ
- Weights & Biases: 実験管理とプロンプト履歴
import llama_index.core
llama_index.core.set_global_handler("arize_phoenix")
用途別 推奨PCスペック
LlamaIndex単体は軽量ですが、ローカルLLMと組み合わせた場合の総合的な推奨スペックを示します。
入門(勉強・プロトタイプ)
7B〜8Bの4bit量子化モデル + 数百文書のRAG。学習と個人的な実験目的に十分。
- CPU: Ryzen 5 7600 / Core i5-13400 以上
- メモリ: 32GB DDR5
- GPU: NVIDIA RTX 4060 Ti 8GB or RTX 4070 12GB
- ストレージ: 1TB NVMe SSD
標準(小規模本番・社内ツール)
14B〜32Bモデル + 数万文書のRAG。少人数チームでの社内文書検索ツールが快適に動作。
- CPU: Ryzen 7 7800X3D / Core i7-14700K 以上
- メモリ: 64GB DDR5
- GPU: NVIDIA RTX 4070 Ti SUPER 16GB or RTX 5080 16GB
- ストレージ: 2TB NVMe SSD Gen4
ハイエンド(中規模本番・研究)
70B以上のモデル + 100万文書級のRAG。マルチモーダル・エージェント本格運用も視野。
- CPU: Ryzen 9 7950X / Threadripper 7970X
- メモリ: 128GB DDR5
- GPU: NVIDIA RTX 5090 32GB(or 複数枚構成)
- ストレージ: 4TB NVMe SSD Gen5
まとめ
LlamaIndex v0.14.23(2026年6月時点)は、ローカルLLMとの相性・RAG構築の速さ・マルチモーダル対応の3拍子が揃った、2026年時点で最も推奨できるRAGフレームワークの一つです。特に「Ollama + LlamaIndex + Chroma」の3点セットは、初期コストゼロ・APIキー不要でPDF Q&A システムを構築できる最短経路として、初学者から実務まで幅広く使えます。
本記事で紹介したコードはすべて完全ローカルで動作します。まずは手元のPDFを data/ フォルダに入れて、最小サンプルの15行を動かしてみてください。動くことを確認したら、チャンクサイズ・Vector Store・エージェント機能へと段階的に踏み込んでいけば、社内文書検索ツール・個人用ナレッジベース・研究補助アシスタントなど、実用的なプロダクトへ拡張できます。
今後のロードマップとして、Run-Llama社は「Agent Client Protocol」の標準化推進とマルチモーダル合成のさらなる強化を掲げています。次のメジャーバージョン(v0.15または v1.0)では、Workflowsの表現力拡張と、より軽量なコアが期待されます。公式ブログのNewsletterを購読しておくと最新機能を追いやすいでしょう。
関連記事: 本サイトではLangChain完全ガイド 2026年7月版、KoboldCpp完全ガイド、Ollama v0.30.12 ツール呼び出し安定化など、ローカルLLMを中心にした実践記事を継続的に公開しています。あわせて参考にしてください。
📦 この記事で紹介した商品
- 大規模言語モデル入門 → Amazonで見る
- NVIDIA GeForce RTX 4070 Ti SUPER → Amazonで見る
- RAG実践ガイド → Amazonで見る
- DDR5メモリ 64GB → Amazonで見る
- TB NVMe SSD → Amazonで見る
※ 上記リンクはAmazonアソシエイトリンクです。購入いただくと当サイトに紹介料が入ります。

