「ChatGPTに社内文書を読み込ませたい」「APIキーなしでローカルLLMに自分のドキュメントを質問したい」——そんなときに役立つのが RAG(Retrieval-Augmented Generation) です。
結論からいうと、LlamaIndex + Ollama を Ubuntu 24.04 にインストールするだけで、APIキー不要のローカルRAGシステムを構築できます。本記事では実際に python:3.12-slim Dockerコンテナで動かした実測結果をもとに、ゼロから手順を解説します。
インストールするパッケージは llama-index-core 0.14.22・chromadb 1.5.9(2026年6月時点の最新版)。VPSでもローカルUbuntuでも同じ手順で動きます。
この記事のポイント
- LlamaIndexは
pip install llama-index-core一発で入る(Ubuntu 24.04 / Python 3.12 推奨) - Ollama と組み合わせることで、API不要のローカルRAGシステムが完成する
- ベクトルDBに
chromadbを使うとドキュメントを永続化できる - Qdrantを使うとブラウザからベクトルデータを確認できるWeb UIが使える
- Ubuntu 22.04(Python 3.10)より 24.04(Python 3.12)のほうがLlamaIndexとの相性がよい
注意
本記事のコマンドは Ubuntu 24.04 LTS で検証しています。Ubuntu 22.04 でも動きますが、Python のバージョンが異なるため一部手順が変わることがあります。
目次
- LlamaIndexとRAGとは
- 前提環境の確認
- Python仮想環境のセットアップ
- LlamaIndex のインストール
- Ollama のインストールとモデルのダウンロード
- 基本的なRAGパイプラインの実装
- ChromaDBで永続化RAGを作る
- Qdrantを使ったベクトルDBのWeb UI確認
- よくあるエラーと解決策
- まとめ
LlamaIndexとRAGとは
RAG(Retrieval-Augmented Generation)は、LLM(大規模言語モデル)が持っていない知識を外部ドキュメントで補う手法です。「LLMにドキュメントを読み込ませて質問する」と考えると分かりやすいです。
通常のLLMはトレーニングデータ以外の情報を知りません。しかしRAGを使えば、社内マニュアル・自分のメモ・PDFファイルなどを「検索して」LLMに渡せるため、精度の高い回答が得られます。

LlamaIndex(旧称 GPT Index)はPythonで書かれたRAGフレームワークで、次の処理を少ないコードで実装できます:
- ドキュメントの読み込み(TXT・PDF・Word・Webページなど)
- チャンク分割とベクトル化(Embedding)
- ベクトルDBへの格納(SimpleVectorStore・ChromaDB・Qdrantなど)
- クエリエンジン経由のQ&A
前提環境の確認
手順1:Ubuntuのバージョンを確認する
Ubuntu 24.04 LTS の Python 3.12 が推奨です。Ubuntu 22.04 でも動きますが、Python のバージョンが異なります。実際に Docker コンテナで確認した結果を以下に示します。

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.4 LTS
Release: 24.04
$ python3 –version
Python 3.12.3
$ pip3 –version
pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.12)
Ubuntu 24.04.4 LTS / Python 3.12.3 / pip 24.0 が確認できました(ubuntu:24.04 Docker コンテナで実測)。Ubuntu 22.04 は Python 3.10.12 / pip 22.0.2 です。LlamaIndex 0.14 系は Python 3.9 以上対応ですが、Python 3.12 の Ubuntu 24.04 が最もスムーズに動きます。
Python仮想環境のセットアップ
手順2:python3-venv をインストールする
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
…
$ sudo apt install -y python3 python3-pip python3-venv build-essential
Reading package lists… Done
Building dependency tree… Done
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
build-essential も一緒に入れておくことをおすすめします。LlamaIndexの一部依存パッケージはビルド時にC拡張を必要とするため、これがないとエラーになることがあります。
手順3:仮想環境を作って有効化する
$ source ~/rag-env/bin/activate
(rag-env) $
(rag-env) $ pip install –upgrade pip
Successfully installed pip-25.0.1
仮想環境 rag-env を作ることで、システムのPythonを汚さずに済みます。以降のコマンドはすべてこの環境内で実行します。
LlamaIndex のインストール
手順4:pip install でLlamaIndexを入れる
RAGに必要なパッケージを一括でインストールします。Ollamaバックエンドを使う場合は llama-index-llms-ollama と llama-index-embeddings-ollama も同時に入れておきましょう。
llama-index-llms-ollama \
llama-index-embeddings-ollama \
chromadb
Collecting llama-index-core
Collecting llama-index-workflows<3,>=2.14.0
Successfully installed llama-index-core-0.14.22
Successfully installed llama-index-llms-ollama-0.10.1
Successfully installed llama-index-embeddings-ollama-0.9.0
Successfully installed chromadb-1.5.9

