mei_13のPython講座 ロゴ

【解説】LLMに「独自の知識」を授ける魔法のライブラリ:LlamaIndexの仕組みと実践




LLMに「独自の知識」を授ける魔法のライブラリ:LlamaIndexの仕組みと実践


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日は、最近のAI開発で欠かせない存在になっているLlamaIndex(ラマインデックス)というライブラリについて、一緒にお勉強してみましょうか。


Hirokiのアイコン
【Hiroki】 Yukiさん、よろしくお願いします!LlamaIndexって、ChatGPTとかのAIに自分の持っているファイルを読み込ませる時に使うものですよね?


Yukiのアイコン
【Yuki】 ええ、その通りです...。ChatGPTのような大規模言語モデル(LLM)は、学習した時点までの知識しか持っていません。でも、私たちが個人的に持っているドキュメントや、最新のニュースについては知らないんですよね。それを解決するのが、RAG(Retrieval-Augmented Generation:検索拡張生成)という手法で、LlamaIndexはそのRAGをとても簡単に実装できるようにしてくれるフレームワークなんです。


Hirokiのアイコン
【Hiroki】 RAG、最近よく聞きます。でも、具体的にどういう仕組みで動いているのか、よくわかっていないんです。


Yukiのアイコン
【Yuki】 少し難しい言葉に聞こえるかもしれませんが、仕組みは意外とシンプルですよ...。大きく分けて「データの読み込み」「インデックスの作成」「クエリ(質問)の実行」という3つのステップで成り立っています。LlamaIndexは、これらを繋ぐ強力な接着剤のような役割を果たしているのだと思います。

LlamaIndexの基本構造:データをどう扱うか


Yukiのアイコン
【Yuki】 まずは、LlamaIndexがどうやってデータを管理しているのかを見ていきましょう。一番基礎となる単位はDocumentNodeです。


Hirokiのアイコン
【Hiroki】 DocumentとNode...。ファイルそのものとは違うんですか?


Yukiのアイコン
【Yuki】 そうですね、DocumentはPDFやテキストファイルなどの「データソース全体」を指すイメージです。でも、長い文章をそのままAIに渡すと、処理できる文字数の制限を超えてしまったり、関係ない部分が混ざって精度が落ちたりするかもしれません。そこで、LlamaIndexはDocumentをNode(ノード)という小さな塊に分割します。


Hirokiのアイコン
【Hiroki】 なるほど!細かく分けることで、必要な部分だけを効率よく探せるようにするんですね。


Yukiのアイコン
【Yuki】 Hirokiくん、察しがいいですね。分割されたNodeは、その後Vector(ベクトル)という数値のリストに変換されます。これを「埋め込み(Embedding)」と呼びます。単語の意味を多次元の空間上の座標として表現することで、コンピュータが「意味の近さ」を計算できるようになるんです。


Hirokiのアイコン
【Hiroki】 意味を数字にするなんて、不思議です。でも、それがあるから「似たような内容の文章」を探し出せるというわけですね。


Yukiのアイコン
【Yuki】 はい。そして、そのベクトル化されたNodeを整理して保存しておく場所がIndexです。LlamaIndexという名前の由来でもありますね。最も一般的なのは「VectorStoreIndex」というもので、これを使うと、質問に対して意味的に最も近いNodeを高速に見つけ出すことができるようになります。

データコネクタとLlamaHubの便利さ


Hirokiのアイコン
【Hiroki】 でも、データを読み込むのって大変じゃないですか?PDFだったり、Notionだったり、Slackのログだったり、形式がバラバラだと書くのが面倒そうです。


Yukiのアイコン
【Yuki】 ふふ、そこもLlamaIndexの得意分野なんですよ。LlamaIndexにはData Connectorsという仕組みがあって、さまざまな形式のデータを簡単にDocumentとして読み込めます。特にLlamaHubというサイトを見ると、世界中の開発者が作ったコネクタが公開されています。


Hirokiのアイコン
【Hiroki】 LlamaHub、見てみました。Google DriveやDiscord、GitHubまでありますね!これなら、どんなデータでもすぐに取り込めそうです。


Yukiのアイコン
【Yuki】 そうですね...。基本的な使い方なら、SimpleDirectoryReaderというクラスを使うだけで、指定したフォルダの中にあるファイルを自動的に判別して読み込んでくれます。初心者の方には、まずはここから始めるのがおすすめかもしれません。

クエリエンジンとレスポンスの生成


Hirokiのアイコン
【Hiroki】 インデックスができたら、次はどうやって質問するんですか?


Yukiのアイコン
【Yuki】 インデックスに対して質問を投げるためのインターフェースをQuery Engine(クエリエンジン)と呼びます。コードで書くと、たった1行で作成できるんですよ。


Hirokiのアイコン
【Hiroki】 えっ、1行だけですか?


Yukiのアイコン
【Yuki】 はい、index.as_query_engine()と記述するだけです。このクエリエンジンが裏側でやってくれることは、実はとても高度なんです。 1. ユーザーの質問をベクトル化する。 2. インデックスの中から、質問の意味に近いNodeをいくつか取ってくる。 3. そのNodeの内容と、元の質問を組み合わせて「この資料に基づいて答えてください」というプロンプト(指示文)を作る。 4. LLMにそのプロンプトを送り、回答を受け取る。


Hirokiのアイコン
【Hiroki】 なるほど...。僕たちが手動でやると大変な手順を、全部自動でやってくれているんですね。


Yukiのアイコン
【Yuki】 そうなんです。もちろん、もっと細かくカスタマイズすることもできますが、まずはこのシンプルな流れを覚えるのがいいと思います。

最新のAIモデルを活用する:Gemini 1.5 Flashの導入


