Skip to content

数据持久化与加载#

数据持久化#

默认情况下,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"},
)

# 如果您使用同一 StorageContext 中的 2 个或更多索引,
# 运行以下代码将索引保存到远程 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",
)

默认情况下,如果您没有传递文件系统,我们将假定使用本地文件系统。