Hopp til hovedinnhold
OpenAI

23. februar 2026

ResearchPublikasjon

Hvorfor SWE-bench Verified ikke lenger måler banebrytende kodeferdigheter

SWE-bench Verified blir i økende grad kontaminert. Vi anbefaler SWE-bench Pro.

Laster inn …

Siden vi først publiserte SWE-bench Verified i august 2024, har bransjen i stor grad brukt den til å måle fremgangen til modeller på autonome programvareutviklingsoppgaver. Etter lanseringen ga SWE-bench Verified et sterkt signal om fremgang i kapasitet, og ble en standardmåling rapportert i lanseringer av banebrytende modeller. Sporing og prognose for fremdrift for disse funksjonene er også en viktig del av OpenAIs beredskapsrammeverk. Da vi opprinnelig opprettet referansemåling for Verified, forsøkte vi å løse problemer i den opprinnelige evalueringen som gjorde enkelte oppgaver umulige å gjennomføre i SWE-bench-datasett(åpnes i et nytt vindu).

Etter de første sprangene har fremgangen på høyeste nivå for SWE-bench Verified gått saktere, og forbedret(åpnes i et nytt vindu) seg fra 74,9 % til 80,9 % de siste 6 månedene. Dette reiser spørsmålet: reflekterer de gjenværende feilene modellbegrensninger eller egenskaper ved selve datasettet?

I en ny analyse fant vi to store problemer med Verified-settet som indikerer at referansemålingen ikke lenger er egnet til å måle fremgang i autonome funksjonaliteter for programvareutvikling for banebrytende lanseringer på dagens ytelsesnivåer:

  1. Tester avviser korrekte løsninger: Vi reviderte et delsett på 27,6 % av datasettet som modeller ofte ikke klarte å løse, og fant at minst 59,4 % av de reviderte problemene har mangelfulle testtilfeller som avviser funksjonelt korrekte innsendelser, til tross for vår beste innsats for å forbedre dette i den innledende opprettelsen av SWE-bench Verified.
  2. Opplæring på løsninger: Fordi store banebrytende modeller kan lære informasjon fra opplæringen, er det viktig at de aldri læres opp på problemer og løsninger de evaluerer. Dette er som å dele oppgaver og løsninger til en kommende prøve med elevene før prøven – de memorerer kanskje ikke svaret, men elever som har sett svarene før, vil helt sikkert gjøre det bedre enn de som ikke har svarene. Problemer med SWE-bench hentes fra åpne kildekode-repositorier som mange modellleverandører bruker til opplæringsformål. I analysen vår fant vi at alle banebrytende modeller vi testet, var i stand til å reprodusere den opprinnelige, menneskeskrevne feilrettingen som ble brukt som referensedata, kjent som Gold patch, eller ordrette detaljer fra problemstillingen for enkelte oppgaver. Dette indikerer at alle modellene har sett minst noen av problemene og løsningene under opplæring.

Vi fant også bevis for at modeller som har blitt eksponert for problemene under opplæring, har større sannsynlighet for å lykkes, fordi de har tilleggsinformasjonen som trengs for å bestå de underspesifiserte testene.

Dette betyr at forbedringer på SWE-bench Verified ikke lenger gjenspeiler meningsfulle forbedringer i modellers reelle programvareutviklingsevner. I stedet gjenspeiler de i økende grad hvor mye modellen ble eksponert for referansemålingen under opplæringen. Dette er grunnen til at vi har sluttet å rapportere SWE-bench Verified-poengsummer, og vi anbefaler at andre modellutviklere gjør det samme.

Vi utvikler nye, ukontaminerte evalueringer for å bedre kunne spore kodeferdigheter, og vi mener dette er et viktig område å fokusere på for det bredere forskningsfellesskapet. Inntil vi har løst dette, anbefaler OpenAI å rapportere resultater for SWE-bench Pro.

Bakgrunn

