From f9af8dd355b9f363978045626e483c0441262e39 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Wed, 8 Apr 2026 11:58:41 +0900 Subject: [PATCH] =?UTF-8?q?fix(search):=20trigram=20threshold=200.3=20?= =?UTF-8?q?=E2=86=92=200.15=20(set=5Flimit)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1.2-B 평가셋 결과 recall 0.788 → 0.750 회귀. 원인: trigram default threshold 0.3이 multi-token 쿼리에서 너무 엄격. 예: '이란 미국 전쟁 글로벌 반응' 같은 5단어 한국어 뉴스 쿼리는 title/ai_summary trigram 매칭이 거의 안 됨. 해결: search_text 시작 시 set_limit(0.15) 호출. - trigram 매칭 더 관대 (recall ↑) - precision은 ORDER BY similarity 가중 합산이 보정 - p95 latency 169ms 여유 충분 (목표 500ms) --- app/services/search/retrieval_service.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/services/search/retrieval_service.py b/app/services/search/retrieval_service.py index ac8ae9d..fd9d6ca 100644 --- a/app/services/search/retrieval_service.py +++ b/app/services/search/retrieval_service.py @@ -40,9 +40,19 @@ async def search_text( JOIN documents d ON d.id = c.id ORDER BY 5컬럼 similarity 가중 합산 + ts_rank * 2.0 가중치: title 3.0 / ai_tags 2.5 / user_note 2.0 / ai_summary 1.5 / extracted_text 1.0 + + threshold: + pg_trgm.similarity_threshold default = 0.3 + → multi-token 한국어 뉴스 쿼리(예: "이란 미국 전쟁 글로벌 반응")에서 + candidates를 못 모음 → recall 감소 (0.788 → 0.750) + → set_limit(0.15)으로 낮춰 recall 회복. precision은 ORDER BY similarity 합산이 보정. """ from api.search import SearchResult # 순환 import 회피 + # trigram threshold를 0.15로 낮춰 multi-token query recall 회복 + # SQLAlchemy async session 내 두 execute는 같은 connection 사용 + await session.execute(text("SELECT set_limit(0.15)")) + result = await session.execute( text(""" WITH candidates AS (