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,72 @@
"""
Gestor de tokens para contar y truncar texto basado en modelos de tokenización.
"""
import logging
import tiktoken
logger = logging.getLogger(__name__)
class TokenManager:
"""Gestor para contar y truncar tokens usando tiktoken"""
def __init__(self, model_name: str = "gpt-3.5-turbo"):
"""
Inicializa el gestor de tokens.
Args:
model_name: Nombre del modelo para la codificación de tokens
"""
try:
self.encoding = tiktoken.encoding_for_model(model_name)
except KeyError:
logger.warning(
f"Modelo {model_name} no encontrado, usando codificación por defecto cl100k_base"
)
self.encoding = tiktoken.get_encoding("cl100k_base")
def count_tokens(self, text: str) -> int:
"""
Cuenta el número de tokens en un texto.
Args:
text: Texto a analizar
Returns:
Número de tokens
"""
return len(self.encoding.encode(text))
def truncate_to_tokens(
self,
text: str,
max_tokens: int,
preserve_sentences: bool = True
) -> str:
"""
Trunca texto a un número máximo de tokens.
Args:
text: Texto a truncar
max_tokens: Número máximo de tokens
preserve_sentences: Si True, intenta mantener oraciones completas
Returns:
Texto truncado
"""
tokens = self.encoding.encode(text)
if len(tokens) <= max_tokens:
return text
truncated_tokens = tokens[:max_tokens]
truncated_text = self.encoding.decode(truncated_tokens)
if preserve_sentences:
# Intentar cortar en el último punto
last_period = truncated_text.rfind('.')
# Solo cortar si el punto está en el último 30% del texto
if last_period > len(truncated_text) * 0.7:
return truncated_text[:last_period + 1]
return truncated_text