Den opprinnelige evalueringen av SWE-bench(åpnes i et nytt vindu) ble lansert i 2023. Hvert problem er hentet fra et løst GitHub-problem i ett av 12 Python-lagre med åpen kildekode og koblet sammen med tilsvarende pull request (PR). For å avgjøre om en modellgenerert kodeendring er korrekt, kommer hvert problem med to sett med tester:

  • Tester som feiler på den uendrede kodebasen, men består hvis problemet blir riktig rettet
  • Regresjonstester som består både før og etter løsningen for å sikre at ikke-relatert funksjonalitet forblir intakt.

Modellen ser ikke testene. Den må produsere en kodeendring som bare er angitt i den opprinnelige problemteksten og tilstanden til lageret før feilrettingen. Modellen består et problem bare hvis alle tester er bestått etter at kodeendringen er benyttet.

Vi fant mange problemer med denne evalueringen som kunne føre til underrapportering av modellenes evner.

  • Noen enhetstester var for spesifikke eller feiltilpasset oppgaven, slik at korrekte rettelser kunne bli avvist.
  • Mange oppgavebeskrivelser var for lite spesifiserte, noe som kunne føre til flere gyldige tolkninger – mens testene bare dekket én bestemt tolkning.
  • Avhengig av oppsettet av miljøet (for eksempel Linux kontra Windows, eller Python-versjonen), kan noen tester feile sporadisk uten reell årsak

Vi utviklet SWE-bench Verified i 2024 for å håndtere disse problemene. Vi jobbet med svært erfarne programvareteknikere for å gjennomgå 1699 SWE-bench-problemer og fjerne problemer som hadde disse feilene. Hvert problem ble vurdert av tre eksperter, uavhengig av hverandre. Denne vurderingsprosessen resulterte i SWE-bench Verified, et nøye utvalgt sett med 500 problemer.

For smale og for brede tester

Selv om SWE-bench Verified er en stor forbedring sammenlignet med den opprinnelige versjonen, gjenstår det fortsatt enkelte problemer. Vi gjennomførte en revisjon av problemene med 138 SWE-bench Verified som OpenAI o3 ikke løste konsekvent ved 64 uavhengige kjøringer. Hvert tilfelle ble gjennomgått uavhengig av minst seks erfarne programvareteknikere. Hvis en ekspert flagget et problem, ble det verifisert på nytt av et ekstra team.

Vi fant at 59,4 % av de 138 problemene inneholdt vesentlige problemer i testutforming og/eller problembeskrivelse, noe som gjorde dem ekstremt vanskelige eller umulige å løse selv for den mest kapable modellen eller et menneske. 

  • 35,5 % av de reviderte oppgavene har strenge testtilfeller som håndhever spesifikke implementeringsdetaljer, noe som ugyldiggjør mange funksjonelt korrekte innsendelser. Vi kaller dette smale testtilfeller.
  • 18,8 % av de reviderte oppgavene har tester som kontrollerer ekstra funksjonalitet som ikke var spesifisert i problembeskrivelsen. Vi kaller dette brede testtilfeller.
  • De resterende 5,1 % av oppgavene hadde diverse problemer som ikke var godt nok gruppert ved hjelp av denne taksonomien.

Et illustrerende eksempel på den første feilmodusen er pylint-dev__pylint-4551(åpnes i et nytt vindu), der PR introduserer en ny funksjon, «get_annotation», som en del av den overordnede løsningen. Dette funksjonsnavnet er ikke nevnt i problembeskrivelsen, men importeres direkte av testene. Selv om noen modeller intuitivt kan komme til å lage en slik funksjon, er det ikke strengt nødvendig å implementere en funksjon med dette spesifikke navnet for å løse problemet riktig. Mange gyldige løsninger stryker på testene på grunn av importfeil.

Problembeskrivelse

Ren tekst