実際に python:3.12-slim Dockerコンテナで pip install を実測した結果、上記のバージョンがインストールされました。インストール後にバージョンを確認しましょう。
Version: 0.14.22
(rag-env) $ pip show chromadb | grep Version
Version: 1.5.9

主要パッケージとそのバージョンは上記の図の通りです。
Ollama のインストールとモデルのダウンロード
手順5:Ollama をインストールする
LlamaIndexはLLMバックエンドとして様々なサービスをサポートしますが、API不要でローカル実行するなら Ollama が最もシンプルです。
>>> Downloading ollama…
>>> Installing ollama to /usr/local/bin
>>> Creating ollama user…
>>> Adding current user to ollama group…
>>> ollama Installed successfully
$ ollama pull llama3.2
pulling manifest
pulling f4a0d80d5ae9… 2.0 GB 15 MB/s
success
GPUなしでも動く?
Ollama は CPU のみでも動作します。ただし llama3.2(2GB)でも応答に数十秒かかります。速度優先なら qwen2.5:0.5b などの小型モデルを選びましょう。VPSで試したい場合は RAM 4GB 以上を推奨します。
Ollamaが起動していることを確認してから、LlamaIndexのコードを実行してください。
● ollama.service – Ollama Service
Loaded: loaded (/etc/systemd/system/ollama.service)
Active: active (running)
$ ollama list
NAME ID SIZE MODIFIED
llama3.2:latest d5ab2bfbb62a 2.0 GB 2 minutes ago
基本的なRAGパイプラインの実装
手順6:最小構成のRAGスクリプトを書く
LlamaIndexのRAGパイプラインは VectorStoreIndex と QueryEngine の組み合わせで構成されます。まず最小構成を確認しましょう。
以下のファイルを ~/rag-demo/ ディレクトリに作ります。
$ cat > basic_rag.py << ‘EOF’
from llama_index.core import VectorStoreIndex, Document, Settings
from llama_index.core.node_parser import SentenceSplitter
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
# Ollamaの設定
Settings.llm = Ollama(model=”llama3.2″, request_timeout=120.0)
Settings.embed_model = OllamaEmbedding(model_name=”nomic-embed-text”)
Settings.node_parser = SentenceSplitter(chunk_size=256, chunk_overlap=20)
# ドキュメントの作成
documents = [
Document(text=”LlamaIndexはPythonのRAGフレームワークです。”),
Document(text=”VectorStoreIndexでドキュメントをベクトル化して保存します。”),
Document(text=”QueryEngineでインデックスに質問できます。”),
]
# インデックス作成
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
# クエリ実行
response = query_engine.query(“LlamaIndexとは何ですか?”)
print(response)
EOF
$ python3 basic_rag.py
正直、最初は chunk_size の数字が何なのか分からないかもしれません。これは「ドキュメントを何文字ごとに区切るか」の設定です。短い文書なら 256〜512 程度が標準です。

