llamaindex 使用向量存储索引(VectorStoreIndex)

使用向量存储索引(VectorStoreIndex)

概念解释

向量存储(Vector Stores)是检索增强生成(RAG)的关键组件,因此你几乎会在使用LlamaIndex构建的每个应用程序中直接或间接地使用它们。

向量存储接受一组节点对象,并从中构建索引。

将数据加载到索引中
基本用法

使用向量存储的最简单方法是加载一组文档并使用from_documents方法从中构建索引:

from llama_index import VectorStoreIndex, SimpleDirectoryReader

# 加载文档并构建索引
documents = SimpleDirectoryReader('data_directory').load_data()
index = VectorStoreIndex.from_documents(documents)

提示

如果你在命令行中使用from_documents,可以通过传递show_progress=True来显示索引构建过程中的进度条。

当你使用from_documents时,你的文档会被分割成块并解析为节点对象,这些节点对象是文本字符串的轻量级抽象,用于跟踪元数据和关系。

有关如何加载文档的更多信息,请参阅[理解加载](Understanding Loading)。

默认情况下,VectorStoreIndex会将所有内容存储在内存中。有关如何使用持久向量存储的更多信息,请参阅下面的“使用向量存储”部分。

提示

默认情况下,VectorStoreIndex将以2048个节点的批次生成和插入向量。如果你内存受限(或有充足的内存),可以通过传递insert_batch_size=2048和你所需的批次大小来修改这一点。

这在插入到远程托管的向量数据库时特别有用。

使用摄取管道创建节点

如果你想要更多控制文档的索引方式,我们建议使用摄取管道。这允许你自定义分块、元数据和节点的嵌入。

from llama_index import Document, OpenAIEmbedding, SentenceSplitter, TitleExtractor, IngestionPipeline

# 创建带有转换的管道
pipeline = IngestionPipeline(
    transformations=[
        SentenceSplitter(chunk_size=25, chunk_overlap=0),
        TitleExtractor(),
        OpenAIEmbedding(),
    ]
)

# 运行管道
nodes = pipeline.run(documents=[Document.example()])

提示

你可以了解更多关于如何使用摄取管道的信息。

直接创建和管理节点

如果你想要完全控制索引,可以手动创建和定义节点,并将它们直接传递给索引构造函数:

from llama_index import TextNode, VectorStoreIndex

node1 = TextNode(text="<text_chunk>", id_="<node_id>")
node2 = TextNode(text="<text_chunk>", id_="<node_id>")
nodes = [node1, node2]
index = VectorStoreIndex(nodes)
处理文档更新

当你直接管理索引时,你需要处理随时间变化的数据源。索引类具有插入、删除、更新和刷新操作,你可以在下面了解更多信息:

  • 元数据提取
  • 文档管理
存储向量索引

LlamaIndex支持数十种向量存储。你可以通过传递一个StorageContext来指定使用哪一个,在其中你指定vector_store参数,如下例使用Pinecone:

import pinecone
from llama_index import VectorStoreIndex, SimpleDirectoryReader, StorageContext, PineconeVectorStore

# 初始化pinecone
pinecone.init(api_key="<api_key>", environment="<environment>")
pinecone.create_index("quickstart", dimension=1536, metric="euclidean", pod_type="p1")

# 构建向量存储并自定义存储上下文
storage_context = StorageContext.from_defaults(
    vector_store=PineconeVectorStore(pinecone.Index("quickstart"))
)

# 加载文档并构建索引
documents = SimpleDirectoryReader('data_directory').load_data()
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)

有关如何使用VectorStoreIndex的更多示例,请参阅我们的向量存储索引使用示例笔记本。

有关如何使用VectorStoreIndex与特定向量存储的示例,请查看存储部分下的向量存储。

可组合检索

VectorStoreIndex(以及任何其他索引/检索器)能够检索通用对象,包括:

  • 对节点的引用
  • 查询引擎
  • 检索器
  • 查询管道

如果这些对象被检索,它们将使用提供的查询自动运行。

例如:

from llama_index import IndexNode, VectorStoreIndex

query_engine = other_index.as_query_engine()
obj = IndexNode(
    text="A query engine describing X, Y, and Z.",
    obj=query_engine,
    index_id="my_query_engine",
)

index = VectorStoreIndex(nodes=nodes, objects=[obj])
retriever = index.as_retriever(verbose=True)

如果包含查询引擎的索引节点被检索,查询引擎将运行,并将结果响应作为节点返回。

有关更多详细信息,请查看指南。

拓展

向量存储索引是LlamaIndex中非常强大的工具,广泛应用于各种场景。通过理解其工作原理和灵活的使用方式,你可以构建高效、可扩展的检索系统。在实际应用中,结合不同的向量存储和自定义节点处理,可以实现更复杂和精细的检索需求。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要重新演唱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值