В мире финансового искусственного интеллекта данные — это новая нефть, но не всякая нефть подходит для переработки. Ограниченность, дисбаланс и шум в реальных финансовых новостях создают серьезные препятствия для обучения надежных моделей обработки естественного языка (NLP). Реальные новостные ленты перенасыщены отчетами о прибылях и убытках (earnings) и колебаниями котировок, в то время как редкие, но критически важные события — такие как изменения кредитных рейтингов, одобрение продуктов или трудовые споры — остаются практически невидимыми для алгоритмов. Синтетическая генерация данных предлагает решение, заполняя эти пробелы, но простое масштабирование генерации приводит к лавине дубликатов. В этой статье мы подробно разберем флагманский подход NVIDIA: итеративный пайплайн, который позволил создать набор из 502 536 уникальных финансовых заголовков, используя мощь NVIDIA NeMo, Nemotron и B200.
Этот материал — не просто обзор инструментов, а глубокое погружение в архитектуру решения. Мы рассмотрим, как сочетание NVIDIA NeMo Data Designer, NeMo Curator и моделей Nemotron позволяет выстроить цикл «генерация-отсев-улучшение», который обеспечивает высокую разнообразие корпусов данных. Вы узнаете, почему однократная генерация 50 000 заголовков привела к удалению 65% результатов как дубликатов, и как итеративный подход с глобальным семантическим дедуплицированием изменил эту статистику. Мы также разберем технические детали: от настройки MoE-моделей через vLLM до алгоритмов выбора примеров few-shot, которые заставляют модель генерировать действительно новые, а не рекомбинированные идеи.

01Проблема дисбаланса в финансовых данных
Финансовый сектор генерирует огромные объемы текстовых данных, но их распределение крайне неравномерно. Если вы попытаетесь обучить модель классификации или дистилляции на сырых новостных лентах, она станет экспертом в распознавании отчетов о прибылях, но провалится на задачах, связанных с редкими событиями. Это создает слепые зоны в торговых стратегиях, моделях риска и системах мониторинга.
Синтетические данные могут заполнить эти пробелы, но здесь кроется главная ловушка. При наивном подходе, когда вы просите большую языковую модель (LLM) сгенерировать 50 000 заголовков, модель склонна повторять наиболее частые паттерны. В пилотном запуске, описанном в исследовании NVIDIA, семантическое дедуплицирование удалило 65% сгенерированных заголовков как почти идентичные. Осталось лишь 17 348 уникальных записей. Это означает, что увеличение объема генерации не приводит к пропорциональному росту разнообразия — вы просто получаете больше шума.
Решение заключается не в масштабе одной генерации, а в итеративности. Пайплайн NVIDIA построен на замкнутом цикле: генерация, фильтрация, глобальное дедуплицирование, выбор разнообразных примеров для обучения модели (few-shot) и коррекция весов категорий. Этот цикл повторяется до тех пор, пока корпус не достигнет целевого размера, обеспечивая постоянное смещение генерации в сторону новых, ранее не встречавшихся семантических областей.
02Архитектура итеративного пайплайна
Центральным элементом архитектуры является концепция глобального дедуплицирования. В отличие от простых систем, которые проверяют дубликаты только внутри текущего батча, этот пайплайн сравнивает каждый новый заголовок со всем накопленным корпусом данных. Это предотвращает появление кросс-батчевых дубликатов и сохраняет семантическую уникальность на протяжении всего процесса, который в данном случае занял 82 итерации.
Пайплайн работает на едином узле с 8 графическими процессорами NVIDIA B200. Это мощнейшее аппаратное обеспечение позволяет разделить нагрузку: GPUs 0–3 используются для инференса модели Nemotron через vLLM с 4-путным тензорным параллелизмом, обрабатывая до 448 параллельных запросов. GPUs 4–7 занимаются семантическим дедуплицированием с использованием фреймворка Ray и NeMo Curator. Такая специализация ресурсов критически важна для поддержания высокой пропускной способности.
03Шаг 1: Генерация с NeMo Data Designer
Первый этап пайплайна — это структурированная генерация заголовков. NVIDIA NeMo Data Designer выступает в роли оркестратора, управляя процессом через декларативную конфигурацию. Конфигурация определяет взвешенный выбор категорий (12 тем плюс категория «Другое») и использует LLM-колонку для генерации заголовков, conditioned на выбранную категорию и текущие примеры few-shot.
Важнейшей особенностью является динамическое обновление весов категорий. Если в предыдущей итерации модель сгенерировала слишком много заголовков по категории «Другое» или «Движение акций», веса для этих категорий снижаются, а для редких категорий (например, «Кредитные рейтинги») повышаются. Это заставляет модель в следующей итерации сфокусироваться на менее изученных областях.
config_builder = DataDesignerConfigBuilder()
# Конфигурация модели для локального vLLM-сервера Nemotron
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,
),
)
config_builder.add_model_config(local_model)
# Сэмплер категорий с ДИНАМИЧЕСКИМИ весами (обновляются после каждой итерации)
config_builder.add_column(
SamplerColumnConfig(
name="category",
sampler_type=SamplerType.CATEGORY,
params=CategorySamplerParams(
values=CATEGORIES, # 12 тем + "Other"
weights=current_weights, # Корректируются после итерации
),
)
)
# LLM-колонка для генерации заголовков с примерами few-shot
config_builder.add_column(
LLMTextColumnConfig(
name="headline",
model_alias="local-nemotron",
system_prompt="You are a financial news headline writer.",
prompt="""Generate a realistic financial news headline \
for the category: {{{{ category }}}}
{format_examples_for_prompt(examples_by_category)}
Generate a single headline for the "{{{{ category }}}}" category.
Headline:"""
)
)Для обеспечения разнообразия используются высокие значения температуры (0.95) и top_p (0.95), а также штрафы за частоту и присутствие токенов. Однако основная нагрузка по очистке «мусора» ложится на последующие этапы фильтрации и дедуплицирования.

