rss2/scripts/test_llm_categorizer.py

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()