English translation is not available yet. Showing Russian content.

Настроить 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/модели — симулируем:

  1. Используйте маленькую открытую модель (Qwen2.5-1.5B-Instruct или Phi-3-mini-4k-instruct), запускаемую локально через transformers + torch.
  2. На выборке из 50-100 примеров (subset датасета) запустите одиночный CoT и зафиксируйте accuracy.
  3. Для self-consistency сгенерируйте 5 путей с temperature=0.7 (разные random seed). Majority vote примените к тем же примерам.
  4. Если accuracy не дотягивает до +15%, увеличьте число путей до 10 или подберите temperature.

3. Технологический стек

КомпонентИнструментыНазначение
Язык программированияPython 3.10+Основной код
Библиотека для работы с LLMopenai, anthropic, transformers, vllmВызов модели
Датасетыdatasets (Hugging Face)Загрузка тестовых примеров
Манипуляции даннымиpandas, numpyАнализ результатов
Промпт-инжинирингJinja2 / f-строкиФормирование CoT-промптов
Логированиеlogging / wandb (опционально)Отслеживание экспериментов
Вычисленияtorch, cuda (если локально)Инференс модели

4. Этапы выполнения

Этап 1: Подготовка датасета и baseline (45 минут)

Действия

  1. Выберите датасет

    • Рекомендуется gsm8k (градуированные математические задачи для 8-го класса). Загрузите тестовую часть:
      from datasets import load_dataset
      dataset = load_dataset("gsm8k", "main", split="test")
      
    • Возьмите случайную подвыборку из 100 примеров (если ресурсы ограничены) — dataset = dataset.select(range(100)).
  2. Напишите функцию CoT-инференса

    • Используйте шаблон промпта:
      Реши задачу шаг за шагом, а затем дай финальный ответ в формате "Ответ: <число>".
      
      Задача: {question}
      
    • Вызовите модель с temperature=0.0 для детерминированного baseline-ответа.
    • Извлеките финальный ответ из вывода модели (регулярное выражение или поиск Ответ:).
  3. Запустите baseline и зафиксируйте accuracy

    • Сравните предсказанные ответы с золотыми (поле answer в датасете).
    • Вычислите accuracy = (количество правильных) / (всего примеров).
    • Запишите baseline в файл baseline_accuracy.txt.

Ожидаемый результат этапа Файл baseline_accuracy.txt с числом, а также функция single_cot(prompt, model).


Этап 2: Реализация self-consistency (1.5 часа)

Действия

  1. Напишите функцию для генерации N путей

    • Параметры: num_paths=5, temperature=0.7, top_p=0.9.
    • Для каждого примера сгенерируйте num_paths цепочек, передавая в вызов модели temperature.
    • Важно: каждый вызов должен быть независимым (разный seed необязателен при temperature>0).
  2. Реализуйте majority vote

    • Извлеките финальные ответы из каждой цепочки (та же логика, что в baseline).
    • Соберите все ответы в список, найдите наиболее часто встречающийся с помощью collections.Counter.
    • Если ничья — можно взять первый по порядку или случайный (но это редко при 5 путях).
    • Верните выбранный ответ.
  3. Интегрируйте с датасетом

    • Пройдите по тестовой выборке (те же 100 примеров), для каждого:
      • Сгенерируйте 5 CoT.
      • Примените majority vote.
      • Сравните с правильным ответом.
    • Вычислите accuracy_self_consistency.
  4. Сравните с baseline

    • gain = accuracy_self_consistency - baseline_accuracy.
    • Выведите и сохраните результат.

Ожидаемый результат этапа Функция self_consistency(question, model, num_paths=5) и отчёт self_consistency_results.txt с accuracy и приростом.


Этап 3: Анализ и отладка (1 час)

Действия

  1. Проверьте корректность извлечения ответов

    • Если модель не всегда выводит Ответ:, добавьте fallback: regex на число в конце текста.
    • Посмотрите на 10-20 примеров вручную, чтобы убедиться, что majority vote действительно улучшает.
  2. Экспериментируйте с параметрами

    • Попробуйте num_paths от 3 до 10, temperature от 0.5 до 1.0.
    • Постройте таблицу зависимости accuracy от числа путей (можно в pandas).
  3. Исследуйте случаи, где majority vote не помогает

    • Выпишите 3 примера, где одиночный CoT был правильным, а self-consistency ошибся (и наоборот).
    • Сделайте выводы о природе этих ошибок.

Ожидаемый результат этапа Краткий отчёт analysis.md с таблицей зависимости и примерами ошибок.


Этап 4: Оформление результата (30 минут)

Действия

  1. Скомпонуйте итоговый скрипт

    • Сделайте единый main.py, который принимает аргументы:
      • --dataset (выбор датасета)
      • --num_samples (сколько примеров использовать)
      • --num_paths (количество путей)
      • --temperature
    • Результаты выводятся в консоль и сохраняются в JSON.
  2. Напишите README.md

    • Описание задачи, использованной модели, параметров.
    • Инструкция по запуску.
    • Таблица с результатами: baseline vs self-consistency (accuracy и прирост).

Ожидаемый результат этапа Репозиторий с кодом и документацией, демонстрирующий прирост 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. Бюджет времени (оценка)

ЭтапВремя
Подготовка датасета и baseline45 мин
Реализация self-consistency1 ч 30 мин
Анализ и отладка1 ч
Оформление результата30 мин
Итого (чистое время)~3 ч 45 мин
Примечание для первого разаУчитывайте время на установку зависимостей и получение API ключа (+30 мин).

9. Связанные вопросы из базы знаний

ВопросТема
128Chain-of-Thought prompting
256Prompt engineering для reasoning
384Majority voting и ensemble в LLM
512Self-consistency decoding
640Температура и влияние на разнообразие
768Fine-tuning для улучшения CoT
896Оценка качества рассуждений LLM

10. Чек-лист самопроверки

  • Я проверил, что baseline accuracy вычислен корректно (сравнивал с золотыми ответами).
  • Я убедился, что при генерации нескольких путей используется temperature>0.
  • Я протестировал majority vote на 5–10 примерах вручную и убедился, что он выбирает правильный ответ.
  • Я подтвердил, что прирост accuracy составляет не менее 15% на выбранной выборке.
  • Я написал README с инструкцией по запуску и результатами.
  • Я зафиксировал все гиперпараметры (num_paths, temperature, seed) для воспроизводимости.