LLMに「独自の知識」を授ける魔法のライブラリ:LlamaIndexの仕組みと実践
![]()
【Yuki】
Hirokiくん、こんにちは。今日は、最近のAI開発で欠かせない存在になっているLlamaIndex(ラマインデックス)というライブラリについて、一緒にお勉強してみましょうか。
![]()
【Hiroki】
Yukiさん、よろしくお願いします!LlamaIndexって、ChatGPTとかのAIに自分の持っているファイルを読み込ませる時に使うものですよね?
![]()
【Yuki】
ええ、その通りです...。ChatGPTのような大規模言語モデル(LLM)は、学習した時点までの知識しか持っていません。でも、私たちが個人的に持っているドキュメントや、最新のニュースについては知らないんですよね。それを解決するのが、RAG(Retrieval-Augmented Generation:検索拡張生成)という手法で、LlamaIndexはそのRAGをとても簡単に実装できるようにしてくれるフレームワークなんです。
![]()
【Hiroki】
RAG、最近よく聞きます。でも、具体的にどういう仕組みで動いているのか、よくわかっていないんです。
![]()
【Yuki】
少し難しい言葉に聞こえるかもしれませんが、仕組みは意外とシンプルですよ...。大きく分けて「データの読み込み」「インデックスの作成」「クエリ(質問)の実行」という3つのステップで成り立っています。LlamaIndexは、これらを繋ぐ強力な接着剤のような役割を果たしているのだと思います。
LlamaIndexの基本構造:データをどう扱うか
![]()
【Yuki】
まずは、LlamaIndexがどうやってデータを管理しているのかを見ていきましょう。一番基礎となる単位はDocumentとNodeです。
![]()
【Hiroki】
DocumentとNode...。ファイルそのものとは違うんですか?
![]()
【Yuki】
そうですね、DocumentはPDFやテキストファイルなどの「データソース全体」を指すイメージです。でも、長い文章をそのままAIに渡すと、処理できる文字数の制限を超えてしまったり、関係ない部分が混ざって精度が落ちたりするかもしれません。そこで、LlamaIndexはDocumentをNode(ノード)という小さな塊に分割します。
![]()
【Hiroki】
なるほど!細かく分けることで、必要な部分だけを効率よく探せるようにするんですね。
![]()
【Yuki】
Hirokiくん、察しがいいですね。分割されたNodeは、その後Vector(ベクトル)という数値のリストに変換されます。これを「埋め込み(Embedding)」と呼びます。単語の意味を多次元の空間上の座標として表現することで、コンピュータが「意味の近さ」を計算できるようになるんです。
![]()
【Hiroki】
意味を数字にするなんて、不思議です。でも、それがあるから「似たような内容の文章」を探し出せるというわけですね。
![]()
【Yuki】
はい。そして、そのベクトル化されたNodeを整理して保存しておく場所がIndexです。LlamaIndexという名前の由来でもありますね。最も一般的なのは「VectorStoreIndex」というもので、これを使うと、質問に対して意味的に最も近いNodeを高速に見つけ出すことができるようになります。
データコネクタとLlamaHubの便利さ
![]()
【Hiroki】
でも、データを読み込むのって大変じゃないですか?PDFだったり、Notionだったり、Slackのログだったり、形式がバラバラだと書くのが面倒そうです。
![]()
【Yuki】
ふふ、そこもLlamaIndexの得意分野なんですよ。LlamaIndexにはData Connectorsという仕組みがあって、さまざまな形式のデータを簡単にDocumentとして読み込めます。特にLlamaHubというサイトを見ると、世界中の開発者が作ったコネクタが公開されています。
![]()
【Hiroki】
LlamaHub、見てみました。Google DriveやDiscord、GitHubまでありますね!これなら、どんなデータでもすぐに取り込めそうです。
![]()
【Yuki】
そうですね...。基本的な使い方なら、SimpleDirectoryReaderというクラスを使うだけで、指定したフォルダの中にあるファイルを自動的に判別して読み込んでくれます。初心者の方には、まずはここから始めるのがおすすめかもしれません。
クエリエンジンとレスポンスの生成
![]()
【Hiroki】
インデックスができたら、次はどうやって質問するんですか?
![]()
【Yuki】
インデックスに対して質問を投げるためのインターフェースをQuery Engine(クエリエンジン)と呼びます。コードで書くと、たった1行で作成できるんですよ。
![]()
【Hiroki】
えっ、1行だけですか?
![]()
【Yuki】
はい、index.as_query_engine()と記述するだけです。このクエリエンジンが裏側でやってくれることは、実はとても高度なんです。
1. ユーザーの質問をベクトル化する。
2. インデックスの中から、質問の意味に近いNodeをいくつか取ってくる。
3. そのNodeの内容と、元の質問を組み合わせて「この資料に基づいて答えてください」というプロンプト(指示文)を作る。
4. LLMにそのプロンプトを送り、回答を受け取る。
![]()
【Hiroki】
なるほど...。僕たちが手動でやると大変な手順を、全部自動でやってくれているんですね。
![]()
【Yuki】
そうなんです。もちろん、もっと細かくカスタマイズすることもできますが、まずはこのシンプルな流れを覚えるのがいいと思います。
最新のAIモデルを活用する:Gemini 1.5 Flashの導入
![]()
【Yuki】
さて、LlamaIndexでは使うAIモデル(LLM)を自由に入れ替えることができます。最近だと、GoogleのGemini 1.5 Flashなどが、高速で性能も良くて注目されていますね。
![]()
【Hiroki】
Gemini!Googleの最新AIですね。LlamaIndexでも使えるんですか?
![]()
【Yuki】
もちろんです。最新のgoogle-genaiライブラリや、LlamaIndex専用の統合パッケージを使うことで、簡単に組み込めます。Gemini 1.5 Flashは、非常に長い文章(コンテキストウィンドウ)を扱えるのが特徴ですが、LlamaIndexと組み合わせることで、より膨大な資料の中から的確な回答を引き出すことができるようになるはずです...。
![]()
【Hiroki】
モデルの設定はどうやってやるんでしょう?
![]()
【Yuki】
LlamaIndexでは、Settingsオブジェクトを使って、使用するLLMや埋め込みモデルを一括で管理します。例えば、次のようなコードで設定できます。
from llama_index.llms.gemini import Gemini
from llama_index.core import Settings
# Gemini 1.5 Flashモデルを設定
Settings.llm = Gemini(model="models/gemini-1.5-flash")
![]()
【Hiroki】
これだけで、以降の処理がGeminiを使って行われるようになるんですね。すごくスマートです。
実際にコードを書いてみましょう
![]()
【Yuki】
それでは、簡単なPythonコードの例を見てみましょうか。カレントディレクトリにあるdataフォルダの中のテキストファイルを読み込んで、質問に答えるプログラムです。
![]()
【Hiroki】
はい!やってみたいです。
![]()
【Yuki】
あ、事前に pip install llama-index llama-index-llms-gemini でライブラリをインストールしておくのを忘れないでくださいね。
import os
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.gemini import Gemini
# APIキーの設定(環境変数などから取得してください)
os.environ["GOOGLE_API_KEY"] = "YOUR_API_KEY"
def main():
# 1. 使用するモデルの設定
# 最新のgemini-1.5-flashを使用します
Settings.llm = Gemini(model="models/gemini-1.5-flash")
# 2. データの読み込み
# ./data フォルダ内のドキュメントを読み込みます
documents = SimpleDirectoryReader("./data").load_data()
# 3. インデックスの作成
# 読み込んだドキュメントをベクトル化してインデックスに格納します
index = VectorStoreIndex.from_documents(documents)
# 4. クエリエンジンの作成
query_engine = index.as_query_engine()
# 5. 質問の実行
response = query_engine.query("この資料の要点を3つで教えてください。")
print(f"回答: {response}")
if __name__ == "__main__":
main()
![]()
【Hiroki】
わあ、思っていたよりずっと短いコードですね!これで自分専用の知識を持ったAIができるなんて、感動です。
![]()
【Yuki】
ふふ、そう言ってもらえると嬉しいです...。でも、実はこれだけだと、毎回プログラムを動かすたびにインデックスを作り直してしまって、時間もお金(APIの料金)ももったいないかもしれません。
![]()
【Hiroki】
あ、確かに。一度作ったインデックスを保存しておくことはできないんですか?
![]()
【Yuki】
もちろんできますよ。storage_contextという機能を使って、ディスクに保存(永続化)することができます。次回からはそれを読み込むだけで済むので、とても効率的になります。
インデックスの保存と読み込み
![]()
【Yuki】
保存と読み込みのコードも少し見ておきましょうか。
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)
![]()
【Hiroki】
これなら、大規模なドキュメントを扱っても大丈夫そうですね。
![]()
【Yuki】
ええ、そう思います。ただ、LlamaIndexは進化がとても早いライブラリなので、時々公式ドキュメントを確認するのが大切です。古い書き方だと動かないこともあるかもしれませんから。
LlamaIndexのさらなる可能性:Agent機能
![]()
【Hiroki】
Yukiさん、LlamaIndexって単に検索して答えるだけじゃなくて、もっと複雑なこともできるんですか?
![]()
【Yuki】
はい、実は「Agent(エージェント)」という機能もあります。これは、AIが自分で「どのツールを使うべきか」を判断して動く仕組みです。例えば、「この資料を読み込んだ上で、必要ならインターネットで最新情報を調べて、最終的なレポートを作成して」といった複雑な指示にも対応できるようになります。
![]()
【Hiroki】
AIが自分で考えて行動する...なんだか、どんどん未来っぽくなってきましたね。
![]()
【Yuki】
そうですね...。最初は難しく感じるかもしれませんが、LlamaIndexはそういった高度な機能も、なるべく私たちが直感的に扱えるように設計されているんです。誰かの役に立つために作られた、小さな便利ツールのような優しさを感じますよね。
![]()
【Hiroki】
確かに、初心者の僕でも、少しずつ触ってみれば何か作れそうな気がしてきました。
まとめ:LlamaIndexを使いこなすために
![]()
【Yuki】
今日はLlamaIndexの基本についてお話ししましたが、いかがでしたか?
![]()
【Hiroki】
はい、すごく勉強になりました!
- RAGを実現するためのフレームワークであること
- DocumentをNodeに分けてIndexを作るということ
- 多くのデータソースを簡単に繋げられること
- 最新のGemini 1.5 Flashなどもすぐに使えること
がよくわかりました。
![]()
【Yuki】
完璧なまとめですね、Hirokiくん。素晴らしいと思います...。
もしもっと詳しく知りたくなったら、公式のドキュメントを読んでみるのもいいかもしれません。
LlamaIndex Documentation
英語のサイトですが、コード例が豊富なので、眺めているだけでも発見があるはずです。
![]()
【Hiroki】
ありがとうございます!さっそく自分の学習ノートを読み込ませて、自分専用の家庭教師AIを作ってみようと思います。
![]()
【Yuki】
それは素敵なアイデアですね。きっと、Hirokiくんの助けになってくれると思いますよ。もし途中で分からなくなったら、またいつでも聞いてくださいね。私も...微力ながら、お手伝いしますから。
![]()
【Hiroki】
はい!これからもよろしくお願いします、Yukiさん!
![]()
【Yuki】
ええ、こちらこそ。あまり根を詰めすぎないように、自分のペースで楽しんでプログラミングを続けてくださいね。夜は冷え込むこともありますから、暖かくして作業してください...。
![]()
【Hiroki】
はい、ありがとうございます!
![]()
【Yuki】
(...あ、ちょっと教えすぎちゃったかな。でも、Hirokiくんが楽しそうだったので良かったです。私も後で、自分のプログラムの整理でもしようかな...。夜の静かな時間なら、捗りそうですし。)
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


