콘텐츠로 이동

LLM 관측성과 평가

분류: Layer 12 - AI 시스템 & LLM 애플리케이션 | 선수지식: L6-40 (Logs/Metrics/Traces), L11-80 (모델 평가), L12-10 (LLM API), L12-60 (Agent)

LLM 관측성과 평가 — Tracing, Metrics, Production Eval, Drift

섹션 제목: “LLM 관측성과 평가 — Tracing, Metrics, Production Eval, Drift”

LLM 관측성·평가는 production LLM 앱의 trace·metric·eval을 통합해 품질·비용·지연·안전을 지속 측정하는 시스템이며, OpenTelemetry GenAI semantic convention과 LangSmith/Langfuse/Arize 같은 도구가 표준이다.

  • Production 운영 핵심: 평가 없이는 prompt·모델 변경의 영향 알 수 없음
  • LLM 특유 지표: latency·cost·token·cache·hallucination — 일반 APM과 다름
  • Agent loop debug: trace 없으면 multi-step agent 디버그 불가능 (L12-60)
  • Continuous improvement: gold dataset + LLM-as-judge + 사용자 피드백 loop
  • Compliance·사고 대응: audit log, drift detection, incident replay

2.5 등장 배경 — 전통 APM이 LLM에서 무너진 지점

섹션 제목: “2.5 등장 배경 — 전통 APM이 LLM에서 무너진 지점”

LLM 관측·평가는 새로 발명된 것이 아니라, 전통 APM(Datadog·NewRelic·Jaeger 같은 distributed tracing)이 LLM 워크로드에서 4가지 가정이 깨지면서 등장했다. 선행 토픽 L6-40 logs-metrics-traces는 metric·log·trace로 분산 시스템을 보는 법을 제공하고, L11-80 model-evaluation-and-data-quality(오프라인 평가)와 L12-10 llm-api-basics(token·cost 단위)는 각각 “평가는 학습 직후 한 번”, “RPC 한 번에 비용 고정”이라는 가정 위에 동작했는데, production LLM은 그 양쪽을 모두 깨뜨린다.

전통 APM 가정LLM에서 깨지는 양상GenAI semconv가 푸는 방식
한 request = 한 RPC 비용한 요청 안에 input 150 / output 320 token, 모델별 단가 4~30배 차gen_ai.usage.input_tokens / output_tokens / request.model 분리 attribute
Response body는 byte 단위 로그prompt 수 KB ~ 수 MB, 이미지·tool call 포함 (멀티 KB 페이로드는 기존 OTel가 설계 대상으로 삼은 적 없음)events·streaming span 별도 신호
같은 입력 → 같은 출력 (deterministic)같은 prompt가 hallucination/refusal로 분기 → error rate로는 안 잡힘finish_reasons, 별도 quality metric (faithfulness 등)
Trace는 HTTP/DB 호출만한 응답 안에 retrieve → rerank → tool call → LLM call 4단 hierarchicalgen_ai.* + LLM·retrieval·tool span 통합

정량 한계 신호: provider별 SDK가 단편화된 결과 — OpenAI/Anthropic/Gemini가 각자 다른 trace 형식 사용, Langfuse·Helicone·LangSmith가 각자 incompatible proprietary 포맷 채택 → 한 도구에서 다른 도구로 trace 옮기면 호환 attribute가 거의 0개. 이게 vendor lock-in을 만들었고, OTel SIG는 2024-04에 GenAI SIG를 발족해 이 단편화를 해결한다고 명시한다.

해결 메커니즘 → 본문 연결: §3.1의 “LLM Observability vs 일반 APM” 표가 위 4가지 깨짐의 dimension 측 결과이고, §3.2의 gen_ai.* attribute 목록이 그 단편화 해소의 구체적 schema다. §3.4의 도구 분류(“OpenTelemetry 표준” 카테고리)가 이 lineage 위에서 비로소 의미를 가진다.

이 토픽이 사라지면: prompt·모델 변경 후 회귀를 잡을 표준 trace 형식이 사라져 도구마다 instrumentation을 따로 짜야 하고, drift·hallucination 같은 LLM 특유 silent failure가 일반 error rate에 숨어 production에서만 발견된다.

출처: OpenTelemetry GenAI Semantic Conventions, OpenTelemetry for Generative AI blog (2024).

전통 APM(Datadog, NewRelic) + LLM 특유 dimensions.

차이점전통 APMLLM Observability
단위request, span, error+ prompt, completion, tool call
비용infra cost+ token cost (input/output 분리)
품질error rate+ hallucination, faithfulness, helpfulness
LatencyRT+ TTFT, TPOT, queue
결정성deterministicnon-deterministic — 같은 입력 다른 출력
Tracedistributed trace+ LLM·tool·retrieval 통합 trace

3.2 OpenTelemetry GenAI Semantic Conventions

섹션 제목: “3.2 OpenTelemetry GenAI Semantic Conventions”

OpenTelemetry가 2024-2025에 정착시킨 LLM trace 표준.

gen_ai.system: "openai"
gen_ai.operation.name: "chat"
gen_ai.request.model: "gpt-4o"
gen_ai.request.temperature: 0.7
gen_ai.request.max_tokens: 1000
gen_ai.usage.input_tokens: 150
gen_ai.usage.output_tokens: 320
gen_ai.usage.total_tokens: 470
gen_ai.response.id: "..."
gen_ai.response.finish_reasons: ["stop"]
  • provider 중립: OpenAI·Anthropic·Gemini·open-weight 모두 같은 schema
  • 도구 호환: Datadog, NewRelic, Honeycomb, Grafana 모두 자동 파싱
  • OpenLLMetry, Traceloop: 자동 instrument 라이브러리 (Python·TS)
  • 버전 고정 필요: GenAI semconv는 development 상태이므로 instrumentation 버전과 OTEL_SEMCONV_STABILITY_OPT_IN 같은 opt-in 정책을 CI에서 고정

LLM 앱은 hierarchical trace로 표현.

[Request: chat completion]
├─ Span: prompt_construction (RAG)
│ ├─ Span: query_embedding (10ms)
│ ├─ Span: vector_search (15ms)
│ ├─ Span: reranker (50ms)
│ └─ Span: prompt_assembly (1ms)
├─ Span: llm_call (gpt-4o, 1.2s)
│ ├─ TTFT: 250ms
│ ├─ Output: 320 tokens
│ └─ Cost: $0.005
├─ Span: tool_call (search_db, 200ms)
└─ Span: output_filter (5ms)

짧은 TypeScript pseudo instrumentation은 다음처럼 시작한다. 핵심은 prompt 원문을 span attribute에 바로 넣지 않고, 버전·토큰·해시·finish reason처럼 join 가능한 값만 남기는 것이다.

import { trace, SpanStatusCode } from "@opentelemetry/api";
const tracer = trace.getTracer("refund-agent");
async function runLlmStep(input: RedactedInput) {
return tracer.startActiveSpan("llm_call", async (span) => {
span.setAttributes({
"gen_ai.system": "openai",
"gen_ai.operation.name": "chat",
"gen_ai.request.model": "gpt-4.1",
"app.prompt.version": "refund-v13",
"app.input.hash": input.hash,
});
try {
const result = await llm.chat(input.messages);
span.setAttributes({
"gen_ai.usage.input_tokens": result.usage.input_tokens,
"gen_ai.usage.output_tokens": result.usage.output_tokens,
"gen_ai.response.finish_reasons": result.finish_reason,
});
return result;
} catch (error) {
span.setStatus({ code: SpanStatusCode.ERROR });
span.recordException(error as Error);
throw error;
} finally {
span.end();
}
});
}

Langfuse는 trace·span·generation을 보여주는 관측성 레이어이고, evaluation system은 dataset·run·grader·report를 관리하는 품질 판단 레이어다. 둘을 섞으면 “trace는 많은데 어떤 변경이 좋아졌는지 모르는” 상태가 된다.

경계책임저장해야 하는 키
Traceproduction 요청 1건의 실제 실행 경로, prompt 조립, retrieval, tool, LLM calltrace_id, span_id, session_id, user_hash, version
Eval run특정 dataset 버전 × app/prompt/model 버전을 재실행한 결과eval_run_id, dataset_version, app_version, trace_id
Scoretrace·observation·dataset run에 붙는 품질 판단. numeric/categorical/boolean/textscore_name, rubric_version, judge_model, score
Reportbaseline 대비 delta, 실패 케이스, CI gate 통과 여부baseline_run_id, candidate_run_id, decision
OpenTelemetry exportprovider 중립 trace 전송. Langfuse 외 Datadog·Grafana·Phoenix로도 보낼 수 있는 포맷gen_ai.*, service.*, deployment.environment
Langfuse-specific metadataLangfuse UI·dataset·score 분석에 필요한 확장 필드prompt_version, release, tags, metadata

운영 규칙:

  • trace와 eval run은 1:N으로 연결한다. production trace 1개가 나중에 여러 grader나 prompt 후보의 eval input으로 재사용될 수 있기 때문이다.
  • trace_id는 원인 분석용, eval_run_id는 의사결정용이다. 장애 디버깅은 trace에서 시작하고, 배포 승인·회귀 판정은 eval report에서 끝난다.
  • gen_ai.*는 공통 필드만 담는다: gen_ai.operation.name, gen_ai.request.model, token usage, finish reason처럼 도구 간 이동 가능한 값을 우선한다. prompt 원문·retrieved chunk 원문은 span attribute에 무조건 넣지 말고 events 또는 vendor-specific input/output 필드에 opt-in으로 둔다.
  • privacy/redaction은 수집 전 단계가 원칙이다. Langfuse masking, OTel Collector processor, app-level PII redactor 중 하나를 ingestion 앞에 두고, 이메일·전화번호·계정 ID·tool argument 안의 secret을 테스트 fixture로 검증한다.
  • redaction 후 재현성 손실을 보완한다. 원문을 지우면 사고 재현이 어려우므로 input_hash, document_id, retrieval_chunk_id, prompt_version처럼 비식별 재현 키를 함께 남긴다.

L12에서는 일반 observability 자체보다 LLM/agent trace를 reliability decision으로 바꾸는 과정이 핵심이다. 장애 분석은 dashboard 평균값에서 끝나지 않고, 실패한 요청의 trace_id를 기준으로 span·score·deployment version을 좁혀야 한다.

Alert: hallucination rate +8%p, cost/request +35%
Trace filter: route=refund_agent, app_version=2026.05.20, model=gpt-4.1
Span diff:
- retrieval_top_k: 5 → 20
- prompt_version: refund-v12 → refund-v13
- tool_call.retry_count: 0 → 3
Eval linkage:
- failed trace 40건을 dataset candidate로 저장
- baseline run과 candidate run의 slice별 delta 비교
Decision:
- prompt v12 rollback
- retrieval_top_k guardrail 상한 8
- high-value refund route는 approval gate 임시 적용

원인 분석 체크포인트:

  • 증상 metric: latency·cost·hallucination·refusal·tool error 중 무엇이 먼저 움직였는지 확인한다.
  • span coverage: 실패 구간이 trace에 없으면 먼저 instrumentation 누락을 고친다. trace 없는 eval score는 원인 분석이 아니라 알림에 가깝다.
  • version join: prompt_version, model, retriever_version, tool_schema_version, guardrail_policy_version을 span에 남겨야 rollback 범위가 좁아진다.
  • failure slice: 전체 평균보다 route, tenant tier, language, retrieval hit/miss, tool name별로 회귀를 본다.
  • replay 가능성: redaction된 trace라도 input_hash, dataset_item_id, document_id, seed, temperature가 있어야 재현 실험으로 이어진다.
도구특징
LangSmithLangChain 기본. trace + eval + dataset
Langfuseopen-source, self-host 가능. trace + cost + eval
HeliconeAPI gateway + cost dashboard + caching
Arize Phoenixopen-source, eval·drift 강력
OpenLLMetry / TraceloopOpenTelemetry 기반. 자동 instrument
Weights & Biases (Weave)ML 생태계 통합. dataset·eval·trace
Datadog LLM Observabilityenterprise APM 통합
AgentOpsagent trace 특화
Portkeygateway + observability + 라우팅
Logfire (Pydantic)Python 친화, OpenTelemetry-native
  • OpenTelemetry 표준: OpenLLMetry, Logfire, Datadog
  • Open-source self-host: Langfuse, Phoenix
  • LangChain 생태계: LangSmith
  • API gateway 통합: Helicone, Portkey
  • Agent 특화: AgentOps, Phoenix
  • TTFT P50/P95/P99 (target: <1s)
  • TPOT P50/P95/P99 (target: 30~50ms)
  • End-to-end latency
  • Queue depth (시간대별)
  • 호출당 input/output 토큰 분포
  • 모델별 호출 수·비용
  • Cache hit ratio (target 50%+)
  • 사용자/feature/route별 비용 attribution
  • Hallucination rate (faithfulness 기반)
  • Refusal rate
  • 사용자 피드백 (👍/👎)
  • Eval 점수 추이
  • Error rate (rate limit, timeout, content filter)
  • Tool success rate
  • Agent task completion rate

3.6 Production Eval (L11-80 §3.7 재방문)

섹션 제목: “3.6 Production Eval (L11-80 §3.7 재방문)”

도메인·작업별 정답 셋 (100~500개). 사람이 검수.

  • prompt·모델·tool 변경 시 회귀 검증
  • Promptfoo, Braintrust, LangSmith Hub로 dashboard
  • 자동 metric (BLEU·ROUGE·exact match) → 1차
  • LLM-as-judge (GPT-4·Claude) → 자유 텍스트
  • 사람 검수는 의심 케이스만 (sampling 또는 disagreement-based)
  • bias 주의 (L11-80 §3.5): position·verbosity·self-enhancement·limited reasoning
방식설명사용처
Offline변경 전 gold dataset에 회귀CI/CD에 통합, 빠른 회귀
Onlineproduction traffic 일부에 A/B실 사용자 영향 측정
Shadowproduction traffic 복사로 비교위험 없이 비교

production eval은 “테스트 스크립트 하나”가 아니라 작은 CI 시스템처럼 구성한다.

[Dataset Registry]
↓ dataset_version 고정
[Runner]
↓ app/prompt/model 실행 + trace_id 생성
[Run Store]
↓ output, latency, cost, trace_id, artifacts 저장
[Grader]
↓ deterministic check + LLM-as-judge + human sample
[Report]
↓ baseline vs candidate 비교, failure slice
[CI Gate]
↓ merge/block/manual review
컴포넌트책임실패 모드
Dataset registrygold/shadow/production-sampled dataset과 version, owner, task schema 관리dataset이 production drift를 반영 못 함
Run store각 dataset item의 input/output/trace_id/score/artifact를 immutable 저장run 재현 불가, baseline이 덮어써짐
Graderexact match, schema validation, Ragas, LLM-as-judge, human annotation 실행judge prompt 변경으로 점수 의미가 바뀜
Reportscore 평균보다 slice별 회귀, p-value/Wilson interval, top failures 출력평균 점수는 통과하지만 특정 언어·고객군에서 회귀
CI gate품질·비용·지연 임계 통과 시 배포 승인, 실패 시 block 또는 manual reviewflaky judge 때문에 배포가 무작위로 막힘

최소 데이터 모델은 trace와 eval decision을 join할 수 있을 만큼만 시작한다.

테이블/레코드최소 필드목적
datasetsdataset_name, dataset_version, owner, task_schema_hash어떤 평가 셋을 썼는지 고정
dataset_itemsdataset_item_id, dataset_version, input_hash, expected_artifact_ref, slice_tags재현 가능한 평가 입력과 slice 기준
eval_runseval_run_id, baseline_run_id, app_version, prompt_version, model_route, started_at, git_sha배포 후보 단위의 비교 기준
eval_resultseval_run_id, dataset_item_id, trace_id, output_hash, latency_ms, cost_usd, status실행 결과와 production trace 연결
scoreseval_run_id, dataset_item_id, score_name, score, rubric_version, grader_name, judge_model점수 의미와 평가 기준 version 고정

최소 운영 계약:

  • dataset은 dataset_name@version으로 pinning한다. “latest dataset”으로 CI를 돌리면 같은 commit이 매일 다른 결과를 낸다.
  • run store는 append-only로 둔다. candidate가 baseline을 덮어쓰면 회귀 분석이 불가능하다.
  • grader는 grader_name, rubric_version, judge_model, temperature, prompt_hash를 score와 함께 남긴다.
  • report는 전체 평균 1개가 아니라 slice를 포함한다: language, route, retrieval hit/miss, input length bucket, tenant tier.
  • CI gate는 hard fail과 soft fail을 나눈다. 예: JSON schema 위반·PII leak은 hard fail, helpfulness -2%p는 manual review.

Evaluation and Reliability Engineering 연결

섹션 제목: “Evaluation and Reliability Engineering 연결”

eval은 “품질 점수표”가 아니라 변경을 배포해도 되는지 판단하는 reliability gate다. SRE의 SLO/error budget이 배포 속도를 조절하듯, LLM 앱에서는 eval score·trace coverage·guardrail violation·human approval rate가 배포 결정을 조절한다.

Reliability 질문Eval/Trace 신호운영 결정
이 prompt를 배포해도 되는가gold dataset pass, slice regression 없음, judge 안정자동 merge 또는 canary 시작
특정 route가 위험해졌는가hallucination/refusal/tool error가 route slice에서만 상승route 단위 rollback 또는 feature flag off
모델 교체가 비용을 폭주시켰는가token/request, retry_count, cache hit ratio 회귀model routing rollback, max token guardrail
자동 실행을 유지해도 되는가confidence 낮음, guardrail hit 증가, human override 증가approval gate 삽입 또는 risk threshold 상향
평가 자체를 믿어도 되는가calibration agreement 하락, swap consistency 하락judge hard gate 해제, 사람 검수 queue로 전환

배포 파이프라인에서는 gate를 3단계로 나눈다.

Pre-merge:
deterministic check + offline eval + PII/schema hard gate
Canary:
1~5% traffic + trace coverage + cost/latency SLO + online feedback
Full rollout:
drift monitor + rollback window + failure trace auto-import

guardrail·rollback·approval gate는 같은 decision layer에 둔다.

  • Guardrail: 실행 전후 invariant를 강제한다. 예: JSON schema, PII 출력 금지, tool argument allowlist, max token, retrieval top-k 상한.
  • Rollback: prompt_version, model_route, retriever_config, tool_schema를 독립적으로 되돌릴 수 있어야 한다. 하나의 “LLM 앱 버전”만 있으면 과잉 rollback이 된다.
  • Approval gate: soft fail이나 high-risk route는 자동 차단 대신 사람 승인 큐로 보낸다. 예: refund amount > $500, legal answer, customer-wide bulk email.
  • Freeze policy: guardrail hard fail 또는 incident severity가 높으면 prompt/model 변경을 freeze하고, 실패 trace를 dataset에 편입한 뒤 재개한다.

production에서 입력 분포·출력 분포가 시간에 따라 변하는 silent failure (L11-30 §3.9).

  • query 유형 변화 (사용자 행동 변화)
  • query length, language ratio
  • 새 도메인 등장
  • 평균 응답 길이 변화
  • refusal rate 변화
  • hallucination rate 증가
  • token cost per request 변화
  • KS test, MMD (입력 임베딩 분포 비교)
  • Population Stability Index (PSI)
  • 운영 임계: drift score >0.2 → alert
  • 표준 도구: Evidently AI, Arize Phoenix, Whylabs

깨지는 조건 — drift detection이 거짓말하는 시점

섹션 제목: “깨지는 조건 — drift detection이 거짓말하는 시점”
  • Seasonality와 drift 혼동: 금요일 traffic은 평일과 다른 query 분포를 정상적으로 가진다. 7일 미만 baseline으로 PSI를 돌리면 매 주말 alert가 발화한다. 진단: 같은 요일끼리 비교(weekly seasonality decomposition) 또는 baseline window를 7일 이상으로 늘림.
  • 임베딩 모델 교체 = 가짜 drift: query 임베딩 인코더 버전을 올렸는데 baseline은 옛 인코더 임베딩이면 PSI가 1에 가깝게 튄다 — 실제 사용자 행동은 변하지 않았다. 진단: embedder_version tag를 PSI scope에 함께 묶고, 교체 시 baseline 재계산.
  • Univariate PSI의 false negative: 개별 feature는 PSI <0.1인데 결합 분포는 다를 수 있음(예: query 길이·언어 비율 각각 정상이나 “짧은 영어 query”가 갑자기 50%→5%로 떨어진 경우). multivariate MMD 또는 임베딩 클러스터 ratio로 보강.
  • 자체 silent failure: drift detector 자체가 죽었는데 metric만 평온해 보일 수 있음 — detector run에 freshness alert(마지막 PSI 계산 시각 >24h 이면 alert) 별도로 걸어야 함.

이 4가지는 §3.16 표의 “Drift false positive 多 → PSI 0.2→0.25”보다 한 단계 앞선 진단(왜 false positive가 나왔는가)에 해당한다.

  • Faithfulness check: RAG 답변이 검색 문서에 근거하는가 (Ragas). Score는 “응답 내 claim 중 retrieved context로 뒷받침되는 비율”. 운영 권장 임계는 일반 0.8 이상, 규제 산업(finance·healthcare·legal)은 0.9 이상 (Ragas docs)
    • 깨지는 조건 (silent failure): 응답이 단답(숫자·한 단어)이면 LLM이 internal claim 추출에 실패해 점수가 비어버린다 — completeness가 떨어지면 자동 metric을 reference-free(SelfCheckGPT) 또는 사람 검수로 대체. 또한 domain mismatch 시 judge가 “근거 없음”을 “맞음”으로 통과시키는 false positive 발생 (Cleanlab 벤치마크 기준 단순 faithfulness만으로는 hallucination 일부 누락) (Cleanlab RAG hallucination benchmark)
  • Self-consistency: 같은 query N번 → 일관성 측정
  • Reference-free: SelfCheckGPT, Lynx, FactScore
  • Confidence score: logprobs 기반 (낮으면 의심)
  • Citation 강제: 출처 없는 응답은 의심 표시

production 운영의 표준.

  • 명시적 피드백: 👍/👎, 별점, 자유 의견
  • 암묵적 피드백: copy/paste 비율, 후속 질문 (재시도), 세션 종료
  • 회귀 케이스 발견: 부정 피드백 → 사람 검수 → gold dataset에 추가
  • A/B 결정: 두 prompt·모델 중 사용자 만족 더 높은 것

LLM 사고 대응의 표준.

  • 비용 폭주 (loop, prompt 누적)
  • Hallucination 증가 (모델 변경, prompt 변경)
  • Prompt injection 성공 (system prompt 누출)
  • 응답 품질 저하 (RAG 데이터 stale)
  • Latency 폭증 (provider 장애)
1. Alert (cost·latency·error rate 임계 초과)
2. Trace로 원인 분석 (어떤 step·prompt·tool에서)
3. Rollback (이전 prompt·모델·라우팅 정책)
4. Post-mortem (5 whys, gold dataset에 추가)
5. Continuous improvement (prevent recurrence)

Rollback·Guardrail·Approval Gate Runbook

섹션 제목: “Rollback·Guardrail·Approval Gate Runbook”

LLM incident는 “서버 재시작”보다 변경면을 좁혀 되돌리는 능력이 중요하다. prompt·retrieval·tool schema·model route가 서로 다른 실패를 만들기 때문이다.

사고 유형즉시 조치후속 eval 편입
hallucination 급증prompt/retriever rollback, citation guardrail실패 trace를 faithfulness dataset에 추가
tool call 오작동tool schema freeze, high-risk action 승인 전환tool argument validation case 추가
비용 폭주max token 상한, loop breaker, model fallbacklong-context·retry loop 케이스 추가
policy/PII 위반output filter hard block, affected route stopPII fixture와 refusal/allowed boundary case 추가
judge 회귀로 CI flakyjudge hard gate 해제, human audit queue 확대calibration set 재채점, rubric version bump

운영 계약:

  • rollback 대상은 versioned config여야 한다. prompt registry, model routing table, retriever config, guardrail policy를 각각 되돌릴 수 있게 둔다.
  • approval gate는 incident mitigation 수단이다. route를 완전히 끄기 전에 high-risk action만 사람 승인으로 돌리면 사용자 영향과 위험을 동시에 낮출 수 있다.
  • post-mortem 산출물은 eval asset이어야 한다. “원인: prompt v13”으로 끝내지 말고, 실패 trace 20~50건을 dataset candidate로 넣고 regression gate에 연결한다.
  • 복구 완료 기준은 metric 정상화 + eval 통과다. P95가 회복되어도 실패 slice가 gold dataset에서 재현되면 full rollout은 보류한다.
  • PagerDuty/Opsgenie: 알림
  • trace replay: 사고 시점 재현 (LangSmith·Langfuse)
  • rollback: prompt·모델·라우팅 이전 버전으로 즉시 복구
[Production Traffic]
↓ trace + 피드백
[Observability dashboard]
↓ 문제 식별 (drift, regression, 사용자 부정 피드백)
[Gold dataset에 추가]
[Prompt/모델/RAG 개선]
↓ Offline eval (gold dataset 회귀)
[A/B test in production]
↓ 통계적 유의성 확인
[Full rollout]
[다시 모니터링]

이 loop가 LLM 운영 품질의 절반.

  • Cache miss explosion: prompt 구조 변경으로 hit ratio 폭락 (L12-70)
  • Provider 장애: 한 provider만 의존 → 라우팅 fallback 필요
  • Drift 무시: 입력 분포 변화로 모델 품질 폭락
  • gold dataset 정체: 새 케이스 안 추가되면 평가가 production 반영 못 함
  • trace 누락: 일부 step이 trace 안 됨 → debug 불가능
  • PII trace 노출: trace에 사용자 PII 그대로 — privacy 위험. redaction 필요

3.13 깨지는 조건 정량 표 (운영 결정용)

섹션 제목: “3.13 깨지는 조건 정량 표 (운영 결정용)”
도구·기법효과 발휘 범위깨지는 조건
LangSmithLangChain 생태계non-LangChain 앱은 OpenLLMetry로
Langfuse (self-host)open-source, 독립 운영큰 traffic은 ClickHouse storage 비용↑
HeliconeAPI gateway + costtrace 깊이는 Langfuse·LangSmith가 더 풍부
OpenLLMetryOTel 표준, provider 중립자동 instrument 누락 시 manual span 필요
Drift threshold 0.2input 분포 변화 알림도메인별 baseline 다름 — 30일 burn-in 후 조정
Gold dataset 50~100prompt 회귀 빠른 검증5%p 차이 95% 검출엔 ~400 필요 (Wilson)
LLM-as-judge자유 텍스트 빠른 평가코드·수학·전문 영역 → 사람 평가 60%대
A/B test 1% traffic실 사용자 영향 측정효과 작으면 통계적 유의성 어려움 (sample 부족)
Shadow eval위험 없이 비교실 사용자 영향 측정 X
Faithfulness 자동RAG 환각 감지judge 모델 약하면 false positive 多

이 표로 실제 결정한 사례 (도구 선택): 사내 RAG 챗봇 일일 traffic 100k, prompt 회귀를 CI에서 30분 안에 잡아야 했음. 후보 — (a) LangSmith + faithfulness, (b) Langfuse self-host + Ragas, (c) Helicone + 사람 검수.

  • LangChain을 쓰고 있지 않으니 (a) 제외 — 표의 “LangSmith: non-LangChain 앱은 OpenLLMetry로” 행이 결정 근거.
  • (c)는 trace 깊이 부족 — 표의 “Helicone: trace 깊이는 Langfuse·LangSmith가 더 풍부” 행이 결정 근거.
  • (b) 선택, gold dataset은 표의 “5%p 차이 95% 검출엔 ~400 필요”에 따라 50개에서 시작해 부정 피드백 import로 400 목표 (분기 단위).
  • 단점 수용: ClickHouse storage 비용은 일 traffic 100k 기준 월 ~$80 추정으로 trade-off 허용.

이 단계가 표를 본문 결정에 묶는 cross-pollination이다. 같은 표를 보고 다른 traffic·생태계의 팀은 (a)나 (c)를 고를 수 있고, 그 판단도 같은 행을 근거로 표현 가능해야 한다 (일반 SRE의 “tool selection matrix → ADR” 패턴과 동일).

수치 출처: “Judging the Judges” (2024, arXiv:2406.07791) — 15개 LLM judge, 22 task, ~150,000 평가 instance 측정. position bias가 무작위 변동이 아니라 모델·task별로 체계적이며, 후보 응답의 품질 차가 클수록 일관성이 회복된다. 따라서 단일 숫자 임계가 아니라 task별 baseline을 잡고 swap test 통과율로 검증해야 한다.

Bias정량 신호완화 절차
Positionswap test에서 동일 응답쌍이 순서만 바뀌었을 때 결과가 뒤집힘 (position consistency <0.7 위험)swap test (반대 순서로 다시 평가, 평균), tie 허용
Verbosity긴 응답 승률 70%+ — 단 일부 모델은 오히려 padding된 답을 깎아 길이 정규화가 역효과인 경우 있음length-controlled (AlpacaEval LC) 또는 길이 정규화
Self-enhancement자기 모델군 승률이 cross-model 평균 대비 +10%p 이상judge 다양화 (GPT-4 + Claude + open-weight 평균)
Limited reasoning수학·코드에서 사람 동의율 60%대도메인 특화 verifier (RLVR style) + 사람 검수
Familiarity익숙한 형식·톤 선호random 샘플 사람 검수로 calibration

LLM-as-judge는 “평가 모델 하나를 붙이면 끝”이 아니라, judge 자체를 production dependency로 운영해야 한다.

  • rubric versioning: rubric 문장·점수 스케일·few-shot 예시가 바뀌면 rubric_version을 올린다. 같은 correctness=0.8이라도 v1은 “정답 포함” 기준, v2는 “근거 포함” 기준일 수 있다.
  • swap test: A/B 응답 순서를 바꿔 judge를 2회 실행하고, 승패가 뒤집히는 비율을 기록한다. position consistency <0.7이면 그 judge 결과는 CI gate의 hard fail로 쓰지 않는다.
  • calibration set: 사람이 이미 판정한 50~200개 고정 셋을 둔다. judge 모델·prompt·rubric을 바꿀 때 calibration agreement가 baseline보다 떨어지면 배포하지 않는다.
  • human audit sample: production 자동 평가 중 1~5% 또는 disagreement case를 annotation queue로 보낸다. judge score와 사용자 피드백이 계속 벌어지면 rubric을 수정하고 과거 run을 재채점한다.
  • judge drift monitoring: 같은 calibration set을 주기적으로 재실행해 score 분포와 reasoning failure를 본다. provider가 모델을 silent update하면 앱은 그대로인데 judge 점수만 움직일 수 있다.
  • 비용·지연 budget: online trace마다 judge를 호출하면 비용이 폭주한다. high-risk route 100%, 일반 route sampling, CI dataset full run처럼 sampling policy를 분리한다.
PSI (Population Stability Index):
PSI < 0.1: 변화 거의 없음
0.1 ≤ PSI < 0.2: 약간 변화 (모니터링)
0.2 ≤ PSI < 0.25: 의미 있는 변화 (alert)
PSI ≥ 0.25: 큰 변화 (즉시 조사·재학습 검토)
KS test:
p-value < 0.05: 분포 다름 (alert)
D-statistic > 0.1: 큰 차이

운영 권장: 30일 burn-in 후 PSI > 0.2 alert, 도메인별 추가 조정. baseline은 7일 단위 갱신.

증상정량 신호원인복구
Trace 누락span coverage <90%instrument 누락OpenLLMetry 자동, manual span 보강
LLM-as-judge ↔ 사용자 불일치judge 점수↑ 사용자 ↓judge bias·도메인 mismatchjudge 재선택, 사람 검수 비율↑
Gold dataset 정체새 케이스 추가 0/주피드백 loop 단절부정 피드백 자동 import, 분기 갱신
Rubric drift같은 run 재채점 시 delta↑rubric version 미기록rubric pinning, calibration 재실행
Eval-run 연결 끊김score만 있고 trace_id 없음run store 계약 부재eval_run_id-trace_id linkage
Drift false positive 多drift alert >5/주임계 너무 낮음PSI 0.2 → 0.25, multivariate
PII trace 노출log에 사용자 PII 포함redaction 누락Presidio 자동, log mask
Provider 장애 미복구한 provider 장애로 전체fallback 부재LiteLLM·OpenRouter multi-provider
A/B 통계 부족sample <400, 5%p 검출 불가traffic 부족longer rollout, increase % traffic
Guardrail 우회 회귀hard fail case production 발생eval fixture 누락fixture 추가, policy version bump
Approval gate 폭주reviewer queue backlog↑threshold 과민·incident 전환risk threshold 조정, batch review

