惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
S
Schneier on Security
The Hacker News
The Hacker News
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
I
Intezer
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Schneier on Security
Schneier on Security
Security Latest
Security Latest
AWS News Blog
AWS News Blog
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
博客园 - 叶小钗
The Last Watchdog
The Last Watchdog
O
OpenAI News
月光博客
月光博客
Hacker News: Ask HN
Hacker News: Ask HN
阮一峰的网络日志
阮一峰的网络日志
S
Security @ Cisco Blogs
Google Online Security Blog
Google Online Security Blog
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Latest news
Latest news
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Apple Machine Learning Research
Apple Machine Learning Research
U
Unit 42
PCI Perspectives
PCI Perspectives
博客园 - 聂微东
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
Forbes - Security
Forbes - Security
H
Heimdal Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Troy Hunt's Blog
博客园 - 三生石上(FineUI控件)
Application and Cybersecurity Blog
Application and Cybersecurity Blog
罗磊的独立博客
WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security

NVIDIA Technical Blog

Running Low-Latency Analytical Workloads with GPU-Accelerated Presto on NVIDIA GB200 NVL72 Create a LangChain Deep Agents Harness Profile for NVIDIA Nemotron 3 Ultra to Improve Performance Develop Humanoid Robot Policies End-to-End with NVIDIA Isaac GR00T Maximize Spectral Efficiency with AI-Native RAN and NVIDIA AI Aerial Building an Analysis AI Agent for Industrial Alarm Management with NVIDIA Nemotron NVIDIA Vera CPU Boosts AI Factory Throughput to Accelerate Agentic Workloads Enhancing Goodput in Large-Scale LLM Training with Nonuniform Tensor Parallelism Hardware-Rooted AI Security That Won’t Slow You Down Mastering Agentic Techniques: AI Agent Reinforcement Learning Designing GPU-Accelerated Query Engines with NVIDIA GQE Optimizing a Neural Reconstruction Pipeline Using NVIDIA Nsight Developer Tools How to Govern Autonomous Agents in Enterprise AI Factories Deploy a Production-Ready NVIDIA AI-Q Blueprint on Oracle Cloud Infrastructure Creating the NVIDIA Nemotron 3 Ultra NVFP4 Checkpoint with NVIDIA Model Optimizer Streamlining Resource Binding with End-to-End Support for Vulkan Descriptor Heaps Scaling AI Inference Across Multiple GPUs Using NVIDIA TensorRT with Multi-Device Inference Support Q&A: How KRAFTON Built PUBG Ally, a Co-Playable Character Powered by NVIDIA ACE Accelerating BEV Pooling on NVIDIA GPUs for Physical AI Applications Maximize AI Factory Energy Efficiency Through Full-Stack Inference and Training Optimizations Boost Inference Performance up to 15x on NVIDIA Blackwell Using DFlash Speculative Decoding Build an AI Scientist for Life Science Discovery with NVIDIA BioNeMo Agent Toolkit How Telcos Build Autonomous Networks with Agentic AI CCCL Runtime: A Modern C++ Runtime for CUDA Enable Real-Time AI for High-Speed Data Acquisition with DAQIRI Inside NVIDIA Halos for Robotics: A Full-Stack Functional Safety System for Physical AI Building AI Agents for AR Glasses and XR Devices with NVIDIA XR AI Build Your Own Transaction Foundation Model for Financial Intelligence NVIDIA Blackwell Tops MLPerf Training 6.0 with Industry-Leading Scale and Performance Build On-Device AI Companions with the NVIDIA ACE Game Agent SDK and Unreal Engine 5 Plugins How to Optimize Transformer-Based Models for Low-Precision Training Fine-Tuning Biological Foundation Models with LoRA Using NVIDIA BioNeMo Recipes Boosting MoE Training Throughput with Advanced Fusion Kernels Pretrained to Imagine, Fine-Tuned to Act: The Rise of World-Action Models NVIDIA Achieves Leading Agentic Coding Performance on First Agentic AI Benchmark Run DiffusionGemma on NVIDIA for Developer-Ready, High-Throughput Text Generation Deploy Long-Context Reasoning and Agentic Workflows with MiniMax M3 on NVIDIA Accelerated Infrastructure One-Click Multi-Tenant Security with  NVIDIA Quantum InfiniBand Designing Production-Ready Battery Energy Storage Systems for AI Factories Delivering Lifecycle Control for AI Infrastructure at Scale with NVIDIA DGX Spark Enterprise Manageability Model Quantization: Turn FP8 Checkpoints into High-Performance Inference Engines with NVIDIA TensorRT Accelerating Federated Learning Research with AI Agents and NVIDIA FLARE Auto-FL Evaluate Clinical ASR Models Faster with Agent Skills and NVIDIA Nemotron Speech Train Models Faster with JAX and MaxText Using NVFP4 on NVIDIA Blackwell NVIDIA Nemotron 3 Ultra Powers Faster, More Efficient Reasoning for Long-Running Agents Build Personal AI Agents on Windows PCs with New Tools from Microsoft and NVIDIA Deploy Self-Evolving Agents for Faster, More Secure Research with a Hermes Agent and NVIDIA NemoClaw Deploy Agentic-Ready AI at the Edge with Memory Efficiency in NVIDIA JetPack 7.2 Run Local AI Agents with Faster Models and Multi-Node Clustering on NVIDIA DGX Spark How to Post-Train Autonomous Vehicle Models in Closed-Loop with NVIDIA Alpamayo Develop Physical AI Reasoning, World, and Action Models with NVIDIA Cosmos 3 Advancing AI Infrastructure for Agentic AI with NVIDIA DOCA In-Silicon Security NVIDIA Vera CPU Sets a New Standard for Agentic Workloads in AI Factories NVIDIA DSX OS Delivers Open, Modular Software for Operating AI Factories at Scale DynoSim: Simulating the Pareto Frontier How to Automate AI Model Documentation with the NVIDIA MCG Toolkit Run Step 3.7 Flash on NVIDIA GPUs with Enterprise-Ready Multimodal AI NVIDIA Dynamo Snapshot: Fast Startup for Inference Workloads on Kubernetes NVIDIA Blackwell Sets STAC-AI Record for LLM Inference in Finance What’s New for Game Developers in NVIDIA RTX: DLSS 4.5 for UE5 and Multilingual AI Characters Extract More Kernel Performance with NVIDIA CompileIQ Auto-Tuning Develop High-Performance GPU Kernels in C++ with NVIDIA CUDA Tile NVIDIA CUDA 13.3 Enhances GPU Development with Tile Programming in C++, Compiler Autotuning, and Python Updates Run Key Genomics and Protein Folding Workloads Faster with NVIDIA RTX PRO 4500 Blackwell Synthesize Realistic 3D Medical Images at Scale to Ship Pre‑Trained Models Automating and Optimizing Financial Signal Discovery with Multi-Agent Systems Get Real-Time Visibility into GPU Usage Across Kubernetes Clusters Unlock Exascale Performance on NVIDIA GB200 NVL72 with Slurm Topology-Aware Job Scheduling Building Token‑Metered AI Services on Telco AI Factories Mastering Agentic Techniques: AI Agent Customization Add a Specialized Deep Research Skill to Agent Harnesses NVIDIA-Verified Agent Skills Provide Capability Governance for AI Agents Mastering Agentic Techniques: AI Agent Evaluation How the NVIDIA Vera Rubin Platform is Solving Agentic AI’s Scale-Up Problem Transform Video Into Instantly Searchable, Actionable Intelligence with AI Agents and Skills Accelerated X-Ray Analysis for Nanoscale Imaging (XANI) of Novel Materials How to Eliminate Pipeline Friction in AI Model Serving Introducing NVIDIA Fleet Intelligence for Real-Time GPU Fleet Visibility and Optimization Improving Bash Generation in Small Language Models with Grammar-Constrained Decoding Streaming Tokens and Tools: Multi-Turn Agentic Harness Support in NVIDIA Dynamo Achieving Peak System and Workload Efficiency on NVIDIA GB200 NVL72 with Slurm Block Scheduling Model Quantization: Post-Training Quantization Using NVIDIA Model Optimizer Real-Time Performance Monitoring and Faster Debugging with NCCL Inspector and Prometheus How to Build In-Vehicle AI Agents with NVIDIA: From Cloud to Car Building for the Rising Complexity of Agentic Systems with Extreme Co-Design Optimize Supply Chain Decision Systems Using NVIDIA cuOpt Agent Skills Speed Up Unreal Engine NNE Inference with NVIDIA TensorRT for RTX Runtime Build AI-Powered Games with NVIDIA DLSS 4.5, RTX, and Unreal Engine 5 How to Build, Run, and Scale High-Quality Creator Workflows in ComfyUI Automating GPU Kernel Translation with AI Agents: cuTile Python to cuTile.jl Powering AI Factories with NVIDIA Enterprise Reference Architectures Scaling Biomolecular Modeling Using Context Parallelism in NVIDIA BioNeMo NVIDIA Nemotron 3 Nano Omni Powers Multimodal Agent Reasoning in a Single Efficient Open Model 24/7 Simulation Loops: How Agentic AI Keeps Subsurface Engineering Moving Build with DeepSeek V4 Using NVIDIA Blackwell and GPU-Accelerated Endpoints Federated Learning Without the Refactoring Overhead Using NVIDIA FLARE Winning a Kaggle Competition with Generative AI–Assisted Coding Simplify Sparse Deep Learning with Universal Sparse Tensor in nvmath-python Scaling the AI-Ready Data Center with NVIDIA RTX PRO 4500 Blackwell Server Edition and NVIDIA vGPU 20 Advancing Emerging Optimizers for Accelerated LLM Training with NVIDIA Megatron Maximizing Memory Efficiency to Run Bigger Models on NVIDIA Jetson
Synthetic Data Generation for Financial AI Research with NVIDIA NeMo | NVIDIA Technical Blog
Elizabeth Goodman · 2026-07-10 · via NVIDIA Technical Blog

