Povrchové pravidlá vyriešili 97,2 % môjho benchmarku — a ich oprava zasadila ďalšie dva
Benchmark odolný voči kontaminácii, ktorý auditoval samého seba: povrchové pravidlá vyriešili 97,2 % jeho traceov. Oprava úniku zasadila dva ďalšie skraty — kompletná auditná stopa, control s permutovanými štítkami a nástroj na jeden príkaz pre vaše vlastné eval dáta.
Povrchové pravidlá — žiadna sémantika, žiadna pamäť, žiadny model — vyriešili 97,2 % traceov môjho nového benchmarku pri 96,0% pokrytí. To číslo som publikoval v README benchmarku, vedľa výsledkov, ktoré mohol kazit. Najostrejší únik už predtým našiel externý recenzent — vsunutý záznam vždy predchádzal záznamu, ktorý nahradzal, 300 z 300 traceov. Potom som úniky opravil — a ich oprava zasadila ďalšie dva.
Tento príspevok je auditná stopa, v poradí, v akom sa to stalo.
Benchmark a nástroj
RAMR je benchmark odolný voči kontaminácii pre pamäť podloženú vyhľadávaním: entity sú náhodné tokeny, takže si model odpovede nemôže zapamätať a closed-book presnosť je ~0 konštrukciou (repo, DOI).
memaudit.py kladie otázku, ktorú by si mal položiť každý tvorca benchmarkov skôr než ju položí niekto iný: koľko z toho dá vyriešiť bez pochopenia? Spustí batériu partial-input baseline pravidiel — pozícia, veľkosť písmen, dĺžka, opakovanie tokenov, prekryv dotazu, strayed polia, tvar id — nad vašimi označenými dátami.
Podlaha, nikdy rozsudok, ako to povedali Feng, Wallace & Boyd-Graber na ACL 2019: „zlyhania partial-input baselines neznamenajú, že dataset je bez artefaktov." Prechádzajúca sonda nič nedokazuje. Je to spodná hranica: tieto pravidlá, nie všetky možné pravidlá.
Control je ten bod. Spustíte dosť povrchových pravidiel na akékoľvek označené dáta a niečo sa oddelí — to je stroj na vyrábanie alarmujúcich čísel o práci iných ľudí. Takže každá sonda sa skóruje aj proti permutovaným štítkom a to je jej zmeraná náhodná úroveň. REAL rozhoduje lift nad nulou, nikdy pokrytie. CI assertuje oba smery: 0 z 8 sond sa spustí na čistých syntetických dátach; vsunutá pozíciová cue číta 100,0 % proti 0,0% nule.
Únik v číslach
| verzia traceov | shortcut podlaha | pokrytie |
|---|---|---|
| v0.2 | 97,2 % | 96,0 % |
| v0.3 (štrukturálny re-cut) | 96,8 % | 52,7 % |
| v0.5 (konektivita vyvážená konštrukciou) | 40,0 % | 1,7 % |
| LoCoMo, pre naše rámovanie | 36,3 % | 44,3 % |
Dve vlastné generácie traceov boli horšie ako LoCoMo na osi, ktorú testujeme. (Nuly sú na sondu: permuted-label úroveň echo skratu je 1,7 %, id-cue sondy do 1,0 % — obe podlahy sú lift nad svojou nulou.) Publikovali sme to sami, prví, v README a ERRATA benchmarku — lebo alternatívou je, že to o nás publikuje niekto iný.
Opravovanie zasadilo ďalšie
Toto je časť, ktorú som nečakal, a je dôvod tohto príspevku.
Re-cut otočil cue. Re-cut, ktorý „opravil" dĺžkovú cue, ju len otočil — 73 % sa stalo 83 % na druhú stranu, čo jednosmerné skórovanie číta ako na náhode. Sonda musela skórovať znamienko, nielen prítomnosť.
Vyváženie echo cue vložilo id únik. Aby som zabil echo skrat, vyvážil som generovanie záznamov — a vyvažovanie vložilo záznam, ktorého výrazné id nechalo spustiť pravidlo na tvar id. Zmerané prebudovaním korpusu 100-krát pod starou schémou: pravidlo tvaru id sa spustí na 136–148 z 300 traceov a je správne na 95,2 % až 100,0 % týchto spustení, proti permuted-label nule do 1,0 %. Obálka sa rozširuje s počtom behov — 5 behov dalo 138–143, 20 dalo 139–146, 100 dalo 136–148 — preto sonda odmieta vytlačiť bodový odhad.
A číslo, ktoré som citoval bez receiptu, nedáva reproduce. Tri publikované súbory tvrdili, že čítanie len formátu id „vyriešilo 205 z 300 traceov". Žiadny receipt a korpus, ktorý to vyprodukoval, je preč. Zmerané 2026-09-04, 100 prebudovaní: efekt je reálny (id cue pristane vždy; nula ≤ 1,0 %), ale magnitúda je 136–148 — nikdy 205. Správne verejné tvrdenie je „205 nedáva reproduce", nie „originál bol zlý": bola to rekonštrukcia, nie originálny beh.
A tretí skrat prežíva dodnes. Generátor stavia stale hodnoty požičaním posledného tokenu z distractor poľa, takže stale hodnota sa s ničím nepája, kým aktuálna hodnota sa zvyčajne ozvení inde v trace. Dve reťazcové pravidlá — „ktorákoľvek hodnota, čo sa ozýva inde, je aktuálna", potom veľkosť písmen ako tie-break — dosiahnu 98,9 % pri 87,7% pokrytí. Kým generátor nekreslí stale hodnotu rovnako prepojenú ako aktuálnu, táto baseline je strop toho, čo fixture môže licencovať ako dôkaz. V produkcii môže korelácia bežať aj opačne: stale hodnoty sa ozývajú v cached summary a kopírovaných poznámkach, kým oprava príde raz. Detektor trénovaný na tejto fixture sa môže učiť pravidlo, ktoré je v teréne pozadu. Nemeriali sme to; preto re-cut záleží.
Bežný pás
Tu je skutočná lekcia. Čakal som: nájdi úniky, oprav ich, hotovo. Čo sa stalo: každá oprava zmenila distribúciu, každá zmena preusporiadala, čo povrchové pravidlá videli, a auditor chytil niečo nové dvakrát, kým sme ho používali. „Opravené" je tvrdenie, ktoré môžete urobiť len proti aktuálnej batérii. Benchmark, ktorý audituje samého seba, je bežiaci pás, nie checkbox — a bežiaci pás je vlastnosť. Deň, keď ho prestanete púšťať, je deň, keď skrat oplatí ticho vedľa vášho „opravené". Alternatívou k publikovaniu podlahy samému je cudzinec, ktorý ju publikuje za vás — bez ERRATA papierovej stopy. (Errata súbor mám, lebo som únik poslal prvý; screenshot toho istého čísla od kritika dopadne inak.)
Práca pre vaše dáta
Ak posielate benchmark, eval set alebo retrieval tracey, audit beží na vašich dátach jedným príkazom:
python memaudit.py --adapter demo # funguje bez vašich dát
python memaudit.py --adapter ramr --blind ramr_traces_v0.5_blind.jsonl --labels ramr_traces_v0.5_labels.jsonl
Dve veci hlásiť pri každom skóre, inak číslo znamená málo:
- 1. shortcut podlahu — čo dosiahnu povrchové pravidlá na vašich dátach;
- 2. permuted-label nulu — čo tie isté pravidlá dosiahnu, keď sa štítky zamiešajú.
Sonda, ktorá sa spustí bez liftu nad svojou nulou, vyrába alarmujúce číslo. Hláste obe, alebo ani jedno. Repo dodáva adaptery a assertuje oba smery v CI; prinesiete vlastný adapter, ak sa váš formát líši.
Úprimné limity
- Podlaha je spodná hranica — tieto pravidlá, nie všetky možné pravidlá.
- LoCoMo riadok je podlaha pre naše rámovanie (každý dialógový ťah ako kandidát, otázky s jedným dôkazom), nie rozsudok o ich benchmarku. LoCoMo je čistý na dvoch osiach, kde náš zlyhal: žiadna pozíciová artefakt, žiadne stray label pole.
- Syntetický rozsah: náhodné tokenové entity izolujú mechanizmy; nemeria vyhľadávanie v reálnych korpusech.
- Id-cue čísla sú pozorovaná obálka nad 100 prebudovaniami, nie vlastnosť korpusu.
- Stále otvorené: trace id nie sú content-addressed, takže žiadny shipped artifact nedá regenerovať byte-for-byte. To je tá skutočná oprava a nie je hotová (ERRATA, defekt 1).
FAQ
Je 97,2 % tvrdenie, že RAMR v0.2 bol nepoužiteľný? Je to tvrdenie, že tracey v0.2 sa dali zväčša vyriešiť bez ich čítania, čo robilo akékoľvek skóre schopností na nich neinterpretovateľné. Stiahli sme tracey, publikovali diff a prerezali generátor.
Prečo publikovať únik namiesto tichej opravy? Tichá in-place úprava bola už skúsaná a bola to zlé rozhodnutie — ERRATA existuje, pretože revidovaný verejný dataset dostáva publikovaný diff. A self-audit buduje dôveru len vtedy, keď zlé číslo ide von s tými dobrými.
Znamená nízka podlaha, že benchmark je dobrý? Nie. Prechádzajúca sonda nič nedokazuje; je to spodná hranica. Znamená to, že špecifické povrchové pravidlá v batérii nenašli nič — nutná, nie dostatočná podmienka.
Môžem to pustiť na vlastnom benchmarku? Áno — python memaudit.py --adapter demo beží bez dát; adaptery berú cestu k vašim blind a label súborom. Hláste podlahu a nulu vedľa každého skóre.
Súbory a receipts
- Auditor:
memaudit.py·
self-test: test_memaudit.py
- Errata (každý defekt, hashé pomenované):
ERRATA.md - Number ledger:
VERIFIED_NUMBERS.md - DOI: 10.5281/zenodo.20818291