O benchmark da memória confiável determinístico · pré-registrado · self-run

O problema da métrica

Recall@k não distingue uma resposta errada e confiante de um honesto «não sei».

Uma pontuação simétrica premia a memória que responde a tudo — inclusive às perguntas que seu store não pode sustentar. VeriBench pontua a memória como um deployment paga por ela: NET(λ) = (corretas − λ·erradas) / n, onde λ é o custo declarado de uma resposta errada em relação a um silêncio. Jurídico e médico rodam com λ alto; brainstorming com λ baixo. Um número só, varrido em λ ∈ {1, 2, 5, 10} — fixado antes de qualquer execução.

Sem juiz LLM, sem rede, sem teatro de ranking — um comando, JSONs brutos commitados no repo.

Abstidohonesto
Sonda sem resposta
«Qual é o código de acesso do cofre Meridian?»
o store não pode sustentar uma resposta — uma memória sem floor devolve mesmo assim o vizinho mais próximo.
O VeriBench cobra essa resposta −λ; a abstenção custa 0.
§01Por que um benchmark novo

Benchmarks de memória medem quanto volta. Nenhum precifica o que volta errado.

Na metade respondível de um corpus, uma memória com gate e um vector store cru recuperam quase idêntico — recall@k não vê diferença. A diferença aparece nas perguntas que o store não pode responder: uma memória sem floor de abstenção devolve mesmo assim seu vizinho mais próximo, com plena confiança. Em produção isso é uma resposta fabricada; num benchmark simétrico é invisível.

NET(λ) a torna visível por construção: uma resposta correta ganha +1, uma errada custa λ, o silêncio não custa nada. A acurácia de equilíbrio é λ/(1+λ) — o mesmo limiar em que o botão SLA do Verimem ajusta o store. O benchmark mede o store exatamente no número com que o operador o ajusta.

§02Protocolo — fixado antes dos números

01Pré-registrado

Hipótese, métrica, varredura de λ e condições de refutação ficam commitadas em PREREGISTRATION.md antes de qualquer execução. O scoring e o mapeamento de resultados foram escritos e testados primeiro — um resultado favorável não pode ser fabricado escolhendo a métrica depois.

02Corpora externos

Datasets reais que não escrevemos: HaluEval QA e SQuAD v2 (partições respondíveis + sem-resposta, disjuntas). A correção é retrieval id-decidível — nenhum juiz LLM em todo o loop.

03Controles que devem falhar

Um store embaralhado deve afundar no negativo (afunda: NET(1) = −0.94) e o mesmo retrieval com o floor desligado deve fabricar nas sem-resposta (fabrica: 100 respostas erradas). Se um controle passa, o benchmark está quebrado — esse é o sentido de tê-lo.

04Mesmo terreno

Os head-to-head usam o embedder idêntico (multilingual-e5-base) nos dois engines, offline, mem0 em modo raw-store (seu LLM nunca é chamado — esse eixo está fora do escopo por declaração, não por omissão).

§03Resultados — HaluEval QA, 300 sondas (200 respondíveis + 100 sem resposta)
SistemacoverageNET(1)NET(2)NET(5)NET(10)negativo a partir de λ
Verimem · floor τ=0.8 (default de produto) 1824114 0.62 +0.593 +0.580 +0.540 +0.473 45.5
mem0 2.0.11 · como distribuído (sem floor) 2001000 1.00 +0.333 0.000 −1.000 −2.667 2.0
mem0 + floor aparafusado 0.75 (ajustado na eval) 1660134 0.55 +0.553 +0.553 +0.553 +0.553 nunca
Mesmo store, floor OFF (controle τ=0) 1921008 0.97 +0.307 −0.027 −1.027 −2.693 1.9
Controle embaralhado (sanidade: deve falhar) 52878 0.97 −0.940 −1.897 −4.767 −9.550 0.02

Leia honestamente, nos dois sentidos: como distribuído, o mem0 fica negativo além de λ=2 — 100 respostas fabricadas na metade sem-resposta; o default de produto do Verimem segue positivo até λ≈45. Mas um floor pode ser aparafusado em qualquer engine: com um limiar ajustado nesta eval, o mem0 alcança +0.553 plano — que vence nosso default em λ≥5 neste corpus. As diferenças que ficam: o engine não entrega floor nenhum, o limiar aparafusado foi escolhido no test set, e a linha plana significa que ele não responde nada de que não tenha certeza — coverage 0.55 contra nosso 0.62, com 182 contra 166 corretas em λ=1.

§03bSQuAD v2 — o corpus mais duro, dito às claras
SistemacoverageNET(1)NET(2)NET(5)NET(10)negativo a partir de λ
Verimem · floor τ=0.8 (default de produto) 1634988 0.71 +0.380 +0.217 −0.273 −1.090 3.3
Verimem · melhor floor 0.85 (ajustado na eval) 987195 0.35 +0.303 +0.280 +0.210 +0.093 14.0
mem0 2.0.11 · como distribuído (sem floor) 2001000 1.00 +0.333 0.000 −1.000 −2.667 2.0
mem0 + floor aparafusado 0.80 (ajustado na eval) 440256 0.15 +0.147 +0.147 +0.147 +0.147 nunca

As passagens distratoras do SQuAD comprimem a banda de pontuação, e dá para ver: no default de produto o crossover cai para λ≈3.3, e manter NET positivo em λ=10 custa coverage 0.35. Abstenção é um botão, não mágica — o corpus decide quanto custa a honestidade. O erro seria esconder esta tabela.

§04Além do retrieval — os eixos que recall@k não pode expressar

AEixo de corpus real

As tabelas acima: dados externos, respondíveis + sem-resposta, floor ligado vs desligado vs concorrente, controle embaralhado. O eixo onde a fabricação vira um evento precificado.

BEixo causal

Um store que corroborou fielmente uma correlação espúria responde a perguntas do(X) com confiança errada — e fica negativo até em λ=1. Proveniência não é causalidade; um benchmark que não as distingue premiará a confusão.

CEixo adversarial

Conluio (N identidades, um só feed) mais um sleeper confiável. Só uma política de confiança de dois canais — corroboração independente e feedback de resultado — permanece positiva; cada canal isolado cai exatamente diante de um dos dois ataques. O eixo por trás do source-trust de dois canais do Verimem.

§05Execute — um comando, arquivos brutos commitados

todos os eixos, determinístico, zero API keys

git clone https://github.com/aureliocpr-ctrl/verimem && cd verimem
pip install -e .
python -m benchmark.veribench.run_all   # every axis, one reproducible entrypoint

Spec, pré-registro e cada JSON bruto de resultado vivem no repo sob benchmark/veribench/ e benchmark/results/. Concorrentes são convidados — o adapter do mem0 está in-tree como exemplo funcional; mande PR do adapter oficial do seu engine e o executamos no mesmo terreno.