140 lines
5.3 KiB
Python
Executable file
140 lines
5.3 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
"""
|
|
Script de prueba para el LLM Categorizer
|
|
Prueba la categorización con datos de ejemplo sin necesidad del contenedor
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
|
|
# Datos de prueba
|
|
TEST_NEWS = [
|
|
{
|
|
'id': 'test_1',
|
|
'titulo': 'El gobierno anuncia nuevas medidas económicas para combatir la inflación',
|
|
'resumen': 'El presidente del gobierno ha presentado un paquete de medidas económicas destinadas a reducir la inflación y proteger el poder adquisitivo de las familias.'
|
|
},
|
|
{
|
|
'id': 'test_2',
|
|
'titulo': 'Nueva vacuna contra el cáncer muestra resultados prometedores',
|
|
'resumen': 'Investigadores de la Universidad de Stanford han desarrollado una vacuna experimental que ha mostrado una eficacia del 85% en ensayos clínicos con pacientes con melanoma.'
|
|
},
|
|
{
|
|
'id': 'test_3',
|
|
'titulo': 'El Real Madrid gana la Champions League por decimoquinta vez',
|
|
'resumen': 'El equipo blanco se impuso por 2-1 en la final celebrada en Wembley, consolidándose como el club más laureado de la competición europea.'
|
|
},
|
|
{
|
|
'id': 'test_4',
|
|
'titulo': 'OpenAI lanza GPT-5 con capacidades multimodales mejoradas',
|
|
'resumen': 'La nueva versión del modelo de lenguaje incorpora mejor comprensión de imágenes, video y audio, además de un razonamiento más avanzado.'
|
|
},
|
|
{
|
|
'id': 'test_5',
|
|
'titulo': 'Crisis diplomática entre Estados Unidos y China por aranceles',
|
|
'resumen': 'Las tensiones comerciales se intensifican después de que Washington impusiera nuevos aranceles del 25% a productos tecnológicos chinos.'
|
|
}
|
|
]
|
|
|
|
def test_without_llm():
|
|
"""Prueba básica sin LLM (categorización basada en keywords)"""
|
|
print("=== Prueba de Categorización Básica (sin LLM) ===\n")
|
|
|
|
# Categorías con palabras clave simples
|
|
CATEGORIES_KEYWORDS = {
|
|
'Política': ['gobierno', 'presidente', 'político', 'parlamento', 'elecciones'],
|
|
'Economía': ['económic', 'inflación', 'aranceles', 'bolsa', 'financiero'],
|
|
'Salud': ['vacuna', 'hospital', 'médico', 'tratamiento', 'enfermedad'],
|
|
'Deportes': ['fútbol', 'champions', 'equipo', 'partido', 'gana'],
|
|
'Tecnología': ['tecnológic', 'digital', 'software', 'ai', 'gpt', 'openai'],
|
|
'Internacional': ['estados unidos', 'china', 'rusia', 'diplomática', 'crisis'],
|
|
}
|
|
|
|
for news in TEST_NEWS:
|
|
text = (news['titulo'] + ' ' + news['resumen']).lower()
|
|
|
|
best_category = 'Otros'
|
|
max_score = 0
|
|
|
|
for category, keywords in CATEGORIES_KEYWORDS.items():
|
|
score = sum(1 for kw in keywords if kw in text)
|
|
if score > max_score:
|
|
max_score = score
|
|
best_category = category
|
|
|
|
print(f"ID: {news['id']}")
|
|
print(f"Título: {news['titulo']}")
|
|
print(f"Categoría: {best_category} (score: {max_score})")
|
|
print()
|
|
|
|
def test_with_llm():
|
|
"""Prueba con el LLM real (requiere modelo descargado)"""
|
|
print("\n=== Prueba de Categorización con LLM ===\n")
|
|
|
|
# Configurar path del modelo
|
|
MODEL_PATH = os.environ.get("LLM_MODEL_PATH", "/home/x/rss2/models/llm")
|
|
|
|
if not os.path.exists(MODEL_PATH):
|
|
print(f"❌ Error: No se encuentra el modelo en {MODEL_PATH}")
|
|
print(f"Por favor ejecuta primero: ./scripts/download_llm_model.sh")
|
|
return
|
|
|
|
# Verificar si exllamav2 está instalado
|
|
try:
|
|
import exllamav2
|
|
print(f"✓ ExLlamaV2 instalado: {exllamav2.__version__}")
|
|
except ImportError:
|
|
print("❌ Error: ExLlamaV2 no está instalado")
|
|
print("Instalar con: pip install exllamav2")
|
|
return
|
|
|
|
# Importar el categorizer
|
|
sys.path.insert(0, '/home/x/rss2')
|
|
from workers.llm_categorizer_worker import ExLlamaV2Categorizer
|
|
|
|
print(f"Cargando modelo desde: {MODEL_PATH}")
|
|
print("(Esto puede tardar unos minutos...)\n")
|
|
|
|
try:
|
|
categorizer = ExLlamaV2Categorizer(MODEL_PATH)
|
|
print("✓ Modelo cargado exitosamente\n")
|
|
|
|
results = categorizer.categorize_news(TEST_NEWS)
|
|
|
|
print("\n=== Resultados ===\n")
|
|
for i, news in enumerate(TEST_NEWS):
|
|
result = results[i]
|
|
print(f"ID: {news['id']}")
|
|
print(f"Título: {news['titulo']}")
|
|
print(f"Categoría: {result['categoria']}")
|
|
print(f"Confianza: {result['confianza']:.2f}")
|
|
print()
|
|
|
|
except Exception as e:
|
|
print(f"❌ Error: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
def main():
|
|
print("=" * 60)
|
|
print("Script de Prueba del LLM Categorizer")
|
|
print("=" * 60)
|
|
print()
|
|
|
|
# Prueba básica siempre funciona
|
|
test_without_llm()
|
|
|
|
# Preguntar si probar con LLM
|
|
print("\n¿Deseas probar con el LLM real? (requiere modelo descargado)")
|
|
print("Esto cargará el modelo en GPU y puede tardar varios minutos.")
|
|
response = input("Continuar? [s/N]: ").strip().lower()
|
|
|
|
if response in ['s', 'si', 'y', 'yes']:
|
|
test_with_llm()
|
|
else:
|
|
print("\nPrueba finalizada. Para probar con el LLM:")
|
|
print("1. Descarga el modelo: ./scripts/download_llm_model.sh")
|
|
print("2. Ejecuta este script de nuevo y acepta probar con LLM")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|