Бенчмарк доверенной памяти детерминированный · пре-зарегистрированный · self-run

Проблема метрики

Recall@k не отличает уверенно-неверный ответ от честного «не знаю».

Симметричная метрика вознаграждает память, отвечающую на всё — включая вопросы, которые её store поддержать не может. VeriBench оценивает память так, как за неё платит деплой: NET(λ) = (верные − λ·неверные) / n, где λ — объявленная цена неверного ответа относительно молчания. Юридика и медицина работают на высоком λ; брейншторм — на низком. Одно число, свип по λ ∈ {1, 2, 5, 10} — зафиксировано до любого запуска.

Без LLM-судьи, без сети, без театра лидербордов — одна команда, сырые JSON закоммичены в репо.

Воздержалсячестно
Проба без ответа
«Какой код доступа у хранилища Meridian?»
store не может поддержать ответ — память без порога всё равно вернёт ближайшего соседа.
VeriBench спишет за такой ответ −λ; воздержание стоит 0.
§01Зачем новый бенчмарк

Бенчмарки памяти меряют, сколько вернулось. Ни один не назначает цену тому, что вернулось неверным.

На отвечаемой половине корпуса память с гейтом и сырой vector store извлекают почти одинаково — recall@k разницы не видит. Разница проявляется на вопросах, на которые store не может ответить: память без порога воздержания всё равно возвращает ближайшего соседа, с полной уверенностью. В продакшене это сфабрикованный ответ; в симметричном бенчмарке он невидим.

NET(λ) делает его видимым по построению: верный ответ даёт +1, неверный стоит λ, молчание не стоит ничего. Точка безубыточности — λ/(1+λ), тот же порог, на который ручка SLA Verimem настраивает store. Бенчмарк меряет store ровно на том числе, которым оператор его настраивает.

§02Протокол — зафиксирован до чисел

01Пре-регистрация

Гипотеза, метрика, свип λ и условия опровержения закоммичены в PREREGISTRATION.md до любого запуска. Скоринг и маппинг исходов были написаны и покрыты юнит-тестами заранее — благоприятный результат нельзя сфабриковать, выбрав метрику задним числом.

02Внешние корпуса

Реальные датасеты, которые писали не мы: HaluEval QA и SQuAD v2 (отвечаемые + безответные сплиты, непересекающиеся). Корректность — id-решаемый retrieval, ни одного LLM-судьи во всём цикле.

03Контроли, обязанные падать

Перемешанный store обязан уйти глубоко в минус (уходит: NET(1) = −0.94), а то же извлечение с выключенным порогом обязано фабриковать на безответных (фабрикует: 100 неверных ответов). Если контроль проходит — бенчмарк сломан; ради этого он и существует.

04Равные условия

Head-to-head идёт на идентичном эмбеддере (multilingual-e5-base) для обоих движков, офлайн, mem0 в режиме raw-store (его LLM не вызывается — эта ось вне рамок по объявлению, а не по умолчанию).

§03Результаты — HaluEval QA, 300 проб (200 отвечаемых + 100 безответных)
СистемаcoverageNET(1)NET(2)NET(5)NET(10)в минус с λ
Verimem · порог τ=0.8 (продуктовый дефолт) 1824114 0.62 +0.593 +0.580 +0.540 +0.473 45.5
mem0 2.0.11 · как поставляется (без порога) 2001000 1.00 +0.333 0.000 −1.000 −2.667 2.0
mem0 + прикрученный порог 0.75 (подобран на eval) 1660134 0.55 +0.553 +0.553 +0.553 +0.553 никогда
Тот же store, порог OFF (контроль τ=0) 1921008 0.97 +0.307 −0.027 −1.027 −2.693 1.9
Перемешанный контроль (sanity: обязан падать) 52878 0.97 −0.940 −1.897 −4.767 −9.550 0.02

Читайте честно, в обе стороны: как поставляется, mem0 уходит в минус за λ=2 — 100 сфабрикованных ответов на безответной половине; продуктовый дефолт Verimem остаётся в плюсе до λ≈45. Но порог можно прикрутить к любому движку: с порогом, подобранным на этой eval, mem0 достигает ровных +0.553 — что на этом корпусе бьёт наш дефолт при λ≥5. Оставшиеся различия: движок сам порог не поставляет, прикрученный порог выбран на тест-сете, а ровная линия означает, что он не отвечает ни на что, в чём не уверен — coverage 0.55 против наших 0.62, при 182 против 166 верных на λ=1.

§03bSQuAD v2 — корпус потяжелее, сказано прямо
СистемаcoverageNET(1)NET(2)NET(5)NET(10)в минус с λ
Verimem · порог τ=0.8 (продуктовый дефолт) 1634988 0.71 +0.380 +0.217 −0.273 −1.090 3.3
Verimem · лучший порог 0.85 (подобран на eval) 987195 0.35 +0.303 +0.280 +0.210 +0.093 14.0
mem0 2.0.11 · как поставляется (без порога) 2001000 1.00 +0.333 0.000 −1.000 −2.667 2.0
mem0 + прикрученный порог 0.80 (подобран на eval) 440256 0.15 +0.147 +0.147 +0.147 +0.147 никогда

Отвлекающие пассажи SQuAD сжимают полосу скорингов, и это видно: на продуктовом дефолте crossover падает до λ≈3.3, а удержание NET в плюсе при λ=10 стоит coverage 0.35. Воздержание — это ручка, а не магия: корпус решает, сколько стоит честность. Неправильно было бы спрятать эту таблицу.

§04За пределами retrieval — оси, которые recall@k выразить не может

AОсь реального корпуса

Таблицы выше: внешние данные, отвечаемые + безответные, порог вкл/выкл vs конкурент, перемешанный контроль. Ось, на которой фабрикация становится событием с ценой.

BКаузальная ось

Store, честно подтвердивший ложную корреляцию, отвечает на вопросы do(X) уверенно-неверно — и уходит в минус даже при λ=1. Происхождение — не причинность; бенчмарк, не различающий их, вознаградит путаницу.

CАдверсариальная ось

Сговор (N идентичностей, один источник) плюс доверенный слипер. В плюсе остаётся только двухканальная политика доверия — независимое подтверждение и обратная связь по исходу; каждый одиночный канал падает ровно под одной из двух атак. Ось, стоящая за двухканальным source-trust Verimem.

§05Запустить — одна команда, сырые файлы в репо

все оси, детерминированно, ноль API-ключей

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

Спека, пре-регистрация и каждый сырой JSON результатов лежат в репо в benchmark/veribench/ и benchmark/results/. Конкуренты приглашены — адаптер mem0 лежит in-tree как рабочий пример; пришлите PR с официальным адаптером вашего движка, и мы прогоним его на равных условиях.