Gå til hovedindhold
OpenAI

23. februar 2026

ResearchPublikation

Hvorfor SWE-bench Verified ikke længere måler banebrydende kodningskapaciteter

SWE-bench Verified bliver i stigende grad kontamineret. Vi anbefaler SWE-bench Pro.

Indlæser ...

Siden vi første gang udgav SWE-bench Verified i august 2024, har branchen bredt anvendt det til at måle modellernes fremskridt inden for autonome softwareudviklingsopgaver. Efter udgivelsen gav SWE-bench Verified et stærkt signal om kapacitetsfremskridt og blev en standardmåling, der rapporteres i udgivelser af banebrydende modeller. Sporing og forudsigelse af fremskridt for disse kapaciteter er også en vigtig del af OpenAI’s Preparedness Framework. Da vi oprindeligt oprettede Verified-benchmarken, forsøgte vi at løse problemer i den oprindelige evaluering, som gjorde visse opgaver umulige at gennemføre i SWE-bench-datasættet(åbner i et nyt vindue).

Efter de første store fremskridt er den seneste udvikling på SWE-bench Verified gået langsommere, med en forbedring(åbner i et nyt vindue) fra 74,9 % til 80,9 % i de sidste 6 måneder. Dette rejser spørgsmålet: Afspejler de resterende fejl modelbegrænsninger eller egenskaber ved selve datasættet?

I en ny analyse fandt vi to væsentlige problemer med det verificerede sæt, der indikerer, at benchmarken ikke længere er egnet til at måle fremskridt inden for autonome softwareudviklingskapaciteter til banebrydende lanceringer på nutidens præstationsniveauer:

  1. Tests afviser korrekte løsninger: Vi reviderede en delmængde på 27,6 % af datasættet, som modellerne ofte ikke kunne løse, og fandt, at mindst 59,4 % af de reviderede problemer havde fejlbehæftede testcases, der afviste funktionelt korrekte indsendelser, på trods af vores bedste indsats for at forbedre dette i den indledende oprettelse af SWE-bench Verified.
  2. Træning i løsninger: Da store, banebrydende modeller kan lære information fra deres træning, er det vigtigt, at de aldrig trænes i problemer og løsninger, som de evalueres på. Det svarer til at dele problemer og løsninger til en kommende prøve med eleverne inden prøven – de husker måske ikke svarene, men de elever, der har set svarene før, vil helt sikkert klare sig bedre end dem, der ikke har. SWE-bench-problemer stammer fra open source-repositorier, som mange modeludbydere bruger til træningsformål. I vores analyse fandt vi, at alle de banebrydende modeller, vi testede, var i stand til at gengive den originale, menneskeskrevne fejlrettelse, der blev brugt som grundlæggende reference, kendt som gold patch, eller ordrette problembeskrivelser for bestemte opgaver, hvilket indikerer, at alle modellerne har set mindst nogle af problemerne og løsningerne under træningen.

Vi fandt også beviser for, at modeller, der har set problemerne under træningen, har større sandsynlighed for at lykkes, fordi de har yderligere information, der er nødvendig for at bestå de underspecificerede tests.

Dette betyder, at forbedringer på SWE-bench Verified ikke længere afspejler meningsfulde forbedringer i modellernes reelle softwareudviklingskapaciteter. I stedet afspejler de i stigende grad, hvor meget modellen blev eksponeret for benchmarken under træningen. Derfor er vi holdt op med at rapportere SWE-bench Verified-resultater, og vi anbefaler, at andre modeludviklere også gør det.

Vi udvikler nye, ukontaminerede evalueringer for bedre at kunne spore kodningsevner, og vi mener, at dette er et vigtigt område at fokusere på for det bredere forskningsfællesskab. Indtil vi har dem, anbefaler OpenAI at rapportere resultater for SWE-bench Pro.

Baggrund

Den oprindelige SWE-bench(åbner i et nyt vindue)-evaluering blev udgivet i 2023. Hvert problem stammer fra en løst GitHub-problem i et af 12 open source Python-repositorier og er parret med den tilsvarende pull request (PR). For at afgøre, om en modelgenereret kodeændring er korrekt, følger der med hvert problem to sæt tests:

  • Test, der fejler på den umodificerede kodebase, men består, hvis problemet rettes korrekt
  • Regressionstests, som består både før og efter rettelsen, for at sikre, at urelateret funktionalitet forbliver intakt.

Modellen ser ikke testene. Den skal producere en kodeændring udelukkende ud fra den oprindelige problemtekst og tilstanden af lageret før rettelsen. Den består kun et problem, hvis alle tests består, efter at kodeændringen er anvendt.