Fine-tuning LLMs for financial natural language processing (NLP) is constrained by limited, imbalanced data. Real-world financial news overrepresents earnings and stock movements, while rarer events such as credit-rating changes, product approvals, and labor issues are harder to capture at scale. Synthetic generation can help fill those gaps for trading research, risk modeling, and surveillance, but diversity requires more than a single large generation run.

This post walks through an iterative pipeline for generating 500,000 unique financial news headlines across 12 topics plus an “Other” category. The workflow combines NVIDIA NeMo Data Designer for structured generation, NVIDIA NeMo Curator for semantic deduplication, and NVIDIA Nemotron models for high-throughput headline synthesis. It also adds a farthest-from-centroid few-shot strategy to steer each round toward novel outputs.

In a naive run of 50,000 headlines, 65% were removed as near-duplicates. Instead of scaling a single batch, the pipeline iterates: generate, filter, deduplicate globally, select distinctive few-shot examples, correct category weights, and repeat until the corpus reaches the target size. Our full run produced 502,536 unique headlines across 13 categories in 82 iterations, using approximately 6 days of compute on a single 8-way NVIDIA B200 node with checkpointing, crash recovery, and SLURM job chaining.

By the end, you’ll understand how to reproduce the generation-deduplication loop, adapt it for your own financial research workflows, or start directly from the open-sourced dataset.

