中文翻译暂不可用,显示俄语原文。
Настроить self-consistency для CoT
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить self-consistency для CoT
1. Цель задачи
Научиться повышать точность ответов LLM на задачах, требующих многошаговых рассуждений, за счёт техники self-consistency. Вы реализуете генерацию нескольких цепочек рассуждений (Chain-of-Thought) для одного запроса, а затем примените majority vote для выбора финального ответа. Экспериментально подтвердите, что accuracy на выбранном датасете увеличивается не менее чем на 15% по сравнению с одиночным CoT.
Ключевой результат Рабочий скрипт на Python, который для заданного набора вопросов генерирует 5 CoT-путей, выполняет majority vote и выводит итоговую точность, демонстрируя прирост ≥15%.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| Датасет с задачами на рассуждение (например, GSM8K, MathQA, или кастомный) | Hugging Face Datasets: gsm8k (main), math_qa; можно скачать вручную |
| LLM с поддержкой CoT (например, GPT-4o-mini, Llama 3 70B, DeepSeek-R1) | API ключ (OpenAI / Anthropic) или локальная модель через transformers / vllm |
| Python 3.10+ и библиотеки | См. раздел 3 |
| Базовый accuracy одиночного CoT (baseline) | Запустить один прогон на тестовой выборке |
Если нет реального API/модели — симулируем:
- Используйте маленькую открытую модель (Qwen2.5-1.5B-Instruct или Phi-3-mini-4k-instruct), запускаемую локально через transformers + torch.
- На выборке из 50-100 примеров (subset датасета) запустите одиночный CoT и зафиксируйте accuracy.
- Для self-consistency сгенерируйте 5 путей с temperature=0.7 (разные random seed). Majority vote примените к тем же примерам.
- Если accuracy не дотягивает до +15%, увеличьте число путей до 10 или подберите temperature.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык программирования | Python 3.10+ | Основной код |
| Библиотека для работы с LLM | openai, anthropic, transformers, vllm | Вызов модели |
| Датасеты | datasets (Hugging Face) | Загрузка тестовых примеров |
| Манипуляции данными | pandas, numpy | Анализ результатов |
| Промпт-инжиниринг | Jinja2 / f-строки | Формирование CoT-промптов |
| Логирование | logging / wandb (опционально) | Отслеживание экспериментов |
| Вычисления | torch, cuda (если локально) | Инференс модели |
4. Этапы выполнения
Этап 1: Подготовка датасета и baseline (45 минут)
Действия
-
Выберите датасет
- Рекомендуется gsm8k (градуированные математические задачи для 8-го класса). Загрузите тестовую часть:
from datasets import load_dataset dataset = load_dataset("gsm8k", "main", split="test") - Возьмите случайную подвыборку из 100 примеров (если ресурсы ограничены) — dataset = dataset.select(range(100)).
- Рекомендуется gsm8k (градуированные математические задачи для 8-го класса). Загрузите тестовую часть:
-
Напишите функцию CoT-инференса
- Используйте шаблон промпта:
Реши задачу шаг за шагом, а затем дай финальный ответ в формате "Ответ: <число>". Задача: {question} - Вызовите модель с temperature=0.0 для детерминированного baseline-ответа.
- Извлеките финальный ответ из вывода модели (регулярное выражение или поиск
Ответ:).
- Используйте шаблон промпта:
Ожидаемый результат этапа Файл baseline_accuracy.txt с числом, а также функция single_cot(prompt, model).
Этап 2: Реализация self-consistency (1.5 часа)
Действия
-
Напишите функцию для генерации N путей
- Параметры:
num_paths=5, temperature=0.7, top_p=0.9. - Для каждого примера сгенерируйте
num_pathsцепочек, передавая в вызов модели temperature. - Важно: каждый вызов должен быть независимым (разный seed необязателен при temperature>0).
- Параметры:
-
Реализуйте majority vote
-
Интегрируйте с датасетом
- Пройдите по тестовой выборке (те же 100 примеров), для каждого:
- Сгенерируйте 5 CoT.
- Примените majority vote.
- Сравните с правильным ответом.
- Вычислите
accuracy_self_consistency.
- Пройдите по тестовой выборке (те же 100 примеров), для каждого:
-
Сравните с baseline
- gain = accuracy_self_consistency - baseline_accuracy.
- Выведите и сохраните результат.
Ожидаемый результат этапа Функция self_consistency(question, model, num_paths=5) и отчёт self_consistency_results.txt с accuracy и приростом.
Этап 3: Анализ и отладка (1 час)
Действия
-
Проверьте корректность извлечения ответов
- Если модель не всегда выводит
Ответ:, добавьте fallback: regex на число в конце текста. - Посмотрите на 10-20 примеров вручную, чтобы убедиться, что majority vote действительно улучшает.
- Если модель не всегда выводит
-
Экспериментируйте с параметрами
- Попробуйте
num_pathsот 3 до 10, temperature от 0.5 до 1.0. - Постройте таблицу зависимости accuracy от числа путей (можно в pandas).
- Попробуйте
-
Исследуйте случаи, где majority vote не помогает
- Выпишите 3 примера, где одиночный CoT был правильным, а self-consistency ошибся (и наоборот).
- Сделайте выводы о природе этих ошибок.
Ожидаемый результат этапа Краткий отчёт analysis.md с таблицей зависимости и примерами ошибок.
Этап 4: Оформление результата (30 минут)
Действия
-
Скомпонуйте итоговый скрипт
- Сделайте единый
main.py, который принимает аргументы:--dataset(выбор датасета)--num_samples(сколько примеров использовать)--num_paths(количество путей)--temperature
- Результаты выводятся в консоль и сохраняются в JSON.
- Сделайте единый
-
Напишите README.md
Ожидаемый результат этапа Репозиторий с кодом и документацией, демонстрирующий прирост accuracy ≥15%.
5. Критерии приемки (Definition of Done)
- Скрипт запускается без ошибок на тестовой выборке (минимум 50 примеров).
- Self-consistency использует 5 независимых CoT-путей.
- Majority vote реализован корректно (выбор наиболее частого ответа).
- Baseline accuracy вычислен и зафиксирован.
- Accuracy self-consistency превышает baseline на ≥15%.
- Код выложен в Git-репозиторий (или предоставлен в виде архива).
- README содержит инструкцию по запуску и сводку результатов.
- Проведён анализ как минимум 3 примеров с пояснениями.
6. Ожидаемый результат
- Основной артефакт Python-скрипт
main.py(или Jupyter notebook), реализующий:- Загрузку датасета.
- Функцию одиночного CoT.
- Функцию self-consistency с majority vote.
- Сравнение метрик.
- Отчёт файл
results.jsonс полями:{ "dataset": "gsm8k", "num_samples": 100, "num_paths": 5, "temperature": 0.7, "baseline_accuracy": 0.72, "self_consistency_accuracy": 0.88, "gain": 0.16 } - Дополнительно
analysis.mdс исследованием влияния числа путей и температуры.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Модель не всегда выводит ответ в нужном формате | Написать гибкий парсер: искать "Ответ:" или "Answer:"; если нет — искать последнее число после "=" или в конце текста. |
| Timeout при вызове API (если используете облачные API) | Добавить retry с экспоненциальной задержкой (например, tenacity). |
| Недостаточно памяти для локального инференса | Уменьшить размер модели (например, 1.5B вместо 7B) или использовать batch size = 1, load in 8-bit. |
| Прирост accuracy меньше 15% | Увеличить число путей до 10, поднять temperature до 0.9, или выбрать более сложный датасет (например, AQuA, ARC-Challenge). |
| Воспроизводимость (seed) | Зафиксировать seed для Python, numpy и torch, если используется локальная модель. Для API — зафиксировать seed параметр (если поддерживается). |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Подготовка датасета и baseline | 45 мин |
| Реализация self-consistency | 1 ч 30 мин |
| Анализ и отладка | 1 ч |
| Оформление результата | 30 мин |
| Итого (чистое время) | ~3 ч 45 мин |
| Примечание для первого раза | Учитывайте время на установку зависимостей и получение API ключа (+30 мин). |
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 128 | Chain-of-Thought prompting |
| 256 | Prompt engineering для reasoning |
| 384 | Majority voting и ensemble в LLM |
| 512 | Self-consistency decoding |
| 640 | Температура и влияние на разнообразие |
| 768 | Fine-tuning для улучшения CoT |
| 896 | Оценка качества рассуждений LLM |
10. Чек-лист самопроверки
- Я проверил, что baseline accuracy вычислен корректно (сравнивал с золотыми ответами).
- Я убедился, что при генерации нескольких путей используется
temperature>0. - Я протестировал majority vote на 5–10 примерах вручную и убедился, что он выбирает правильный ответ.
- Я подтвердил, что прирост accuracy составляет не менее 15% на выбранной выборке.
- Я написал README с инструкцией по запуску и результатами.
- Я зафиксировал все гиперпараметры (num_paths, temperature, seed) для воспроизводимости.