Бенчмарк · agentic
SWE-bench
SWE-bench проверяет, способна ли ИИ-система исправлять настоящие ошибки в программах: он берёт 2294 реальных задачи (issues) из популярных открытых Python-репозиториев на GitHub и просит модель сгенерировать патч с исправлением кода. Главная метрика — процент решённых задач.
Подробнее
- Пример
- Типичный пример даёт модели реальный баг-репорт или запрос функции из Python-проекта — скажем, задачу из Django или scikit-learn — вместе с кодом этого репозитория и просит сгенерировать патч, который устраняет проблему.
- Метрика
- Оценка — это процент решённых задач из 2294: задача засчитывается, только если патч модели после применения проходит собственный набор тестов репозитория.
- Приёмка
- Проверка полностью автоматическая: сгенерированный патч применяется к репозиторию и запускаются реальные тесты проекта; задача считается решённой, только если целевые падавшие тесты начинают проходить, а ранее проходившие остаются зелёными — без участия человека и без точного совпадения.
- Почему важно
- Он измеряет сквозные навыки разработки на реальном коде, а не на игрушечных задачах, поэтому за ним внимательно следят как за индикатором прогресса кодинг-агентов; для заголовочных цифр его в основном вытеснил проверенный людьми поднабор SWE-bench Verified.
Разбор примера
Задача
Репозиторий
psf/requests. Пользователь сообщает, что установка заголовка запроса в None (чтобы удалить заголовок сессии по умолчанию) не даёт эффекта: ключ со значением None остаётся в объединённых заголовках вместо удаления. Дан репозиторий на коммите с багом и это issue — подготовьте patch, чтобы requests.sessions.merge_setting удалял ключи со значением None.Решение
--- a/requests/sessions.py
+++ b/requests/sessions.py
@@ -412,6 +412,11 @@ def merge_setting(request_setting, session_setting, dict_class=OrderedDict):
merged_setting = dict_class(to_key_val_list(session_setting))
merged_setting.update(to_key_val_list(request_setting))
+ # Remove keys that are set to None. Extract the keys first to avoid
+ # mutating the dictionary while iterating over it.
+ none_keys = [k for (k, v) in merged_setting.items() if v is None]
+ for key in none_keys:
+ del merged_setting[key]
+
return merged_setting
Разбор
После объединения словарей сессии и запроса любой ключ со значением
None появился из явного переопределения на уровне запроса, призванного удалить значение по умолчанию, поэтому исправление собирает такие ключи и удаляет их (сначала формируя список, чтобы не менять словарь во время итерации). SWE-bench оценивает, применяя patch и запуская тесты FAIL_TO_PASS и PASS_TO_PASS этого экземпляра — задача решена, только если проходят все.