04Шаг 2: Фильтрация качества
Прежде чем отправлять сгенерированные заголовки в семантическое дедуплицирование, проходит легкий этап rule-based фильтрации. Его цель — удалить явно некорректные outputs: обрезанные, слишком короткие или содержащие артефакты форматирования. Хотя этот шаг удаляет менее 1% заголовков, он необходим для предотвращения ошибок в следующих этапах обработки.
| Фильтр | Порог | Цель |
|---|---|---|
| Минимальное количество слов | >= 5 слов | Удаление обрезанных фрагментов |
| Минимальное количество символов | >= 25 символов | Удаление слишком коротких ответов |
| Максимальное количество слов | <= 100 слов | Удаление «беглых» генераций |
| Максимальное количество символов | <= 1,000 символов | Перехват крайних случаев |
| Количество скобок | < 5 скобок | Удаление артефактов форматирования |
| Доля спецсимволов | <= 25% | Удаление «искаженных» выходов |
Основная работа по контролю качества ложится на семантическое дедуплицирование, которое рассматривается как ядро механизма обеспечения качества.
05Шаг 3: Семантическое дедуплицирование с NeMo Curator
Это самый ресурсоемкий и важный этап. После каждого батча новые заголовки объединяются с накопленным корпусом, и запускается workflow TextSemanticDeduplicationWorkflow из NeMo Curator. Заголовки векторизуются с помощью модели sentence-transformers/all-MiniLM-L6-v2, затем кластеризуются алгоритмом K-means, и внутри каждого кластера выполняется попарное сравнение косинусного сходства.
Любой заголовок с косинусным сходством выше 90% (порог eps=0.10) удаляется. При этом сохраняется наиболее репрезентативная копия — та, что ближе всего к центру кластера.
workflow = TextSemanticDeduplicationWorkflow(
input_path=input_path,
output_path=output_path,
cache_path=cache_path,
perform_removal=True,
# Параметры эмбеддинга
text_field="headline",
model_identifier="sentence-transformers/all-MiniLM-L6-v2",
embedding_max_seq_length=512,
embedding_model_inference_batch_size=1024,
# Параметры дедуплицирования
n_clusters=500, # Больше кластеров = меньше сравнений
eps=0.10, # eps = 1 - similarity_threshold (0.90)
id_field="id",
# Среди дубликатов оставляем более репрезентативную копию
ranking_strategy=RankingStrategy(
metadata_cols=["cosine_dist_to_cent"],
ascending=True # Оставляем ближайшую к центру
),
pairwise_batch_size=4096,
input_filetype="parquet",
output_filetype="parquet"
)
workflow.run()Почему выбрано именно 500 кластеров? Попарное сравнение вычислительно дорого, так как сложность растет квадратично внутри каждого кластера. При целевом объеме в 500K заголовков, 500 кластеров поддерживают средний размер кластера около 1,000 записей, что приводит к примерно 500 миллионам сравнений. Если бы мы использовали всего 13 кластеров (по одному на категорию), общее число сравнений возросло бы до ~19 миллиардов, что сделало бы процесс непрактичным. Высокое число кластеров делает глобальное дедуплицирование масштабируемым.