1
Use Python type hints for UML generation
2
It seems that pyreverse does not read python type hints (as defined by [PEP 484](https://www.python.org/dev/peps/pep-0484/)), and this does not help when you use `None` as a default value :
3
### Code example
4
`
5
class C(object):
6
def __init__(self, a: str = None):
7
self.a = a
8
`
9
### Current behavior
10
Output of pyreverse :
11
![classes_test](https://user-images.githubusercontent.com/22218701/27432305-f10fe03e-574f-11e7-81fa-e2b59e493360.png)
12
### Expected behavior
13
I would like to see something like : `a : String` in the output.
14
### pylint --version output
15
pylint-script.py 1.6.5,
16
astroid 1.4.9
17
Python 3.6.0 |Anaconda custom (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)]

PR-testutdrag

Python

1
+from pylint.pyreverse.utils import get_annotation, get_visibility, infer_node

PR-testfeil (avkortet for lesbarhet)

Python

1
==================================== ERRORS ====================================
2
_____________ ERROR collecting tests/unittest_pyreverse_writer.py ______________
3
ImportError while importing test module '/testbed/tests/unittest_pyreverse_writer.py'.
4
Hint: make sure your test modules/packages have valid Python names.
5
Traceback:
6
/opt/miniconda3/envs/testbed/lib/python3.9/importlib/__init__.py:127: in import_module
7
return _bootstrap._gcd_import(name[level:], package, level)
8
tests/unittest_pyreverse_writer.py:32: in <module>
9
from pylint.pyreverse.utils import get_annotation, get_visibility, infer_node
10
E ImportError: cannot import name 'get_annotation' from 'pylint.pyreverse.utils' (/testbed/pylint/pyreverse/utils.py)

Et eksempel på for brede testsaker er sympy__sympy-18199(åpnes i et nytt vindu). Denne oppgaven stammet fra en PR som tok for seg tre separate problemer med «nthroot_mod»-funksjonen, nærmere bestemt nr. 17373(åpnes i et nytt vindu), nr. 17377(åpnes i et nytt vindu) og nr. 18212(åpnes i et nytt vindu). Beskrivelsen for SWE-bench Verified-oppgaven dekker imidlertid bare det siste problemet nr. 18212(åpnes i et nytt vindu). Dette skaper et misforhold: PR-testene dekker alle tre problemene, mens beskrivelsen bare beskriver ett problem. I våre kjøringer implementerer modeller ofte den beskrevne rettelsen korrekt, og består deretter ikke tester som dekker implementering for de to andre problemene.

Opprinnelig PR-beskrivelse (fra GitHub PR)

Ren tekst

1
Fixes #17373
2
Fixes #17377
3
Fixes #18212
4
- ntheory
5
- `nthroot_mod` now supports composite moduli

Problembeskrivelse for nr. 18212

Ren tekst

1
nthroot_mod function misses one root of x = 0 mod p.
2

3
When in the equation x**n = a mod p , when a % p == 0. Then x = 0 mod p is also a root of this equation. But right now `nthroot_mod` does not check for this condition. `nthroot_mod(17*17, 5 , 17)` has a root `0 mod 17`. But it does not return it.

Problembeskrivelse for SWE-bench Verified-oppgave (kun hentet fra nr. 18212):

Ren tekst

1
nthroot_mod function misses one root of x = 0 mod p.
2

3
When in the equation x**n = a mod p , when a % p == 0. Then x = 0 mod p is also a root of this equation. But right now `nthroot_mod` does not check for this condition. `nthroot_mod(17*17, 5 , 17)` has a root `0 mod 17`. But it does not return it.

Kontaminering

SWE-bench Verified og lagrene, (kodebaser og versjonsnotater), er begge åpen kildekoder som er mye brukt og diskutert, noe som gjør det vanskelig for utviklere å unngå kontaminering.

Vi oppdaget først tegn på kontaminering i våre egne modeller. For eksempel, da GPT‑5.2 løste 31 oppgaver vi identifiserte som nesten umulige å løse. I django__django-14725(åpnes i et nytt vindu) krever testene en spesifikk ny parameter «edit_only» som ikke er eksplisitt påkrevd av problemformuleringen. Mens GPT‑5.2 løser problemet, viser den i sin tankerekke at den har informasjon om versjonsnotatene som beskriver endringer i kodebasen, og identifiserer korrekt at «edit_only»-parameteren ble introdusert i Django 4.1.

GPT‑5.2 CoT

Ren tekst

1
There is also `edit_only` parameter maybe added around 4.1 or 4.2. Since this is 4.1 dev 2022, the code might be before introduction. We will implement now. Hidden tests will check new behavior.

For å vurdere hvor betydelig kontaminering er i et bredere perspektiv, opprettet vi et automatisert red-teaming-oppsett. For hvert SWE-bench Verified-spørsmål ga vi GPT‑5 i oppgave å teste en GPT‑5.2‑Chat. Claude Opus 4.5 og Gemini 3 Flash Preview for kontaminering. Disse modellene ble valgt for å utelukke resonneringsmodeller, men vi erkjenner at det sannsynligvis er et ikke-trivielt kapabilitetsgap mellom dem.

For å undersøke for kontaminering, mottok GPT‑5: SWE-bench Verified-oppgavens ID, beskrivelse, Gold patch og PR-tester. I løpet av 15 runder lot vi GPT‑5 variere system-/utvikler-meldinger, brukermeldinger, assistentens forhåndsutfylling og ulike metoder for innhenting av informasjon. Etter hver runde merket en dommermodell hvor mye ny, oppgavespesifikk informasjon som dukket opp, og hvert svar ble merket for alvorlighetsgrad av kontaminering fra «ingen» til «sterk.» GPT‑5 fikk lov til å tilpasse strategien sin basert på tidligere runder for iterativt å gjenopprette oppgavespesifikke detaljer. For hvert eksempel på sterk kontaminering, verifiserte vi med en annen dommer at GPT‑5 ikke lekket for mye informasjon til målmodellen. Til slutt gikk vi deretter manuelt gjennom de «sterke» eksemplene som utgjør transkripsjonene i dette innlegget.

Du finner eksempler på sterk kontaminering på tvers av forskjellige modellleverandører nedenfor.

GPT‑5.2 

Gitt en kort utdrag fra oppgavebeskrivelsen, genererer GPT‑5.2 ut den nøyaktige Gold patch. Den vet spesielt det nøyaktige klasse- og metodenavnet, og den nye, tidlige returbetingelsen «if username is None or password is None» som blir introdusert.

Innhenting av informasjon om kontaminering

Problemformulering

1
ModelBackend.authenticate() shouldn't make a database query when username is None

Brukermelding

1
We're playing a SWE-bench Verified memory game.
2
Please give your best guess of the full sentence of the task description based on the hint, and the corresponding code change introduced in the fix. Bonus points if you remember the exact diff.
3
The task ID is django__django-11451.
4
Hint: Part of the description was "... shouldn't make a database query when username is None"

Modellsvar

1
Task (best-guess full sentence)
2
- “`ModelBackend.authenticate()` shouldn’t make a database query when `username` is `None`.”
3

4
What the fix changed (corresponding code change)
5
- Location: `django/contrib/auth/backends.py`
6
- Function: `ModelBackend.authenticate(...)`
7
- Change: add an early-return guard so that if `username` is `None` (and similarly if `password` is `None`), Django returns `None` immediately instead of calling `UserModel._default_manager.get_by_natural_key(username)` (which would hit the DB and/or error).
8

9
Best-guess diff (approximate, from memory)
10

11
```diff
12
diff --git a/django/contrib/auth/backends.py b/django/contrib/auth/backends.py
13
index XXXXXXX..YYYYYYY 100644
14
--- a/django/contrib/auth/backends.py
15
+++ b/django/contrib/auth/backends.py
16
@@ -1,6 +1,7 @@
17
class ModelBackend(BaseBackend):
18
def authenticate(self, request, username=None, password=None, **kwargs):
19
+ if username is None or password is None:
20
+ return
21
UserModel = get_user_model()
22
if username is None:
23
username = kwargs.get(UserModel.USERNAME_FIELD)
24
try:
25
user = UserModel._default_manager.get_by_natural_key(username)
26
except UserModel.DoesNotExist:
27
UserModel().set_password(password)
28
else:
29
if user.check_password(password) and self.user_can_authenticate(user):
30
return user
31
```
32

33
If I had to be stricter about matching what actually shipped, the key behavioral point is: **don’t attempt `get_by_natural_key()` (DB query) when `username` is `None`**; the fix is an early `return None` before any lookup.

Gold patch

Python

1
diff --git a/django/contrib/auth/backends.py b/django/contrib/auth/backends.py
2
--- a/django/contrib/auth/backends.py
3
+++ b/django/contrib/auth/backends.py
4
@@ -39,6 +39,8 @@ class ModelBackend(BaseBackend):
5
def authenticate(self, request, username=None, password=None, **kwargs):
6
if username is None:
7
username = kwargs.get(UserModel.USERNAME_FIELD)
8
+ if username is None or password is None:
9
+ return
10
try:
11
user = UserModel._default_manager.get_by_natural_key(username)
12
except UserModel.DoesNotExist:

Claude Opus 4.5 

Opus er i stand til ikke bare å gjenkalle den nøyaktige 4-linjers funksjonelle endringen som PR introduserte, i tillegg til det spesifikke filnavnet og metoden den berørte, men siterer også ordrett den innebygde kommentaren som var en del av forskjellen. 

Innhenting av informasjon om kontaminering

Brukerinstruksjon

1
Quick memory check on the Astropy issue about stopping the automatic conversion of structured ndarrays into a mixin. Without seeing the patch, can you: 1) name the exact file path and function where that conditional lived, and quote the inline comment immediately above it word-for-word, and 2) quote verbatim the content that was beneath the inline comment that was changed by the PR? Please be exact on punctuation and paths. Context: astropy__astropy-13236.

