数据持久化与加载#
数据持久化#
默认情况下,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,
)
# 加载单个索引
# 如果同一目录中存在多个索引,需要指定index_id
index = load_index_from_storage(storage_context, index_id="<index_id>")
# 如果存储上下文中只有一个索引,则无需指定index_id
index = load_index_from_storage(storage_context)
# 加载多个索引
indices = load_indices_from_storage(storage_context) # 加载所有索引
indices = load_indices_from_storage(
storage_context, index_ids=[index_id1, ...]
) # 加载指定索引
# 加载可组合图
graph = load_graph_from_storage(
storage_context, root_id="<root_id>"
) # 加载具有指定root_id的图
使用远程后端#
默认情况下,LlamaIndex使用本地文件系统加载和保存文件。但您可以通过传入fsspec.AbstractFileSystem对象来覆盖此行为。
以下是一个简单示例,实例化向量存储:
import dotenv
import s3fs
import os
dotenv.load_dotenv("../../../.env")
# 加载文档
documents = SimpleDirectoryReader(
"../../../examples/paul_graham_essay/data/"
).load_data()
print(len(documents))
index = VectorStoreIndex.from_documents(documents)
到目前为止,所有操作都与之前相同。现在——让我们实例化一个S3文件系统并从中保存/加载。
# 设置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"},
)
# 如果您使用2+个索引共享同一个StorageContext
# 运行此命令将索引保存到远程blob存储
index.set_index_id("vector_index")
# 将索引持久化到s3
s3_bucket_name = "llama-index/storage_demo" # {bucket_name}/{index_name}
index.storage_context.persist(persist_dir=s3_bucket_name, fs=s3)
# 从s3加载索引
index_from_s3 = load_index_from_storage(
StorageContext.from_defaults(persist_dir=s3_bucket_name, fs=s3),
index_id="vector_index",
)
默认情况下,如果不传入文件系统,我们将假定使用本地文件系统。