Reproducibility

Versions

ComponentVersion
NeMo Curator1.0.0rc0.dev0
NeMo Data Designer0.1.5
vLLM0.12.0
Modelnvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8
sentence-transformers≥ 2.2.0
Table 1. Software and model versions used in this guide

Hardware: Single 8-way NVIDIA B200 node. GPUs 0–3 dedicated to vLLM inference (4-way tensor parallelism, 448 concurrent requests); GPUs 4–7 ran NeMo Curator semantic deduplication with Ray.

Pipeline parameters: 35K headlines per batch (50K in early iterations), 90% cosine-similarity deduplication threshold, 500 K-means clusters, 3 few-shot examples per category, 80% cross-iteration similarity cutoff for example selection.

Checkpointing: Each iteration persisted corpus state, category weights, few-shot examples, metrics, and used-example embeddings for crash recovery and SLURM job chaining.

Pipeline overview

Financial headline generation fails as a single-pass problem because real-world feeds are imbalanced: earnings reports and stock movements dominate, while credit-rating changes, product approvals, and other rarer events are sparse. In a 50K-headline baseline, semantic deduplication retained only 17,348 unique headlines, showing that larger batches add many near-duplicates rather than proportionally more coverage.

The iterative pipeline addresses this with a closed loop. Each iteration generates a category-weighted batch, filters malformed outputs, deduplicates against the full accumulated corpus, selects diverse few-shot examples, and adjusts category weights before the next iteration.

