llama-index
97 строк · 3.4 Кб
1"""Joint QA Summary graph."""
2
3from typing import Optional, Sequence4
5from llama_index.legacy.indices.list.base import SummaryIndex6from llama_index.legacy.indices.vector_store import VectorStoreIndex7from llama_index.legacy.ingestion import run_transformations8from llama_index.legacy.query_engine.router_query_engine import RouterQueryEngine9from llama_index.legacy.schema import Document10from llama_index.legacy.service_context import ServiceContext11from llama_index.legacy.storage.storage_context import StorageContext12from llama_index.legacy.tools.query_engine import QueryEngineTool13
14DEFAULT_SUMMARY_TEXT = "Use this index for summarization queries"15DEFAULT_QA_TEXT = (16"Use this index for queries that require retrieval of specific "17"context from documents."18)
19
20
21class QASummaryQueryEngineBuilder:22"""Joint QA Summary graph builder.23
24Can build a graph that provides a unified query interface
25for both QA and summarization tasks.
26
27NOTE: this is a beta feature. The API may change in the future.
28
29Args:
30docstore (BaseDocumentStore): A BaseDocumentStore to use for storing nodes.
31service_context (ServiceContext): A ServiceContext to use for
32building indices.
33summary_text (str): Text to use for the summary index.
34qa_text (str): Text to use for the QA index.
35node_parser (NodeParser): A NodeParser to use for parsing.
36
37"""
38
39def __init__(40self,41storage_context: Optional[StorageContext] = None,42service_context: Optional[ServiceContext] = None,43summary_text: str = DEFAULT_SUMMARY_TEXT,44qa_text: str = DEFAULT_QA_TEXT,45) -> None:46"""Init params."""47self._storage_context = storage_context or StorageContext.from_defaults()48self._service_context = service_context or ServiceContext.from_defaults()49self._summary_text = summary_text50self._qa_text = qa_text51
52def build_from_documents(53self,54documents: Sequence[Document],55) -> RouterQueryEngine:56"""Build query engine."""57# parse nodes58nodes = run_transformations(59documents, self._service_context.transformations # type: ignore60)61
62# ingest nodes63self._storage_context.docstore.add_documents(nodes, allow_update=True)64
65# build indices66vector_index = VectorStoreIndex(67nodes,68service_context=self._service_context,69storage_context=self._storage_context,70)71summary_index = SummaryIndex(72nodes,73service_context=self._service_context,74storage_context=self._storage_context,75)76
77vector_query_engine = vector_index.as_query_engine(78service_context=self._service_context79)80list_query_engine = summary_index.as_query_engine(81service_context=self._service_context,82response_mode="tree_summarize",83)84
85# build query engine86return RouterQueryEngine.from_defaults(87query_engine_tools=[88QueryEngineTool.from_defaults(89vector_query_engine, description=self._qa_text90),91QueryEngineTool.from_defaults(92list_query_engine, description=self._summary_text93),94],95service_context=self._service_context,96select_multi=False,97)98