# ai_benchmark

Эксперименты и тестирование LLM, VLM и прочих тулов

## Установка

```bash
pip install -r requirements.txt
```

## Использование

### Через скрипт run.sh

```bash
./run.sh run --model llama3 --ollama-url http://localhost:11434
```

### Генерация тестов через Ollama

```bash
# Генерировать 1 тест для каждой категории через Ollama
./run.sh gen

# Или через Python напрямую
python scripts/generate_tests.py --count 1 --category all --model llama3 --ollama-url http://localhost:11434
```

### Через Python

```bash
python src/main.py --model llama3 --ollama-url http://localhost:11434
```

### Аргументы для generate_tests.py

- `--count`: Количество тестов для генерации (по умолчанию: 1)
- `--category`: Категория тестов (translation, summarization, codegen, или all) (по умолчанию: all)
- `--model`: Название модели для генерации тестов (обязательный)
- `--ollama-url`: URL подключения к Ollama серверу (обязательный)
- `--validate`: Валидировать тесты в указанной директории

### Аргументы для main.py

- `--model`: Название модели для тестирования (обязательный)
- `--ollama-url`: URL подключения к Ollama серверу (обязательный)
- `--benchmarks`: Список бенчмарков для выполнения (translation, summarization, codegen). По умолчанию все.
- `--output`: Директория для сохранения результатов. По умолчанию: `results`
- `--verbose`: Подробный режим вывода

### Примеры

Запуск всех бенчмарков через скрипт:
```bash
./run.sh run --model llama3 --ollama-url http://localhost:11434
```

Генерация тестов через Ollama:
```bash
./run.sh gen
```

Запуск только тестов переводов:
```bash
./run.sh run --model llama3 --ollama-url http://localhost:11434 --benchmarks translation
```

Очистка отчетов:
```bash
./run.sh clean
```

Запуск с подробным выводом:
```bash
./run.sh run --model llama3 --ollama-url http://localhost:11434 --verbose
```

## Структура проекта

```
ai-benchmark/
├── src/
│   ├── benchmarks/          # Модули с тестовыми наборами
│   │   ├── translation.py   # Тесты переводов
│   │   ├── summarization.py # Тесты пересказов
│   │   ├── codegen.py       # Тесты генерации кода
│   │   └── base.py          # Базовый класс для тестов
│   ├── models/              # Модули для работы с моделями
│   │   └── ollama_client.py # Клиент для Ollama
│   ├── utils/               # Утилиты
│   │   ├── report.py        # Генерация отчетов
│   │   └── scoring.py      # Вычисление метрик оценки качества
│   └── main.py              # Основной скрипт запуска
├── tests/                   # Тестовые данные
│   ├── translation/         # Данные для тестов переводов
│   ├── summarization/       # Данные для тестов пересказов
│   └── codegen/             # Данные для тестов генерации кода
├── results/                 # Результаты выполнения
├── scripts/                 # Скрипты для работы с проектом
│   ├── generate_tests.py    # Скрипт для генерации тестов
│   └── README.md            # Документация по скриптам
├── prompts/                 # Промпты для генерации тестов
│   ├── translation.txt      # Промпты для тестов перевода
│   ├── summarization.txt    # Промпты для тестов пересказа
│   └── codegen.txt          # Промпты для тестов генерации кода
├── requirements.txt         # Зависимости проекта
└── README.md                # Документация
```

## Добавление новых тестов

1. Создайте новый файл в `src/benchmarks/` наследуя от `Benchmark`
2. Реализуйте методы `load_test_data()` и `evaluate()`
3. Добавьте тестовые данные в соответствующую директорию в `tests/`
4. Обновите список бенчмарков в `src/main.py`

## Формат тестовых данных

Тестовые данные должны быть в формате TXT с разделителем:

```
Текст промпта для модели
=== разделитель ===
Ожидаемый ответ
```

Файл должен содержать два разделенных строкой `=== разделитель ===` поля:
- Первая строка - промпт для модели
- Вторая строка - ожидаемый ответ

## Результаты

После выполнения бенчмарков в директории `results/` будут сгенерированы файлы в формате Markdown с таблицами результатов. Каждый бенчмарк будет иметь свой отчет, а также будет создан сводный отчет со статистикой по всем тестам.

## Методика расчета Score (Скор)

### Основная метрика: F1-score

Каждый тест оценивается по метрике F1-score, которая вычисляется на основе сходства между ответом модели и ожидаемым ответом:

1. **Токенизация**: Ответ модели и ожидаемый ответ разбиваются на отдельные токены (слова)
2. **Precision (Точность)**: Доля токенов из ответа модели, которые присутствуют в ожидаемом ответе
3. **Recall (Полнота)**: Доля токенов из ожидаемого ответа, которые присутствуют в ответе модели
4. **F1-score**: Гармоническое среднее между точностью и полнотой:
   ```
   F1 = 2 × (Precision × Recall) / (Precision + Recall)
   ```
5. **Диапазон**: 0.0 - 1.0, где 1.0 означает идеальное совпадение

### Альтернативные метрики

Для более детального анализа можно использовать следующие метрики:

- **Levenshtein Distance / Edit Distance**: Количество редактирований (вставок, удалений, замен) для преобразования ответа модели в ожидаемый ответ. Полезно для оценки структурных различий.
- **BLEU Score**: Популярная метрика для оценки качества машинного перевода, основанная на n-граммах. Подходит для задач переводов.
- **ROUGE Score**: Метрика для оценки качества суммаризации, основанная на перекрытии n-грамм, слов и последовательностей. Подходит для задач пересказов.
- **Code Similarity Metrics**: Для генерации кода можно использовать процент совпадения структуры кода (функции, классы, синтаксис), а также метрики типа AST (Abstract Syntax Tree) similarity.

### Средний Score

В отчетах вычисляется средний Score по всем успешно выполненным тестам в каждом бенчмарке. Этот показатель позволяет сравнить общую производительность модели по разным задачам.

### Пример расчета F1-score

Если модель ответила "hello world" на промпт, а ожидаемый ответ "hello there", расчет будет следующим:

- Токены модели: {"hello", "world"}
- Токены ожидаемого: {"hello", "there"}
- Пересечение: {"hello"}
- Precision = 1/2 = 0.5
- Recall = 1/2 = 0.5
- F1-score = 2 × (0.5 × 0.5) / (0.5 + 0.5) = 0.5

## Дополнительные возможности

### Генерация тестов

Скрипт `scripts/generate_tests.py` позволяет автоматически генерировать тесты для всех категорий:
- **Переводы** (translation): генерирует английские предложения и их переводы на русский
- **Пересказы** (summarization): генерирует тексты и их пересказы
- **Генерация кода** (codegen): генерирует задачи и соответствующий код

Тесты генерируются с использованием LLM и сохраняются в формате TXT с разделителем `=== разделитель ===`.

### Валидация тестов

Скрипт поддерживает валидацию тестов:
```bash
python scripts/generate_tests.py --validate tests/translation
```

Валидация проверяет:
- Соответствие формату (наличие разделителя)
- Наличие обязательных полей
- Корректность содержания

### Промпты

В директории `prompts/` хранятся промпты, используемые для генерации тестов. Каждый файл содержит специфические инструкции для каждой категории задач.

### Результаты отчетов

Отчеты генерируются в формате Markdown и содержат:
- Таблицы с результатами каждого теста
- Статистику по каждой метрике
- Сводные данные по всем тестам
- Сравнение результатов между разными моделями
