Генерація синтетичних даних для fine-tuning LLM
Синтетична генерація — це створення навчальних прикладів за допомогою сильнішої LLM (teacher model). Підхід "Self-Instruct" та його розвиток WizardLM/Evol-Instruct дозволяють сгенерувати тисячі якісних навчальних прикладів з невеликого seed датасету (100-200 прикладів).
Self-Instruct методологія
from anthropic import Anthropic
import json
client = Anthropic()
SEED_EXAMPLES = [
{"instruction": "Пояснити термін з ML", "output": "..."},
{"instruction": "Написати SQL запит для...", "output": "..."},
# 20-200 seed прикладів
]
def generate_new_instructions(seed_examples: list, n: int = 20) -> list[str]:
"""Генерація нових інструкцій на основі seed прикладів"""
examples_str = "\n".join([f"- {ex['instruction']}" for ex in seed_examples[:10]])
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=2000,
messages=[{
"role": "user",
"content": f"""Ось деякі приклади інструкцій для AI помічника:
{examples_str}
Сгенеруйте {n} НОВИХ різноманітних інструкцій в тій же області.
Вимоги:
- Кожна інструкція повинна бути унікальною та не повторювати приклади
- Змініть складність: деякі прості, деякі багатоступінчасті
- Включіть різні формати: питання, команди, завершення
- Повернутися як JSON масив рядків"""
}]
)
return json.loads(response.content[0].text)
def generate_response(instruction: str, context: str = None) -> str:
"""Генерація ідеальної відповіді для інструкції"""
prompt = f"Instruction: {instruction}"
if context:
prompt = f"Context: {context}\n\n{prompt}"
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1000,
system="You are an expert assistant. Provide accurate, helpful, and complete responses.",
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
Evol-Instruct: Ускладнення інструкцій
EVOLUTION_METHODS = [
"Add constraints: add a specific constraint or requirement to the instruction",
"Deepening: ask for more depth or detail in the response",
"Concretizing: replace general concepts with specific examples",
"Increased reasoning steps: require multi-step reasoning",
"Complicate input: add more complex or ambiguous input",
]
def evolve_instruction(original: str) -> str:
"""Ускладнення інструкції одним з методів"""
method = random.choice(EVOLUTION_METHODS)
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=200,
messages=[{
"role": "user",
"content": f"""Перепишіть цю інструкцію, використовуючи цей метод: {method}
Оригінальна інструкція: {original}
Повернутися лише переписану інструкцію, нічого більше."""
}]
)
return response.content[0].text.strip()
Генерація domain-specific даних
def generate_domain_dataset(domain: str, n_examples: int,
output_path: str):
"""Генерація датасету для конкретного домену"""
examples = []
for i in range(n_examples):
# Крок 1: Генерація різноманітної інструкції
instruction = generate_instruction_for_domain(domain)
# Крок 2: Генерація відповіді
response = generate_response(instruction)
# Крок 3: Фільтр якості (LLM-judge)
quality_score = judge_quality(instruction, response)
if quality_score >= 0.7:
examples.append({
"instruction": instruction,
"output": response,
"quality_score": quality_score,
"generated_by": "claude-3-5-sonnet-20241022"
})
if (i + 1) % 100 == 0:
print(f"Generated {i+1}/{n_examples}, kept {len(examples)}")
with open(output_path, 'w') as f:
for ex in examples:
f.write(json.dumps(ex, ensure_ascii=False) + '\n')
Оцінювання синтетичних даних перед навчанням
Синтетичні дані потребують додаткової валідації:
- Hallucination check: відповіді teacher моделі можуть містити фактичні помилки. Потрібна review domain-експертом вибірки.
- Style bias: GPT-4 має характерний стиль — модель може вивчити "GPT-style" замість цільового стилю.
- Diversity check: чи немає тематичних кластерів, які перепредставлені.
Для 5000+ синтетичних прикладів рекомендується людська review 5-10% вибірки з розрахунком approval rate. Якщо approval rate < 80%, потрібно поліпшити промпти генерації.







