90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
"""Empty index.
|
|
|
|
An index that doesn't contain any documents. Can only be used for
|
|
pure LLM calls.
|
|
|
|
"""
|
|
|
|
from typing import Any, Dict, Optional, Sequence
|
|
|
|
from llama_index.core.base_query_engine import BaseQueryEngine
|
|
from llama_index.core.base_retriever import BaseRetriever
|
|
from llama_index.data_structs.data_structs import EmptyIndexStruct
|
|
from llama_index.indices.base import BaseIndex
|
|
from llama_index.schema import BaseNode
|
|
from llama_index.service_context import ServiceContext
|
|
from llama_index.storage.docstore.types import RefDocInfo
|
|
|
|
|
|
class EmptyIndex(BaseIndex[EmptyIndexStruct]):
|
|
"""Empty Index.
|
|
|
|
An index that doesn't contain any documents. Used for
|
|
pure LLM calls.
|
|
NOTE: this exists because an empty index it allows certain properties,
|
|
such as the ability to be composed with other indices + token
|
|
counting + others.
|
|
|
|
"""
|
|
|
|
index_struct_cls = EmptyIndexStruct
|
|
|
|
def __init__(
|
|
self,
|
|
index_struct: Optional[EmptyIndexStruct] = None,
|
|
service_context: Optional[ServiceContext] = None,
|
|
**kwargs: Any,
|
|
) -> None:
|
|
"""Initialize params."""
|
|
super().__init__(
|
|
nodes=None,
|
|
index_struct=index_struct or EmptyIndexStruct(),
|
|
service_context=service_context,
|
|
**kwargs,
|
|
)
|
|
|
|
def as_retriever(self, **kwargs: Any) -> BaseRetriever:
|
|
# NOTE: lazy import
|
|
from llama_index.indices.empty.retrievers import EmptyIndexRetriever
|
|
|
|
return EmptyIndexRetriever(self)
|
|
|
|
def as_query_engine(self, **kwargs: Any) -> BaseQueryEngine:
|
|
if "response_mode" not in kwargs:
|
|
kwargs["response_mode"] = "generation"
|
|
else:
|
|
if kwargs["response_mode"] != "generation":
|
|
raise ValueError("EmptyIndex only supports response_mode=generation.")
|
|
|
|
return super().as_query_engine(**kwargs)
|
|
|
|
def _build_index_from_nodes(self, nodes: Sequence[BaseNode]) -> EmptyIndexStruct:
|
|
"""Build the index from documents.
|
|
|
|
Args:
|
|
documents (List[BaseDocument]): A list of documents.
|
|
|
|
Returns:
|
|
IndexList: The created summary index.
|
|
"""
|
|
del nodes # Unused
|
|
return EmptyIndexStruct()
|
|
|
|
def _insert(self, nodes: Sequence[BaseNode], **insert_kwargs: Any) -> None:
|
|
"""Insert a document."""
|
|
del nodes # Unused
|
|
raise NotImplementedError("Cannot insert into an empty index.")
|
|
|
|
def _delete_node(self, node_id: str, **delete_kwargs: Any) -> None:
|
|
"""Delete a node."""
|
|
raise NotImplementedError("Cannot delete from an empty index.")
|
|
|
|
@property
|
|
def ref_doc_info(self) -> Dict[str, RefDocInfo]:
|
|
"""Retrieve a dict mapping of ingested documents and their nodes+metadata."""
|
|
raise NotImplementedError("ref_doc_info not supported for an empty index.")
|
|
|
|
|
|
# legacy
|
|
GPTEmptyIndex = EmptyIndex
|