在LlamaIndex中,SummaryIndex
是一个特殊的索引类型,它允许你将多个对象(如检索器、查询引擎等)组合在一起,形成一个顶级的索引。当你创建一个SummaryIndex
并传入多个对象时,这些对象会被组合在一起,形成一个统一的查询接口。
索引的工作原理
当你创建一个SummaryIndex
并传入多个对象时,这些对象会被组合在一起,形成一个统一的查询接口。具体来说,当你对SummaryIndex
进行查询时,它会同时触发所有传入对象的检索操作,并将所有检索到的结果汇总在一起,然后生成一个最终的响应。
summary_index = SummaryIndex(objects=[vector_obj, bm25_obj])
在这个例子中,summary_index
包含了两个对象:vector_obj
和bm25_obj
。这两个对象分别代表向量检索器和BM25检索器。
查询过程
当你对summary_index
进行查询时,它会同时触发vector_obj
和bm25_obj
的检索操作:
query_engine = summary_index.as_query_engine(response_mode="tree_summarize", verbose=True)
response = await query_engine.aquery("How does attention work in transformers?")
print(str(response))
在这个查询过程中,summary_index
会同时使用vector_obj
和bm25_obj
进行检索:
- 向量检索器 (
vector_obj
):使用向量相似度进行检索。 - BM25检索器 (
bm25_obj
):使用BM25算法进行检索。
这两个检索器会并行工作,检索到的结果会被汇总在一起,然后生成一个最终的响应。
汇总结果
在response_mode="tree_summarize"
模式下,SummaryIndex
会将所有检索到的结果汇总在一起,并生成一个摘要性的响应。这个模式确保了并发执行和快速响应。
选择性查询
如果你希望选择性地使用某个特定的检索器进行查询,而不是同时使用所有检索器,你可以直接使用该检索器进行查询,而不是通过SummaryIndex
。例如:
# 仅使用向量检索器进行查询
vector_query_engine = vector_retriever.as_query_engine()
vector_response = await vector_query_engine.aquery("How does attention work in transformers?")
print(str(vector_response))
# 仅使用BM25检索器进行查询
bm25_query_engine = bm25_retriever.as_query_engine()
bm25_response = await bm25_query_engine.aquery("How does attention work in transformers?")
print(str(bm25_response))
通过这种方式,你可以选择性地使用某个特定的检索器进行查询,而不是同时使用所有检索器。
总结
在SummaryIndex
中,所有传入的对象(如检索器)都会被同时触发进行检索,并将所有检索到的结果汇总在一起,生成一个最终的响应。如果你希望选择性地使用某个特定的检索器进行查询,可以直接使用该检索器进行查询,而不是通过SummaryIndex
。