From 2f152911f72f9d81d089e0f870a4368e1dfa672a Mon Sep 17 00:00:00 2001 From: hyungi Date: Mon, 25 May 2026 06:14:59 +0000 Subject: [PATCH] feat(search): /ask corpus_variant + exact_knn (EVAL-ONLY) for passage-RAG diagnose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-DocSrv-Hier-PassageRAG-Diagnose-1 c1. /ask evidence retrieval 의 chunk leg 를 측정 뷰(prehier/hier_sim_*)로 교체 + exact_knn — passage evidence 단위(hier 절 vs legacy 윈도우) 비교용. /search 와 동일 패턴, run_search 전달. EVAL-ONLY 박제, default(미지정) 시 기존 /ask byte/behavior 동일(회귀 0). pattern 검증 → 잘못된 값 422. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/api/search.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/api/search.py b/app/api/search.py index 2b888ba..431f0c3 100644 --- a/app/api/search.py +++ b/app/api/search.py @@ -582,6 +582,22 @@ async def ask( ), ), ] = None, + corpus_variant: str | None = Query( + None, + pattern=r"^(prehier|hier_sim_raw|hier_sim_clean)$", + description=( + "⚠️ EVAL-ONLY (Hier-PassageRAG-Diagnose-1). evidence retrieval 의 chunk leg 를 측정 뷰로 " + "교체 — prehier(legacy) | hier_sim_raw | hier_sim_clean. 운영 UI 미사용. " + "미지정 = production corpus_chunks (기존 /ask 동작 동일)." + ), + ), + exact_knn: bool = Query( + False, + description=( + "⚠️ EVAL-ONLY (Hier-PassageRAG-Diagnose-1). vector leg exact KNN (ivfflat 근사 제거). " + "passage 변종 공정 비교용. 운영 미사용. 미지정(false) = 기존 /ask 동작 동일." + ), + ), x_source: Annotated[str | None, Header(alias="X-Source")] = None, x_eval_case_id: Annotated[str | None, Header(alias="X-Eval-Case-Id")] = None, x_eval_token: Annotated[str | None, Header(alias="X-Eval-Token")] = None, @@ -601,10 +617,11 @@ async def ask( defense_log: dict = {} # per-layer flag snapshot source, eval_case_id = _resolve_eval_identity(x_source, x_eval_case_id, x_eval_token) - # 1. 검색 파이프라인 + # 1. 검색 파이프라인 (corpus_variant/exact_knn = EVAL-ONLY, 미지정 시 기존 동작 동일) pr = await run_search( session, q, mode="hybrid", limit=limit, fusion=DEFAULT_FUSION, rerank=True, analyze=True, + corpus_variant=corpus_variant, exact_knn=exact_knn, ) # 1.5. ask_includable=false 문서를 evidence 입력에서 제외