Домашка: бенчмарк вслепую

Домашка

Урок закончился словами «пять своих задач вслепую говорят больше, чем позиция в лидерборде» — домашка превращает эти слова в код. Вы соберёте bench.py: маленький, честный стенд для сравнения моделей. По умолчанию он работает на FakeLLM (и его же мы проверяем тестами), а когда захотите сравнить по-настоящему — подмените заглушки на LLMClient с разными LLM_MODEL, и стенд станет боевым.

Описание задачи

Файл bench.py в devbuddy.

Основная функциональность

  • Константа TASKS — словарь «имя задачи → промпт». Три задачи (тексты ниже): баг, трейс, код.

  • run_benchmark(llms: dict, tasks: dict) -> dict — прогоняет каждую «модель» (любой объект с методом ask) через каждую задачу. Возвращает словарь с ключами-кортежами (имя_модели, имя_задачи) и значениями-ответами.

  • format_table(scores: dict) -> str — собирает markdown-таблицу: строки — модели, колонки — задачи и сумма. Оценки (0–2 за задачу) расставляет человек — это и есть «вслепую».

Тексты задач (используйте как есть — они с секретом: на них дешёвые и дорогие модели расходятся заметнее всего):

python
TASKS = {
    "баг": (
        "Найди баг в коде и ответь одной фразой, без кода:\n"
        "def avg(numbers):\n"
        "    return sum(numbers) / len(numbers)\n"
        "print(avg([]))"
    ),
    "трейс": (
        "Что случилось? Ответь одной фразой:\n"
        "TypeError: unsupported operand type(s) for +: 'int' and 'str'\n"
        "  File \"report.py\", line 14, in total\n"
        "    return qty + unit"
    ),
    "код": (
        "Напиши функцию is_palindrome(s: str) -> bool на Python. "
        "Только код, без пояснений."
    ),
}

Дополнительные условия

  • Только стандартная библиотека; никаких запросов в сеть внутри run_benchmark — он честно дёргает всё, что ему передали.

  • Порядок строк и колонок таблицы — детерминированный: как ключи легли в словарь, так и выводим.

Как проверить себя

test_bench.py, запуск python -m pytest test_bench.py -v:

python
from bench import format_table, run_benchmark
from fake_llm import FakeLLM


def test_run_collects_every_combination():
    llms = {"краткая": FakeLLM("ответ A"), "подробная": FakeLLM("ответ B")}
    tasks = {"баг": "промпт 1", "код": "промпт 2"}
    answers = run_benchmark(llms, tasks)
    assert answers[("краткая", "баг")] == "ответ A"
    assert answers[("подробная", "код")] == "ответ B"
    assert len(answers) == 4


def test_table_lists_models():
    scores = {
        ("дешёвая", "баг"): 2, ("дешёвая", "код"): 1,
        ("дорогая", "баг"): 2, ("дорогая", "код"): 2,
    }
    table = format_table(scores)
    assert "дешёвая" in table
    assert "дорогая" in table


def test_table_sums():
    scores = {
        ("дешёвая", "баг"): 2, ("дешёвая", "код"): 1,
        ("дорогая", "баг"): 2, ("дорогая", "код"): 2,
    }
    table = format_table(scores)
    assert "| 3 |" in table   # сумма дешёвой
    assert "| 4 |" in table   # сумма дорогой

Пример работы программы

python
>>> from bench import format_table
>>> scores = {("luna", "баг"): 2, ("luna", "код"): 1, ("astra", "баг"): 2, ("astra", "код"): 2}
>>> print(format_table(scores))
| модель | баг | код | сумма |
|---|---|---|---|
| luna | 2 | 1 | 3 |
| astra | 2 | 2 | 4 |

Критерии готовности

  • Три теста зелёные.

  • python bench.py (если сделаете main с двумя FakeLLM) печатает ответы обеих «моделей» на все задачи — заготовку таблицы.

  • Коммит: bench.py и test_bench.py.

Проверьте на живой модели (необязательно, но это самое интересное)

Возьмите две модели из разных ярусов (например, дешёвую и среднюю) и прогоните через стенд: словарь llms соберите из двух LLMClient-подобных объектов с разными LLM_MODEL. Ответы сохраните в файл, оцените каждую пару «модель-задача» на 0–2 вслепую (не подглядывая, кто ответил), соберите format_table и запишите вывод одной строкой: какую модель вы возьмёте в ревьюер и почему. Эта строка — первый архитектурный документ вашего агента.

  • theory icon

    Как устроены LLM: токены, контекст, цена

    10 мин

  • homework icon

    Домашка: токен-калькулятор

    4 мин

  • quiz icon

    Квиз: Как устроены LLM: токены, контекст, цена

    8 мин

  • theory icon

    Промпты как код: шаблоны и переменные

    8 мин

  • homework icon

    Домашка: промпт ревьюера

    3 мин

  • quiz icon

    Квиз: Промпты как код: шаблоны и переменные

    7 мин

  • theory icon

    Структурированный вывод: JSON вместо прозы

    6 мин

  • homework icon

    Домашка: парсер ревью

    3 мин

  • quiz icon

    Квиз: Структурированный вывод: JSON вместо прозы

    7 мин

  • theory icon

    Выбор модели: GPT, Claude, открытые

    7 мин

  • homework icon

    Домашка: бенчмарк вслепую

    4 мин

  • quiz icon

    Квиз: Выбор модели: GPT, Claude, открытые

    7 мин

  • homework icon

    HARD-задача: смета агента

    3 мин

  • theory icon

    Локальная модель: Ollama по-настоящему

    8 мин

  • quiz icon

    Квиз: Локальная модель: Ollama по-настоящему

    6 мин

🎯
Тренажёр собеседованияЗакрепите знания перед интервью