fix(rag): fb-41 PR-8 multi-hop synthesize safety in depth (pool 15 + self-check rule) #175

Merged
altair823 merged 2 commits from feat/fb-41-pr-8-multi-hop-synthesize-safety into main 2026-05-25 12:51:48 +00:00
Owner

요약

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_chunks default 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)

query path grounded latency answer
caffeine formula single-pass false (LlmSelfJudge) 30s "근거가 부족하다" ✓
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 — latency 4× 개선 but LLM 이 새 rule 무시

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 warnings clean.
  • S7 dogfood retest — hallucination 여전 (latency 4× 개선만, PR 본문에 정직 명시).

시험 항목 (Test Plan)

  • default_multi_hop_max_pool_chunks_is_15 test
  • legacy_config_without_multi_hop_knobs_uses_defaults 의 pool assert 15 갱신
  • synthesize prompt 에 self-check rule 추가
  • dogfood S7 retest — latency 4× 개선 확인 (hallucination 여전)
  • HOTFIXES 2026-05-25 fb-41 post-PR-7 cross-link

다음

  • PR-9a: kebab-nli crate (mDeBERTa ONNX adapter + model download/cache).
  • PR-9b: ask / ask_multi_hop 의 post-synthesize verify.
  • PR-9c: tests + dogfood S7 재검증 (NLI score < 0.5 → refuse 예상).
  • v0.18.0 cut (PR-9c 머지 후).

Assisted-by: Claude Code

## 요약 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_chunks` default **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) | query | path | grounded | latency | answer | |---|---|---|---|---| | caffeine formula | single-pass | false (LlmSelfJudge) | 30s | \"근거가 부족하다\" ✓ | | 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 — **latency 4× 개선** but LLM 이 새 rule 무시 | **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 warnings` clean. - S7 dogfood retest — hallucination 여전 (latency 4× 개선만, PR 본문에 정직 명시). ## 시험 항목 (Test Plan) - [x] `default_multi_hop_max_pool_chunks_is_15` test - [x] `legacy_config_without_multi_hop_knobs_uses_defaults` 의 pool assert 15 갱신 - [x] synthesize prompt 에 self-check rule 추가 - [x] dogfood S7 retest — latency 4× 개선 확인 (hallucination 여전) - [x] HOTFIXES 2026-05-25 fb-41 post-PR-7 cross-link ## 다음 - **PR-9a**: kebab-nli crate (mDeBERTa ONNX adapter + model download/cache). - **PR-9b**: ask / ask_multi_hop 의 post-synthesize verify. - **PR-9c**: tests + dogfood S7 재검증 (NLI score < 0.5 → refuse 예상). - v0.18.0 cut (PR-9c 머지 후). Assisted-by: Claude Code
altair823 added 1 commit 2026-05-25 12:45:01 +00:00
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>
claude-reviewer-01 requested changes 2026-05-25 12:49:16 +00:00
Dismissed
claude-reviewer-01 left a comment
Member

회차 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.md 2026-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 측면은 정합.

회차 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.md` 2026-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.18

doc 참조 + HOTFIXES 갱신 누락 (actionable): doc 가 tasks/HOTFIXES.md 2026-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 아님.

선택지:

  • (가벼움) PR-7 entry 의 "다른 도그푸딩 발견" 절을 closure 형태로 갱신 — "pool 30→15 PR-8 머지" + dogfood retest 결과 (latency 614s→158s, hallucination 여전 → PR-9 NLI 로 진짜 fix).
  • (별 entry) 2026-05-25 fb-41 post-PR-7 dogfood retest entry 신규 — config doc 가 referencing 한 정확한 이름.

후자가 doc reference 와 정확히 일치. HOTFIXES newest-first 라 PR-7 entry 위에 추가.

**doc 참조 + HOTFIXES 갱신 누락 (actionable)**: doc 가 `tasks/HOTFIXES.md` 2026-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 아님. 선택지: - (가벼움) PR-7 entry 의 "다른 도그푸딩 발견" 절을 closure 형태로 갱신 — "pool 30→15 PR-8 머지" + dogfood retest 결과 (latency 614s→158s, hallucination 여전 → PR-9 NLI 로 진짜 fix). - (별 entry) 2026-05-25 fb-41 *post-PR-7* dogfood retest entry 신규 — config doc 가 referencing 한 정확한 이름. 후자가 doc reference 와 정확히 일치. HOTFIXES newest-first 라 PR-7 entry 위에 추가.
altair823 added 1 commit 2026-05-25 12:51:20 +00:00
HOTFIXES.md 의 fb-41 entry 에 *post-PR-7 dogfood retest + PR-8 partial
mitigation* sub-section 추가 + *PR-9 NLI plan* anchor + 사용자 영향
절 갱신. config.rs 의 doc reference 가 정확한 entry sub-section
가리키도록 조정 — dangling reference 해소.

검증
- `cargo test -p kebab-config -j 1` — 모든 test 통과.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
claude-reviewer-01 approved these changes 2026-05-25 12:51:35 +00:00
claude-reviewer-01 left a comment
Member

회차 2 — HOTFIXES.md 갱신 완벽 반영. PR-8 의 partial mitigation 절 + PR-9 NLI plan anchor + 사용자 영향 절 갱신 모두 doc reference 정합. config.rs 의 cross-link 도 정확한 sub-section 가리킴.

추가 actionable 항목 없음 — 머지에 동의.

요약:

  • multi_hop_max_pool_chunks default 30 → 15 (synthesize prompt size ↓ → gemma3:4b latency 614s → 158s, 4× 개선).
  • MULTI_HOP_SYNTHESIZE_SYSTEM_PROMPT 에 답하기 전 self-check rule + example 추가 (future larger LLM 용 value).
  • HOTFIXES dated entry — partial mitigation 명시 + PR-9 NLI verification plan anchor.
  • PR 본문이 dogfood retest 결과 정직 명시 — hallucination 여전 (gemma3:4b prompt-following ceiling).
  • 진짜 fix 는 PR-9 (별 PR, design note 작성됨).
  • 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 예정).

회차 2 — HOTFIXES.md 갱신 완벽 반영. PR-8 의 partial mitigation 절 + PR-9 NLI plan anchor + 사용자 영향 절 갱신 모두 doc reference 정합. config.rs 의 cross-link 도 정확한 sub-section 가리킴. 추가 actionable 항목 없음 — 머지에 동의. 요약: - multi_hop_max_pool_chunks default 30 → 15 (synthesize prompt size ↓ → gemma3:4b latency 614s → 158s, 4× 개선). - MULTI_HOP_SYNTHESIZE_SYSTEM_PROMPT 에 답하기 전 self-check rule + example 추가 (future larger LLM 용 value). - HOTFIXES dated entry — partial mitigation 명시 + PR-9 NLI verification plan anchor. - PR 본문이 dogfood retest 결과 정직 명시 — hallucination 여전 (gemma3:4b prompt-following ceiling). - 진짜 fix 는 PR-9 (별 PR, design note 작성됨). - `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 예정).
altair823 merged commit 63aece3ea1 into main 2026-05-25 12:51:48 +00:00
altair823 deleted branch feat/fb-41-pr-8-multi-hop-synthesize-safety 2026-05-25 12:51:49 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: altair823-org/kebab#175