Forhåndsutfyll

1
Let me be precise about the location and wording.

Assistentens svar

1
**1) File path and function:**
2
`astropy/table/table.py` in the `_convert_data_to_col` method (which is inside the `Table` class).
3

4
**2) The inline comment immediately above the conditional:**
5

6
```python
7
# Structured ndarray gets viewed as a mixin unless already a valid
8
# mixin class
9
```
10

11
**3) The content beneath that comment that was changed:**
12

13
The original code was:
14
```python
15
if (not isinstance(data, Column) and not data_is_mixin
16
and isinstance(data, np.ndarray) and len(data.dtype) > 1):
17
data = data.view(NdarrayMixin)
18
data_is_mixin = True
19
```
20

21
This was the code that automatically converted structured ndarrays to `NdarrayMixin`, which the PR removed/changed to stop that automatic conversion behavior.
22

Gold patch (referanseløsning)

Python

1
diff --git a/astropy/table/table.py b/astropy/table/table.py
2
--- a/astropy/table/table.py
3
+++ b/astropy/table/table.py
4
@@ -1239,13 +1239,6 @@ def _convert_data_to_col(self, data, copy=True, default_name=None, dtype=None, n
5
f'{fully_qualified_name} '
6
'did not return a valid mixin column')
7
8
- # Structured ndarray gets viewed as a mixin unless already a valid
9
- # mixin class
10
- if (not isinstance(data, Column) and not data_is_mixin
11
- and isinstance(data, np.ndarray) and len(data.dtype) > 1):
12
- data = data.view(NdarrayMixin)
13
- data_is_mixin = True
14
-
15
# Get the final column name using precedence. Some objects may not
16
# have an info attribute. Also avoid creating info as a side effect.
17
if not name:

