Домашка: бенчмарк вслепую
Домашка
Урок закончился словами «пять своих задач вслепую говорят больше, чем позиция в лидерборде» — домашка превращает эти слова в код. Вы соберёте 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 за задачу) расставляет человек — это и есть «вслепую».
Тексты задач (используйте как есть — они с секретом: на них дешёвые и дорогие модели расходятся заметнее всего):
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:
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 # сумма дорогойПример работы программы
>>> 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 и запишите вывод одной строкой: какую модель вы возьмёте в ревьюер и почему. Эта строка — первый архитектурный документ вашего агента.
Как устроены LLM: токены, контекст, цена
10 мин
Домашка: токен-калькулятор
4 мин
Квиз: Как устроены LLM: токены, контекст, цена
8 мин
Промпты как код: шаблоны и переменные
8 мин
Домашка: промпт ревьюера
3 мин
Квиз: Промпты как код: шаблоны и переменные
7 мин
Структурированный вывод: JSON вместо прозы
6 мин
Домашка: парсер ревью
3 мин
Квиз: Структурированный вывод: JSON вместо прозы
7 мин
Выбор модели: GPT, Claude, открытые
7 мин
Домашка: бенчмарк вслепую
4 мин
Квиз: Выбор модели: GPT, Claude, открытые
7 мин
HARD-задача: смета агента
3 мин
Локальная модель: Ollama по-настоящему
8 мин
Квиз: Локальная модель: Ollama по-настоящему
6 мин