feat(eval): fb-41 multi-hop golden set + spec/plan #166
Reference in New Issue
Block a user
Delete Branch "feat/fb-41-multi-hop-eval-golden"
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?
요약
fb-41 multi-hop RAG (XL 작업) 의 PR-1. baseline 측정 anchor 만 추가 — RAG pipeline 미변경, fixture file + parse 회귀 핀.
설계: docs/superpowers/specs/2026-05-25-p9-fb-41-multi-hop-rag-design.md
계획: docs/superpowers/plans/2026-05-25-p9-fb-41-multi-hop-rag.md
사용자 결정 4 axis (2026-05-25)
--multi-hopflag변경
fixtures/multi_hop_golden.yaml신규. 15 question (5 cross-doc + 5 intra-doc + 5 single-fact negative). 기존GoldenQuerystruct 그대로 사용 — 별 loader / type 변경 없음.expected_chunk_ids비어 있어 curator 가kebab ingest후 채울 수 있는 template 형태.must_contain으로 baseline 측정 가능 (P5-2 metric).crates/kebab-eval/tests/loader.rs::loads_multi_hop_golden_fixture신규 회귀 핀. fixture parse OK + 15 question + 5/5/5 bucket 분포 + 모든 question 에must_contain최소 1 개.Baseline 측정 protocol
본 PR 자체는 baseline artifact 를 commit 하지 않음. 사용자 측 별도 run:
kebab eval run --fixture fixtures/multi_hop_golden.yaml(현 single-pass).multi_hop=true재실행 → Δ.expected_chunk_ids가 비어 있어precision_at_k_chunk(fb-39) 는 skip; 나머지 metric (rule-based answer correctness + citation_coverage) 가 작동. 사용자가 ingest 후 chunk_id 채우면 더 정밀한 baseline 측정 가능.PR 분할 6 단계 (plan 참조)
RagPipeline::ask_multi_hop(fixed depth=2) +AskOpts.multi_hop+impl Default for AskOpts.Answer.hops노출.--multi-hopflag +answer.v1schema additive +error.v1신규 codemulti_hop_decompose_failed.asktool 의multi_hopargument + SKILL.md.마지막 PR 후 v0.18.0 cut — minor bump (frozen design §3.8 갱신 + 사용자 visible 새 surface +
prompt_template_version = rag-multi-hop-v1cascade).검증
cargo test -p kebab-eval --test loader -j 1— 전부 녹색 (3 test 통과 포함 신규 회귀 핀).cargo clippy -p kebab-eval --all-targets -j 1 -- -D warnings— clean.시험 항목 (Test Plan)
loads_multi_hop_golden_fixture신규 — fixture parse + 15 question + 5/5/5 분포 + must_contain 핀비범위
--multi-hopflag (PR-4).expected_chunk_ids채우기 (사용자 ingest 후, 향후 PR 또는 별도 fixture curation commit).다음 단계
PR-1 머지 후 PR-2 시작 (
AskOpts.multi_hop+Defaultimpl +ask_multi_hopskeleton fixed depth=2).Assisted-by: Claude Code
회차 1 — 4 axis 결정 추적성 좋고 6 PR 분할이 작은 단위로 자연스러움. actionable 2 + suggestion 3 + 칭찬 1:
actionable:
mh-s-004의must_contain: ["i"]한 글자 — trigram 0-hit + noise 매칭 위험. 구체적 토큰 보강 필요suggestion:
mh-c-002의 hard-coded"v0.17.2"토큰 — 의미적 안정성 vs release tag freeze 결정칭찬: bucket + must_contain non-empty 회귀 핀이 fixture curation 의도를 코드로 표현.
@@ -38,7 +38,44 @@ fn loads_minimal_well_formed_yaml() {assert_eq!(qs[1].difficulty.as_deref(), Some("easy"));}칭찬 —
5/5/5bucket distribution + 모든 question 의must_containnon-empty 회귀 핀이 fixture curation 의 의도를 그대로 코드로 표현. 향후 fixture 가 16 question 으로 늘면 즉시 fail — 그게 의도된 가드면 OK. 의도가 "최소 5 per bucket" 인 lower bound 였다면>= 5assertion 이 더 robust. spec / plan 의 "15 question 목표" 는 baseline anchor 의 frozen size 라 본 핀이 정확.@@ -0,0 +10,4 @@# p9-fb-41 implementation planDesign: `docs/superpowers/specs/2026-05-25-p9-fb-41-multi-hop-rag-design.md`.plan 의 PR-1 file list 가 실제 PR 와 일치 안 함. plan 작성 시점 (kebab-eval 구조 미survey) 에
tasks/eval/multi-hop-golden.toml+crates/kebab-eval/src/golden.rs::MultiHopGoldenQuestion신규 type 명시했는데, 실제 PR 가:fixtures/multi_hop_golden.yaml(workspace root, fb-39 sister naming)GoldenQuerystruct 재사용 — 별 type / loader 변경 없음loads_multi_hop_golden_fixture)plan 의 PR-1 단락이 outdated. 머지 후 follow-up commit 으로 plan 갱신 또는 본 PR 회차 2 에서 정정. plan 이 후속 archeology source 라 deviation 남기면 향후 다른 사람 혼란.
@@ -0,0 +1,122 @@# Multi-hop golden query suite for `kebab eval run` (fb-41 baseline + post-merge Δ).fixture 모든 15 question 의
lang: ko. 기존fixtures/golden_queries.yaml는g002 / g004가 영어 — multi-hop fixture 도 영어 mix 가 사용자 dogfood 의 lang 다양성 cover. 예: 5/5/5 buckets 중 영어 2-3 개 섞기 (cross-doc 의 1 개를 영어, intra-doc 의 1 개를 영어, single-fact 의 1 개를 영어). 또는 별 fixture (multi_hop_golden_en.yaml) 분리.Suggestion 만 — 사용자 실제 사용 패턴이 한국어 위주면 OK. fb-41 dogfood 시 영어 query 도 측정할지 사용자 결정.
@@ -0,0 +33,4 @@must_contain: ["markdown", "image", "pdf", "chunker_version"]difficulty: multi-hop- id: mh-c-002mh-c-002의must_contain: ["v0.17.2"]가 release tag 에 hard-coded. 향후 (v0.18.x cut 또는 entry merge / cross-link 정리 시) 의미는 같아도 정확한 version 문자열이 달라질 수 있음 (예: HOTFIXES entry header 가post-v0.17.1 dogfood로 적혀 있던 시기 있었음). baseline 시점 freeze 의도면 OK, 의미적 안정성 우선이면"OCR"또는"image.ocr"같은 도메인 토큰 권장.Suggestion — fb-41 fixture 의 의도 (특정 release 동작 vs 의미적 invariant) 에 따라 결정.
@@ -0,0 +117,4 @@- id: mh-s-005query: "kebab 의 RRF k 파라미터 default 값은?"lang: komh-s-004의must_contain: ["i"]가 약한 신호. (1) trigram tokenizer 가i한 글자는 색인 못 함 — 0-hit 가능. (2)must_contain이 answer 본문에 substring 등장 검증이라"i"한 글자는"Insert","INSERT","increment"등 무관한 단어에도 match. baseline metric 의 단순 pass/fail 가 noise.보강:
다른 single-fact (mh-s-001/002/003/005) 들은 구체적 토큰 1-2 개라 OK.
회차 2 — 회차 1 의 actionable 2 + suggestion 1 모두 잘 반영. 잔여 actionable 0건. APPROVE.
회차 1 의 deferred 2 suggestion 의 freeze 의도 명시:
mh-c-002의"v0.17.2"hard-coded — baseline anchor 가 "특정 release 시점의 multi-hop 능력 측정" 의도라 의식적 freeze. v0.18.x cut 시점에 fixture re-curation 별 PR 로 처리하는 게 baseline 변동 vs 실제 multi-hop 효과 분리 가능.>= 5) 로 풀면 향후 fixture 가 무계획적으로 늘어 baseline 비교 가능성 ↓. fixture re-curation 시점에 (의식적 의사결정) 핀 갱신.cadence 자연 (4 → 0) 수렴. 다음 PR (PR-2 —
RagPipeline::ask_multi_hopskeleton,AskOpts.multi_hop+impl Default for AskOpts) 진행 권장.@@ -0,0 +10,4 @@# p9-fb-41 implementation planDesign: `docs/superpowers/specs/2026-05-25-p9-fb-41-multi-hop-rag-design.md`.칭찬 — plan PR-1 단락이 실제 변경 + deviation 명시 양쪽 cover. "plan 초안 대비 deviation" sub-section 가 후속 archeology 가 "왜 plan 과 실제 PR 가 달랐는가" 즉시 파악 가능 — frozen-as-historical-contract 정책 유지하면서 실제 산출 추적. 다른 PR 들의 plan 단락도 동일 패턴이면 좋겠음 (PR-2~PR-6 에서도 deviation 발견 시).
@@ -0,0 +33,4 @@must_contain: ["markdown", "image", "pdf", "chunker_version"]difficulty: multi-hop- id: mh-c-002칭찬 — 3 question 영어 변환 (
mh-c-005schema list,mh-i-001chunk_id recipe,mh-s-002license) 이 자연스러운 영어 + 동일must_contain검증력 유지. 영어 dogfood 시 measurement gap 차단.@@ -0,0 +117,4 @@- id: mh-s-005query: "kebab 의 RRF k 파라미터 default 값은?"lang: ko칭찬 —
mh-s-004의["INSERT", "i 입력모드"]보강이 두 토큰 모두 corpus 에 실제 등장 (README 의"i 입력모드"literal + multiple doc 의"INSERT"). 한국어 + 영어 mix 도 trigram 색인 + answer 본문 substring 검증 양쪽에 견고.