使用 VectorStoreIndex#
向量存储是检索增强生成(RAG)的关键组件,因此在使用 LlamaIndex 制作的几乎每个应用程序中,您都会直接或间接地使用它们。
向量存储接受 Node
对象 的列表,并从中构建索引。
将数据加载到索引中#
基本用法#
使用 Vector Store 的最简单方法是使用 from_documents
加载一组文档并从中构建索引:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 加载文档并构建索引
documents = SimpleDirectoryReader(
"../../examples/data/paul_graham"
).load_data()
index = VectorStoreIndex.from_documents(documents)
提示
如果您在命令行上使用 from_documents
,可以方便地传递 show_progress=True
来在构建索引过程中显示进度条。
当您使用 from_documents
时,您的文档将被分成块,并解析为Node
对象,这些对象是文本字符串的轻量级抽象,用于跟踪元数据和关系。
有关如何加载文档的更多信息,请参见了解加载。
默认情况下,VectorStoreIndex 将所有内容存储在内存中。有关如何使用持久向量存储的更多信息,请参见下文的使用向量存储。
提示
默认情况下,VectorStoreIndex
将以 2048 个节点一批生成并插入向量。如果您受到内存限制(或者内存有剩余),您可以通过传递 insert_batch_size=2048
和您期望的批量大小来修改此设置。
当您插入到远程托管的向量数据库时,这一点尤其有帮助。
使用摄入管道创建节点#
如果您希望更多地控制文档的索引方式,我们建议使用摄入管道。这允许您自定义节点的分块、元数据和嵌入。
from llama_index.core import Document
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.extractors import TitleExtractor
from llama_index.core.ingestion import IngestionPipeline, IngestionCache
# 使用转换创建管道
pipeline = IngestionPipeline(
transformations=[
SentenceSplitter(chunk_size=25, chunk_overlap=0),
TitleExtractor(),
OpenAIEmbedding(),
]
)
# 运行管道
nodes = pipeline.run(documents=[Document.example()])
提示
您可以了解更多关于如何使用摄入管道的信息。
直接创建和管理节点#
如果您希望完全控制您的索引,可以手动创建和定义节点,并将它们直接传递给索引构造函数:
from llama_index.core.schema import TextNode
node1 = TextNode(text="<text_chunk>", id_="<node_id>")
node2 = TextNode(text="<text_chunk>", id_="<node_id>")
nodes = [node1, node2]
index = VectorStoreIndex(nodes)
处理文档更新#
在直接管理索引时,您将希望处理随时间变化的数据源。Index
类具有插入、删除、更新和刷新操作,您可以在下面了解更多信息:
存储向量索引#
LlamaIndex 支持数十种向量存储。您可以通过传递 StorageContext
来指定要使用的向量存储,然后在其中指定 vector_store
参数,就像在以下使用 Pinecone 的示例中一样:
import pinecone
from llama_index.core import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
)
from llama_index.vector_stores.pinecone import 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(
"../../examples/data/paul_graham"
).load_data()
index = VectorStoreIndex.from_documents(
documents, storage_context=storage_context
)
有关如何使用 VectorStoreIndex 的更多示例,请参见我们的向量存储索引使用示例笔记本。
有关如何将 VectorStoreIndex 与特定的向量存储一起使用的示例,请查看存储部分下的向量存储。
可组合的检索#
VectorStoreIndex
(以及任何其他索引/检索器)能够检索通用对象,包括
- 节点的引用
- 查询引擎
- 检索器
- 查询管道
如果检索到这些对象,它们将会自动使用提供的查询运行。
例如:
from llama_index.core.schema import IndexNode
query_engine = other_index.as_query_engine
obj = IndexNode(
text="描述 X、Y 和 Z 的查询引擎。",
obj=query_engine,
index_id="my_query_engine",
)
index = VectorStoreIndex(nodes=nodes, objects=[obj])
retriever = index.as_retreiver(verbose=True)
如果检索到包含查询引擎的索引节点,查询引擎将被运行,并将生成的响应作为节点返回。
更多细节,请查看指南