3.17 Observability·Eval의 일반 매핑 (Transferable Pattern)

섹션 제목: “3.17 Observability·Eval의 일반 매핑 (Transferable Pattern)”

LLM observability·eval = “trace + 측정 + 회귀 + 모니터링”. 전통 SRE와 같은 패턴.

LLM Observability·Eval일반 시스템 매핑
Trace (LangSmith·Langfuse)distributed tracing (Jaeger, Datadog APM)
Latency P99·TTFTAPI endpoint latency SLO
Cost dashboardcloud cost dashboard (FinOps)
Gold datasetregression test, golden output
LLM-as-judgecode review bot, automated PR check
A/B testfeature flag rollout (Statsig, GrowthBook)
Drift detection (PSI·KS)metric anomaly detection, SLO violation alert
Hallucination detectiondata validation, contract test
Incident response (rollback)deploy rollback, feature flag kill switch

일반 공식: “측정 → trace → 비교 → alert → rollback → 학습”의 6단계 SRE 패턴이 LLM 운영에도 동일. LLM이 특별한 점은 비결정적 output + 자유 텍스트 metric이며, observability와 eval이 합쳐진 시스템이 표준.

운영 시나리오 — LLM 챗봇 incident response (예시)

섹션 제목: “운영 시나리오 — LLM 챗봇 incident response (예시)”
상황: 사내 챗봇 P95 TTFT가 갑자기 5s로 폭증, 비용도 시간당 2× ↑.
Incident 흐름:
1. Alert (Helicone): TTFT P99 > 3s, cost/h > $50
2. Trace 분석 (Langfuse):
- prompt 평균 입력 토큰 800 → 5000 (대화 history 무한 누적!)
- cache hit ratio 70% → 5% (prompt 구조 변경)
3. 원인: 어제 prompt 변경 시 sliding window 제거됨
4. Rollback: prompt 이전 버전으로 즉시 복구
5. Post-mortem: gold dataset에 long-conversation 케이스 추가, CI 게이트
복구 결과 (가상): 30분 내 P95 정상 (<1s), cost 정상.
대안 비선택:
- LLM 변경 X (provider 장애 아님)
- Top-K 변경 X (RAG 정상)
- 사용자 측 캐시 X (서버측 문제)
drift detection (§3.7):
- Input drift PSI 0.3 (>0.25 임계) → alert 발동
- 사용자 피드백 부정 비율 +20% (signal)

§3.4 도구 + §3.7 drift + §3.10 incident response + §3.13 깨지는 조건 + §3.16 silent failure 모두 적용.

  • LLM 앱의 일상 운영 모니터링
  • 프롬프트·모델 변경 회귀 검증
  • 사고 대응·debugging
  • 비용·SLA 추적
  • 사용자 피드백 → 개선 loop
  • Compliance audit (HIPAA·GDPR·SOC 2)

플랫폼 엔지니어가 LLM 관측성·평가를 운영할 때 다음에 도움된다.

  • OpenTelemetry GenAI 도입: provider·도구 중립적 trace. 자체 instrument
  • Tool 선택: open-source는 Langfuse·Phoenix, gateway는 Helicone·Portkey, agent는 AgentOps
  • Gold dataset 운영: 도메인 50~500개 + 사람 검수 + Promptfoo dashboard
  • Drift detection: PSI·KS test로 입력 분포 모니터링 → retraining 트리거
  • Incident response: trace replay + rollback 표준화
  • Continuous improvement: 사용자 피드백 → gold dataset → 재평가 loop 자동화
