LlamaIndexのIndexの仕組み

大規模言語モデル(LLM)を利用する上でLangChainと合わせて重要なLlamaIndexについて,LlamaIndexのドキュメントembedding方法や回答の合成方法がイマイチ不思議(理解できてなかった)だったので,読んで整理しました.

LlamaIndexとは

LlamaIndexはLLMを利用する際,①外部ドキュメントをLLMに効率的に渡すための構造化データの作成や,②構造化データを踏まえて質問解答するようにLLMに要求しする処理を実現してくれます.
 ①LlamaIndexはドキュメントを取り込み,Nodeと呼ばれるオブジェクトにテキストをパース・チャンクします.
 ②レスポンスの合成:取得したNodeをもとにレスポンス文書を合成する.(複数のレスポンス・モードが存在) 
今回は①の際のIndex方法について整理します.

Indexの種類(4種類)

リスト,ベクトル,キーワードテーブル,ツリーの4種類が存在.

リスト Index

  • 単にノードを直列に保存 https://gpt-index.readthedocs.io/en/latest/_images/list.png

  • クエリするときにパラメータを指定しないと,リスト内のすべてのノードをロードする https://gpt-index.readthedocs.io/en/latest/_images/list_query.png

  • top kの近傍をフェッチするembeddingベースやキーワードのフィルタリングを追加したクエリの指定も可能. https://gpt-index.readthedocs.io/en/latest/_images/list_filter_query.png

ベクトルストアIndex

各Nodeと対応するembeddingをベクトルストアに格納

https://gpt-index.readthedocs.io/en/latest/_images/vector_store.png

クエリの際は最も類似した上位k個のノードを取得し、それをレスポンス合成モジュールに渡す.

https://gpt-index.readthedocs.io/en/latest/_images/vector_store_query.png

ツリーIndex

Nodeの階層的なツリーを構築

https://gpt-index.readthedocs.io/en/latest/_images/tree.png

ルート・ノードからリーフ・ノードに至るまで辿る. デフォルトでは(child_branch_factor=1)、クエリは親ノードから1つの子ノードを選ぶ.child_branch_factor=2の場合、クエリは親ノード1つにつき2つの子ノードを選ぶ.

https://gpt-index.readthedocs.io/en/latest/_images/tree_query.png

キーワードテーブルIndex

各Nodeからキーワードを抽出し、各キーワードから対応するNodeへのマッピングを構築

https://gpt-index.readthedocs.io/en/latest/_images/keyword.png

クエリから関連するキーワードを抽出し、それらをノードに対応するキーワードと照合して、ノードを取得する。

https://gpt-index.readthedocs.io/en/latest/_images/keyword_query.png