Figure 1, below, illustrates the overall architecture.

A circular flow diagram illustrating an iterative headline generation pipeline with five stages. Starting from an "Initialize" trigger, the cycle proceeds clockwise: Generate produces batched headlines using category-weighted sampling and few-shot examples; Filter removes malformed outputs based on word count and special character ratio; Deduplicate performs semantic deduplication using MiniLM-L6 embeddings and cosine similarity; Extract examples selects the top three most distinctive headlines per category to use as few-shot examples in the next iteration; and Adjust weights boosts under-represented categories before the cycle repeats.
Figure 1. Iterative headline generation pipeline. Each batch is generated, filtered, deduplicated against the accumulated corpus, sampled for few-shot examples, and reweighted by category before the next iteration

The key design decision is global deduplication. Each batch is compared with all previously retained headlines, not just with itself, preventing cross-batch duplicates and preserving semantic uniqueness across the 500K corpus.

Step 1. Generate headlines with NeMo Data Designer

We serve Nemotron 3 Nano (30B parameters, 3B active) via vLLM with 4-way tensor parallelism and 448 concurrent requests. The model’s Mixture-of-Experts (MoE) architecture balances throughput and quality, using 3B active parameters per forward pass within a 30B-parameter model.

NeMo Data Designer orchestrates generation through a declarative configuration: a weighted category sampler across 12 topics plus “Other,” and an LLM column that generates headlines conditioned on the sampled category and current few-shot examples. 

Category weights are updated after each iteration through distribution correction (Step 5).

Data Designer configuration:

config_builder = DataDesignerConfigBuilder()

# Model config for local vLLM-served 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)

# Category sampler with DYNAMIC weights (updated each iteration)
config_builder.add_column(
    SamplerColumnConfig(
        name="category",
        sampler_type=SamplerType.CATEGORY,
        params=CategorySamplerParams(
            values=CATEGORIES,        # 12 topics + "Other"
            weights=current_weights,   # Adjusted after each iteration
        ),
    )
)

# LLM column for headline generation with few-shot examples
config_builder.add_column(
    LLMTextColumnConfig(
        name="headline",
        model_alias="local-nemotron",
        system_prompt="You are a financial news headline writer.",
        prompt=f"""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:""",
    )
)

We use high-diversity sampling (temperature=0.95, frequency penalty 0.3, presence penalty 0.2) and rely on downstream filtering and semantic deduplication to remove malformed or redundant outputs.

Prompt structure

The prompt includes a role-setting system prompt, few-shot examples grouped by category, and an instruction for the sampled category. Data Designer injects the category at runtime through Jinja templating, and the few-shot examples are refreshed each iteration (Step 4).

Prompt structure (simplified):

SYSTEM:
  You are a financial news headline writer. Generate realistic,
  professional financial news headlines. Output ONLY the headline
  text, nothing else.

USER:
  Generate a realistic financial news headline for the category:
  {{ category }}

  Examples by category:
  - Earnings: "Google Parent Alphabet Posts $1.84 EPS, $63.5B Revenue"
  - Earnings: "Myriad Genetics Beats Q4 Estimates with 15% Revenue Surge"
  - Earnings: "Codec Solutions Posts Q3 Adjusted EPS $0.31, Surpasses ..."
  - Price Targets: "J.P. Morgan Cuts Target for Thermo Fisher, Downgrades ..."
  - Price Targets: "Mitsubishi UFJ Secures Buy Rating on Mitsui & Co. ..."
  - Price Targets: "Credence Resources Upgrades Target to $12.50 ..."
  - Stock price movement: "Equities Rise Broadly, Dow Gains 180 Points ..."
  - ...
  (3 examples x 12 topics + Other = up to 39 few-shot examples)

  Generate a single headline for the "{{ category }}" category.
  The headline should be 10-25 words long, realistic, and match
  the style of professional financial news.

  Headline:

