
Afinar modelos de lenguaje (LLM) para procesamiento de lenguaje natural en finanzas choca con un problema de datos: son escasos y están desbalanceados. Las noticias financieras reales sobrerrepresentan los reportes de resultados y los movimientos bursátiles, mientras que eventos más raros, como cambios en la clasificación crediticia, aprobaciones de productos o conflictos laborales, son difíciles de capturar a escala. La generación sintética puede llenar esos vacíos para investigación de trading, modelado de riesgo y vigilancia de mercados, pero la diversidad exige más que una sola corrida de generación grande.
NVIDIA documenta un pipeline iterativo que produjo 500.000 titulares únicos repartidos en 12 temas más una categoría "Otros". El flujo combina NeMo Data Designer para la generación estructurada, NeMo Curator para la deduplicación semántica y modelos Nemotron para la síntesis de alto rendimiento. También incorpora una estrategia de ejemplos "el más lejano del centroide" para empujar cada ronda hacia salidas novedosas.
En una corrida ingenua de 50.000 titulares, el 65% se eliminó por ser casi duplicados: la deduplicación semántica retuvo apenas 17.348 titulares únicos. En vez de escalar un solo lote, el pipeline itera: genera, filtra, deduplica de forma global, selecciona ejemplos distintivos, corrige los pesos por categoría y repite hasta alcanzar el tamaño objetivo. La corrida completa produjo 502.536 titulares únicos en 13 categorías tras 82 iteraciones, usando cerca de 6 días de cómputo sobre un único nodo de 8 GPU NVIDIA B200, con checkpointing, recuperación ante caídas y encadenamiento de trabajos SLURM.
¿Cómo está armado el hardware?
En el nodo B200 de 8 vías, las GPU 0 a 3 se dedicaron a inferencia con vLLM (paralelismo tensorial de 4 vías, 448 solicitudes concurrentes) y las GPU 4 a 7 corrieron la deduplicación semántica de NeMo Curator con Ray. Los parámetros clave del pipeline: 35.000 titulares por lote (50.000 en las primeras iteraciones), umbral de deduplicación por similitud coseno de 90%, 500 clústeres K-means, 3 ejemplos por categoría y un corte de similitud entre iteraciones de 80% para la selección de ejemplos.
Paso 1. Generar titulares con NeMo Data Designer
El modelo Nemotron 3 Nano (30.000 millones de parámetros, 3.000 millones activos) se sirve vía vLLM con paralelismo tensorial de 4 vías y 448 solicitudes concurrentes. Su arquitectura de mezcla de expertos (MoE) equilibra rendimiento y calidad, usando solo 3B de parámetros activos por paso hacia adelante dentro de un modelo de 30B. NeMo Data Designer orquesta la generación mediante una configuración declarativa: un muestreador de categorías ponderado sobre 12 temas más "Otros" y una columna LLM que genera titulares condicionados a la categoría muestreada y a los ejemplos vigentes.
local_model = ModelConfig(
alias="local-nemotron",
model="nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8",
provider="local-vllm",
inference_parameters=InferenceParameters(
max_parallel_requests=448,
temperature=0.95,
top_p=0.95,
),
)Se usa un muestreo de alta diversidad (temperatura 0,95, penalización de frecuencia 0,3 y de presencia 0,2) y se confía en el filtrado posterior y la deduplicación semántica para eliminar salidas malformadas o redundantes.
Paso 2. Filtrado de calidad
Antes de la deduplicación semántica, una pasada liviana basada en reglas descarta salidas malformadas, como titulares truncados, desbordados o ilegibles. En la práctica estos filtros eliminaron menos del 1% de los titulares por lote, así que la mayor parte del control de calidad proviene del paso siguiente.
Paso 3. Deduplicación semántica con NeMo Curator
Este es el mecanismo central de calidad. Tras cada lote, el pipeline combina los titulares nuevos con el corpus acumulado y ejecuta el flujo de deduplicación de NeMo Curator. Los titulares se representan con el modelo de embeddings all-MiniLM-L6-v2, se agrupan con K-means y se comparan dentro de cada clúster por similitud coseno por pares. Cualquier titular por encima del umbral de similitud de 90% se elimina.
workflow = TextSemanticDeduplicationWorkflow(
text_field="headline",
model_identifier="sentence-transformers/all-MiniLM-L6-v2",
n_clusters=500, # más clústeres = más pequeños = más rápido por pares
eps=0.10, # eps = 1 - umbral_similitud (0,90)
pairwise_batch_size=4096,
)
workflow.run()La decisión de diseño clave es la deduplicación global: cada lote se compara con todos los titulares retenidos previamente, no solo consigo mismo, evitando duplicados entre lotes y preservando la unicidad semántica a lo largo de todo el corpus de 500K.
¿Por qué 500 clústeres?
La similitud por pares es cara porque las comparaciones escalan de forma cuadrática dentro de cada clúster. En el punto final de 500.000 titulares, 500 clústeres mantienen el clúster promedio cerca de 1.000 titulares y el total de comparaciones cerca de 500 millones. Usar 13 clústeres, uno por categoría, empujaría el total hacia unos 19.000 millones de comparaciones. El mayor número de clústeres mantiene tratable la deduplicación global a medida que el corpus crece.
Monitoreo de la distribución de similitud
Tras cada iteración, el pipeline grafica la función de distribución acumulada empírica (ECDF) de las similitudes coseno por pares. La línea roja marca el umbral de 0,90: un ascenso pronunciado cerca de 1,0 indica muchos casi duplicados, mientras que una curva más suave y desplazada a la izquierda señala una cobertura más amplia. Las curvas tempranas se inclinan a la derecha porque el modelo repite patrones comunes a partir de pocos ejemplos; las tardías se desplazan a la izquierda y se estabilizan, mostrando que los ejemplos actualizados siguen empujando la generación hacia contenido novedoso incluso cuando el corpus se acerca a los 500K titulares.

El conjunto resultante, FinHeadlineMix, queda optimizado para tareas posteriores como la destilación de modelos y la clasificación, habilitando la cobertura de eventos raros y el entrenamiento eficiente de modelos estudiante compactos que se acercan al desempeño F1 de sus modelos maestros en benchmarks de PLN financiero.




