見出し画像

①LlamaIndexのData Lodingについてやってみた(v0.10 対応)

LLamaIndexのデータのロードについてサクッとまとめました.

https://docs.llamaindex.ai/en/stable/understanding/loading/loading.html

私の使用している環境はこちら.

!pip install openai
!pip install pypdf==1.12.0
!pip install langchain==0.1.7
!pip install llama-index==0.10.5

SimpleDirectoryReader

通常は次のようにして,あるディレクトリに入れたすべてのファイルからドキュメントを作成します.

from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader("./data").load_data()

この方法を用いたコードはこちら



ドキュメントを直接作成

上記のようにローダーを用いて外部のデータをドキュメントにする代わりに,直接作成することができます.

使用する際は,リストの中に入れることで複数のドキュメントを読み込めるようになっています.

from llama_index.core import Document

doc = Document(text="text")

この方法を用いたコードはこちら

https://colab.research.google.com/drive/1eytR1VmNisxNmp0gBKSNalvr1C1DG7fn?usp=sharing

変換(Transformations)

データをロード出来たら,ストレージシステムに入れる前にデータを処理して変換する必要があります.

高レベルの変換API(.from_documents())

通常はインデックスが持っているメソッド`.from_documents()`を用いてDocumentオブジェクトの配列を解析してチャンクアップします.

from llama_index.core import VectorStoreIndex

vector_index = VectorStoreIndex.from_documents(documents)
vector_index.as_query_engine()

これにより,内部ではDocumentがNodeオブジェクトに分割されます.

Nodeはドキュメントに似ていますが,親のDocumentと関係を持つようになります.

テキストスプリッターなどの主要な構成物をカスタマイズしたい場合は,アブストラクト化を通じてカスタムリストを渡すtransformationsか,settingsでグローバルに適用ができます.

text_splitter = SentenceSplitter(chunk_size=512, chunk_overlap=10)

# global
from llama_index.core import Settings

Settings.text_splitter = text_splitter

# per-index
index = VectorStoreIndex.from_documents(
    documents, transformations=[text_splitter]
)

この方法を用いたコードはこちら

SentenceSplitterについて

次のようなFieldsがあります.

  • chunk_overlap (int)

  • chunk_size (int)

  • paragraph_separator (str)

  • secondary_chunking_regex (str)

  • separator (str)

使いやすいものはchunk_overlap=2つのチャンクでダブらせる文字の数と,chunk_size=チャンクの文字数だと思います.

下位レベルの変換API

より細かく設定することもできます.

ドキュメントをノードに分割する

ドキュメントの重要な処理として,チャンクまたはノードオブジェクトに分割することです.

具体的には,データを取得してLLMに供給できるサイズに処理することです.

LlamaIndexでは段落,文,トークンベースのスプリッターから,HTML,JSONなどのファイルベースのスプリッターまで幅広いスプリッターがあります.

SemanticSplitterNodeParserなど,ドキュメントによってはかなり効果が現われそうなユニークなスプリッターがあるので,活用したいデータが決まっている人はよく確認しておくとよさそうです.

試しにTokenTextSplitterを使用した例はこちらです.


メタデータの追加

先ほどのdocを自分で作れるものについて,メタデータを追加することも可能です.

手動でも可能ですし,自動メタデータ抽出機能を使うこともできるようです.

document = Document(
    text="text",
    metadata={"filename": "<doc_file_name>", "category": "<category>"},
)

この機能を使いまして,文書がいつ作成されたものかを答えられるかやってみました.


この記事が気に入ったらサポートをしてみませんか?