06Шаг 4: Выбор разнообразных few-shot примеров
Чтобы модель не зацикливалась на одних и тех же формулировках, пайплайн динамически обновляет примеры, которые подаются в промпт для каждой итерации. Стратегия выбора основана на двух принципах: максимальное удаление от центра кластера и семантическое отличие от уже использованных примеров.
Алгоритм работает так:
- Выбор дальше всего от центра: Из каждого кластера K-means выбираются заголовки, которые находятся на максимальном косинусном расстоянии от центра кластера. Эти заголовки являются наиболее «атипичными» в своей семантической нише и служат лучшим сигналом для генерации новых идей.
- Семантический фильтр: Каждый кандидат проверяется на сходство со всеми ранее использованными примерами. Если сходство >= 80%, кандидат отклоняется. Это предотвращает семантическое повторение сигналов промпта между итерациями.
- Резервные варианты: Если аутсайдеры исчерпаны, выбираются случайные выборки из пула категории, а в крайнем случае — вручную курируемые seed-примеры.
Этот подход приводит к тому, что примеры в промптах становятся все более специфичными и сложными по мере продвижения к 82-й итерации. Например, вместо общего заголовка об отчетах Alphabet, модель начинает получать примеры с конкретными деталями о новых продуктах или нишевых финансовых инструментах.

07Шаг 5: Динамическая коррекция распределения
Простое взвешенное сэмплирование не гарантирует баланса, так как модель часто «ленива» и предпочитает генерировать заголовки по более простым или распространенным категориям. После каждой итерации пайплайн сравнивает целевое распределение категорий с фактическим. Категории, которые были недопредставлены, получают повышенные веса, а чрезмерно представленные — ограничиваются. Затем веса нормализуются для следующей итерации.
Этот механизм гарантирует, что редкие события, такие как изменения кредитных рейтингов или слияния и поглощения (M&A), получают справедливое количество синтетических примеров, что критически важно для обучения сбалансированных моделей.
08Результаты: Набор данных FinHeadlineMix
Итогом работы пайплайна стал набор данных FinHeadlineMix, содержащий 502 536 уникальных заголовков по 13 категориям. Кумулятивный коэффициент дедуплицирования составил около 82%, что означает, что из всех сгенерированных заголовков (включая промежуточные итерации) удалось сохранить только уникальные и разнообразные записи. Вычислительные затраты составили примерно 6 дней работы на одном узле с 8 GPU NVIDIA B200, с использованием чекпоинтинга для восстановления после сбоев и цепочек заданий SLURM.
Полученный набор данных оптимизирован для downstream-задач, таких как дистилляция моделей и классификация. Он позволяет редким событиям быть представленными в данных, что поддерживает эффективное обучение компактных «студенческих» моделей, которые достигают производительности, близкой к уровню «учительских» моделей, на финансовых NLP-бенчмарках.

09Что это значит на практике
Для исследователей и инженеров в финансовой сфере этот подход открывает новые возможности. Во-первых, он демонстрирует, что качество данных важнее их количества. Итеративный подход с глобальным дедуплицированием позволяет получить более чистый и разнообразный датасет, чем простая генерация большого объема данных.
Во-вторых, использование открытых инструментов NVIDIA NeMo и Nemotron делает этот процесс воспроизводимым. Вы можете адаптировать этот пайплайн для других доменов, где данные дисбалансированы, например, для медицинских записей или юридических документов. Ключевые компоненты — семантическое дедуплицирование, динамическое обновление few-shot примеров и коррекция весов категорий — являются универсальными паттернами для генерации качественных синтетических данных.
В-третьих, оптимизация под аппаратное обеспечение NVIDIA B200 показывает, как современные GPU могут ускорить сложные пайплайны обработки данных. Разделение задач между инференсом и дедуплицированием на разных GPU позволяет максимизировать утилизацию ресурсов.
Наконец, открытый набор данных FinHeadlineMix предоставляет готовую основу для старта исследований. Вместо того чтобы начинать с нуля, исследователи могут использовать этот датасет для обучения и тестирования своих моделей, экономя время и вычислительные ресурсы. Это пример того, как передовые технологии AI могут быть демократизированы и сделаны доступными для широкого круга пользователей, способствуя прогрессу в финансовой аналитике и автоматизации.
Таким образом, генерация синтетических данных с помощью NVIDIA NeMo — это не просто технический трюк, а стратегический инструмент для создания более умных, справедливых и эффективных финансовых AI-систем. Понимание и применение этих принципов может стать ключевым конкурентным преимуществом для организаций, стремящихся оставаться на передовой финансового инновационного процесса.
Источник: NVIDIA Developer ↗
