A client brought a dataset of 500 instruction–response pairs. After three epochs of fine-tuning, accuracy on the test set was 92%, but on real data it dropped to 78%. The cause: a small and homogeneous sample. The model learned patterns, not the task's essence. Data augmentation increases the number of examples while preserving labels, boosting accuracy to 90%+. In this article, we cover three augmentation methods we use in production: backtranslation, LLM-generated paraphrases, and instruction diversity expansion. We also show how to control quality using semantic similarity.
Why Standard Augmentation Fails for LLMs
In computer vision, simple transformations work: rotation, brightness change, noise. For text, such methods are useless — they break grammar or alter meaning. LLMs need semantic equivalence paired with lexical diversity. We use three approaches that preserve meaning and increase variety.
Backtranslation: Simple and Reliable
Translate to an intermediate language and back. It creates paraphrases with minimal cost.
from deep_translator import GoogleTranslator def backtranslate(text: str, pivot_language: str = 'de') -> str: intermediate = GoogleTranslator(source='en', target=pivot_language).translate(text) back = GoogleTranslator(source=pivot_language, target='en').translate(intermediate) return back # Apply to instructions only, not output original = "How do I cancel my subscription?" augmented = backtranslate(original) # "How can I terminate my subscription?" Important: we apply it only to instructions, not responses — otherwise the model learns to output paraphrases instead of precise answers. Backtranslation yields about 80% useful paraphrases, but is inferior to LLM generation (95% useful). Backtranslation saves up to 40% of budget compared to LLM generation.
LLM-Generated Paraphrases: Maximum Diversity
The most quality method — generating variants through a strong LLM (Claude, GPT-4). We specify the number of variants and ask to change wording, style, sentence structure.
from anthropic import Anthropic client = Anthropic() def generate_paraphrases(instruction: str, n: int = 5) -> list[str]: response = client.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=500, messages=[{ "role": "user", "content": f"""Generate {n} diverse paraphrases of this instruction. Keep the same meaning but vary the wording, formality level, and sentence structure. Instruction: {instruction} Return as JSON array of strings.""" }] ) return json.loads(response.content[0].text) This approach yields up to 10 different phrasings for one instruction — from formal to colloquial. LLM generation outperforms backtranslation by 1.2 times in useful paraphrase share, but requires more resources and tokens.
Instruction Diversity Expansion: Different Query Types
Users formulate the same task differently. We automatically generate instruction variations: request, command, question, demand.
def expand_instruction_types(task_description: str, example_output: str) -> list[dict]: variations = [ f"Please {task_description.lower()}", f"Can you {task_description.lower()}?", f"I need you to {task_description.lower()}", f"{task_description}:", task_description.upper() ] return [{"instruction": var, "output": example_output} for var in variations] Negation Augmentation: Safety Without Quality Loss
For borderline queries, we add examples of proper refusal. The model learns to politely decline inappropriate requests, offering an alternative.
refusal_examples = [] for ex in harmful_edge_cases: refusal_examples.append({ "instruction": ex.instruction, "output": f"I can't help with that request as it {reason}. " f"I'd be happy to help with {alternative_suggestion} instead." }) Step-by-Step Augmentation Process
- Dataset analysis: assess size, diversity, instruction types.
- Method selection: combine backtranslation and LLM generation depending on the task.
- Generation: create paraphrases with chosen methods.
- Filtering: check semantic similarity and discard duplicates.
- Integration: add augmented examples to the training set.
How to Control Augmented Data Quality?
We check each augmented pair for semantic similarity to the original. We use SentenceTransformer to obtain embeddings.
| Metric | Range | Interpretation |
|---|---|---|
| Semantic similarity | 0.75–0.95 | Acceptable |
| Semantic similarity > 0.98 | Duplicate | Discard |
| Semantic similarity < 0.7 | Meaning changed | Discard |
| Length ratio | 0.5–2.0 | Acceptable |
| Unique words ratio | > 0.3 | Sufficient diversity |
from sentence_transformers import SentenceTransformer import numpy as np def measure_augmentation_quality(original: str, augmented: str) -> dict: model = SentenceTransformer('all-MiniLM-L6-v2') orig_emb = model.encode(original) aug_emb = model.encode(augmented) similarity = float(np.dot(orig_emb, aug_emb) / (np.linalg.norm(orig_emb) * np.linalg.norm(aug_emb))) return { 'semantic_similarity': similarity, 'is_valid': 0.7 < similarity < 0.98, 'length_ratio': len(augmented) / len(original), 'unique_words': len(set(augmented.split()) - set(original.split())) } The optimal range for similarity is 0.75–0.95. If value > 0.98 — near duplicate; if < 0.7 — meaning distorted. Such examples are discarded. Quality augmentation reduces retraining costs by 50%.
Additional Metrics Information
We also use the Jaccard coefficient to assess lexical diversity. If unique words ratio < 0.3, the example is considered too similar and is discarded.Comparison of Augmentation Methods
| Method | Paraphrase Quality | Cost | Speed |
|---|---|---|---|
| Backtranslation | 80% useful | Low | Fast |
| LLM generation | 95% useful | High | Slow |
| Instruction diversity | 90% useful | Medium | Medium |
What Is the Optimal Augmentation Volume?
We recommend expanding the dataset 2–3 times, maintaining an original/augmented ratio of 1:2. The share of augmented examples should not exceed 70% — otherwise the model overfits to artificial patterns. In our projects, accuracy on production queries improves by 8–15% after adding 1000–3000 augmented pairs.
What's Included in Our Work
We have been performing data augmentation for over 5 years and have completed more than 20 projects for NLP tasks. With our service you receive:
- Augmentation pipeline code in Python (ready for integration).
- Documentation of methods and configurations.
- Labeled dataset in the required format (JSON, Parquet).
- Quality metrics report: similarity distribution, rejection rate.
- Consultation on choosing an augmentation strategy for your task.
Timelines — from 3 to 10 business days. Cost is calculated individually. To get started, just send a sample dataset and task description — we will evaluate the project and propose a solution.
Contact us to discuss augmentation for your fine-tuning. Order end-to-end data augmentation — get a ready pipeline and an improved dataset.







