본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 07. 04:56

5 일 동안 3 번의 LLM 관측성 감사: 각 수정은 다음 버그를 드러냄

요약

이 글은 LLM 관측성(Observability)을 학습하고 감사하는 과정을 기록한 기술 블로그 포스팅입니다. 필자는 Langfuse와 같은 도구를 사용하여 모델의 성능 지표를 추적하고, 시스템 수정 후에도 새로운 버그나 근본적인 문제를 발견했음을 보여줍니다. 초기에는 높은 오류율과 토큰 처리 문제 등이 있었으나, 수정을 거치면서 지표는 개선되었지만, 벤치마크 데이터가 포화 상태에 이르거나 평가 기준(rubric)이 모델의 실제 성능 차이를 구분하지 못하는 근본적인 한계점들을 발견했습니다.

핵심 포인트

  • LLM 관측성 감사는 단순히 버그를 수정하는 것을 넘어, 시스템의 숨겨진 취약점과 새로운 문제를 지속적으로 드러내는 과정이다.
  • 시스템 개선(수정)은 명확한 지표(오류율 32% -> 0.0%)를 개선시키지만, 데이터는 항상 다른 형태의 근본적인 한계를 노출한다.
  • 벤치마크 기반 평가 기준(rubric)이 포화 상태에 도달하면, 모델 간의 실제 성능 차이를 구분하는 데 실패할 수 있다 (예: 모든 모델이 1.000으로 동률).
  • 판사 간 불일치율(Judge Disagreement Rate)을 측정하는 것은 평가 시스템 자체의 신뢰도를 검증하는 중요한 지표이다.

나는 2026 년에 대부분의 사람들이 배우는 방식처럼 LLM 관측성을 배우고 있다: 모델을 통해 설명해 주게 요청하는 방식으로. 프롬프트는 내가 작성한 것이다, "이제 아직 완전히 이해하지 못한다"라는 관점에서 쓴 것이다. 깊이는 모델에서 온다. 검증 — 쿼리를 다시 실행하고 수학을 sanity-check 하며, 스크린샷을 익명화하는 것 — 은 다시 내 것이다. 나는 그 결과물을 발표하므로 같은 길에 있는 누군가가 초기 혼란을 건너뛸 수 있게 한다. 3 일 전에는 self-hosted Langfuse 인스턴스를 감사했고 32% 오류율, max_tokens=720000 버그, 그리고 untruncated retrieval context 에서 $1.11 의 단일 호출을 발견했다. 그 다음에 위에 있는 LLM-as-a-judge 레이어를 감사했고, Hallucination 점수의 22 퍼센트 포인트가 파이프라인 오류로 평가되는 것을 발견했다. 이번 주에는 같은 인스턴스를 다시 재다운로드했다. 수정이 적용되었다. 숫자들은 훨씬 더 좋아졌다. 그리고 데이터는 다른 버그를 드러냈다 — 이전 감사에서는 너무 높은 noise floor 때문에 볼 수 없었던 것이다. 이것이 무엇으로 바뀌었는지, 여전히 깨진 것은 무엇인지, 그리고 "모든 것이 훌륭해 보인다"라는 이름 아래 숨겨지는 새로운 문제는 무엇인지. 1. 같은 인스턴스에서의 Before / After 지표 3 일 전 오늘 오류율 (application calls) 32% 0.0% In/out token ratio 97:1 1.8:1 max_tokens 버그 호출 91 (트래픽의 28%) 0 Invalid model slugs in pool 2 ( openrouter/free, gemma-4-26b-a4b-it ) 1 비용 창구 내 $2.86 $0.00 Throughput bursty, user-driven flat 20 traces/hour 이전 감사에서 4 개의 버그가 사라졌다: max_tokens=720000 수정 — 더 이상 context-overflow rejection 이 없다. openrouter/free 를 라우팅에서 제거 — 실패율이 100% 인 slug 가 제거되었다. Retrieval context truncation 적용 — In/out token ratio 는 50 배 감소했다. Premium models 를 eval mix 에서 끌어올림 — 전체 플레트는 :free tier 에 있다. 하나만 남았다: google/gemma-4-26b-a4b-it:free 는 여전히 풀에 있다. 오늘 한 호출이 스러져갔다. 저렴하고 쉬운 수정. 2. 데이터의 새로운 형태 오늘의 트래픽은 사용자 트래픽이 아니다. 그것은 benchmark loop 이다: trace.name 분포 (오늘, 400 traces): OpenRouter Request 100 ← 실제 application calls Execute evaluator: Correctness 100 ← judge calls Execute evaluator: Hallucination 100 ← judge calls Execute evaluator: Toxicity 100 ← judge calls 한 시간마다 20 개의 traces, 19 시간 동안. 이것은 stabilization phase 도중에 정확히 원하는 것이다 — 사용자에 의존하지 않고 변동을 표면화하는 것이 아니라 타이머로 공급한다. 또한 이것이 지금 하나의 judge metric 이 1.000 으로 포화되는 것이 위험한 이유이다, 이는 이 글의 나머지 부분이다. 3. Correctness 리더보드가 포화 상태다 Correctness (n≥3, 오늘, level != ERROR): inclusionai/ling-2.6-1t:free 1.000 n=3 minimax/minimax-m2.5:free 1.000 n=8 meta-llama/llama-3.2-3b-instruct:free 1.000 n=6 nvidia/nemotron-3-nano-omni-30b-reasoning:free 1.000 n=4 poolside/laguna-m.1:free 1.000 n=4 openai/gpt-oss-20b:free 1.000 n=8 openai/gpt-oss-120b:free 1.000 n=6 tencent/hy3-preview:free 1.000 n=3 poolside/laguna-xs.2:free 1.000 n=7 liquid/lfm-2.5-1.2b-instruct:free 0.857 n=7 meta-llama/llama-3.3-70b-instruct:free 0.833 n=6 qwen/qwen3-next-80b-a3b-instruct:free 0.833 n=6 nvidia/nemotron-nano-9b-v2:free 0.800 n=10 qwen/qwen3-coder:free 0.750 n=4 3 일 전 tencent/hy3-preview:free 는 0.573 으로 바닥에 있었다. 오늘에는 다른 8 개 모델과 함께 1.000 으로 tied 되었다. 모델은 더 좋아지지 않았다. 벤치마크 프롬프트 세트는 이 rubric 을 구별하기가 너무 쉬웠다. 여기서 멈추고 리더보드를 행동으로 옮긴다면, 당신은 1.2B 파라미터 모델과 120B 파라미터 모델에 동등한 가중치를 부여하게 될 것이다.

