跳转到内容

数据持久化与加载

默认情况下,LlamaIndex将数据存储在内存中,如果需要,可以显式持久化这些数据:

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

这将把数据持久化到磁盘,保存在指定的 persist_dir(或默认的 ./storage)下。

多个索引可以持久化并从同一目录加载,前提是您跟踪索引ID以便加载。

用户也可以配置默认持久化数据的替代存储后端(例如 MongoDB)。 在这种情况下,调用 storage_context.persist() 将不会执行任何操作。

要加载数据,用户只需使用相同的配置重新创建存储上下文(例如传入相同的 persist_dir 或向量存储客户端)。

storage_context = StorageContext.from_defaults(
docstore=SimpleDocumentStore.from_persist_dir(persist_dir="<persist_dir>"),
vector_store=SimpleVectorStore.from_persist_dir(
persist_dir="<persist_dir>"
),
index_store=SimpleIndexStore.from_persist_dir(persist_dir="<persist_dir>"),
)

然后我们可以通过下面的一些便捷函数从 StorageContext 加载特定索引。

from llama_index.core import (
load_index_from_storage,
load_indices_from_storage,
load_graph_from_storage,
)
# load a single index
# need to specify index_id if multiple indexes are persisted to the same directory
index = load_index_from_storage(storage_context, index_id="<index_id>")
# don't need to specify index_id if there's only one index in storage context
index = load_index_from_storage(storage_context)
# load multiple indices
indices = load_indices_from_storage(storage_context) # loads all indices
indices = load_indices_from_storage(
storage_context, index_ids=[index_id1, ...]
) # loads specific indices
# load composable graph
graph = load_graph_from_storage(
storage_context, root_id="<root_id>"
) # loads graph with the specified root_id

默认情况下,LlamaIndex使用本地文件系统来加载和保存文件。但是,您可以通过传递一个fsspec.AbstractFileSystem对象来覆盖此行为。

这是一个简单的示例,实例化一个向量存储:

import dotenv
import s3fs
import os
dotenv.load_dotenv("../../../.env")
# load documents
documents = SimpleDirectoryReader(
"../../../examples/paul_graham_essay/data/"
).load_data()
print(len(documents))
index = VectorStoreIndex.from_documents(documents)

到目前为止,所有步骤都相同。现在 - 让我们实例化一个 S3 文件系统并在其中保存/加载。

# set up s3fs
AWS_KEY = os.environ["AWS_ACCESS_KEY_ID"]
AWS_SECRET = os.environ["AWS_SECRET_ACCESS_KEY"]
R2_ACCOUNT_ID = os.environ["R2_ACCOUNT_ID"]
assert AWS_KEY is not None and AWS_KEY != ""
s3 = s3fs.S3FileSystem(
key=AWS_KEY,
secret=AWS_SECRET,
endpoint_url=f"https://{R2_ACCOUNT_ID}.r2.cloudflarestorage.com",
s3_additional_kwargs={"ACL": "public-read"},
)
# If you're using 2+ indexes with the same StorageContext,
# run this to save the index to remote blob storage
index.set_index_id("vector_index")
# persist index to s3
s3_bucket_name = "llama-index/storage_demo" # {bucket_name}/{index_name}
index.storage_context.persist(persist_dir=s3_bucket_name, fs=s3)
# load index from s3
index_from_s3 = load_index_from_storage(
StorageContext.from_defaults(persist_dir=s3_bucket_name, fs=s3),
index_id="vector_index",
)

默认情况下,如果您未传递文件系统,我们将假定为本地文件系统。