Vi fandt mange problemer med den evaluering, som kunne føre til underrapportering af modellernes evner.

  • Nogle enhedstests var enten for specifikke eller ikke tilpasset opgaven, hvilket kunne føre til, at korrekte rettelser blev afvist.
  • Mange opgavebeskrivelser var utilstrækkeligt specificerede, hvilket kunne føre til flere gyldige fortolkninger – mens testene kun dækkede en specifik.
  • Afhængigt af opsætningen af miljøet (for eksempel Linux vs Windows eller Python-versionen) kan nogle tests fejle sporadisk.

Vi oprettede SWE-bench Verified i 2024 for at løse disse problemer. Vi arbejdede sammen med erfarne softwareingeniører for at gennemgå 1.699 SWE-bench-problemer og filtrere problemer fra, der havde disse problemer. Hvert problem blev gennemgået af tre eksperter uafhængigt. Denne gennemgangsproces resulterede i SWE-bench Verified, et kurateret sæt af 500 problemer.

For smalle og for brede tests

Selvom SWE-bench Verified er en stor forbedring i forhold til den oprindelige version, er der stadig tilbageværende problemer. Vi gennemførte en revision af 138 SWE-bench Verified problemer, som OpenAI o3 ikke løste konsekvent i 64 uafhængige kørsler. Hver sag blev gennemgået uafhængigt af mindst seks erfarne softwareingeniører. Hvis en ekspert markerede et problem, blev det verificeret igen af et yderligere team.

Vi fandt, at 59,4 % af de 138 problemer indeholdt væsentlige problemer i testdesignet og/eller problembeskrivelsen, hvilket gjorde dem ekstremt vanskelige eller umulige at løse, selv for den mest kompetente model eller person. 

  • 35,5 % af de reviderede opgaver har strenge testcases, der håndhæver specifikke implementeringsdetaljer, hvilket ugyldiggør mange funktionelt korrekte indsendelser, som vi kalder snævre testcases.
  • 18,8 % af de reviderede opgaver har tests, der kontrollerer for yderligere funktionalitet, som ikke var specificeret i problembeskrivelsen, hvilket vi kalder brede testtilfælde.
  • De resterende 5,1 % af opgaverne havde diverse problemer, som ikke kunne grupperes under denne taksonomi.

Et illustrativt eksempel på den første fejltilstand er pylint-dev__pylint-4551(åbner i et nyt vindue), hvor PR introducerer en ny funktion `get_annotation` som en del af den samlede løsning. Dette funktionsnavn er ikke nævnt i problembeskrivelsen, men importeres direkte af testene. Selvom nogle modeller måske intuitivt vil oprette en sådan funktion, er det ikke strengt nødvendigt at implementere en funktion med dette specifikke navn for at løse problemet korrekt. Mange gyldige løsninger dumper testene på grund af importfejl.

Problembeskrivelse

Almindelig 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-testuddrag

Python

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

PR-testfejl (afkortet for læsbarhed)

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 testcases er sympy__sympy-18199(åbner i et nyt vindue). Denne opgave stammede fra en PR, der adresserede tre forskellige problemer med funktionen `nthroot_mod`, specifikt #17373(åbner i et nyt vindue), #17377(åbner i et nyt vindue) og #18212(åbner i et nyt vindue). Beskrivelsen af SWE-bench Verified-opgaven dækker dog kun det endelige issue #18212(åbner i et nyt vindue). Dette skaber en uoverensstemmelse: PR-testene dækker alle tre problemer, mens beskrivelsen kun beskriver ét. I vores kørsler implementerer modeller ofte korrekt den beskrevne rettelse og fejler derefter tests, der dækker implementeringen af de to andre problemer.

Oprindelig PR-beskrivelse (fra GitHub PR)

Almindelig tekst

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

Problembeskrivelse for #18212