Step 2. Quality filtering

Before semantic deduplication, a lightweight rule-based pass removes malformed outputs such as truncated, runaway, or garbled headlines.

FilterThresholdPurpose
Minimum word count>= 5 wordsRemove truncated or fragment outputs
Minimum char count>= 25 charactersRemove very short outputs
Maximum word count<= 100 wordsRemove runaway generation
Maximum char count<= 1,000 charactersCatch edge cases
Bracket count< 5 bracketsRemove formatting artifacts
Special character ratio<= 25%Remove garbled outputs
Table 2. Quality filters applied to generated headlines, with thresholds and rationale for each

In practice, these filters removed fewer than 1% of headlines per batch, so most quality control comes from semantic deduplication in the next step.

Step 3. Semantic deduplication with NeMo Curator

This is the core quality mechanism. After each batch, the pipeline combines newly generated headlines with the accumulated corpus and runs NeMo Curator’s TextSemanticDeduplicationWorkflow. Headlines are embedded with all-MiniLM-L6-v2, clustered with K-means, and compared within clusters using pairwise cosine similarity. Any headline above the 90% similarity threshold is removed.

NeMo Curator semantic deduplication configuration:

workflow = TextSemanticDeduplicationWorkflow(
    input_path=input_path,
    output_path=output_path,
    cache_path=cache_path,
    perform_removal=True,
    # Embedding parameters
    text_field="headline",
    model_identifier="sentence-transformers/all-MiniLM-L6-v2",
    embedding_max_seq_length=512,
    embedding_model_inference_batch_size=1024,
    # Deduplication parameters
    n_clusters=500,     # Higher = smaller clusters = faster pairwise
    eps=0.10,           # eps = 1 - similarity_threshold (0.90)
    id_field="id", 
    # Among duplicates, keep the more representative copy
    ranking_strategy=RankingStrategy(   
        metadata_cols=["cosine_dist_to_cent"],
        ascending=True,  #Keep the most representative (closest to centroid)
    ),
    pairwise_batch_size=4096,
    input_filetype="parquet",
    output_filetype="parquet",
)
workflow.run()

Why 500 clusters?

Pairwise similarity is expensive because comparisons scale quadratically within each cluster. At the 500K-headline endpoint, 500 clusters keep the average cluster near ~1,000 headlines and total comparisons near ~500M. Using 13 clusters, one per category, would push total comparisons toward ~19B. The higher cluster count keeps global deduplication tractable as the corpus grows.

Similarity distribution monitoring

After each iteration, the pipeline plots an ECDF (Empirical Cumulative Distribution Function) of pairwise cosine similarities. The red line marks the 0.90 deduplication threshold: a steep rise near 1.0 signals many near-duplicates, while a smoother left-shifted curve indicates broader coverage.

Figure 2, below, overlays representative iterations 5, 20, 40, 60, and 82. Early curves skew right because the model repeats common patterns from limited few-shot examples. Later curves shift left and stabilize, showing that updated few-shot examples continue to push generation toward novel content even as the corpus approaches 500K headlines.

A line graph titled "Similarity Distribution Across Iterations (ECDF)" showing empirical cumulative distribution functions (ECDFs) of cosine similarity scores at five training iterations (5, 20, 40, 60, and 82), represented by blue, orange, green, red, and purple lines respectively. The x-axis shows cosine similarity from 0.0 to 1.0; the y-axis shows the ratio of the dataset below the similarity score, from 0.0 to 1.0. All curves follow an S-shape, rising steeply between similarity values of 0.5 and 0.95. A vertical red dashed line marks the 0.9 cosine similarity deduplication threshold. Later iterations shift leftward, indicating that generated headlines become more diverse over time as the corpus grows and deduplication removes near-duplicate content
Figure 2. Combined ECDF of cosine similarity distributions across iterations 5, 20, 40, 60, and the final iteration 82

