見出し画像

③LlamaIndex v0.10のStoringで保存機能をやってみる

※すべての内容は無料で閲覧いただけます。

こちらの公式ドキュメントを参考にStoringについてまとめていきます.


保存

データをロードしてインデックスを作成したら,コスト低減のためにインデックスデータを保存するとよいです.
デフォルトではインデックス付きデータはメモリにのみ保存されるため,明示的にストレージへの保存が必要です.

ディスク

インデックス付きのデータを保存するもっとも簡単な方法は,各インデックスに備わっているメソッド.persist()を使用することです.

このメソッドは、全てのデータをディスクの指定した場所に書き込みます。

index.storage_context.persist(persist_dir="<persist_dir>")

以下はコンポーザブルグラフでの例です。

graph.root_index.storage_context.persist(persist_dir="<persist_dir>")

次のように、永続化インデックスをロードすることでデータの再読み込みと再インデックス化の必要がなくなります。

from llama_index.core import StorageContext, load_index_from_storage

# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir="<persist_dir>")

# load index
index = load_index_from_storage(storage_context)

こちらのindexの保存と、保存したindexからの読み込みについて実装しました。

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

なお、カスタムのtransformations, embed_model などを使用してインデックスを初期化した場合は、load_index_from_storage の実行中に同じオプションを渡すかグローバル設定として設定する必要があります。

グローバル設定に関してConfig設定のドキュメントはこちら

ベクターストアの使用

インデックス作成での説明の通り、インデックスの最も一般的なタイプの1つはVectorStoreIndexです。

このVectorStoreIndex に埋め込みを作成するためのAPI呼び出しは、時間と費用の面でコストが高いため、同じデータを使用する場合はそれらを保存するのが良いです。

まず、chromaをインストールします。

pip install chromadb

Chromaについてはこちらの記事で解説されています。

Chromaを使用してVectorStoreIndexから作られた埋め込みを保存するには次の手順が必要です。

  • Chromaクライアントを初期化する

  • データをChromaに保存するためのコレクションを作成する

  • ChromaをStorage Context 内のvector_store に割りあてる

  • そのStorageContextを使用してVectorStoreIndex を初期化する

こちらは実際にデータをクエリする様子を少しだけ示します。

import chromadb
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext

# load some documents
documents = SimpleDirectoryReader("./data").load_data()

# initialize client, setting path to save data
db = chromadb.PersistentClient(path="./chroma_db")

# create collection
chroma_collection = db.get_or_create_collection("quickstart")

# assign chroma as the vector_store to the context
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)

# create your index
index = VectorStoreIndex.from_documents(
    documents, storage_context=storage_context
)

# create a query engine and query
query_engine = index.as_query_engine()
response = query_engine.query("What is the meaning of life?")
print(response)

すでに埋め込みを作成して保存している場合は、再度ドキュメントをロードしたり、新しいVectorStoreIndexを作成するのではなく、埋め込みを直接読み込むのが良いです。

import chromadb
from llama_index.core import VectorStoreIndex
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext

# initialize client
db = chromadb.PersistentClient(path="./chroma_db")

# get collection
chroma_collection = db.get_or_create_collection("quickstart")

# assign chroma as the vector_store to the context
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)

# load your index from stored vectors
index = VectorStoreIndex.from_vector_store(
    vector_store, storage_context=storage_context
)

# create a query engine
query_engine = index.as_query_engine()
response = query_engine.query("What is llama2?")
print(response)

Chromaの詳しい使用法はこちらを参照してください。(公式、英語)

これでデータのクエリの準備が完了しました。

ドキュメントまたはノードの挿入

すでにインデックスを作成している場合は、insertメソッドを使用することにより、新しいドキュメントをインデックスに追加することができます。

from llama_index.core import VectorStoreIndex

index = VectorStoreIndex([])
for doc in documents:
    index.insert(doc)

こちらのドキュメントやノードの挿入について、実装しました。

まとめ

  • 作成したindexを保存することでAPI使用のコストを軽減できる

  • ディスクへ保存する際はメソッド`.persist()`を使用する

  • 保存したインデックスはメソッドload_index_from_storage() でロードできる

  • メソッドinsert()により、すでに作成したindexに新しいドキュメントのindexを挿入できる

次に読む記事

いよいよRAGのメインの一つであるクエリについて学ぶと良いでしょう。

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