Preparar repositorio para despliegue: código fuente limpio
This commit is contained in:
parent
866f5c432d
commit
3eca832c1a
76 changed files with 5434 additions and 3496 deletions
140
scripts/test_llm_categorizer.py
Executable file
140
scripts/test_llm_categorizer.py
Executable file
|
|
@ -0,0 +1,140 @@
|
|||
#!/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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue