Capstone 11 — LLM 관측성과 평가 대시보드(LLM Observability & Eval Dashboard)

Langfuse는 오픈 코어(open-core) 모델로 전환했습니다. Arize Phoenix는 2026년 GenAI 시맨틱 컨벤션(semantic convention) 매핑을 공개했고, Helicone과 Braintrust는 사용자별 비용 귀속(per-user cost attribution)에 더욱 집중했습니다. Traceloop의 OpenLLMetry는 사실상 표준 SDK 계측(instrumentation) 도구로 자리 잡았습니다. 프로덕션 구성은 trace 저장용 ClickHouse, 메타데이터(metadata)용 Postgres, UI용 Next.js, 그리고 표본 추출된 trace 위에서 도는 평가(eval) 작업 묶음(DeepEval, RAGAS, LLM-judge)이 일반적입니다. 이런 시스템을 셀프 호스팅(self-hosted)으로 직접 구축하고, 최소 네 가지 SDK 계열에서 trace를 수집하며, 일부러 주입한 회귀(regression)를 5분 안에 잡아내는 것을 목표로 합니다.

유형: Capstone 언어: TypeScript(UI), Python / TypeScript(ingest + evals), SQL(ClickHouse) 선수 지식: Phase 11(LLM engineering), Phase 13(tools), Phase 17(infrastructure), Phase 18(safety) 실습 Phase: P11 · P13 · P17 · P18 예상 시간: 25시간

문제

2026년에 프로덕션 트래픽을 운영하는 모든 AI 팀은 모델 옆에 관측성 평면(observability plane)을 함께 둡니다. 비용 귀속(cost attribution), 환각(hallucination) 감지, 드리프트(drift) 모니터링, 탈옥(jailbreak) 신호 분석, SLO(Service Level Objective) 대시보드, PII(Personally Identifiable Information; 개인식별정보) 유출 알림이 모두 필요하기 때문입니다. Langfuse, Phoenix, OpenLLMetry 같은 오픈소스 레퍼런스는 OpenTelemetry GenAI 시맨틱 컨벤션을 수집 스키마(schema)로 사용하도록 수렴했습니다. 이제 하나의 SDK로 OpenAI, Anthropic, Google, LangChain, LlamaIndex, vLLM을 계측(instrument)하고 호환되는 span을 전송할 수 있습니다.

이 강의에서는 최소 네 가지 SDK 계열에서 trace를 수집하고, 표본 추출된 trace 위에서 작은 평가 작업 묶음을 실행하며, 드리프트를 감지하고, 알림(alert)까지 보내는 셀프 호스팅 대시보드를 만듭니다. 측정 기준은 명확합니다. 일부러 주입한 회귀, 예를 들어 프롬프트가 갑자기 PII를 생성하기 시작하는 상황을 대시보드가 5분 안에 잡아내고 알림을 발송해야 합니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.프로덕션 LLM 관측성 플랫폼이 OpenTelemetry GenAI 시맨틱 컨벤션(semantic conventions)을 수집 스키마로 수렴하는 이유는 무엇인가요?

2.OpenTelemetry 컬렉터에서 테일 샘플링(tail sampling)이란 무엇이며, LLM 관측성에 왜 중요한가요?

0/2 답변 완료

개념

수집(ingest)은 OTLP(OpenTelemetry Protocol) HTTP로 받습니다. SDK는 GenAI 시맨틱 컨벤션을 따르는 span을 만듭니다. 예를 들어 gen_ai.system, gen_ai.request.model, gen_ai.usage.input_tokens, gen_ai.response.id, llm.prompts, llm.completions 같은 속성이 포함됩니다. Span은 컬럼 기반 분석(columnar analytics)을 위해 ClickHouse에 저장하고, 사용자, 세션, 앱 같은 메타데이터는 Postgres에 저장합니다.

평가는 표본 추출된 trace 위에서 배치 작업(batch job)으로 실행됩니다. DeepEval은 충실성(faithfulness), 독성(toxicity), 답변 관련성(answer relevance)을 점수화합니다. RAGAS는 trace가 검색 컨텍스트(retrieval context)를 포함할 때 검색 지표를 점수화합니다. 커스텀 LLM-judge는 도메인 특화 검사, 예를 들어 PII 유출이나 정책 밖 응답(off-policy response) 같은 항목을 확인합니다. 평가 실행 결과는 부모 trace에 연결된 eval span의 형태로 같은 ClickHouse에 다시 기록됩니다.

드리프트 감지는 시간에 따른 임베딩 공간(embedding space) 분포를 살펴봅니다. 프롬프트 임베딩에 PSI(Population Stability Index) 또는 KL 발산(KL divergence)을 계산하고, 평가 점수 추세도 함께 살핍니다. 알림은 Prometheus Alertmanager로 보내고, 이후 Slack 또는 PagerDuty로 라우팅합니다. UI는 Recharts를 사용하는 Next.js 15로 구성합니다.

아키텍처

production apps:
  OpenAI SDK  +  Anthropic SDK  +  Google GenAI SDK
  LangChain + LlamaIndex + vLLM
       |
       v
  OpenTelemetry SDK with GenAI semconv
       |
       v  OTLP HTTP
  collector (ingest, sample, fan-out)
       |
       +-------------+-----------+
       v             v           v
   ClickHouse    Postgres    S3 archive
   (spans)       (metadata)  (raw events)
       |
       +---> eval jobs (DeepEval, RAGAS, LLM-judge)
       |     sampled or all-trace
       |     write eval spans back
       |
       +---> drift detector (PSI / KL on prompt embeddings)
       |
       +---> Prometheus metrics -> Alertmanager -> Slack / PagerDuty
       |
       v
   Next.js 15 dashboard (Recharts)

스택

  • 수집(Ingest): OpenTelemetry SDK와 GenAI 시맨틱 컨벤션, OTLP HTTP 전송(transport)을 사용합니다.
  • Collector: 비용 제어를 위해 tail-sampling 프로세서가 포함된 OpenTelemetry Collector를 사용합니다.
  • 저장소(Storage): span은 ClickHouse에, 메타데이터는 Postgres에, 원본 이벤트(raw event) 아카이브는 S3에 저장합니다.
  • 평가(Eval): DeepEval, RAGAS 0.2, Arize Phoenix 평가기(evaluator) 묶음, 커스텀 LLM-judge를 함께 사용합니다.
  • 드리프트(Drift): sentence-transformers로 만든 풀링된(pooled) 프롬프트 임베딩에 대해 PSI 또는 KL 발산을 주간 단위로 계산합니다.
  • 알림(Alerting): Prometheus Alertmanager → Slack / PagerDuty 체인을 사용합니다.
  • UI: Next.js 15 App Router + Recharts + 서버 액션(server actions)을 사용합니다.
  • 기본 지원 SDK: OpenAI, Anthropic, Google GenAI, LangChain, LlamaIndex, vLLM입니다.

직접 만들기

  1. Collector 설정. OTLP HTTP 수신기(receiver)를 갖춘 OpenTelemetry Collector를 구성합니다. tail-sampler는 오류 trace의 100%, 성공 trace의 10%를 보존하도록 설정하고, 익스포터(exporter)는 ClickHouse와 S3로 둡니다.

  2. ClickHouse 스키마. spans 테이블을 만들고, 컬럼은 GenAI 시맨틱 컨벤션을 반영합니다. 예를 들어 gen_ai_system, gen_ai_request_model, input_tokens, output_tokens, latency_ms, prompt_hash, trace_id, parent_span_id 같은 컬럼을 두고, 긴 페이로드(payload)를 위한 JSON 백(bag) 컬럼도 함께 둡니다. user_idapp_id에는 보조 인덱스(secondary index)를 추가합니다.

  3. SDK 커버리지 테스트. 각 SDK(OpenAI, Anthropic, Google, LangChain, LlamaIndex, vLLM)를 사용하는 작은 클라이언트 앱을 만들고 OpenLLMetry 자동 계측(auto-instrument)을 적용합니다. 각각이 표준(canonical) GenAI span을 생성해 ClickHouse에 도착하는지 확인합니다.

  4. 평가 작업(Eval jobs). 스케줄된 작업이 최근 15분 동안 표본 추출된 trace를 읽고 DeepEval의 faithfulness, toxicity, answer relevance를 실행합니다. 출력은 부모 trace에 연결된 eval span입니다.

  5. 커스텀 LLM-judge. PII 유출 판정기(PII-leak judge)를 만듭니다. 응답을 입력으로 받아 가드 LLM(guard LLM)을 호출하고 PII 유출 가능성을 점수화합니다. 점수가 높은 응답은 분류 대기열(triage queue)로 보냅니다.

  6. 드리프트 감지. 주간 작업이 이번 주의 풀링된 프롬프트 임베딩과 직전 4주 베이스라인(baseline) 사이의 PSI를 계산합니다. PSI가 임계값(threshold)을 넘으면 알림을 보냅니다.

  7. 대시보드. Next.js 15로 페이지를 만듭니다. 개요(spans/sec, cost/user, p95 latency), traces(검색 + 워터폴(waterfall)), 평가(faithfulness 추세, toxicity), 드리프트(시간에 따른 PSI), 알림 페이지를 포함합니다.

  8. 알림 체인(Alerting chain). Prometheus 익스포터가 평가 점수 집계(aggregate)와 지연 백분위(latency percentile)를 읽습니다. Alertmanager는 경고(warning)는 Slack으로, 치명적 위반(critical breach)은 PagerDuty로 보냅니다.

  9. 회귀 탐침(Regression probe). 버그를 주입합니다. 평가 대상 챗봇(chatbot)이 1% 확률로 가짜 SSN(Social Security Number)을 유출하도록 만들고, 버그 배포부터 Slack 알림까지 걸린 MTTR(Mean Time To Recovery/Resolve)을 측정합니다.