Yukiのアイコン
【Yuki】 さて、LlamaIndexでは使うAIモデル(LLM)を自由に入れ替えることができます。最近だと、GoogleのGemini 1.5 Flashなどが、高速で性能も良くて注目されていますね。


Hirokiのアイコン
【Hiroki】 Gemini!Googleの最新AIですね。LlamaIndexでも使えるんですか?


Yukiのアイコン
【Yuki】 もちろんです。最新のgoogle-genaiライブラリや、LlamaIndex専用の統合パッケージを使うことで、簡単に組み込めます。Gemini 1.5 Flashは、非常に長い文章(コンテキストウィンドウ)を扱えるのが特徴ですが、LlamaIndexと組み合わせることで、より膨大な資料の中から的確な回答を引き出すことができるようになるはずです...。


Hirokiのアイコン
【Hiroki】 モデルの設定はどうやってやるんでしょう?


Yukiのアイコン
【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のアイコン
【Hiroki】 これだけで、以降の処理がGeminiを使って行われるようになるんですね。すごくスマートです。

実際にコードを書いてみましょう


Yukiのアイコン
【Yuki】 それでは、簡単なPythonコードの例を見てみましょうか。カレントディレクトリにあるdataフォルダの中のテキストファイルを読み込んで、質問に答えるプログラムです。


Hirokiのアイコン
【Hiroki】 はい!やってみたいです。


Yukiのアイコン
【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のアイコン
【Hiroki】 わあ、思っていたよりずっと短いコードですね!これで自分専用の知識を持ったAIができるなんて、感動です。


Yukiのアイコン
【Yuki】 ふふ、そう言ってもらえると嬉しいです...。でも、実はこれだけだと、毎回プログラムを動かすたびにインデックスを作り直してしまって、時間もお金(APIの料金)ももったいないかもしれません。


Hirokiのアイコン
【Hiroki】 あ、確かに。一度作ったインデックスを保存しておくことはできないんですか?


Yukiのアイコン
【Yuki】 もちろんできますよ。storage_contextという機能を使って、ディスクに保存(永続化)することができます。次回からはそれを読み込むだけで済むので、とても効率的になります。

インデックスの保存と読み込み


Yukiのアイコン
【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のアイコン
【Hiroki】 これなら、大規模なドキュメントを扱っても大丈夫そうですね。


Yukiのアイコン
【Yuki】 ええ、そう思います。ただ、LlamaIndexは進化がとても早いライブラリなので、時々公式ドキュメントを確認するのが大切です。古い書き方だと動かないこともあるかもしれませんから。

LlamaIndexのさらなる可能性:Agent機能


Hirokiのアイコン
【Hiroki】 Yukiさん、LlamaIndexって単に検索して答えるだけじゃなくて、もっと複雑なこともできるんですか?


Yukiのアイコン
【Yuki】 はい、実は「Agent(エージェント)」という機能もあります。これは、AIが自分で「どのツールを使うべきか」を判断して動く仕組みです。例えば、「この資料を読み込んだ上で、必要ならインターネットで最新情報を調べて、最終的なレポートを作成して」といった複雑な指示にも対応できるようになります。


Hirokiのアイコン
【Hiroki】 AIが自分で考えて行動する...なんだか、どんどん未来っぽくなってきましたね。


Yukiのアイコン
【Yuki】 そうですね...。最初は難しく感じるかもしれませんが、LlamaIndexはそういった高度な機能も、なるべく私たちが直感的に扱えるように設計されているんです。誰かの役に立つために作られた、小さな便利ツールのような優しさを感じますよね。


Hirokiのアイコン
【Hiroki】 確かに、初心者の僕でも、少しずつ触ってみれば何か作れそうな気がしてきました。

まとめ:LlamaIndexを使いこなすために


Yukiのアイコン
【Yuki】 今日はLlamaIndexの基本についてお話ししましたが、いかがでしたか?


Hirokiのアイコン
【Hiroki】 はい、すごく勉強になりました! - RAGを実現するためのフレームワークであること - DocumentをNodeに分けてIndexを作るということ - 多くのデータソースを簡単に繋げられること - 最新のGemini 1.5 Flashなどもすぐに使えること がよくわかりました。


Yukiのアイコン
【Yuki】 完璧なまとめですね、Hirokiくん。素晴らしいと思います...。 もしもっと詳しく知りたくなったら、公式のドキュメントを読んでみるのもいいかもしれません。 LlamaIndex Documentation 英語のサイトですが、コード例が豊富なので、眺めているだけでも発見があるはずです。


Hirokiのアイコン
【Hiroki】 ありがとうございます!さっそく自分の学習ノートを読み込ませて、自分専用の家庭教師AIを作ってみようと思います。


Yukiのアイコン
【Yuki】 それは素敵なアイデアですね。きっと、Hirokiくんの助けになってくれると思いますよ。もし途中で分からなくなったら、またいつでも聞いてくださいね。私も...微力ながら、お手伝いしますから。


Hirokiのアイコン
【Hiroki】 はい!これからもよろしくお願いします、Yukiさん!


Yukiのアイコン
【Yuki】 ええ、こちらこそ。あまり根を詰めすぎないように、自分のペースで楽しんでプログラミングを続けてくださいね。夜は冷え込むこともありますから、暖かくして作業してください...。


Hirokiのアイコン
【Hiroki】 はい、ありがとうございます!


Yukiのアイコン
【Yuki】 (...あ、ちょっと教えすぎちゃったかな。でも、Hirokiくんが楽しそうだったので良かったです。私も後で、自分のプログラムの整理でもしようかな...。夜の静かな時間なら、捗りそうですし。)



< LangChain
コラム一覧に戻る
Biopython >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
● 高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!



AIアシスタント Yuki