feat(eval): 변형 일관성(query-paraphrase robustness) 평가 프레임워크 #193
Reference in New Issue
Block a user
Delete Branch "feat/paraphrase-robustness-eval"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
요약
같은 의미를 다른 표현(동의어·풀어쓴 문장·한/영)으로 물어도 검색 품질이 일관되는지 직접 측정하는 평가 프레임워크를
kebab-eval에 추가한다. 선행 cross-script 실험이 "겹침(overlap)"이라는 프록시 지표를 최적화하다 헛돈 교훈을 반영해, 처방을 만들기 전에 진짜 지표(변형 간 일관성)를 재는 도구를 먼저 세운다.핵심은
GoldenQuery.group으로 같은 의도의 여러 표현을 묶고, 그룹 내recall@narrow(10)vsrecall@pool(50)대비로 각 변형을Ok/MisRanked(A: 정답이 pool엔 있고 top-10 밖 → 재정렬 후보) /Missing(B: pool에도 없음 → 어휘격차) 로 분류하는 것이다. 이 진단이 처방 방향(near-tie 흡수 vs 쿼리/문서 확장)을 가른다.설계: docs/superpowers/specs/2026-05-29-query-paraphrase-robustness-eval-design.md
계획: docs/superpowers/plans/2026-05-29-query-paraphrase-robustness-eval.md
변경 내용
GoldenQuery.group: Option<String>(additive,#[serde(default)]) + loader 그룹 정합성 검증(같은 group → 동일expected_doc_ids, 위반 시 bail).kebab-eval::variant모듈 — 변형 일관성 메트릭(recall_spread/worst/A·B dominant/fully_consistent/pool_possibly_truncated) + (A)/(B) 분류 + 마크다운/JSON 렌더.runner의config_snapshot_json에eval_k추가 → variant 진단이eval_k < pool_k(50)인 run 에서 조용히 무력화되지 않도록compute_variant_consistency_with_config가 bail.kebab eval variants <run_id> [--json]CLI 서브커맨드.비범위 / 회귀 위험
AggregateMetrics(hit@k/MRR/recall) 경로 불변 — group=None 쿼리는 기존과 동일하게 처리된다(회귀 가드 테스트 포함). 검색/임베딩/색인 동작 변경 없음, wire schema 불변. Phase 2(처방)는 별도 PR.검증
cargo test -p kebab-eval녹색 (변형 일관성 3 + H1/M1 회귀 3 + 그룹 정합성 + 기존 metrics/loader/compare/runner 전부).cargo clippy -p kebab-eval -p kebab-cli --all-targets -- -D warnings녹색 (err+warn 0).시험 항목 (Test Plan)
kebab eval run --mode hybrid --k 50후kebab eval variants <run_id>가 그룹별 recall_spread/A/B/pool 표를 출력--k 10run 에 대해eval variants가 pool truncation 으로 bail (조용한 오답 방지)--json출력이VariantConsistencyReport구조와 일치Assisted-by: Claude Code
회차 1 — 설계·테스트 견고, actionable 1건(README sync).
좋은 점
recall@narrowvsrecall@pool대비로 정의한 게 진단 목적에 정확히 맞고, per-task 리뷰에서 H1(POOL_K=50vseval run --k기본 10 → A 영원히 안 나옴)을 측정 전에 잡아eval_k스냅샷 + bail +pool_possibly_truncated플래그로 막은 흐름이 인상적이다. 회귀 테스트로 고정한 것도 좋다.group=None경로·AggregateMetrics불변 회귀 가드,eval_k누락(구버전 run) 시 안전 skip — backward-compat 처리가 꼼꼼하다.answer_ok를metrics.rsgroundedness(error 가드 + 빈 must_contain/forbidden vacuous-true 방지)와 정렬한 것도 sibling 메트릭 일관성 측면에서 옳다.[MEDIUM] README 명령 표 sync 누락
kebab eval variants <run_id> [--json]를 추가하는데README.md의 명령 표(line 96| kebab eval run / compare | golden query 회귀 측정 |)가 갱신되지 않았다. CLAUDE.md 의 README-sync 규칙("새kebab <subcommand>→ 명령 표 갱신")에 해당한다.aggregate도 빠져 있으니 함께 보강 권장:run / aggregate / compare / variants+ 설명에 "변형 일관성 진단" 추가.나머지(코드 로직·테스트·docs)는 머지 가능 수준. 위 1건 반영 후 APPROVE 예정.
회차 2 — 회차 1 지적(README 명령 표 sync) 반영 확인. APPROVE.
1529e6d에서kebab eval run / aggregate / compare / variants로 표를 보강하고variants의 (A)/(B) 진단 +--json을 설명에 추가했다. 누락됐던aggregate도 함께 채워 명령 표가 실제 서브커맨드와 일치한다.남은 actionable 없음. 정리하면:
머지 가능.
회차 3 — 사용자 요청으로 README 슬림 + ARCHITECTURE 동기화 추가 (
b6ad947). 검토 완료, APPROVE.이 회차는 코드가 아니라 문서 정리다. PR 범위가 "eval 프레임워크 + 문서 정리"로 넓어졌으나, 사용자가 한 PR 에 묶기를 명시적으로 요청한 의도된 결합이다(결함 아님).
검토 결과:
--help, TUI 키는 in-appF1cheatsheet 로 위임 — 정적 문서가 런타임 권위 소스를 중복·stale 하게 떠안던 구조를 해소했다.--help/ wire-schema) 정합.actionable 없음. eval 프레임워크(회차 1~2 APPROVE) + 문서 정리 모두 머지 가능.