본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

관측 가능성: 조용한 품질 저하 감시

~22 min · ops, monitoring

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

조용히 나빠질 수 있는 것들

  • 캐시 적중률 하락 — 파이프라인 회귀, 캐시 키 변경, 캐시 삭제가 원인일 수 있어.
  • 상위 k개 점수 분포 변화 — 코퍼스의 변화나 임베딩 모델 회귀를 뜻할 수 있어.
  • 빈 결과 비율 상승 — 필터가 너무 강하거나 최저 점수가 너무 높거나 코퍼스에 빈틈이 있을 수 있어.
  • 지연 시간의 점진적 상승 — 인덱스 증가, autovacuum 지연, GPU 경합이 원인일 수 있어.
  • LLM의 '모르겠다' 비율 상승 — 검색 품질 저하가 생성 단계까지 번졌다는 신호야.

최소 대시보드

다음 여섯 지표를 시간순으로 그리면 조용한 실패 대부분을 사용자보다 먼저 잡을 수 있어.

  1. 분당 쿼리 수
  2. 단계별 검색 지연 시간의 중앙값과 p95
  3. 1위 점수의 중앙값과 p95
  4. 최저 점수를 넘는 후보가 없는 빈 결과 비율
  5. 임베딩 캐시 적중률
  6. LLM의 '모르겠다' 응답 비율

Code

prometheus-client로 검색 지표 내보내기·python
from prometheus_client import Histogram, Counter

QUERY_LATENCY = Histogram('retrieval_latency_seconds', 'End-to-end retrieval latency', ['stage'])
TOP1_SCORE    = Histogram('retrieval_top1_score', 'Top-1 similarity score')
EMPTY_RESULT  = Counter('retrieval_empty_total', 'Queries that returned no candidates above floor')

def instrumented_retrieve(question: str, k: int = 5, min_score: float = 0.3):
    with QUERY_LATENCY.labels(stage='embed').time():
        qvec = embed(question)
    with QUERY_LATENCY.labels(stage='search').time():
        results = query(NEW, qvec, k)
    above = [r for r in results if (1 - r['distance']) >= min_score]
    if not above:
        EMPTY_RESULT.inc()
    elif above:
        TOP1_SCORE.observe(1 - above[0]['distance'])
    return above

External links

Exercise

지연 시간, 1위 점수, 빈 결과 비율, 캐시 적중률을 검색기에 연결해 하루 동안 실행하고 그래프를 확인해. 새벽 3시에 깨워야 할 만큼 중요한 수치 하나를 고르면 그것이 서비스 수준 목표의 출발점이 돼.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.