# Бенчмарк модели под классификацию пар

Готовый набор для замера LLM на задаче «связано ли A и B?». 11 кейсов, 6+ провайдеров, параллельный прогон, итоговая markdown-таблица.

Сопровождает выпуск №002 авторской колонки. Полное обоснование методологии — в статье.

## Что внутри

```
scripts/
├── README.md                  ← этот файл
├── casebook-template.csv      ← шаблон ground truth, 11 строк-примеров
├── system-prompt.md           ← system prompt классификации
├── user-template.md           ← user message template
├── bench-runner.py            ← параллельный прогон через провайдеров
├── analyze-results.py         ← JSONL → markdown-таблица
├── .env.example               ← шаблон API-ключей
└── requirements.txt           ← Python-зависимости
```

## Быстрый старт (5 шагов)

1. **Скачать набор**: загрузи всю папку `scripts/` к себе в проект.
2. **Установить зависимости**:
   ```bash
   python3 -m venv venv && source venv/bin/activate
   pip install -r requirements.txt
   ```
3. **Заполнить ключи**:
   ```bash
   cp .env.example .env
   # Открой .env и подставь свои API-ключи.
   # Минимум — два провайдера, чтобы было с чем сравнивать.
   ```
4. **Заполнить casebook**: открой `casebook-template.csv`, замени примеры
   на 11 своих кейсов (по 4 типа сложности — см. шаблон). Сохрани как
   `casebook.csv`.
5. **Прогнать и проанализировать**:
   ```bash
   python bench-runner.py casebook.csv results.jsonl
   python analyze-results.py results.jsonl > report.md
   ```

`report.md` — твоя итоговая таблица: каждая модель × decision profile,
точность на ground truth, latency, стоимость.

## Кастомизация

### Сменить промпт под свою задачу

`system-prompt.md` и `user-template.md` написаны под общую формулировку
«закрывает ли изменение A событие B». Если у тебя дедупликация багов /
маршрутизация в саппорт / антифрод — поменяй текст промпта, оставив:

- структуру JSON-ответа `{"verdict": "...", "reason": "..."}`
- три класса в закрытом списке
- слово `json` в user message (требование DashScope)

### Добавить или убрать провайдеров

В `bench-runner.py` массив `MODELS` — список конфигов. Каждый конфиг:

```python
{
    "tag": "glm-5.1-default",
    "provider": "zai",
    "model": "glm-5.1",
    "extra_body": {"thinking": {"type": "disabled"}},
    "thinking": False,
}
```

Закомментируй ненужных, добавь своих по тому же шаблону. Цены провайдеров
живут в словаре `PRICING` — при изменении провайдером тарифа поправь там.

### Изменить число кейсов

Скрипт читает столько строк, сколько в CSV. На 11–25 кейсах прогон
занимает 1–3 минуты. На 100+ — провайдеры могут начать резать rate limit;
тогда уменьши `Semaphore(N)` в `bench-runner.py`.

## Что замер даёт на выходе

`report.md` содержит:

1. Таблицу: модель × {YES, NO, MAYBE} распределение, latency p50, latency
   max, средняя стоимость прогона, accuracy на ground truth.
2. Расхождения между моделями на одних и тех же кейсах (где decisions
   разошлись), с цитатами reason.
3. Три рекомендации под три продуктовых сценария: inline-чат / фон /
   эскалейт-триаж.

## Стоимость прогона

Один полный прогон на 11 кейсах × 10 моделей-режимов — примерно $0.30–0.60
суммарно. Точные цифры зависят от тарифов провайдеров и выбранных
thinking-режимов (с reasoning дороже на порядок).

## Лицензия

MIT. Используй, модифицируй, переделывай под свои нужды.
