Gå direkt till huvudinnehåll
OpenAI

23 februari 2026

ForskningPublikation

Varför SWE-bench Verified inte längre mäter banbrytande kodningsfunktioner

SWE-bench Verified är alltmer kontaminerat. Vi rekommenderar SWE-bench Pro.

Laddar …

Sedan vi först publicerade SWE-bench Verifierad i augusti 2024 har branschen i stor utsträckning använt det för att mäta framsteg för modeller inom autonoma uppgifter i programvaruutveckling. Efter lanseringen gav SWE-bench Verifierad en stark signal om framsteg i kapacitet och blev ett standardmått som rapporteras i lanseringar av banbrytande modeller. Att hålla koll på och förutse utvecklingen av dessa funktioner är också en viktig del av OpenAI:s Preparedness Framework. När vi först skapade riktmärket Verified försökte vi lösa problem i den ursprungliga utvärderingen som gjorde vissa uppgifter omöjliga att genomföra i SWE-bench datamängder(öppnas i ett nytt fönster).

Efter inledande språng har den toppmoderna utvecklingen på SWE-bench Verifierad saktat in och förbättrats(öppnas i ett nytt fönster) från 74,9 % till 80,9 % under de senaste sex månaderna. Detta väcker frågan: återspeglar de återstående felen modellens begränsningar eller egenskaper hos datamängden i sig?

I en ny analys fann vi två stora problem med Verified-datamängden som tyder på att riktmärket inte längre är lämpligt för att mäta framsteg inom autonoma mjukvaruutvecklingsfunktioner för banbrytande lanseringar på dagens prestandanivåer:

  1. Tester underkänner korrekta lösningar: Vi granskade en delmängd på 27,6 % av datamängden som modeller ofta misslyckades med lösningar och fann att minst 59,4 % av de granskade problemen har bristfälliga testfall som underkänner funktionellt korrekta inlämningar, trots våra bästa ansträngningar att förbättra detta när vi skapade SWE-bench Verified i första början.
  2. Träning på lösningar: Eftersom stora banbrytande modeller kan lära sig från sin träning är det viktigt att de aldrig tränas på problem och lösningar som de utvärderas på. Detta är ungefär som att dela problem och lösningar för ett kommande prov med eleverna före provet – de kanske inte memorerar svaret, men elever som har sett svaren tidigare kommer definitivt att klara sig bättre än de som inte har det. SWE-bench-problem hämtas från förvar med öppen källkod som många leverantörer av modeller använder för träningsändamål. I vår analys fann vi att alla banbrytande modeller vi testade kunde reproducera den ursprungliga, människoskrivna buggfixen som användes som grundsanningsreferens, en så kallad ”gold patch”, eller ordagranna detaljer i problembeskrivningen för vissa uppgifter, vilket indikerar att samtliga har sett åtminstone några av problemen och lösningarna under träningen.

Vi hittade också belägg för att modeller som har sett problemen under träningen har större sannolikhet att lyckas, eftersom de har ytterligare information som behövs för att klara de underspecificerade testerna.

Detta innebär att förbättringar på SWE-bench Verified inte längre återspeglar meningsfulla förbättringar i modellers verkliga förmåga till programvaruutveckling. I stället återspeglar de i allt högre grad hur mycket modellen exponerades för riktmärket under träningen. Det är därför vi har slutat rapportera SWE-bench Verified-resultat, och vi rekommenderar att andra modellutvecklare gör detsamma.

Vi bygger nya, inte kontaminerade utvärderingar för att bättre kunna följa kodningsförmågor, och vi anser att detta är ett viktigt område att fokusera på för det bredare forskarsamhället. Tills vi har dem på plats rekommenderar OpenAI att rapportera resultat för SWE-bench Pro.

Bakgrund

Den ursprungliga SWE-bench(öppnas i ett nytt fönster)-utvärderingen släpptes 2023. Varje problem hämtas från ett löst GitHub-problem i ett av 12 förvar med öppen källkod och paras ihop med motsvarande pull request (PR). För att avgöra om en modellgenererad kodändring är korrekt testas varje problem med två testuppsättningar:

  • Tester som misslyckas på den omodifierade kodbasen, men genomförs om problemet åtgärdas korrekt
  • Regressionstester som godkänns både före och efter korrigeringen för att säkerställa att orelaterad funktionalitet förblir densamma.

Modellen ser inte testerna. Den måste producera en kodändring med endast den ursprungliga problemtexten och tillståndet för förvaret före åtgärden. Den godkänns bara om alla tester godkänns efter att kodändringen har tillämpats.

