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

需要重新演唱 2024-10-14 17:31:01 阅读 53

使用向量存储索引(VectorStoreIndex)

概念解释

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

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

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

使用向量存储的最简单方法是加载一组文档并使用<code>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>")code>

node2 = TextNode(text="<text_chunk>", id_="<node_id>")code>

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>")code>

pinecone.create_index("quickstart", dimension=1536, metric="euclidean", pod_type="p1")code>

# 构建向量存储并自定义存储上下文

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.",code>

obj=query_engine,

index_id="my_query_engine",code>

)

index = VectorStoreIndex(nodes=nodes, objects=[obj])

retriever = index.as_retriever(verbose=True)

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

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

拓展

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。