UbuntuでLlamaIndexを使ってRAGを実装する方法

ローカルLLM

「ChatGPTに社内文書を読み込ませたい」「APIキーなしでローカルLLMに自分のドキュメントを質問したい」——そんなときに役立つのが RAG(Retrieval-Augmented Generation) です。

結論からいうと、LlamaIndex + Ollama を Ubuntu 24.04 にインストールするだけで、APIキー不要のローカルRAGシステムを構築できます。本記事では実際に python:3.12-slim Dockerコンテナで動かした実測結果をもとに、ゼロから手順を解説します。

インストールするパッケージは llama-index-core 0.14.22chromadb 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 のバージョンが異なるため一部手順が変わることがあります。

目次

  1. LlamaIndexとRAGとは
  2. 前提環境の確認
  3. Python仮想環境のセットアップ
  4. LlamaIndex のインストール
  5. Ollama のインストールとモデルのダウンロード
  6. 基本的なRAGパイプラインの実装
  7. ChromaDBで永続化RAGを作る
  8. Qdrantを使ったベクトルDBのWeb UI確認
  9. よくあるエラーと解決策
  10. まとめ

LlamaIndexとRAGとは

RAG(Retrieval-Augmented Generation)は、LLM(大規模言語モデル)が持っていない知識を外部ドキュメントで補う手法です。「LLMにドキュメントを読み込ませて質問する」と考えると分かりやすいです。

通常のLLMはトレーニングデータ以外の情報を知りません。しかしRAGを使えば、社内マニュアル・自分のメモ・PDFファイルなどを「検索して」LLMに渡せるため、精度の高い回答が得られます。

LlamaIndex RAGパイプライン構成図(概念図)
LlamaIndex RAGパイプライン構成図(概念図)

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 コンテナで確認した結果を以下に示します。

Ubuntu 22.04 vs 24.04 Python バージョン比較(実測)
Ubuntu 22.04 vs 24.04 Python バージョン比較(実測)



ubuntu@linuxlab: ~
$ lsb_release -a
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 をインストールする




ubuntu@linuxlab: ~
$ sudo apt update
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:仮想環境を作って有効化する




ubuntu@linuxlab: ~
$ python3 -m venv ~/rag-env
$ 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-ollamallama-index-embeddings-ollama も同時に入れておきましょう。




ubuntu@linuxlab: ~ (rag-env)
(rag-env) $ pip install llama-index-core \
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
LlamaIndex pip インストール実ログ(python:3.12-slim 実測)
LlamaIndex pip インストール実ログ(python:3.12-slim 実測)

実際に python:3.12-slim Dockerコンテナで pip install を実測した結果、上記のバージョンがインストールされました。インストール後にバージョンを確認しましょう。




ubuntu@linuxlab: ~ (rag-env)
(rag-env) $ pip show llama-index-core | grep Version
Version: 0.14.22
(rag-env) $ pip show chromadb | grep Version
Version: 1.5.9
LlamaIndex 主要パッケージ一覧(pip install 実測)
LlamaIndex 主要パッケージ一覧(pip install 実測)

主要パッケージとそのバージョンは上記の図の通りです。

Ollama のインストールとモデルのダウンロード

手順5:Ollama をインストールする

LlamaIndexはLLMバックエンドとして様々なサービスをサポートしますが、API不要でローカル実行するなら Ollama が最もシンプルです。




ubuntu@linuxlab: ~
$ curl -fsSL https://ollama.com/install.sh | sh
>>> 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のコードを実行してください。




ubuntu@linuxlab: ~
$ systemctl status ollama
● 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パイプラインは VectorStoreIndexQueryEngine の組み合わせで構成されます。まず最小構成を確認しましょう。

以下のファイルを ~/rag-demo/ ディレクトリに作ります。




ubuntu@linuxlab: ~/rag-demo
$ mkdir ~/rag-demo && cd ~/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 程度が標準です。

LlamaIndex RAGパイプライン実行デモ(Docker 実測)
LlamaIndex RAGパイプライン実行デモ(Docker 実測)

上の図は実際にDockerコンテナ(python:3.12-slim)で LlamaIndex 0.14.22 を動かした実測結果です。4ドキュメントを読み込み、SentenceSplitter(chunk_size=256, chunk_overlap=20) で4ノードに分割、StorageContextSimpleVectorStore が正常に初期化されたことを確認しました。

SentenceSplitterの動作を理解する

SentenceSplitter はドキュメントを文単位で分割するクラスです。実測では4つのドキュメントが4つのノードに分割されました。




ubuntu@linuxlab: ~/rag-demo (python:3.12-slim 実測)
ドキュメント数: 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 を使います。




ubuntu@linuxlab: ~/rag-demo
$ mkdir docs && echo “Ubuntuはデビアン系のLinuxディストリビューションです。” > docs/ubuntu.txt
$ 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を作れます。




ubuntu@linuxlab: ~/rag-demo
$ cat > chroma_rag.py << ‘EOF’
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を起動する




ubuntu@linuxlab: ~
$ docker run -d –name 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が表示されます。

Qdrant Web UI のWelcomeランディング画面(Docker で起動・Playwright 実測)
Qdrant Web UI のWelcomeランディング画面(Docker で起動・Playwright 実測)

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

コレクションを確認する

Qdrant コレクション一覧(rag_documents コレクション作成後)
Qdrant コレクション一覧(rag_documents コレクション作成後)

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

Qdrant コレクション詳細(ベクトルデータ確認)
Qdrant コレクション詳細(ベクトルデータ確認)

コレクション詳細画面では格納されたベクトルデータとペイロード(メタデータ)を確認できます。実際に上記のスクリーンショットでは rag_documents コレクションに3件のサンプルベクトルを格納しています(Playwright で Qdrant API を直接呼び出して追加・撮影)。

LlamaIndexからQdrantに接続する




ubuntu@linuxlab: ~/rag-demo
(rag-env) $ pip install qdrant-client llama-index-vector-stores-qdrant -q
$ 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’」

仮想環境が有効化されていない可能性があります。




ubuntu@linuxlab: ~
$ source ~/rag-env/bin/activate
(rag-env) $ # プロンプトに (rag-env) が表示されていれば OK

②「httpx.ConnectError: All connection attempts failed」(Ollama接続エラー)

Ollamaが起動していないか、ポートが違う可能性があります。




ubuntu@linuxlab: ~
$ ollama serve & # フォアグラウンドで起動して確認
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 モデルがない場合に発生します。




ubuntu@linuxlab: ~
$ ollama pull nomic-embed-text
success

④「error: legacy-install-failure」(pip install エラー)

build-essential がなくてC拡張のビルドが失敗しています。




ubuntu@linuxlab: ~
$ sudo apt install -y build-essential libssl-dev libffi-dev
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の選び方に迷ったら、実測ベンチを掲載したこちらの記事も参考にしてください。

コメント

タイトルとURLをコピーしました