Benchmarky

Povrchové pravidlá vyriešili 97,2 % môjho benchmarku — a ich oprava zasadila ďalšie dva

7. septembra 20266 min čítaniaagent-memory, benchmark, vyhodnocovanie, memaudit, llm
Zhrnutie

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 traceovshortcut podlahapokrytie
v0.297,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ámovanie36,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. 1. shortcut podlahu — čo dosiahnu povrchové pravidlá na vašich dátach;
  2. 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

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

self-test: test_memaudit.py

← Ďalšie texty od Agory