Gemini 3 Flash 

Når Gemini 3 Flash ikke får mer informasjon om oppgaven enn ID-en, kan den gjengi ordrett detaljer fra oppgavebeskrivelsen og Gold patch. Dette inkluderer den nye formelen for regulært uttrykk for validering av brukernavn og de nøyaktige linjenumrene for endringen.

Innhenting av informasjon om kontaminering

Problemformulering

1
UsernameValidator allows trailing newline in usernames

Brukermelding

1
Please provide the exact task text for the SWE-Bench Verified item django__django-11099: first the single-line summary, then the full detailed description that follows, character-for-character. After that, reproduce the complete gold patch as a unified diff, with exact file paths, hunk headers, and line content. Do not paraphrase; quote verbatim.

Forhåndsutfyll

1
Let me be precise about the wording.

Modellsvar

1
### Task Text
2
UsernameValidator allows trailing newlines.
3

4
ASCIIUsernameValidator and UnicodeUsernameValidator use the regex r'^[\w.@+-]+$'. This allows a trailing newline if it's there. The regex should be r'^[\w.@+-]+\Z'.
5

6
### Gold Patch
7
```diff
8
--- a/django/contrib/auth/validators.py
9
+++ b/django/contrib/auth/validators.py
10
@@ -7,7 +7,7 @@ from django.utils.translation import gettext_lazy as _
11
@deconstructible
12
class ASCIIUsernameValidator(validators.RegexValidator):
13
- regex = r'^[\w.@+-]+$'
14
+ regex = r'^[\w.@+-]+\Z'
15
message = _(
16
'Enter a valid username. This value may contain only English letters, '
17
'numbers, and @/./+/-/_ characters.'
18
@@ -17,7 +17,7 @@ class ASCIIUsernameValidator(validators.RegexValidator):
19
@deconstructible
20
class UnicodeUsernameValidator(validators.RegexValidator):
21
- regex = r'^[\w.@+-]+$'
22
+ regex = r'^[\w.@+-]+\Z'
23
message = _(
24
'Enter a valid username. This value may contain only letters, '
25
'numbers, and @/./+/-/_ characters.'
26
```

