使用向量存储索引(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中非常强大的工具,广泛应用于各种场景。通过理解其工作原理和灵活的使用方式,你可以构建高效、可扩展的检索系统。在实际应用中,结合不同的向量存储和自定义节点处理,可以实现更复杂和精细的检索需求。
版权归原作者 需要重新演唱 所有, 如有侵权,请联系我们删除。