Primera version de chunkeo completo crud

This commit is contained in:
Sebastian
2025-11-05 19:18:11 +00:00
parent df2c184814
commit 7c6e8c4858
36 changed files with 6242 additions and 5 deletions

View File

@@ -0,0 +1,189 @@
"""
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