Vi hittade många problem med den utvärderingen som skulle kunna leda till en underrapportering av modellernas kapacitet.

  • Vissa enhetstester var alltför specifika eller feljusterade i förhållande till uppgiften så att korrekta åtgärder kunde nekas.
  • Många uppgiftsbeskrivningar var underspecificerade, vilket kunde leda till flera giltiga tolkningar – medan testerna bara täckte en specifik.
  • Beroende på hur miljön är konfigurerad (till exempel Linux kontra Windows, eller Python-versionen) kan vissa tester misslyckas felaktigt

Vi skapade SWE-bench Verified 2024 för att åtgärda dessa problem. Vi arbetade med erfarna mjukvaruingenjörer för att granska 1 699 SWE-bench-problem och filtrera bort problem som hade dessa fel. Varje problem granskades på ett oberoende sätt av tre experter. Den här granskningsprocessen resulterade i SWE-bench Verifierad, en utvald mängd med 500 problem.

För smala och för breda tester

Även om SWE-bench Verifierad är en stor förbättring jämfört med den ursprungliga versionen kvarstår vissa problem. Vi genomförde en granskning av 138 SWE-bench Verified-problem som OpenAI o3 inte löste konsekvent över 64 oberoende körningar. Varje fall granskades oberoende av minst sex erfarna programvaruutvecklare. Om en expert flaggade ett problem verifierades det på nytt av ett ytterligare team.

Vi fann att 59,4 % av de 138 problemen innehöll väsentliga brister i testdesignen och/eller problembeskrivningen, vilket gjorde dem extremt svåra eller omöjliga att lösa även för den mest kapabla modellen eller människan. 

  • 35,5 % av de granskade uppgifterna har strikta testfall som upprätthåller specifika implementeringsdetaljer, vilket ogiltigförklarar många funktionellt korrekta inlämningar, vilket vi kallar snäva testfall.
  • 18,8 % av de granskade uppgifterna har tester som kontrollerar ytterligare funktionalitet som inte angavs i problembeskrivningen, vilket vi kallar breda testfall.
  • De återstående 5,1 % av uppgifterna hade diverse problem som inte var väl grupperade med denna taxonomi.

Ett illustrativt exempel på det första felläget är pylint-dev__pylint-4551(öppnas i ett nytt fönster), där PR:en introducerar en ny funktion `get_annotation` som en del av den övergripande lösningen. Det här funktionsnamnet nämns inte i problembeskrivningen, men importeras direkt av testerna. Även om vissa modeller kan intuitivt skapa en sådan funktion är det inte strikt nödvändigt att implementera en funktion med just det här namnet för att korrekt lösa problemet. Många giltiga lösningar misslyckas på grund av importfel i testerna.

Problembeskrivning

Ren text

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-testfel (förkortade för läsbarhet)

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)

Ett exempel på alltför breda testfall är sympy__sympy-18199(öppnas i ett nytt fönster). Den här uppgiften hämtades från en PR som åtgärdade tre separata problem med funktionen `nthroot_mod`, närmare bestämt #17373(öppnas i ett nytt fönster), #17377(öppnas i ett nytt fönster) och #18212(öppnas i ett nytt fönster). Beskrivningen för SWE-bench Verifierad-uppgiften omfattar dock endast det slutliga problemet #18212(öppnas i ett nytt fönster). Detta skapar en diskrepans: PR-testerna omfattar alla tre problemen, medan beskrivningen bara beskriver ett. I våra körningar implementerar modeller ofta korrekt den beskrivna lösningen och misslyckas sedan med tester som omfattar implementeringen för de andra två problemen.

Ursprunglig PR-beskrivning (från GitHub-PR:n)

Ren text

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

Problembeskrivning för #18212

Ren text

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.

