English translation is not available yet. Showing Russian content.
Как вы делаете synthetic data для сложного рассуждения (math, code)?
Краткий тезис
Синтетические данные для сложного рассуждения (math, code) создаются через генерацию Chain-of-Thought (пошаговых рассуждений) с последующей валидацией: другой LLM проверяет логику, для кода — запуск в песочнице, а также через backward generation (ответ → вопрос) и self-consistency (множественные траектории с голосованием). Эти методы позволяют получать большие размеченные датасеты без ручной аннотации, что критически важно для обучения агентов, способных к многошаговому рассуждению в Agentic RAG.
1. Термин: Synthetic data для reasoning
Synthetic data — это искусственно сгенерированные данные, имитирующие реальные. В контексте сложного рассуждения (math, code) это пары (вопрос, пошаговое решение + ответ), созданные LLM без участия человека.
Зачем нужны синтетические данные
- Ручная разметка сложных рассуждений (например, доказательств теорем или многошаговых алгоритмов) крайне дорога и трудоёмка.
- Для обучения Agentic RAG (агентов, которые используют инструменты и делают несколько шагов) требуются тысячи примеров с цепочками действий.
- Синтетические данные позволяют масштабировать датасеты и покрывать редкие сценарии.
Основные подходы (из черновика):
- Chain-of-Thought генерация
- Проверка другим LLM
- Симуляция (для кода)
- Backward generation
- Self-consistency
2. Chain-of-Thought (CoT) генерация
Chain-of-Thought — это методика, при которой LLM генерирует не только ответ, но и промежуточные шаги рассуждения. Для синтетических данных мы используем CoT-промпты, чтобы получить размеченные примеры.
Пример промпта для математики
Ты — репетитор по математике. Реши задачу пошагово, объясняя каждый шаг.
Задача: {question}
Решение:
Пример генерации
Задача: Если x + 2 = 5, чему равно x?
Решение:
1. Исходное уравнение: x + 2 = 5.
2. Вычтем 2 из обеих частей: x + 2 - 2 = 5 - 2.
3. Получаем: x = 3.
Ответ: 3.
Для кода промпт может требовать генерации кода с комментариями и выводом.
Проблема LLM может генерировать правдоподобные, но неверные рассуждения. Поэтому нужна валидация.
3. Проверка (Check) другим LLM
Используется второй LLM (или та же модель с другим промптом) для верификации корректности рассуждения.
Методы проверки
- Проверка ответа совпадает ли финальный ответ с правильным (если известен).
- Проверка шагов логически ли каждый шаг следует из предыдущего, нет ли ошибок в арифметике или синтаксисе кода.
- Критерии для math — численная проверка, для code — запуск и сравнение вывода с ожидаемым.
Пример промпта для проверки
Проверь решение математической задачи. Укажи, верен ли каждый шаг, и есть ли ошибка в ответе.
Задача: {question}
Решение: {solution}
Вердикт (верно/неверно):
Таблица: плюсы и минусы проверки LLM
| Плюсы | Минусы |
|---|---|
| Не требует внешних инструментов | LLM может пропустить ошибки (hallucination) |
| Быстро и дешево | Зависит от качества модели-верификатора |
| Масштабируется | Трудно проверить сложные логические цепочки |
4. Симуляция для кода
Для задач, связанных с программированием, лучший способ валидации — запустить сгенерированный код в изолированной среде (песочнице) и проверить результат.
Процесс
- LLM генерирует код по описанию задачи.
- Код выполняется в контейнере (Docker, subprocess с ограничениями).
- Сравнивается вывод с ожидаемым (если есть тесты) или проверяется отсутствие ошибок.
- Если код не работает или выдаёт неверный результат — пример отбрасывается или модифицируется.
Пример на Python
import subprocess
import tempfile
def validate_code(code, test_input, expected_output):
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
f.write(code)
f.flush()
try:
result = subprocess.run(
['python', f.name],
input=test_input,
capture_output=True,
text=True,
timeout=5
)
return result.stdout.strip() == expected_output.strip()
except Exception:
return False
Преимущество объективная проверка, не зависит от LLM. Недостаток нужно готовить тесты, что тоже может быть автоматизировано (LLM генерирует тесты).
5. Backward generation
Backward generation (обратная генерация) — метод, при котором сначала создаётся ответ или решение, а затем по нему генерируется вопрос. Это гарантирует, что вопрос имеет корректный ответ.
Алгоритм
- Выбираем тему (например, "линейные уравнения").
- LLM генерирует случайное корректное решение (например,
x = 3). - На основе решения LLM генерирует вопрос: "Придумай задачу, ответом на которую будет x = 3".
- Проверяем, что при решении сгенерированного вопроса получается исходный ответ (можно через CoT + проверку).
Пример:
- Шаг 1: Решение:
x = 3. - Шаг 2: Сгенерированный вопрос: "Решите уравнение: 2x + 1 = 7".
- Шаг 3: Проверка: решаем уравнение — получаем
x = 3. Совпало → пример корректен.
Преимущество гарантируется, что ответ правильный (если проверка пройдена). Недостаток вопросы могут быть однотипными или слишком простыми.
6. Self-consistency
Self-consistency — метод, при котором для одного вопроса генерируется несколько независимых цепочек рассуждений (CoT), а затем выбирается наиболее частый ответ (majority vote). Если ответы совпадают, пример считается надёжным.
Процесс
- Для вопроса
QLLM генерируетNрассуждений (например, 5). - Из каждого извлекается финальный ответ.
- Выбирается ответ, который встречается чаще всего.
- Если все ответы разные — пример отбрасывается.
Пример для math
- Вопрос: "Сколько будет 12 * 15?"
- Рассуждение 1: "1210=120, 125=60, 120+60=180" → ответ 180.
- Рассуждение 2: "1510=150, 152=30, 150+30=180" → ответ 180.
- Рассуждение 3: "12*15=180" → ответ 180.
- Majority vote: 180 → пример принимается.
Self-consistency повышает качество датасета, отсеивая случайные ошибки. Используется как финальный фильтр.
7. Комбинированные методы
На практике подходы комбинируют. Пример пайплайна для создания датасета по математике:
- Backward generation → получаем вопрос и гарантированный ответ.
- CoT генерация → LLM строит пошаговое решение.
- Проверка другим LLM → верификация шагов.
- Self-consistency → генерация 3 траекторий, majority vote.
- Фильтрация → оставляем только примеры, где все проверки пройдены.
Для кода дополнительно добавляется симуляция (запуск кода с тестами).
Таблица сравнения методов
| Метод | Тип валидации | Надёжность | Стоимость |
|---|---|---|---|
| CoT + проверка LLM | Логическая | Средняя | Низкая |
| Симуляция кода | Исполнение | Высокая | Средняя |
| Backward generation | Обратная связь | Высокая (при проверке) | Средняя |
| Self-consistency | Статистическая | Высокая | Высокая (много вызовов) |
8. Инструменты и фреймворки
- DSPy — фреймворк для программирования LLM, позволяет строить пайплайны генерации и валидации синтетических данных. Есть модули
ChainOfThought,ReAct,Assertions. - LangChain — с помощью
LLMChainиSequentialChainможно организовать многошаговую генерацию и проверку. - OpenAI / Anthropic API — прямые вызовы с кастомными промптами.
- Собственные скрипты на Python с использованием
asyncioдля параллельной генерации.
Пример на DSPy (упрощённо):
import dspy
class GenerateCoT(dspy.Signature):
question = dspy.InputField()
reasoning = dspy.OutputField()
answer = dspy.OutputField()
class VerifySolution(dspy.Signature):
question = dspy.InputField()
reasoning = dspy.InputField()
answer = dspy.InputField()
is_correct = dspy.OutputField(desc="True/False")
pipeline = dspy.Pipeline(GenerateCoT(), VerifySolution())
9. Связь с Agentic RAG
В Agentic RAG агент должен выполнять многошаговые рассуждения, использовать инструменты (поиск, калькулятор, код). Синтетические данные, созданные описанными методами, используются для:
- Fine-tuning базовой LLM на рассуждения с инструментами.
- Обучения политики агента (какой инструмент выбрать на каждом шаге).
- Создания датасетов для оценки (benchmark) агентных систем.
Например, можно сгенерировать синтетические траектории, где агент сначала пишет код для вычисления, затем проверяет результат через калькулятор, а потом формулирует ответ. Такие данные улучшают способность агента к tool use и multi-step reasoning.
10. Проблемы и ограничения
- Качество генерации LLM может генерировать правдоподобные, но неверные рассуждения (hallucination). Требуется многоуровневая фильтрация.
- Перекос (bias): синтетические данные могут наследовать bias базовой модели, например, предпочтение определённых типов задач.
- Стоимость генерация большого датасета с self-consistency и проверками требует много API-вызовов.
- Разнообразие: backward generation может порождать однотипные вопросы. Нужны техники для увеличения разнообразия (например, случайные параметры, комбинирование тем).
Пет-проект для закрепления
Задача Создать датасет из 1000 примеров для решения квадратных уравнений с пошаговым рассуждением.
Инструменты Python, OpenAI API (или локальная модель), библиотека sympy для проверки решений.
Шаги:
- Backward generation: сгенерировать 1200 случайных квадратных уравнений с помощью
sympy(гарантированно корректные корни). - CoT генерация для каждого уравнения попросить LLM (например, GPT-4) написать пошаговое решение через дискриминант.
- Проверка другой LLM проверяет каждый шаг. Отбрасываем примеры, где шаги нелогичны.
- Self-consistency для каждого уравнения генерируем 3 решения, оставляем только те, где ответы совпадают.
- Симуляция (опционально): для уравнений с комплексными корнями — проверка через
sympy. - Форматирование сохраняем в JSON (question, reasoning, answer).
Ожидаемый результат чистый датасет из 1000 примеров, готовый для fine-tuning модели на математические рассуждения.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 697 | Как обучать агента для Agentic RAG? |
| 699 | Как оценивать качество рассуждений агента? |
| 700 | Как интегрировать инструменты (код, калькулятор) в агента? |
| 701 | Как реализовать multi-step reasoning в агенте? |
| 702 | Как обеспечить consistency в ответах агента? |
| 703 | Какие метрики использовать для оценки агентных систем? |
Навигация
- Предыдущий: 697
- Следующий: 699
- Индекс: 00. Индекс разборов