개념 A개념 B차이점
ObservabilityMonitoringtrace·log·metric 통합 vs metric 중심
TraceLoghierarchical span vs 단일 시점 메시지
TraceEval run실제 요청 실행 경로 vs dataset 기준 재실행 결과
Offline evalOnline eval (A/B)gold dataset 회귀 vs 실 traffic 측정
Online evalShadow eval일부 사용자에 적용 vs traffic 복사로 비교
ScoreRubric평가 결과 값 vs 점수 기준·버전
Latency P50P95/P99평균적 vs 꼬리. UX는 P95+ 결정
FaithfulnessHallucination rate문서 근거 비율 vs 환각 비율 (relation)
Drift detectionA/B test분포 변화 vs 의도한 변경 효과
LangSmithLangfuseLangChain 친화 vs open-source self-host
Datadog LLM ObsOpenLLMetryenterprise APM 통합 vs OTel 표준 자동 instrument
  • LLM observability와 일반 APM의 차이를 prompt/cost/quality dimension으로 설명할 수 있다
  • OpenTelemetry GenAI semantic convention의 핵심 attribute(model, tokens, finish_reason)를 말할 수 있다
  • Langfuse trace와 evaluation run을 trace_id·eval_run_id로 분리해 연결할 수 있다
  • Trace 구조 (RAG retrieval + LLM call + tool 통합)를 설명할 수 있다
  • Dataset registry → run store → grader → report → CI gate 흐름을 설계할 수 있다
  • Eval score·trace·guardrail violation을 reliability gate로 연결할 수 있다
  • Production eval 3종(offline gold dataset, online A/B, shadow)을 작업에 매핑할 수 있다
  • LLM-as-judge에 rubric versioning, swap test, calibration set, human audit sample을 적용할 수 있다
  • prompt·output·tool argument의 privacy/redaction 정책을 trace 수집 전에 검증할 수 있다
  • trace 기반 원인 분석으로 prompt·model·retriever·tool 중 rollback 대상을 좁힐 수 있다
  • soft fail을 approval gate로 보내고 hard fail은 guardrail로 차단하는 기준을 세울 수 있다
  • Drift detection 방법(KS test, PSI, MMD)과 임계값을 설명할 수 있다
  • Hallucination detection 4종(faithfulness, self-consistency, reference-free, confidence)을 구분할 수 있다
  • Incident response 5단계(alert → trace → rollback → post-mortem → 재발 방지)를 운영할 수 있다
  • Continuous improvement loop (피드백 → gold dataset → 재평가)를 자동화할 수 있다
  • 표준: OpenTelemetry GenAI semantic conventions, gen_ai.*, OTLP, OTel Collector, OTEL_SEMCONV_STABILITY_OPT_IN
  • 도구: LangSmith, Langfuse, Helicone, Arize Phoenix, OpenLLMetry, Traceloop, Weave (W&B), Datadog LLM Obs, AgentOps, Portkey, Logfire
  • Eval: Promptfoo, Braintrust, Ragas, TruLens, DeepEval, ARES, dataset registry, run store, CI gate
  • Reliability Engineering: reliability gate, rollout policy, rollback, guardrail policy, approval gate, failure slice
  • Judge 운영: rubric versioning, swap test, calibration set, annotation queue, human audit sample
  • Drift: Evidently AI, Whylabs, NannyML, Arize Phoenix
  • Hallucination: SelfCheckGPT, Lynx, FactScore, Patronus, RAGAS faithfulness
  • Privacy: PII redaction, prompt masking, tool argument masking, data retention
  • Feedback: implicit signals, A/B framework (Statsig, GrowthBook, Eppo)
  • OpenLLMetry로 OpenAI/Anthropic API 호출 자동 trace — span attribute 확인
  • LangSmith 또는 Langfuse 통합 — RAG·agent trace dashboard
  • gen_ai.operation.name, token usage, finish reason이 OTel exporter와 Langfuse 양쪽에서 같은 trace에 남는지 확인
  • email·phone·secret이 포함된 fixture로 Langfuse masking 또는 OTel Collector redaction 테스트
  • Helicone API gateway 도입 → cost·latency dashboard 확인
  • Cache hit ratio·TTFT P95 알람 설정
  • gold dataset 50개 만들고 Promptfoo로 prompt A vs B 비교
  • Ragas로 RAG faithfulness·answer relevance 측정 자동화
  • dataset@version을 고정해 eval run을 만들고, 각 item output에 trace_id를 연결
  • deterministic grader + LLM-as-judge + 사람 검수 샘플을 한 report에 합치기
  • judge rubric v1/v2를 나눠 같은 calibration set 재채점 후 score delta 비교
  • swap test로 A/B 응답 순서를 바꿨을 때 승패 뒤집힘 비율 측정
  • CI gate 임계값 설정: schema/PII hard fail, quality delta soft fail
  • Evidently AI로 입력 query 임베딩의 PSI 계산 — 한 달 단위
  • drift > 0.2 alert 설정
  • SelfCheckGPT 또는 RAGAS faithfulness로 답변 100개 자동 평가
  • confidence score(logprobs) 기반 의심 케이스 자동 raise
  • 의도적 prompt 회귀 (잘못된 prompt 배포) → alert 발동·trace replay·rollback 시뮬레이션
  • 비용 폭주 시뮬레이션 (긴 input) → budget alert 발동
  • 실패 trace 20개를 dataset candidate로 저장하고, 다음 CI gate에서 재현되는지 확인
  • high-risk route를 feature flag로 approval gate에 임시 전환하는 runbook 작성
  • trace에 일부 step 누락 → instrument 누락. SDK 또는 manual span 추가
  • LLM-as-judge 점수가 사용자 피드백과 안 맞음 → judge 모델 변경, judge prompt 개선
  • 같은 candidate가 실행할 때마다 CI에서 통과/실패 반복 → dataset version·rubric version·judge temperature pinning 확인
  • eval score만 있고 원인 분석이 안 됨 → score에 연결된 trace_id·observation span 누락 확인
  • redaction 후 trace replay가 안 됨 → 원문 대신 input_hash·document id·prompt version 같은 재현 키 보강
  • drift detection false positive 多 → 임계값 재조정, multivariate detector
  • gold dataset 점수는 좋은데 production 부정 피드백 → gold dataset이 production 분포와 다름. 새 케이스 추가
  1. LLM observability는 trace·metric·prompt·cost·token·hallucination 등 LLM 특유 dimension을 통합 관측한다.
  2. OpenTelemetry GenAI semantic conventions가 provider·도구 중립 표준이고, OpenLLMetry·Logfire가 자동 instrument.
  3. Production eval은 offline·online·shadow 결과를 reliability gate로 바꿔 배포·rollback·approval 전환을 결정한다.
  4. Drift detection (KS·PSI), hallucination detection (faithfulness·SelfCheckGPT), 사용자 피드백 loop가 핵심 도구.
  5. Incident response는 alert → trace 원인 분석 → rollback/guardrail/approval gate → eval asset 편입으로 닫힌다.

최종 수정: 2026-05-21