Almindelig 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-opgave (kun taget fra #18212):

Almindelig 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 er verificeret, og lagrene (kodebaser og udgivelsesnoter) er begge open source og bredt anvendt og diskuteret, hvilket gør det vanskeligt for modeludviklere at undgå kontaminering.

Vi stødte først på tegn på kontaminering i vores egne modeller. For eksempel, da GPT‑5.2 løste 31 opgaver, som vi havde identificeret som næsten umulige at løse. I django__django-14725(åbner i et nyt vindue) kræver testene en specifik ny parameter `edit_only`, som ikke eksplicit kræves af problemformuleringen. Mens GPT‑5.2 løser problemet, viser det i sin tankegang, at det har oplysninger om release notes, der beskriver ændringer i kodebasen, og identificerer korrekt, at parameteren `edit_only` blev introduceret i Django 4.1.

GPT‑5.2 CoT

Almindelig 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 at vurdere, hvor alvorlig kontaminering er i et bredere perspektiv, oprettede vi en automatiseret red-teaming-opsætning. For hvert SWE-bench-verificeret spørgsmål bad vi GPT‑5 om at undersøge GPT‑5.2‑Chat, Claude Opus 4.5 og Gemini 3 Flash Preview for forurening. Disse modeller blev valgt for at udelukke ræsonneringsmodeller, men vi erkender, at der sandsynligvis er en ikke ubetydelig forskel i kapacitet mellem dem.

For at undersøge for forurening modtog GPT‑5: SWE-bench Verified-opgavens ID, beskrivelse, gold patch og PR-tests. Over 15 omgange lod vi GPT‑5 variere system-/udviklerprompten, brugerprompten og assistentens forudfyldning samt forskellige fremkaldelsesstrategier. Efter hver runde angav en dommermodel, hvor meget ny opgavespecifik information der var fremkommet, og hvert svar blev angivet med hensyn til forureningsgrad fra "ingen" til "stærk". GPT‑5 fik lov til at tilpasse sin strategi baseret på tidligere ture for iterativt at genskabe opgavespecifikke detaljer. For hvert eksempel på stærk kontaminering verificerede vi sammen med en anden dommer, at GPT‑5 ikke lækkede for mange oplysninger til målmodel. Til sidst gennemgik vi derefter manuelt de “stærke” eksempler, der udgør udskrifterne i dette indlæg.

Nedenfor er eksempler på kraftig kontaminering på tværs af forskellige modeludbydere.

GPT‑5.2 

Ud fra et kort uddrag af opgavens beskrivelse genererer GPT‑5.2 det nøjagtige guldstykke. Især kender den det nøjagtige klasse- og metodenavn samt den nye tidlige returneringsbetingelse `if username is None or password is None`, som introduceres.

Fremkaldelse af kontaminering

Problemformulering

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

Brugerforespørgsel

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"

Modelrespons

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 kan ikke kun huske den nøjagtige 4-linjers funktionelle ændring, som PR introducerede, sammen med det specifikke filnavn og den metode, den berørte, men citerer også ordret den indbyggede kommentar, der var en del af diff'en. 

Fremkaldelse af kontaminering

Brugerprompt

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.

Forudfyld

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

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 

Gemini 3 Flash kan, når den ikke får yderligere oplysninger om opgaven ud over ID'et, udskrive ordrette detaljer fra opgavens beskrivelse og gold patch'en. Dette inkluderer den nye regex-formel til validering af brugernavne og de nøjagtige linjenumre for ændringen.

Fremkaldelse af kontaminering

Problemformulering

1
UsernameValidator allows trailing newline in usernames

Brugerforespørgsel

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.

Forudfyld

1
Let me be precise about the wording.

Modelrespons

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.'

Diskussion

Ud fra denne revision af SWE-bench Verified kan vi drage to bredere konklusioner om evalueringsdesign. For det første indebærer benchmarks fra offentligt tilgængeligt materiale en risiko for forurening, hvor eksponering af træningsdata kan forhøje scoringerne uden at det bemærkes. Hvis offentligt indsamlede data anvendes i benchmarkkonstruktion, bør modeludviklere udføre yderligere tests for forurening. Benchmarks og endda deres løsninger, der offentliggøres, kan ende i træningsdata. Der bør udvises særlig forsigtighed med hensyn til, hvordan datasæt offentliggøres (dvs. adgangskodebeskyttet) og datafiltrering af træningsdata (dvs. nøje overholdelse af kanaristrenge). 

For det andet er det vanskeligt at få automatiseret scoring til at fungere korrekt. Perfekte testcases skal fuldt ud verificere korrekt funktionalitet, være uafhængige af specifikke, uvæsentlige implementeringsdetaljer og samtidig være robuste over for genvejsløsninger. Disse problemer er i sagens natur komplekse og vanskelige at løse. At opdage disse problemer krævede flere omfattende menneskelige mærkningskampagner. 

Vi har inkorporeret disse resultater i vores seneste evalueringsindsats. I de seneste måneder har vi valgt at rapportere resultater fra den offentlige opdeling af SWE-Bench Pro. Vi anbefaler, at andre modeludviklere gør det samme. SWE-bench Pro er ikke perfekt, men empirisk set synes det at lide mindre under kontamineringsproblemer. Vores kontamineringspipeline fandt nogle tilfælde af kontaminering, men disse tilfælde var betydeligt sjældnere og mindre alvorlige end SWE-bench Verified, og ingen model var i stand til at producere en komplet ordret gold patch.

Vi vil fortsætte med at investere i originale, privatudviklede benchmarks og bede om hjælp fra industrien og den akademiske verden til at gøre det samme. I GDPVal udarbejdes opgaverne privat af eksperter inden for området, hvilket reducerer eksponeringsrisikoen, og løsningerne bedømmes holistisk af uddannede korrekturlæsere. Denne tilgang er ressourcekrævende, men i stigende grad nødvendig for at måle reelle kapacitetsforbedringer.

Skrevet af

OpenAI