fix(rag): fb-41 PR-8 multi-hop synthesize safety in depth (pool 15 + self-check rule) #175
Reference in New Issue
Block a user
Delete Branch "feat/fb-41-pr-8-multi-hop-synthesize-safety"
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 layered defense — PR-7 의 pre-decompose probe 위에 synthesize-단계 safety 추가. 본 PR 만으로는 S7 hallucination 완전 차단 안 됨 — gemma3:4b 의 prompt-following 한계 (도그푸딩 S7 retest 에서 확인). 진짜 fix 는 PR-9 (NLI-based post-synthesis verification, 별 PR). PR-8 은 그 사이의 partial mitigation + safety in depth.
설계: docs/superpowers/specs/2026-05-25-p9-fb-41-multi-hop-rag-design.md
PR-9 design note:
/build/cache/dogfood-v018/results/PR-9-DESIGN.md변경
RagCfg::multi_hop_max_pool_chunksdefault 30 → 15 (synthesize prompt size ↓ → gemma3:4b 가 citation rule 잃지 않게).MULTI_HOP_SYNTHESIZE_SYSTEM_PROMPT에 답하기 전 self-check rule 추가 — "[원본 질문] 의 핵심 entity (고유명사, 화학식, 수치 단위, 코드명, 약자) 가 [근거] 본문에 literal 으로 등장하지 않으면 즉시 '근거가 부족하다'. example (caffeine + Adam optimizer chunk) 명시".도그푸딩 결과 (PR-7 + PR-8 retest)
PR-8 의 부분 성과: pool 30→15 latency 614s → 158s. prompt rule 은 future larger LLM (gemma2:9b 등) 에서 가치.
PR-8 의 한계: gemma3:4b 의 prompt-following ceiling — strong rule 도 무시. LLM-self-judge 기반 safety 의 한계.
진짜 fix → PR-9
학계 / industry 표준 (Self-RAG, CRAG, Auto-GDA, MedTrust-RAG) 의 결론: deterministic post-synthesis verification 이 정답. NLI groundedness check (mDeBERTa-v3-base-xnli 280 MB multilingual ONNX) 가 (premise=packed_chunks, hypothesis=answer) entailment 검사. PR-8 위에 layered defense.
검증
cargo test -p kebab-config -p kebab-rag -j 1— 모든 test 통과.cargo clippy -p kebab-config -p kebab-rag --all-targets -j 1 -- -D warningsclean.시험 항목 (Test Plan)
default_multi_hop_max_pool_chunks_is_15testlegacy_config_without_multi_hop_knobs_uses_defaults의 pool assert 15 갱신다음
Assisted-by: Claude Code
v0.18 cut 전 fb-41 multi-hop RAG **layered defense** — PR-7 의 pre-decompose probe gate 위에 추가 safety. PR-7 의 fix 만으로는 hybrid mode 의 RRF top_score 가 gate 통과 시 (도그푸딩 S7 의 caffeine query) hallucination 여전히 발생 — synthesize 단계 자체의 safety 보강 필요. **중요**: 본 PR 만으로는 S7 hallucination 완전 차단 안 됨 (gemma3:4b 의 prompt-following 한계 — 추가 dogfood S7 retest 에서 확인). 진짜 fix 는 PR-9 (NLI-based post-synthesis verification). PR-8 은 그 사이의 *partial mitigation + safety in depth* — latency 4× 개선 (614s → 158s) + future larger LLM 용 prompt rule. 설계: docs/superpowers/specs/2026-05-25-p9-fb-41-multi-hop-rag-design.md 계획: /build/cache/dogfood-v018/results/PR-9-DESIGN.md (사용자 결정 후 spec/plan 으로 promotion) ## 변경 - `crates/kebab-config/src/lib.rs`: - `RagCfg::multi_hop_max_pool_chunks` default **30 → 15**. - rationale doc — gemma3:4b 가 30-chunk large prompt 에서 citation rule 잃는 측정 결과. - 2 unit test (`default_*` rename + `legacy_*` assert) 갱신. - `crates/kebab-rag/src/pipeline.rs`: - `MULTI_HOP_SYNTHESIZE_SYSTEM_PROMPT` 에 **답하기 전 self-check** rule 추가 — "[원본 질문] 의 핵심 entity (고유명사, 화학식, 수치 단위, 코드명, 약자) 가 [근거] 본문에 literal 으로 등장하지 않으면 다른 entity 의 정보로 답을 합성하지 말고 '근거가 부족하다' 답한다". example (caffeine + Adam optimizer chunk) 도 명시. ## 도그푸딩 결과 (retest with PR-7 + PR-8) | query | path | grounded | latency | answer | |---|---|---|---|---| | caffeine formula | single-pass | false (LlmSelfJudge) | 30s | "근거가 부족하다" ✓ | | caffeine formula | multi-hop pre-fix | true ✗ | 141s | hallucination | | caffeine formula | multi-hop PR-7 | true ✗ | 143s | hallucination (probe gate top_score 0.5 > 0.30) | | caffeine formula | multi-hop PR-8 | true ✗ | **158s** | hallucination (LLM 가 새 rule 무시) — **latency 4× 개선** | PR-8 의 부분 성과: - pool 30→15 로 synthesize prompt size ↓ → latency 614s → 158s. - prompt rule 은 future larger LLM (gemma2:9b, qwen2.5:7b 등) 에서 가치 ↑. PR-8 의 한계: - gemma3:4b 의 prompt-following 한계 — strong rule 도 무시하고 다른 entity chunk (Adam optimizer formula) 의 본문을 caffeine 화학식 출처로 인용. - LLM-self-judge 기반 safety 의 ceiling. ## 진짜 fix → PR-9 (별 PR) 학계 / industry 표준 검색 결과 (Self-RAG, CRAG, Auto-GDA, MedTrust-RAG): deterministic post-synthesis verification 이 정답 path. **NLI-based groundedness check** — mDeBERTa-v3-base-xnli (280 MB multilingual) ONNX model 이 (premise=packed_chunks, hypothesis=answer) entailment 검사. score < 0.5 면 refuse. PR-8 위에 layered defense. ## 검증 - `cargo test -p kebab-config -p kebab-rag -j 1` — 모든 test 통과 (config default test 2개 갱신, rag tests 영향 없음). - `cargo clippy -p kebab-config -p kebab-rag --all-targets -j 1 -- -D warnings` clean. - 단일 crate 직렬 build (16 GB RAM 제약). - S7 dogfood retest — hallucination 여전 (PR 본문에 정직 명시). ## 변경 없음 - Wire schema — additive (config knob default 만 변경). - PR-7 의 probe gate — 그대로 작동 (gate 통과 시 PR-8 의 추가 safety layer). - 다른 도그푸딩 P1 항목 (citation 일관성, binary path) — 별 PR. ## 다음 - **PR-9a/b/c**: NLI-based post-synthesis verification — 진짜 fix. - PR-9 머지 후 dogfood S7 재검증 (예상: refuse + nli_score < 0.5). - v0.18.0 cut. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>회차 1 — HOTFIXES.md 갱신 누락 1 건.
PR-8 의 scope (pool default 30→15 + synthesize prompt self-check rule) 자체는 작고 정합. PR 본문이 partial mitigation 임을 정직히 명시 + dogfood retest 결과 (latency 4× 개선 / hallucination 여전) 도 ship 표명. PR-9 의 NLI verification 으로 진짜 fix 라는 명시도 깨끗.
본 유일 nit:
crates/kebab-config/src/lib.rs의 doc 가tasks/HOTFIXES.md2026-05-25 fb-41 post-PR-7 entry 를 cross-link 하는데, 현재 HOTFIXES 에 그 이름 entry 없음 (PR-7 entry 는 "pre-v0.18 dogfood"). PR-8 의 부분 성과 + 한계 + PR-9 path 를 HOTFIXES 에 entry 로 추가해야 doc reference 가 dangling 아님. inline 코멘트에 두 fix 옵션 (PR-7 entry 갱신 vs 별 entry).설계 / clippy / tests / wire 측면은 정합.
@@ -206,1 +205,3 @@/// 5-hop / 10-hits multi-hop runs while still bounded./// with `forced_stop = true`.////// Default `15` — tuned down from the original 30 in the v0.18doc 참조 + HOTFIXES 갱신 누락 (actionable): doc 가
tasks/HOTFIXES.md2026-05-25 fb-41 post-PR-7 entry 를 참조하는데, 현재 HOTFIXES 에는 그 이름 entry 없음 (PR-7 entry 는 "fb-41 pre-v0.18 dogfood: multi-hop score-gate 우회"). PR-8 의 부분 성과 (pool 30→15 latency 4× 개선) + 한계 (gemma3:4b prompt-following ceiling) 를 HOTFIXES 에 추가해야 doc reference 가 dangling 아님.선택지:
후자가 doc reference 와 정확히 일치. HOTFIXES newest-first 라 PR-7 entry 위에 추가.
회차 2 — HOTFIXES.md 갱신 완벽 반영. PR-8 의 partial mitigation 절 + PR-9 NLI plan anchor + 사용자 영향 절 갱신 모두 doc reference 정합. config.rs 의 cross-link 도 정확한 sub-section 가리킴.
추가 actionable 항목 없음 — 머지에 동의.
요약:
cargo test -p kebab-config -p kebab-rag -j 1모든 test 통과 + clippy clean.v0.18.0 cut blocker 의 layered defense — probe gate (PR-7) + synthesize safety (PR-8) + NLI verification (PR-9 예정).