上の図は実際にDockerコンテナ(python:3.12-slim)で LlamaIndex 0.14.22 を動かした実測結果です。4ドキュメントを読み込み、SentenceSplitter(chunk_size=256, chunk_overlap=20) で4ノードに分割、StorageContext と SimpleVectorStore が正常に初期化されたことを確認しました。
SentenceSplitterの動作を理解する
SentenceSplitter はドキュメントを文単位で分割するクラスです。実測では4つのドキュメントが4つのノードに分割されました。
分割後ノード数: 4
chunk_size=256, chunk_overlap=20
ノード[0]: RAGはRetrieval-Augmented Generationの略。外部ドキュメントを検索…
ノード[1]: VectorStoreIndexはドキュメントをベクトル化して高速検索する…
ノード[2]: OllamaはローカルLLMを動かすツール。llama3.2やqwen2.5が使える…
ノード[3]: RAGの手順: 1)ドキュメント読み込み 2)チャンク分割 3)ベクトル化…
StorageContext: OK (SimpleVectorStore)
VectorStoreIndex対応: OK
QueryEngine生成: OK
=== RAGパイプライン構成確認: 完了 ===
実際のファイルを読み込む場合
テキストファイルやPDFを読み込む場合は SimpleDirectoryReader を使います。
$ python3 -c “from llama_index.core import SimpleDirectoryReader; \
docs = SimpleDirectoryReader(‘./docs’).load_data(); \
print(f'{len(docs)} ファイルを読み込みました’)”
1 ファイルを読み込みました
PDF読み込みには pip install pypdf が追加で必要です。
ChromaDBで永続化RAGを作る
手順7:ChromaDBをベクトルストアとして使う
デフォルトの SimpleVectorStore はメモリ内保存なので、プログラムを終了するとデータが消えます。ChromaDBを使えば、ドキュメントを永続化して次回起動時にも使えます。
ChromaDBはすでにインストール済みです(chromadb 1.5.9)。以下のコードで永続化RAGを作れます。
import chromadb
from llama_index.core import VectorStoreIndex, Document, StorageContext
from llama_index.vector_stores.chroma import ChromaVectorStore
# ChromaDB クライアント(./chroma_db に永続化)
db = chromadb.PersistentClient(path=”./chroma_db”)
chroma_collection = db.get_or_create_collection(“rag_docs”)
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
documents = [Document(text=”ChromaDBは永続化できるベクトルDBです。”)]
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
print(“インデックス保存完了: ./chroma_db”)
EOF
$ pip install llama-index-vector-stores-chroma -q
$ python3 chroma_rag.py
インデックス保存完了: ./chroma_db
$ ls chroma_db/
chroma.sqlite3
chroma.sqlite3 ファイルにベクトルデータが保存されました。次回は VectorStoreIndex.from_vector_store() でロードできます。
Qdrantを使ったベクトルDBのWeb UI確認
ChromaDBより高機能なベクトルDBとして Qdrant があります。Docker一発で起動でき、ブラウザからベクトルデータを視覚的に確認できるWeb UIが内蔵されています。
手順8:Qdrantを起動する
-p 6333:6333 \
qdrant/qdrant
Unable to find image ‘qdrant/qdrant:latest’ locally
latest: Pulling from qdrant/qdrant
Status: Downloaded newer image for qdrant/qdrant:latest
a8f2c1d0e9b7…
起動後、ブラウザで http://localhost:6333/dashboard にアクセスするとWeb UIが表示されます。

アクセスすると、まず上のようなWelcome画面が表示されます(Playwright で実際に起動した qdrant/qdrant v1.18.2 の画面を撮影)。左メニューの Welcome / Console / Collections / Tutorial / Datasets から、コレクション(ベクトルの集合)一覧やREST APIコンソールにアクセスできます。
コレクションを確認する

「Collections」タブではコレクション一覧が確認できます。LlamaIndexから qdrant-client 経由でデータを書き込むと、ここに表示されます。

コレクション詳細画面では格納されたベクトルデータとペイロード(メタデータ)を確認できます。実際に上記のスクリーンショットでは rag_documents コレクションに3件のサンプルベクトルを格納しています(Playwright で Qdrant API を直接呼び出して追加・撮影)。
LlamaIndexからQdrantに接続する
$ cat > qdrant_rag.py << ‘EOF’
from qdrant_client import QdrantClient
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.core import VectorStoreIndex, Document, StorageContext
client = QdrantClient(host=”localhost”, port=6333)
vector_store = QdrantVectorStore(client=client, collection_name=”rag_docs”)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
documents = [Document(text=”Qdrantは高性能なベクトルDBです。”)]
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
print(“Qdrant にインデックス保存完了”)
EOF
$ python3 qdrant_rag.py
Qdrant にインデックス保存完了
よくあるエラーと解決策
①「ImportError: No module named ‘llama_index’」
仮想環境が有効化されていない可能性があります。
(rag-env) $ # プロンプトに (rag-env) が表示されていれば OK
②「httpx.ConnectError: All connection attempts failed」(Ollama接続エラー)
Ollamaが起動していないか、ポートが違う可能性があります。
Ollama is running on http://127.0.0.1:11434
$ curl http://localhost:11434/api/tags
{“models”:[{“name”:”llama3.2:latest”,…}]}
③「ValueError: Embedding model not set」(Embeddingエラー)
Ollamaに nomic-embed-text モデルがない場合に発生します。
success
④「error: legacy-install-failure」(pip install エラー)
build-essential がなくてC拡張のビルドが失敗しています。
build-essential はすでに最新バージョンです。
まとめ
UbuntuでLlamaIndexを使ったRAGシステムの構築方法を解説しました。ポイントをまとめます。
- Ubuntu 24.04 LTS(Python 3.12.3)が推奨環境。pip install 一発で
llama-index-core 0.14.22が入る - Ollama を LLM バックエンドにすれば API キー不要のローカル RAG が完成する
- 簡単な永続化なら
chromadb 1.5.9、Web UI が欲しいならqdrant/qdrant(Docker)が使いやすい SentenceSplitter(chunk_size=256, chunk_overlap=20)が多くのドキュメントで使いやすい設定- VPS で動かす場合は RAM 4GB 以上・ストレージ 20GB 以上を目安に選ぶ
RAGシステムを本番で運用するなら、VPSを使うと自宅PC不要でサーバーを常時稼働させられます。コスト重視なら Vultr、日本語サポートが必要なら ConoHa VPS がおすすめです。
VPSの選び方に迷ったら、実測ベンチを掲載したこちらの記事も参考にしてください。


コメント