Problembeskrivning för SWE-bench Verified-uppgift (endast hämtad från #18212):

Ren text

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 och förvar (kodbaser och versionsanteckningar) är båda öppen källkod och används och diskuteras i stor utsträckning, vilket gör det svårt för modellutvecklare att undvika kontaminering.

Vi stötte först på tecken på kontaminering i våra egna modeller. Till exempel när GPT‑5.2 löste 31 uppgifter som vi identifierade som nästan omöjliga att lösa. I django__django-14725(öppnas i ett nytt fönster) kräver testerna en specifik ny parameter `edit_only` som inte uttryckligen krävs av problemformuleringen. När GPT‑5.2 löser problemet visar den i sin tankekedja att den har information om versionsanteckningarna som beskriver ändringar i kodbasen och identifierar korrekt att parametern `edit_only` introducerades i Django 4.1.

GPT‑5.2 CoT

Ren text

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.

För att bedöma hur betydande kontamineringen är i ett bredare perspektiv skapade vi en automatiserad read teaming-konfiguration. För varje fråga i SWE-bench Verifierad gav vi GPT‑5 i uppdrag att undersöka en GPT‑5.2‑Chat, Claude Opus 4.5 och Gemini 3 Flash Preview för kontaminering. Dessa modeller valdes för att utesluta resonemangsmodeller, men vi medger att det sannolikt finns ett icke obetydligt kapacitetsgap mellan dem.

För att undersöka kontaminering fick GPT‑5 SWE-bench Verifierad-uppgiftens ID, beskrivning, gold patch och PR-tester. Under drygt 15 omgångar lät vi GPT‑5 variera system-/utvecklarprompten, användarprompten och assistentens förifyllnad samt olika eliciteringsstrategier. Efter varje omgång angav en domarmodell hur mycket ny, uppgiftsspecifik information som förekom och varje svar märktes med kontamineringsgrad från ”ingen” till ”stark”. GPT‑5 fick anpassa sin strategi baserat på tidigare omgångar för att iterativt återhämta uppgiftsspecifika detaljer. För varje exempel på stark kontaminering verifierade vi med en annan domare att GPT‑5 inte läckte för mycket information till målmodellen. Slutligen granskade vi manuellt de ”starka” exemplen som utgör transkriptionerna i det här inlägget.

Nedan följer exempel på stark förorening hos olika modelleverantörer.

GPT‑5.2 

Med ett kort utdrag från uppgiftsbeskrivningen genererar GPT‑5.2 en exakt gold patch. Tänk på att den känner till det exakta klass- och metodnamnet samt det nya tidiga returvillkoret `if username is None or password is None` som introducerats.

Framkallande av kontaminering

Problemformulering

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

Användarprompt

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 kan inte bara återge den exakta funktionella ändringen på 4 rader som PR:en introducerade, tillsammans med det specifika filnamnet och den metod som den berörde, utan citerar också ordagrant inline-kommentaren som var en del av diffen. 

Framkallande av kontaminering

Användarprompt

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.

Ifyllning

1
Let me be precise about the location and wording.

Assistentsvar

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 inte får någon ytterligare information om uppgiften utöver ID:t, återge ordagrant detaljer från uppgiftsbeskrivningen och goldpatchen. Detta inkluderar den nya regex-formeln för validering av användarnamn och de exakta radnumren för ändringen.

Framkallande av kontaminering

Problemformulering

1
UsernameValidator allows trailing newline in usernames

Användarprompt

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.

Ifyllning

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

Diskussion

Utifrån denna granskning av SWE-bench Verified ser vi två bredare lärdomar för utformningen av utvärderingar. För det första innebär benchmarktester som hämtats från offentligt tillgängligt material en risk för kontaminering, där exponering för träningsdata i tysthet kan förbättra poängen. Om offentligt genomsökta data används vid konstruktion av riktmärken bör modellutvecklare utföra ytterligare tester för kontaminering. Riktmärken, och till och med deras lösningar, som publiceras offentligt kan hamna i träningsdata. Extra försiktighet bör iakttas både när det gäller hur datamängder publiceras (dvs. lösenordsskydd) och filtrering av träningsdata (dvs. strikt efterlevnad av varningssträngar). 

För det andra är automatiserad poängsättning knepig att få till. Perfekta testfall bör fullt ut verifiera korrekt funktionalitet, vara både oberoende av specifika oviktiga implementeringsdetaljer och även robusta mot genvägslösningar. Dessa problem är i sig komplexa och svåra att lösa. Att upptäcka dessa problem krävde flera omfattande kampanjer för mänsklig märkning. 

Vi har införlivat dessa resultat i våra senaste utvärderingsinsatser. Under de senaste månaderna har vi valt att rapportera resultat från den offentliga splitten av SWE-Bench Pro. Vi rekommenderar att andra modellutvecklare gör detsamma. SWE-bench Pro är inte perfekt, men verkar empiriskt sett drabbas mindre av kontamineringsproblem. Vår kontamineringspipeline hittade några fall av kontaminering, men dessa fall var betydligt mer sällsynta och mindre allvarliga än SWE-bench Verified, och ingen modell kunde producera en komplett ordagrann goldpatch.

Vi kommer att fortsätta investera i originella, privatförfattade riktmärken och be om hjälp från industrin och den akademiska världen att göra detsamma. I GDPVal skapas uppgifter privat av domänexperter, vilket minskar exponeringsrisken, och lösningar bedöms holistiskt av utbildade granskare. Den här metoden är resurskrävande, men blir allt mer nödvändig för att mäta verkliga förbättringar av förmågor.

Författare

OpenAI