| """Abstract base classes for indexing components. |
| |
| This module defines the interfaces for: |
| - Chunkers: Text splitting strategies |
| - Extractors: Entity/relationship extraction |
| - Indexers: Knowledge graph builders |
| """ |
|
|
| from abc import ABC, abstractmethod |
| from dataclasses import dataclass, field |
| from typing import Dict, List, Optional, Any, Union |
|
|
| from ..base import BaseGraphStorage, BaseVectorStorage, TextChunkSchema |
|
|
|
|
| @dataclass |
| class ChunkResult: |
| """Result from a chunking operation. |
| |
| Attributes: |
| chunks: List of chunk dictionaries with content and metadata |
| total_tokens: Total number of tokens in the original content |
| """ |
| chunks: List[Dict[str, Any]] = field(default_factory=list) |
| total_tokens: int = 0 |
|
|
|
|
| @dataclass |
| class ExtractionResult: |
| """Result from entity/relationship extraction. |
| |
| Attributes: |
| entities: List of extracted entity dictionaries |
| relationships: List of extracted relationship dictionaries |
| stats: Statistics about the extraction process |
| """ |
| entities: List[Dict[str, Any]] = field(default_factory=list) |
| relationships: List[Dict[str, Any]] = field(default_factory=list) |
| stats: Dict[str, int] = field(default_factory=dict) |
|
|
|
|
| @dataclass |
| class IndexingResult: |
| """Result from an indexing/building operation. |
| |
| Attributes: |
| nodes_added: Number of nodes added to the graph |
| edges_added: Number of edges added to the graph |
| entities_indexed: Number of entities indexed in vector DB |
| relationships_indexed: Number of relationships indexed in vector DB |
| metadata: Additional metadata about the operation |
| """ |
| nodes_added: int = 0 |
| edges_added: int = 0 |
| entities_indexed: int = 0 |
| relationships_indexed: int = 0 |
| metadata: Dict[str, Any] = field(default_factory=dict) |
|
|
|
|
| class BaseChunker(ABC): |
| """Abstract base class for text chunking strategies. |
| |
| Chunkers are responsible for splitting text content into smaller, |
| overlapping or non-overlapping chunks suitable for processing. |
| """ |
|
|
| @abstractmethod |
| def chunk(self, content: str, **kwargs) -> ChunkResult: |
| """Split content into chunks. |
| |
| Args: |
| content: Text content to split |
| **kwargs: Chunker-specific parameters |
| |
| Returns: |
| ChunkResult containing the chunks and metadata |
| """ |
| pass |
|
|
| def __repr__(self) -> str: |
| return f"{self.__class__.__name__}()" |
|
|
|
|
| class BaseExtractor(ABC): |
| """Abstract base class for entity/relationship extraction. |
| |
| Extractors are responsible for identifying and extracting entities |
| and relationships from text chunks, typically using LLMs or |
| rule-based approaches. |
| """ |
|
|
| @abstractmethod |
| async def extract( |
| self, |
| chunks: Dict[str, TextChunkSchema], |
| knowledge_graph: BaseGraphStorage, |
| **kwargs |
| ) -> ExtractionResult: |
| """Extract entities and relationships from chunks. |
| |
| Args: |
| chunks: Dictionary of chunk_id -> chunk data |
| knowledge_graph: Graph storage to add entities/relationships to |
| **kwargs: Extractor-specific parameters |
| |
| Returns: |
| ExtractionResult with entities, relationships, and stats |
| """ |
| pass |
|
|
| def __repr__(self) -> str: |
| return f"{self.__class__.__name__}()" |
|
|
|
|
| class BaseIndexer(ABC): |
| """Abstract base class for knowledge graph builders. |
| |
| Indexers are responsible for building knowledge graphs from |
| various sources (schemas, files, etc.) and storing them in |
| the appropriate storage backends. |
| """ |
|
|
| def __init__( |
| self, |
| graph_storage: BaseGraphStorage, |
| entities_vdb: BaseVectorStorage, |
| relationships_vdb: BaseVectorStorage, |
| ): |
| """Initialize the indexer with storage backends. |
| |
| Args: |
| graph_storage: Graph storage for nodes and edges |
| entities_vdb: Vector database for entity embeddings |
| relationships_vdb: Vector database for relationship embeddings |
| """ |
| self.graph_storage = graph_storage |
| self.entities_vdb = entities_vdb |
| self.relationships_vdb = relationships_vdb |
|
|
| @abstractmethod |
| async def build(self, source: Any, **kwargs) -> IndexingResult: |
| """Build knowledge graph from source. |
| |
| Args: |
| source: Source data (file path, schema dict, etc.) |
| **kwargs: Builder-specific parameters |
| |
| Returns: |
| IndexingResult with statistics about the build |
| """ |
| pass |
|
|
| def __repr__(self) -> str: |
| return f"{self.__class__.__name__}()" |
|
|