3秒でわかる
手元の文書を検索できる形に整えて LLM へつなぐ Python 向けのライブラリ。RAG の読み込みから検索までを短い記述で組めます。
30秒図解
もう少し詳しく
どういうものか
LlamaIndex は、社内文書や PDF といった手元のデータを LLM から扱える形に整える Python 中心のライブラリになる。文書の読み込み、扱いやすい大きさへの分割、ベクトル化、検索用インデックスの作成、質問に応じた取り出しまでを一続きの API で提供する。RAG (検索して得た文書を根拠として回答を作る方式) を組むための道具として使われる。
なぜ必要か
LLM は学習した時点までの一般知識しか持たず、社内規程や自社製品の仕様は知らない。質問のたびに全文をプロンプトへ貼れば文脈長を超え、費用も膨らむ。関係する数ページだけを毎回選び出して渡す仕組みが要る。その選び出しに必要な分割、埋め込み、類似検索を自前で書くと数百行になるところを、LlamaIndex は既定の設定で肩代わりする。
具体例
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
docs = SimpleDirectoryReader("./docs").load_data()
index = VectorStoreIndex.from_documents(docs)
engine = index.as_query_engine(similarity_top_k=3)
answer = engine.query("返品の期限は何日ですか")
print(answer)
print(answer.source_nodes[0].node.text) # 根拠にした文書を確認するsimilarity_top_k は、質問に近い文書を上から何件取り出して LLM へ渡すかを決める。
つまずきやすいところ
回答が的外れなときに、モデルを疑って検索側を見落とす例が多い。まず source_nodes を表示し、正しい文書が取り出せているかを確かめる。取り出せていなければ原因は分割の粒度か埋め込みの側にある。分割が細かすぎると文の前後が切れて意味が失われ、粗すぎると無関係な内容が混ざって類似度が下がる。また、インデックスは作った時点の内容を保持するので、元ファイルを更新したら作り直さないと古い回答が返り続ける。
似た用語との違い
LangChain は LLM を使う処理全般をつなぐ汎用の枠組みで、対象が広い。LlamaIndex は取り込みと検索に軸足を置いており、RAG だけを組むなら記述量が少なくて済む。両者は排他ではなく、検索部分を LlamaIndex に任せて全体を LangChain で組む構成も取れる。
覚え方
LlamaIndex がやっているのは、社内文書に索引を付けて司書を置く作業にあたる。質問が来たら書架から関係する数ページだけを抜き出し、それを添えて LLM に読ませる。回答が変なときは、司書が持ってきた資料が正しかったかを先に確かめる。