← 평가·검증

측정하지 않은 것을 측정했다고 하지 않는다

조건 라벨을 뗀 수치는 측정이 아니라 주장이다. 라벨과 함께 쓸 수 없는 수치는 버린다.

질문

두 시스템을 같은 하네스로 돌려 숫자를 얻었다. 이 숫자를 어디까지 "측정했다"고 말할 수 있는가.
그리고 어디서부터 "우열을 가렸다"가 거짓이 되는가.

판정

측정 조건을 함께 쓸 수 없는 수치는 측정이 아니라 주장이다. 라벨을 떼는 순간 그 수치는 거짓이 된다.

근거

/Users/bkan/workspace/memory-bench 는 mem0 와 Hindsight 를 같은 조건으로 돌리는 비교 하네스다.
이 리포가 수치보다 먼저 강제하는 것은 라벨이다. MEASURED 는 이 리포 하네스에서 라이브로 돌린 것,
DOCUMENTED 는 스펙·의존성 조사·벤더 문서에서 온 것이다
(/Users/bkan/workspace/memory-bench/COMPARISON.md 3행).

2026-08-25 실측 결과는 이렇다.

Hindsight 와 mem0 모두 8/8 을 기록했다

쓰고 retain 은 infer=False 다. 따라서 이 결과는 LLM 추출 품질 비교가 아니다

  • 동일한 Python 3.13.14, 동일 호스트(macOS-26.5.2-arm64)의 eval-mini 8문항에서
  • Hindsight: retain p50/p95 5466.0/6466.8 ms, recall p50/p95 399.3/1190.0 ms
  • mem0: retain p50/p95 13.3/151.5 ms, recall p50/p95 11.4/409.1 ms
  • 그러나 LLM 구성이 비대칭이다. Hindsight 는 LLM=none, mem0 는 로컬 Ollama qwen2.5:0.5b 제공자를

이 라벨을 떼고 "한쪽이 400배 빠르다"거나 "mem0 가 이겼다/졌다"로 쓰면 거짓이 된다.
retain 지연의 두 자릿수 격차는 제품 우열이 아니라 서로 다른 구성의 파이프라인 두 개를 나란히 세운 결과다.

무효 수치를 폐기한 기록이 이 판정의 진짜 근거다. mem0 의 최초 0/8 은 제품 성능이 아니라
mem0 2.0.8 의 search API 오용이었다. 어댑터가 search(query, user_id=scope) 를 호출해 8건 전부
검색 실행 전 예외가 났다. add 는 top-level user_id 를 받지만 search
filters={"user_id": scope} 를 요구한다. 회귀 테스트를 추가하고 계약을 주석으로 고정한 뒤
새 저장소에서 재실행해 8/8 을 확인했다. 커밋 05a82ae(실측 반영), 37a83c7(검색 필터 계약 명시).
당시의 recall_accuracy: 0.0 은 성능 수치가 아니라 버그의 흔적이고, 그래서 버렸다.

하네스 자체도 같은 규율로 만들었다. 어댑터는 백엔드를 못 띄우면 수치를 지어내는 대신
예외를 던진다(/Users/bkan/workspace/memory-bench/adapters/mem0_adapter.py).
0 이나 추정치로 칸을 채우는 코드가 없으면 "실행 안 했음"이 결과 파일에 남는다.

같은 규율을 클라이언트 작업에서도 지켰다. 온프렘 요건 고객사의 한국어 임베딩 3-way A/B 에서
사전 동결한 decision rule(Bonferroni α=0.025, MRR), 90 쿼리 6 전략, self-retrieval 무결성 검증까지
갖춰 돌렸고, 결과는 전 pair 통계 유의성 미달 + 표본 부족 → underpowered 였다.
그래서 "교체 근거 없음"으로 기존 모델을 유지했다. 유의하지 않은 차이를 개선으로 발표하지 않는 것이
그 실험의 산출물이었다.

한계·재검토 트리거

eval-mini 는 8문항 single-hop smoke set 이다. LongMemEval 이나 LoCoMo 가 아니고, 통계적 결론을
낼 수 있는 크기도 아니다. 두 어댑터 경로가 동일 입력에서 동작함을 증명하지, 일반적인 메모리 품질을
증명하지 않는다. 지연 수치는 단일 맥 호스트 1회 실행의 p50/p95 다.

2026-08 기준 / 재검토 트리거: (1) 두 백엔드의 LLM 구성을 대칭으로 맞춘 재실행이 나오거나,
(2) 100문항 이상 멀티홉 셋으로 교체하거나, (3) results/*.jsonstatusmeasured 가 아닌
값으로 바뀌면 이 판정문의 근거 절을 전부 교체한다.