그들은 '동등하게 옳다'라고 주장했지만 사실은 그렇지 않다. 이 프롬프트 세트와 평가 기준 (rubric) 으로서는 판사가 이를 구분할 수 없다.

  1. 평가 기준이 실제로 실패한 경우

두 명의 판사가 동일한 생성물 (generation) 을 평가했을 때 극심하게 의견이 갈리면, 이는 평가 기준의 문제이다. 오늘의 데이터는 100 번의 애플리케이션 호출 중 17 번에 이러한 사례가 발생하여, 판사 간 불일치율이 17% 로 나타났다.

동일한 관찰이지만 서로 다른 판결:
[obsId=5d42ef596a8f] poolside/laguna-m.1:free 출력: <입력 프롬프트의 정문 복사, 실제 생성물 없음>
Correctness = 1.0 "제공된 기준 출력 (ground truth) 과 완전 일치"
Hallucination = 0.0 "입력 쿼리의 완전한 복사로 인해 콘텐츠 생성 실패"

모델은 답변 대신 프롬프트를 다시 복사했다. Correctness 판사는 기준 출력과 텍스트 매칭을 보상한다. Hallucination 판사는 실제 콘텐츠를 생성하지 않는 출력을 패널티로 부과한다. 두 판사 모두 자신의 평가 기준을 올바르게 해석하고 있다. 두 판사는 동일한 파괴된 출력물을 보고 있으며, 서로 반대 결론에 도달했다.

이 패턴은 poolside/laguna-m.1(3 건), openai/gpt-oss-120b(2 건), nvidia/nemotron-nano-9b-v2(2 건) 및 각 1 건씩 다른 10 개 모델에서 반복된다.

  1. 교차 판사 상관관계, 세 시간대

동일한 관찰에 대한 Pearson r(Correctness, Hallucination):
audit 1 (May 02-03, n=72) : r = 0.018
audit 2 (May 02-05, n=143) : r = 0.056
today (May 06, n=100) : r = -0.027

세 개의 독립적인 샘플. 세 가지 거의 제로에 가까운 상관관계.
두 LLM 판사가 동일한 출력물에 대해 밀접한 관련 개념을 점수화할 때, 오직 우연의 수준에서만 일치한다. 이는 5 일 동안 일관되게 관찰된다.
이는 두 판사 모두의 버그가 아니다. 이는 평가 기준의 속성이다: "기준과 매칭"과 "허위 콘텐츠 생성 없음"은 genuinely(진정) 다른 것을 측정한다.
프롬프트 복사는 첫 번째를 만족할 수 있지만 두 번째는 실패할 수 있다.
창의적이지만 틀린 답변은 두 번째를 만족할 수 있지만 첫 번째는 실패할 수 있다.
두 점수는 거의 통계적으로 독립적이다.
운영 규칙: 단일 판사가 개선될 때만 라우팅 변경을 배포하지 마십시오. 당신은 한 개의 직교 축 (orthogonal axis) 을 최적화하고, 다른 판사는 다른 축에서 조용히 퇴보할 수 있기 때문이다.

  1. 독성 (Toxicity) 은 무거운 짐이 되었다

오늘의 독성 점수: 100 / 100 = 0.000
이전 감사 (audit) 와 동일하다.
판사 프롬프트는 문제없다 — 댓글은 일관되어 있다 ("중립적 지시, 해로운 콘텐츠 없음"). 그러나 작업물 (workload) 은 단순히 독성 콘텐츠를 포함하지 않는다.
이 판사를 실행하는 것은 상수 (constant) 를 생성하기 위해 gemini-2.5-flash 토큰을 소모한다.
작업물이 에이전트 지시 형태 (agent-instruction-shaped) 라면, Toxicity 는 잘못된 세 번째 판사이다.
더 나은 후보:
Echo Detection : boolean — 출력은 입력과 정문 복사인가? 이는 위의 모든 17 번의 불일치를 LLM 호출 없이 감지했을 것이다 (Levenshtein 거리만 충분하다).
Format Compliance : 출력은 예상 스키마를 준수하는가? 에이전트 작업물에서 변형된 JSON 은 가장 흔한 침묵 실패이다.
Refusal Detection : 모델이 거절했는가? Correctness 점수는 거절이 올바른 행동일 때조차 0 으로 평가한다. 별도의 신호는 "틀림"과 "거절 (올바르게 할 가능성 있음)"을 구분할 수 있게 한다.

  1. 다섯 가지 수정 사항, 우선순위

Correctness 평가 기준에 반-반사 (anti-echo) 조항 추가하기. 프롬프트에 다음을 추가: "생성물이 실질적인 응답을 생성하지 않고 입력/프롬프트를 복사하는 경우, 텍스트 중첩과 무관하게 점수를 0 으로 하십시오." 이는 프롬프트 복사의 인위적인 1.000 천장 (ceiling) 을 깨뜨린다.

파이플라인 수준에서 결정론적 반사 감지기 추가하기. 입력과 출력에 대한 해시 + 정규화된 Levenshtein, 임계값은 0.85. 더 저렴하고 빠르며 LLM 판사 해석에 의존하지 않는다.
Tox

Format Compliance 또는 Echo Detection 을 가진 이시티 (icity) 와 함께: 상수 신호는 신호가 아닙니다. 토크 예산은 다른 곳에 더 잘 쓰여야 합니다. 벤치마크 프롬프트 세트를 다변화하세요. 현재 세트는 이 규칙을 포화시킵니다. 추가: 다단계 추론, 엄격한 형식 제약, 거절 가능 프롬프트, 공격적 변형문. 구글/게마-4-26b-a4b-it:free 를 라우팅 풀에서 제거하세요. 확인된 무효 슬러그로, 이전 감사의 관성에 살아남았습니다.

  1. 세 가지 감사에서의 패턴

각 감사는 이전 감사에서 볼 수 없었던 문제를 드러냈습니다:

감사 1 는 인프라 버그 (오류, 과대 컨텍스트, 무효 슬러그) 를 찾았습니다. 판단층은 실행 중이었지만, 그 출력은 인프라 노이즈에 오염되었음 — 리더보드에는 좋은 모델을 구분하는 것이 아니라 나쁜 입력을 견뉜 모델이 어느 정도인지 반영되었습니다.

감사 2 는 오염의 양적 분석을 수행했습니다: 판단 점수의 22 퍼센트 포인트가 파이프라인 오류였습니다. 이를 필터링하면 사용 가능한 리더보드를 만들 수 있었습니다.

감사 3 (오늘) 은 인프라를 고쳐도 새로운 실패 모드가 드러났음을 발견했습니다: 정답성 (Correctness) 를 통과하지만 환각 (Hallucination) 을 실패하는 프롬프트-이코 출력. 리더보드는 1.000 으로 포화되어 모델 간의 차이를 숨깁니다.

각 고쳐지는 층은 다음 버그 층을 보여줍니다. 데이터는 결코 잘못되지 않았습니다 — 당신의 노이즈 바닥 (noise floor) 은 너무 높아서 읽을 수 없었습니다.

LLM 판단 파이프라인을 세우신다면 이 시퀀스를 예상하세요. 첫 번째 리더보드를 믿지 마세요. 두 번째도 마찬가지입니다.

중첩된 규칙이 없는 두 판단자를 교차 상관관계 (cross-correlate) 하시고, 지속되는 불일치를 특징으로 간주하세요: 이것이 실제 실패 모드가 사는 곳입니다.

셀프 호스팅 Langfuse + OpenRouter. 내부 호스트명, 사용자 ID 및 제품 코드명은 생략됩니다. 공개 모델 슬러그는 재현성을 위해 그대로 유지됩니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
2

댓글

0