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 입력에서 제외