Bug solucionado de Qdrant y subida a de datos extraidos a Redis con referencia al documento
This commit is contained in:
68
backend/app/models/extracted_data.py
Normal file
68
backend/app/models/extracted_data.py
Normal file
@@ -0,0 +1,68 @@
|
||||
"""
|
||||
Modelo Redis-OM para almacenar datos extraídos de documentos.
|
||||
Permite búsqueda rápida de datos estructurados sin necesidad de búsqueda vectorial.
|
||||
"""
|
||||
from datetime import datetime
|
||||
from typing import Optional, Dict, Any
|
||||
from redis_om import HashModel, Field, Migrator
|
||||
import json
|
||||
|
||||
|
||||
class ExtractedDocument(HashModel):
|
||||
"""
|
||||
Modelo para guardar datos extraídos de documentos en Redis.
|
||||
|
||||
Uso:
|
||||
1. Cuando se procesa un PDF con schema y se extraen datos
|
||||
2. Los chunks van a Qdrant (para RAG)
|
||||
3. Los datos extraídos van a Redis (para búsqueda estructurada)
|
||||
|
||||
Ventajas:
|
||||
- Búsqueda rápida por file_name, tema, collection_name
|
||||
- Acceso directo a datos extraídos sin búsqueda vectorial
|
||||
- Permite filtros y agregaciones
|
||||
"""
|
||||
|
||||
# Identificadores
|
||||
file_name: str = Field(index=True)
|
||||
tema: str = Field(index=True)
|
||||
collection_name: str = Field(index=True)
|
||||
|
||||
# Datos extraídos (JSON serializado)
|
||||
# Redis-OM HashModel no soporta Dict directamente, usamos str y serializamos
|
||||
extracted_data_json: str
|
||||
|
||||
# Metadata
|
||||
extraction_timestamp: str # ISO format
|
||||
|
||||
class Meta:
|
||||
database = None # Se configura en runtime
|
||||
global_key_prefix = "extracted_doc"
|
||||
model_key_prefix = "doc"
|
||||
|
||||
def set_extracted_data(self, data: Dict[str, Any]) -> None:
|
||||
"""Helper para serializar datos extraídos a JSON"""
|
||||
self.extracted_data_json = json.dumps(data, ensure_ascii=False, indent=2)
|
||||
|
||||
def get_extracted_data(self) -> Dict[str, Any]:
|
||||
"""Helper para deserializar datos extraídos desde JSON"""
|
||||
return json.loads(self.extracted_data_json)
|
||||
|
||||
@classmethod
|
||||
def find_by_file(cls, file_name: str):
|
||||
"""Busca todos los documentos extraídos de un archivo"""
|
||||
return cls.find(cls.file_name == file_name).all()
|
||||
|
||||
@classmethod
|
||||
def find_by_tema(cls, tema: str):
|
||||
"""Busca todos los documentos extraídos de un tema"""
|
||||
return cls.find(cls.tema == tema).all()
|
||||
|
||||
@classmethod
|
||||
def find_by_collection(cls, collection_name: str):
|
||||
"""Busca todos los documentos en una colección"""
|
||||
return cls.find(cls.collection_name == collection_name).all()
|
||||
|
||||
|
||||
# Ejecutar migración para crear índices en Redis
|
||||
Migrator().run()
|
||||
@@ -58,7 +58,7 @@ class CustomSchema(BaseModel):
|
||||
schema_id: Optional[str] = Field(None, description="ID único del schema (generado automáticamente si no se provee)")
|
||||
schema_name: str = Field(..., description="Nombre descriptivo del schema", min_length=1, max_length=100)
|
||||
description: str = Field(..., description="Descripción de qué extrae este schema", min_length=1, max_length=500)
|
||||
fields: List[SchemaField] = Field(..., description="Lista de campos a extraer", min_items=1, max_items=50)
|
||||
fields: List[SchemaField] = Field(..., description="Lista de campos a extraer", min_items=1, max_items=200)
|
||||
|
||||
# Metadata
|
||||
created_at: Optional[str] = Field(None, description="Timestamp de creación ISO")
|
||||
|
||||
Reference in New Issue
Block a user