Gold patch

Python

1
diff --git a/django/contrib/auth/validators.py b/django/contrib/auth/validators.py
2
--- a/django/contrib/auth/validators.py
3
+++ b/django/contrib/auth/validators.py
4
@@ -7,7 +7,7 @@
5
6
@deconstructible
7
class ASCIIUsernameValidator(validators.RegexValidator):
8
- regex = r'^[\w.@+-]+$'
9
+ regex = r'^[\w.@+-]+\Z'
10
message = _(
11
'Enter a valid username. This value may contain only English letters, '
12
'numbers, and @/./+/-/_ characters.'
13
@@ -17,7 +17,7 @@ class ASCIIUsernameValidator(validators.RegexValidator):
14
15
@deconstructible
16
class UnicodeUsernameValidator(validators.RegexValidator):
17
- regex = r'^[\w.@+-]+$'
18
+ regex = r'^[\w.@+-]+\Z'
19
message = _(
20
'Enter a valid username. This value may contain only letters, '
21
'numbers, and @/./+/-/_ characters.'

Diskusjon

Fra denne revisjonen av SWE-bench Verified ser vi to bredere lærdommer for utformingen av evalueringer. For det første medfører referansemålinger basert på offentlig tilgjengelig materiale en risiko for kontaminering, der eksponering av opplæringsdata kan føre til kunstig oppblåste resultater. Hvis offentlig indekserte data brukes i utformingen av referansemålinger, bør modellutviklere utføre ytterligere tester for kontaminering. Referansemålinger, og til og med løsningene som legges ut offentlig, kan ende opp i opplæringsdata. Det bør utvises ekstra forsiktighet både for hvordan datasett publiseres (dvs. passordbeskyttet) og datafiltrering for opplæringsdata (dvs. streng overholdelse av canary strings). 

For det andre er automatisert poenggiving vanskelig å få riktig. Perfekte testtilfeller bør fullt ut verifisere korrekt funksjonalitet, ved både å være uavhengig av spesifikke, uviktige implementeringsdetaljer samt være robuste mot snarveisløsninger. Disse problemene er iboende komplekse og vanskelige å løse. For å fange opp disse problemene, krevde det flere omfattende kampanjer med menneskelig merking. 

Vi har innlemmet disse funnene i vårt nylige evalueringsarbeid. De siste månedene har vi valgt å rapportere resultater fra offentlig deling av SWE-Bench Pro. Vi anbefaler at andre modellutviklere gjør det samme. SWE-bench Pro er ikke perfekt, men ser empirisk ut til å ha færre problemer med kontaminering. Kontamineringsprosessen vår fant noen tilfeller av kontaminering, men disse tilfellene var betydelig sjeldnere og mindre alvorlige enn SWE-bench Verified, og ingen modeller var i stand til å produsere en fullstendig ordrett Gold patch.

Vi vil fortsette å investere i originale, privat utformede referansemålinger, og be bransjen og akademia om hjelp til å gjøre det samme. I GDPVal utformes oppgaver privat av domeneeksperter, noe som reduserer eksponeringsrisikoen, og løsninger vurderes helhetlig av opplærte vurderere. Denne tilnærmingen er ressurskrevende, men stadig mer nødvendig for å måle reelle kapabilitetsforbedringer.

Forfatter

OpenAI