③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のメインの一つであるクエリについて学ぶと良いでしょう。
この記事が気に入ったらサポートをしてみませんか?