altair823
7150c376bb
feat(rag): fb-41 PR-3a — HopRecord wire + RagCfg multi-hop knobs
PR-3 의 분할 첫 PR. wire additive (HopRecord + HopKind + Answer.hops
field) + RagCfg 의 multi_hop_* 3 노브. RAG pipeline 동작 미변경 —
모든 Answer literal 의 `hops = None`. PR-3b (후속) 가 ask_multi_hop
의 happy path 에서 dynamic decide loop 구현 + hops trace 채움.
분할 이유: 원래 PR-3 가 wire + cfg + decide loop + ScriptedLm +
helper refactor + 5+ tests 단일 PR 였는데 ~1500 줄 단일 patch 가
review 부담 + 회기 위험 ↑. additive foundation 부터 ship 후 decide
loop 별 PR — 사용자 결정 (2026-05-25).
- `kebab_core::HopRecord` (iter, kind, sub_queries,
context_chunks_added, forced_stop, llm_call_ms) + `HopKind`
(Decompose / Decide / Synthesize) — wire-additive shape.
- `kebab_core::Answer.hops: Option<Vec<HopRecord>>` —
`#[serde(default, skip_serializing_if = "Option::is_none")]`,
single-pass / refusal path 는 None, PR-3b 의 multi-hop happy
path 가 Some.
- `kebab_config::RagCfg` 에 3 신규 노브:
- `multi_hop_max_depth: u32` (default 3)
- `multi_hop_max_sub_queries_per_iter: u32` (default 5)
- `multi_hop_max_pool_chunks: u32` (default 30)
3 모두 `#[serde(default)]` + env override
(`KEBAB_RAG_MULTI_HOP_MAX_*`) + legacy parse 핀
(`LEGACY_PRE_TIMEOUT_TOML` 공유).
- 9 Answer literal site (pipeline.rs ×6 + kebab-cli + kebab-tui
tests + kebab-eval test) 에 `hops: None` 명시 추가. exhaustive
field check 가 자동 guard — 빠진 site 시 compile fail.
- plan 의 PR-3 단락 → PR-3a / PR-3b 분할 명시 + scope 정정.
Tests (163 passing across kebab-config + kebab-core + kebab-rag):
- 5 신규 multi-hop knob test (default / env override / legacy parse).
- 기존 50+57+31+19+3+3 test 모두 hops:None 추가 후도 통과.
Wire 영향: `answer.v1` 의 optional `hops` 필드 — `skip_serializing_
if = None` 이라 single-pass response 에 emit 안 됨. wire breaking
아님, JSON Schema 갱신은 PR-3b 또는 PR-4 (실제 emit 시점).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 07:15:01 +00:00
..
2026-05-02 04:01:55 +00:00
2026-05-02 18:01:14 +00:00
2026-05-03 12:57:38 +00:00
2026-05-04 17:34:30 +00:00
2026-05-04 16:34:51 +00:00
2026-05-05 11:28:11 +00:00
2026-05-07 19:18:27 +09:00
2026-05-07 11:12:05 +09:00
2026-05-07 14:54:43 +09:00
2026-05-07 17:49:04 +09:00
2026-05-09 00:40:46 +09:00
2026-05-09 14:16:42 +09:00
2026-05-09 17:43:26 +09:00
2026-05-09 23:31:29 +09:00
2026-05-10 03:34:39 +09:00
2026-05-10 12:14:26 +09:00
2026-05-10 17:45:57 +09:00
2026-05-10 22:19:44 +09:00
2026-05-10 23:02:37 +09:00
2026-05-10 18:58:35 +09:00
2026-05-10 20:10:39 +09:00
2026-05-15 14:31:22 +09:00
2026-05-19 15:36:08 +00:00
2026-05-20 00:26:58 +00:00
2026-05-20 08:58:45 +00:00
2026-05-20 10:27:13 +00:00
2026-05-20 12:55:36 +00:00
2026-05-21 13:15:22 +00:00
2026-05-21 11:16:55 +00:00
2026-05-23 00:57:37 +00:00
2026-05-25 07:15:01 +00:00