如何合并多个已创建的LlamaIndex VectorStoreIndex实例并统一查询?
在LlamaIndex中合并两个独立VectorStoreIndex并保留原存储的实现方法
问题场景
已基于不同文档创建两个独立的VectorStoreIndex实例并完成持久化,加载后通过各自的QueryEngineTool进行查询。需求是将这两个索引合并为逻辑上的单个索引,使用单个QueryEngineTool查询,同时保留原有两个索引的独立存储不受影响。
解决方案
以下提供三种可行的实现方式,可根据实际需求选择:
方式一:提取文档重新创建合并索引
从已加载的两个索引中提取所有原始文档,基于这些文档创建新的合并索引,原索引的存储完全保留。
# 从已加载的索引中提取所有文档 lyft_docs = list(lyft_index.docstore.docs.values()) uber_docs = list(uber_index.docstore.docs.values()) merged_docs = lyft_docs + uber_docs # 创建合并后的VectorStoreIndex merged_index = VectorStoreIndex.from_documents(merged_docs) # 可选:持久化合并后的索引(不干扰原有的lyft/uber存储) merged_index.storage_context.persist(persist_dir="./storage/merged_ride_sharing") # 构建单个QueryEngineTool query_engine_tools = [ QueryEngineTool( query_engine=merged_index.as_query_engine(similarity_top_k=3), metadata=ToolMetadata( name="ride_sharing_10ks", description="Provides information on the company's financials for the year 2021 in response to user queries." ), ), ]
优缺点:
- 优势:查询逻辑与单一向量索引完全一致,使用简单。
- 劣势:需要重新生成向量数据,消耗额外计算资源;原索引更新后,合并索引不会自动同步,需重新生成。
方式二:使用CompositeIndex组合索引
利用LlamaIndex的CompositeIndex将多个子索引组合为一个逻辑上的单一索引,直接复用原索引的向量数据,无需重新生成。
from llama_index import CompositeIndex # 创建组合索引,保留原索引的独立存储 merged_index = CompositeIndex([lyft_index, uber_index]) # 创建组合索引的查询引擎 merged_query_engine = merged_index.as_query_engine(similarity_top_k=3) # 构建单个QueryEngineTool query_engine_tools = [ QueryEngineTool( query_engine=merged_query_engine, metadata=ToolMetadata( name="ride_sharing_10ks", description="Provides information on the company's financials for the year 2021 in response to user queries." ), ), ]
优缺点:
- 优势:复用原索引的向量数据,无需额外计算;原索引的存储结构完全保留。
- 劣势:组合索引的查询逻辑相对复杂,部分高级索引功能可能无法直接使用。
方式三:使用MultiVectorQueryEngine合并查询结果
如果不需要严格意义上的"合并索引",而是希望用一个查询引擎同时检索两个索引并自动合并结果,可使用MultiVectorQueryEngine,完全保留原索引的独立性。
from llama_index.query_engine import MultiVectorQueryEngine # 创建两个原索引的查询引擎 lyft_query_engine = lyft_index.as_query_engine(similarity_top_k=3) uber_query_engine = uber_index.as_query_engine(similarity_top_k=3) # 创建多向量查询引擎,合并两个查询引擎的结果 merged_query_engine = MultiVectorQueryEngine( query_engines=[lyft_query_engine, uber_query_engine] ) # 构建单个QueryEngineTool query_engine_tools = [ QueryEngineTool( query_engine=merged_query_engine, metadata=ToolMetadata( name="ride_sharing_10ks", description="Provides information on the company's financials for the year 2021 in response to user queries." ), ), ]
优缺点:
- 优势:实现简单,完全复用原索引;原索引更新后,查询结果会自动同步。
- 劣势:本质是多个查询引擎的结果合并,并非真正的单一索引结构。
内容的提问来源于stack exchange,提问作者林抿均
相关产品推荐
相关产品推荐

