Pamäť agentov

Udrží pamäť agenta opravený fakt? Zmerali sme to

July 9, 20265 min readpamäť agentov, RAG, supersession, benchmark, mem0
Zhrnutie

Zopakuj hodnotu, ktorú agent opravil, a mnohé pamäťové systémy ju vrátia. Zmerali sme toto echo zlyhanie naprieč backendmi (mem0, keyed store, superseded-value guard), s opravou aj otvorenou frontiérou.

Zopakuj fakt, ktorý agent už opravil, a mnohé pamäťové systémy potichu vrátia starú hodnotu — zmerali sme to naprieč backendmi. Tu je prečo, a jednoriadkový test, ktorý to chytí.

Embedding similarita je povestne zlá v jednej konkrétnej veci: rozlíšiť kontradikciu od duplikátu. Existuje na to číslo — cosine ich oddelí zhruba na AUROC 0.59, len tesne nad mincovým hodom, a kontradikovaná hodnota býva podobnejšia originálu než skutočná parafráza. (Yadav, Temporal Validity in Retrieval Memory, arXiv:2606.26511.)

Znie to akademicky, kým nenarazíš na zlyhanie, ktoré to spôsobí v pamäti agenta.

Zlyhanie

Povieš agentovi "región je Frankfurt." Neskôr opravíš: "vlastne je to Ohio." Dobrá pamäť teraz odpovie Ohio. V poriadku.

Potom sa stará hodnota povie znova. Ani nie zlomyseľne — používateľ zopakuje preferenciu, o ktorej zabudol, že ju zmenil, alebo zapadnutý riadok v dlhom prepise: "región je Frankfurt." Zostane opravený fakt opravený, alebo Frankfurt vstane z mŕtvych?

Nazývame to echo: zopakovanie hodnoty, ktorá už bola opravená preč. V každom store, ktorého supersession je last-writer-wins podľa recency, je echo najnovšie tvrdenie starej hodnoty, takže vyhrá. A keďže similarita ho neoznačí — echo je takmer identické s originálom, ktorý oživuje — ani similarity-based store nemá signál, ako ho chytiť.

Meranie

Postavili sme malú syntetickú sondu: assertni fakt, oprav ho, zopakuj starú hodnotu inými slovami, a skóruj na answer-level — vyvolaj top-k pamätí, podaj ich LLM, spýtaj sa "aká je aktuálna hodnota?" Ten protokol je férový voči add-based storom, ktoré držia obe hodnoty a riešia konflikt pri čítaní, nielen voči tým, čo prepisujú. n=30; demonštrácia, nie definitívny benchmark.

Echo-resistance = podiel, kde je odpoveď stále opravená hodnota. 1.0 je dobre.

Backendforget-precisionecho-resistance
naivný keyed store (bez guardu)1.000.00
mem0 2.0.11 (natívny OpenAI config)0.870.53 (95% CI 0.37-0.70)
superseded-value guard1.001.00

Každý backend udrží samotnú opravu, keď sa číta pozorne. Ale pod preformulovaným echom:

Oprava je stará a nudná

Guard nie je dômyselný. Je to v podstate AGM belief revision (Alchourrón-Gärdenfors-Makinson, 1985) a bitemporálne databázy (Snodgrass, ~1993) znova aplikované: keď je hodnota opravená preč, holé zopakovanie ju nesmie oživiť. Kľúčuj na hodnotu, nie na similaritu — re-assert už-superseded hodnoty je restatement-of-superseded a nevyhrá. Skutočná zmena názoru ("vlastne prepni späť") je povolená, ale len cez explicitný reaffirm signál, nikdy nie tichým echom.

Shipli sme to ako opt-in guard v našej malej pamäťovej knižnici. Zaujímavé nie je, že to funguje — je to textbook — ale že adversariálne echo bolo nezmerané: benchmarky ako STALE a LongMemEval bežia jednu opravu, nikdy re-injekciu starej hodnoty. (Súvisiace: slepá škvrna supersession v RAG, a naša práca o obrane proti memory-poisoningu a provenance, nie pravde.)

Časť, ktorú nikto nerieši

Náš guard má tvrdú hranicu. Kľúčuje na hodnotový token, takže chytí len echá, ktoré starú hodnotu pomenujú. Skutočne otvorený prípad je value-obscuring reštatement — "vráťme sa k tomu, čo sme mali predtým", "vráť tú poslednú zmenu" — kde sa stará hodnota nikdy nevysloví. Na fixtúre takýchto sú obe naše metódy slepé: value-match F1 0.03, cosine na úrovni náhody. Rozlišujúci signál nie je v obsahu vôbec; je to discourse relácia — otvára toto tvrdenie usadené rozhodnutie? To je štrukturálny problém, a práve tam si myslíme, že štrukturálny (nie similarity) prístup by konečne mohol nájsť svoje miesto.

Zhrnutie

Hlavne publikujeme ten test, nie skóre: prežije tvoja oprava zopakovanie starej hodnoty? Je to lacné otestovať, zlyhanie je tiché, a takmer žiaden pamäťový eval to nebeží. Harness sa dá pustiť proti hocijakému storu cez malý adaptér: github.com/DanceNitra/ramr.

Poctivé limity, rovno: malé syntetické n=30, jeden judge model, len answer-level, value-preserving echá; mem0 číslo je bod na širokom intervale, nie verdikt. Ber to ako demonštráciu reálneho failure mode — a dôvod pridať jeden lacný regresný test do svojej pamäťovej vrstvy.

FAQ

Otázka: Hovorí to, že mem0 je pokazený? Nie. mem0 add-based dizajn drží obe hodnoty a rieši konflikt pri čítaní, čo je rozumná voľba. Echo zlyhanie je dôsledok toho kompromisu, zmerané v jeho vlastnom odporúčanom configu, reportované s intervalom spoľahlivosti — nie tvrdenie o bugu.

Otázka: Prečo tu embedding similarita zlyháva? Lebo kontradikcia a duplikát vyzerajú pre cosine takmer identicky (AUROC ~0.59). Zopakovaná stará hodnota je takmer identická s originálom, ktorý oživuje, takže prah similarity nevie oddeliť "staré echo" od "ten istý fakt znova."

Otázka: Aká je oprava? Deterministická supersession kľúčovaná na hodnotu: keď je hodnota opravená preč, jej zopakovanie ju nemôže oživiť bez explicitného reaffirm. Je to AGM belief revision / bitemporálna validita, nie nová myšlienka — ale adversariálny reštatement, proti ktorému bráni, bol nezmeraný.

Otázka: Čo stále zlyháva? Value-obscuring reštatementy ("vráťme sa k tomu, čo sme mali"), ktoré starú hodnotu nikdy nepomenujú. Tam zlyháva aj value-match aj cosine; signál je discourse relácia, ktorá potrebuje štrukturálnu metódu.

← Ďalšie texty od Agory