After deduplication, the pipeline selects few-shot examples for the next batch. The goal is to steer the model away from patterns it has already produced.

Farthest-from-centroid selection

K-means clustering from the deduplication step gives each headline a cluster centroid. We rank headlines by cosine distance from that centroid and select farthest examples, which are atypical within their semantic neighborhood and useful for prompting novel outputs.

Cross-iteration semantic filtering

Distance alone is not enough. The pipeline also compares each candidate against all previously used few-shot examples and rejects any candidate with >=80% cosine similarity. This prevents semantically repeated prompt signals across iterations.

Table 3, below, summarizes the selection priority. Three examples are selected per category, for 39 total per iteration, and the used-example set plus embeddings are checkpointed for recovery.

PriorityStrategyPurpose
1. PrimaryFarthest from K-means centroidMost atypical = most informative few-shot signal
2. Semantic filter< 80% cosine similarity to all used examplesPrevents semantic repetition across iterations
3. FallbackRandom sample from category poolEnsures coverage when outliers are exhausted
4. Last resortSeed examples (manually curated)Cold-start baseline for hard-to-fill categories
Table 3. Few-shot example selection priority

Semantic similarity check for few-shot candidate filtering:

def is_semantically_distinct(
    candidate_embedding, used_embeddings, threshold=0.80
):
    """Reject candidates >= threshold similar to ANY used example."""
    if used_embeddings.size == 0:
        return True
    candidate_norm = candidate_embedding / (
        np.linalg.norm(candidate_embedding) + 1e-9
    )
    used_norms = used_embeddings / (
        np.linalg.norm(used_embeddings, axis=1, keepdims=True) + 1e-9
    )
    similarities = np.dot(used_norms, candidate_norm)
    return np.max(similarities) < threshold

Table 4, below, shows how selected examples become more specific by the final iteration.

CategoryIteration 1 ExampleIteration 82 Example
EarningsGoogle Parent Alphabet Posts $1.84 EPS, $63.5B Revenue, Exceeds ForecastsThermoGlow Posts Q2 Beat, Lifts FY Guidance on Record Orders for Ultra-Low-VOC Automotive Adhesive
M&AMacy’s to Acquire Nordstrom’s Home Division in $1.8B DealSiemens Agrees to Acquire Mentor Graphics in $3.5B Deal, EU Demands Divestiture of Overlapping EDA Tools
Credit RatingsS&P Upgrades Moody’s Outlook for Major European Bank to StableFitch Downgrades Argentina’s State Oil Company YPF to B-, Citing Fiscal Pressures and Falling Production
Table 4. Few-shot examples from iteration 1 (early) and iteration 82 (final). Later examples feature more specific entities, niche financial instruments, and longer, more detailed structures, reflecting the pipeline’s drift toward frontier content.

Step 5. Dynamic distribution correction

Weighted sampling alone doesn’t keep categories on target because the model favors easier classes such as “Other” and “Stock Movement.” After each iteration, the pipeline compares target and actual category proportions, boosts underrepresented categories, clamps extremes, and normalizes weights for the next batch.

Weight adjustment algorithm:

def compute_adjusted_weights(current_dist, target_dist, floor=0.005):
    adjusted = []
    for category in CATEGORIES:
        target = target_dist.get(category, 0.01)
        current = current_dist.get(category, 0.0)
        if current > 0:
            ratio = target / current           # > 1 = under-represented
            ratio = max(0.2, min(5.0, ratio))  # Clamp to avoid extremes
            weight = target * ratio
        else:
            weight = target * 2.0              # Missing category: boost
        adjusted.append(max(floor, weight))
    total = sum(adjusted)
    return [w / total for w in adjusted]       # Normalize to 1.0

By iteration 82, rare categories such as “Credit Ratings” and “Product Approval” closely match their 1% targets, while “Other” remains overrepresented. The correction loop still reduces model bias enough to preserve coverage across all categories.

