You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并多个已创建的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,提问作者林抿均

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:52:10