190 lines
5.0 KiB
Python
190 lines
5.0 KiB
Python
"""
|
|
Clase abstracta base para operaciones con bases de datos vectoriales.
|
|
|
|
Este módulo define la interfaz que todas las implementaciones de bases de datos
|
|
vectoriales deben seguir, permitiendo cambiar fácilmente entre diferentes proveedores.
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
from typing import List, Dict, Any, Optional
|
|
|
|
|
|
class VectorDBBase(ABC):
|
|
"""
|
|
Clase abstracta que define las operaciones básicas para una base de datos vectorial.
|
|
|
|
Esta interfaz permite implementar el patrón Repository/Strategy para
|
|
abstraer la lógica de acceso a datos vectoriales.
|
|
"""
|
|
|
|
@abstractmethod
|
|
async def collection_exists(self, collection_name: str) -> bool:
|
|
"""
|
|
Verifica si existe una colección con el nombre especificado.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección a verificar
|
|
|
|
Returns:
|
|
bool: True si la colección existe, False en caso contrario
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def create_collection(
|
|
self,
|
|
collection_name: str,
|
|
vector_size: int = 3072,
|
|
distance: str = "Cosine"
|
|
) -> bool:
|
|
"""
|
|
Crea una nueva colección en la base de datos vectorial.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección a crear
|
|
vector_size: Dimensión de los vectores (por defecto 3072)
|
|
distance: Métrica de distancia ("Cosine", "Euclid", "Dot")
|
|
|
|
Returns:
|
|
bool: True si se creó exitosamente, False en caso contrario
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def delete_collection(self, collection_name: str) -> bool:
|
|
"""
|
|
Elimina una colección completa.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección a eliminar
|
|
|
|
Returns:
|
|
bool: True si se eliminó exitosamente, False en caso contrario
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def file_exists_in_collection(
|
|
self,
|
|
collection_name: str,
|
|
file_name: str
|
|
) -> bool:
|
|
"""
|
|
Verifica si un archivo ya existe en una colección.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección
|
|
file_name: Nombre del archivo a buscar
|
|
|
|
Returns:
|
|
bool: True si el archivo existe, False en caso contrario
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def get_chunks_by_file(
|
|
self,
|
|
collection_name: str,
|
|
file_name: str,
|
|
limit: Optional[int] = None
|
|
) -> List[Dict[str, Any]]:
|
|
"""
|
|
Obtiene todos los chunks de un archivo específico.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección
|
|
file_name: Nombre del archivo
|
|
limit: Límite opcional de resultados
|
|
|
|
Returns:
|
|
List[Dict]: Lista de chunks con su metadata
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def delete_file_from_collection(
|
|
self,
|
|
collection_name: str,
|
|
file_name: str
|
|
) -> int:
|
|
"""
|
|
Elimina todos los chunks de un archivo de una colección.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección
|
|
file_name: Nombre del archivo a eliminar
|
|
|
|
Returns:
|
|
int: Número de chunks eliminados
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def add_chunks(
|
|
self,
|
|
collection_name: str,
|
|
chunks: List[Dict[str, Any]]
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
Agrega múltiples chunks a una colección.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección
|
|
chunks: Lista de chunks con estructura:
|
|
{
|
|
"id": str,
|
|
"vector": List[float],
|
|
"payload": {
|
|
"text": str,
|
|
"file_name": str,
|
|
"page": int,
|
|
...otros campos opcionales
|
|
}
|
|
}
|
|
|
|
Returns:
|
|
Dict con 'success' (bool) y 'chunks_added' (int)
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def get_collection_info(self, collection_name: str) -> Optional[Dict[str, Any]]:
|
|
"""
|
|
Obtiene información sobre una colección.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección
|
|
|
|
Returns:
|
|
Optional[Dict]: Información de la colección o None si no existe
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def count_chunks_in_file(
|
|
self,
|
|
collection_name: str,
|
|
file_name: str
|
|
) -> int:
|
|
"""
|
|
Cuenta el número de chunks de un archivo.
|
|
|
|
Args:
|
|
collection_name: Nombre de la colección
|
|
file_name: Nombre del archivo
|
|
|
|
Returns:
|
|
int: Número de chunks del archivo
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def health_check(self) -> bool:
|
|
"""
|
|
Verifica que la conexión con la base de datos vectorial esté funcionando.
|
|
|
|
Returns:
|
|
bool: True si la conexión es exitosa, False en caso contrario
|
|
"""
|
|
pass
|