A grouped bar chart titled showing target versus actual category distribution at iteration 82 across 502,536 headlines. Each category has two bars: green for target percentage and dark/black for actual percentage. The ten categories from left to right, with target and actual values, are: Other (18% target, 24.2% actual), Earnings (14% target, 11% actual), Price Targets (12% target, 8.1% actual), Stock Movement (11% target, 11.2% actual), Analyst Rating (10% target, 9.5% actual), Products/Services (8% target, 8.6% actual), M&A (7% target, 5.6% actual), Regulatory (7% target, 4.8% actual), Guidance (6% target, 0.9% actual), Labour Issues (3% target, 4% actual), Dividends (2% target, 2.5% actual), Product Approval (1% target, 1.1% actual), and Credit Ratings (1% target, 1.2% actual)
Figure 3. Target vs. actual category distribution at iteration 82 (502,536 headlines)

Results

Pipeline run summary: The 500K target is slightly overshot because generation proceeds in fixed 35K batches and halts only after the threshold is crossed; the excess 2,536 examples are trimmed from the over-represented “Other” category.

  • Total unique headlines: 502,536 (target: 500,000)
  • Total iterations: 82
  • Batch size: 35,000 headlines per iteration
  • Total generated (pre-deduplication): ~2.87M headlines
  • Overall deduplication rate: ~82% (cumulative)
  • Net new per iteration: ~5,000–6,000 unique headlines
  • Categories: 12 broad topics + Other
  • Similarity threshold: 90% cosine similarity
  • Few-shot examples per iteration: 39 (3 per category)

Deduplication efficiency

Semantic deduplication was the dominant filter, and its role shifted over the run. In iteration 1, seeded by only one manual example per category, the pipeline retained 17,348 of 50K headlines; the remaining 32,652 (65%) were near-duplicates. Iterations 2–3 used farthest-from-centroid examples from previous outputs and maintained higher yields of 15K–17K new headlines per 50K batch, though cross-batch collisions began rising as the corpus grew.

From iteration 4 onward, we reduced batch size from 50K to 35K once the deduplication drop rate exceeded ~80%. Larger SLURM jobs were mostly producing headlines discarded downstream, while smaller 35K batches delivered similar net-new yield with less wasted compute.

After the corpus passed ~100K headlines, each new headline had to be distinct from a much larger pool. By iteration 40+, yield stabilized at ~5K–6K new headlines per 35K batch, or roughly 15%, with about 30K discarded per batch. Table 4 shows the transition: early duplicates are mostly within-batch repetition, while later duplicates are mostly collisions with the accumulated corpus. The steady nonzero yield near 500K shows that evolving few-shot examples continued to steer generation into novel regions.

IterationBatch SizeNet NewDiscardedYieldCorpus Size After
150,00017,34832,65235%17,348
250,00017,19932,80134%34,547
350,00015,20934,79130%49,756
550,00016,91733,08334%80,028
4235,000~5,700~29,30016%268,724
8235,000~5,155~29,84515%502,536
Table 5. Deduplication yield across representative iterations. Yield drops from ~35% (early, small corpus) to ~15% (late, large corpus) as cross-batch collisions dominate

Downstream application: Model distillation

The generated dataset supports the AI Model Distillation for Financial Data developer example, where a 49B–70B teacher model labels synthetic headlines and smaller 1B, 3B, and 8B student models are fine-tuned with LoRA. With 25K labeled examples, a 3B student reaches 95% of the teacher’s F1-score on this financial headline classification task.

Dataset diversity matters here: semantic uniqueness and category balance expose the student to rare financial events and edge cases that are difficult to collect from real-world sources.

A practical path

Four principles emerged for iterative synthetic data generation with global semantic duplication: 

  • Iterate, don’t batch. A single 500K generation pass produces mostly duplicates. Eighty-two smaller iterations with evolving prompts yield a far more diverse corpus.
  • Deduplicate globally, not locally. Each iteration must deduplicate against the full accumulated dataset to prevent cross-batch duplicates.
  • Few-shot examples are the steering wheel. Farthest-from-centroid selection with semantic similarity filtering is the most impactful lever for generation diversity.
  • Distribution correction is essential. Without dynamic weight adjustment, models over-generate popular categories and starve rare ones.

Getting started

Going further