사용해보기

$ curl -X POST https://my-otel-collector/v1/traces -d @trace.json
[collector]  accepted 1 trace, 3 spans
[clickhouse] inserted 3 spans (app=chat, user=u_42)
[eval]       DeepEval faithfulness 0.82, toxicity 0.03
[drift]      weekly PSI 0.08 (below 0.2 threshold)
[ui]         live at https://obs.example.com

산출물 만들기

outputs/skill-llm-observability.md가 제출 산출물입니다. LLM 애플리케이션(application)이 주어지면 이 대시보드는 trace를 수집하고, 평가를 실행하고, 드리프트에 대해 알림을 보내며, Next.js에서 사용자별 비용 내역(breakdown)을 보여 주어야 합니다.

가중치기준측정 방법
25Trace 스키마 커버리지표준 GenAI span을 생성하는 SDK 계열의 수(목표: 6개 이상)
20평가 정확도(Eval correctness)수작업 라벨링 데이터셋 대비 DeepEval / RAGAS 점수
20대시보드 UX주입된 회귀(regression)의 MTTR(목표: 5분 미만)
20비용 / 규모(Cost / scale)적체(backlog) 없이 1k spans/sec 지속 수집
15알림 + 드리프트 감지Prometheus/Alertmanager 체인의 종단간(end-to-end) 실행
100

연습문제

  1. (쉬움) Haystack 프레임워크용 커스텀 계측(custom instrumentation)을 추가하세요. ClickHouse에 충실한(faithful) gen_ai.* 속성이 포함된 표준 span이 도착하는지 확인합니다.

  2. (중간) 같은 trace에서 DeepEval을 Phoenix 평가기로 교체하세요. 두 평가 엔진(eval engine) 사이의 점수 드리프트(score drift)를 측정합니다.

  3. (중간) 드리프트 감지기를 더 정교하게 만드세요. 전체 단위(global)가 아닌 app_id별 PSI를 계산하고, 앱별 드리프트 추이(trail)를 보여 줍니다.

  4. (중간) "user impact" 페이지를 추가하세요. 스파크라인(sparkline)과 함께 사용자별 비용(cost-per-user)과 사용자별 실패율(failure-rate-per-user)을 함께 보여 줍니다.

  5. (어려움) toxicity가 0.5를 초과하는 trace는 100% 보존하고, 나머지는 10% 계층 표본(stratified sample)으로 보존하는 tail-sampling 정책을 설계하세요. 이로 인해 도입되는 표본 추출 편향(sampling bias)을 측정합니다.

핵심 용어

용어흔한 설명실제 의미
GenAI semconv"OTel LLM 속성"system, model, token처럼 LLM span 속성을 정의하는 2025년 OpenTelemetry 규격이다.
Tail sampling"trace 이후 표본 추출"trace가 완료된 뒤 collector가 보존(keep) 또는 폐기(drop) 여부를 결정하는 방식으로, 오류 정보를 보고 판단할 수 있다.
PSI(Population Stability Index)"분포 안정성 지수"두 분포를 비교하는 드리프트 지표로, 일반적으로 0.2를 초과하면 의미 있는 드리프트를 뜻한다.
LLM-judge"모델로 평가"한 LLM이 다른 LLM의 출력을 채점 기준(rubric)에 따라 점수화하는 방식이며, faithfulness, toxicity, PII 등을 평가할 수 있다.
Tail-sampling policy"보존 규칙"어떤 trace를 저장하고 어떤 trace를 버릴지 정하는 규칙으로, 오류 보존과 표본 비율(sample rate)을 함께 정의한다.
Eval span"연결된 평가 trace"원래의 LLM 호출(call) span에 연결된 자식 span(child span)으로, 평가 점수를 담는다.
Cost per user"단위 경제성(unit economics)"특정 기간 동안 user_id에 귀속된 달러 비용으로, 중요한 제품 지표이다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

llm-observability

Build a self-hosted LLM observability dashboard that ingests OpenTelemetry GenAI spans, runs evals, and catches injected regressions in under five minutes.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.회귀 탐침(regression probe)은 챗봇이 1% 확률로 가짜 SSN을 유출하는 버그를 주입합니다. 목표 MTTR은 배포부터 슬랙 알림까지 5분입니다. 이를 달성하기 위해 함께 작동해야 하는 구성요소는 무엇인가요?

2.드리프트 감지기는 풀링된 프롬프트 임베딩에 대해 주간 단위로 PSI(Population Stability Index)를 계산합니다. PSI가 0.2를 초과하면 알림이 발생합니다. 이 드리프트를 일으킬 수 있는 실제 변화는 무엇인가요?

3.대시보드는 사용자별 비용 귀속(per-user cost attribution)을 보여줍니다. 이 지표가 단순한 예산 관리를 넘어 중요한 이유는 무엇인가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다