본문으로 건너뛰기

© 2026 Molayo

Dev.to릴리즈2026. 06. 09. 07:08

[![ ](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2

요약

AI 에이전트의 품질을 정량화하고 관찰 가능하게 만드는 LLM-as-a-judge 평가 전략을 다룹니다. OpenTelemetry를 활용하여 트레이스에 점수를 부착하고, 다양한 백엔드로 텔레메트리를 이식하는 아키텍처를 제안합니다.

핵심 포인트

  • LLM-as-a-judge를 통한 에이전트 품질의 정량적 점수화
  • OpenTelemetry 기반의 이식 가능한 텔레메트리 아키텍처 구축
  • 단순 지표(지연 시간, 에러율)로 잡을 수 없는 판단력 저하 감지
  • 트레이스와 점수를 결합하여 문제의 근거(Rationale) 확보


주관적인 "준비된 것 같다"는 느낌을 알람을 보낼 수 있는 0–1 점수로 전환하는 현장 가이드 — 그리고 해당 신호를 여러 백엔드 간에 이식 가능하게 유지하는 OpenTelemetry 아키텍처.

이 포스트는 LLM-as-a-judge(판사로서의 LLM)가 완벽한가에 대한 것이 아닙니다. AI 에이전트의 품질을 **관찰 가능(observable)**하게 만드는 것에 관한 것입니다. 즉, 트레이스(trace)를 점수화하고, 성능 저하(regression)에 대해 알람을 보내며, OpenTelemetry를 통해 텔레메트리(telemetry)를 이식 가능하게 유지하는 법을 다룹니다.

요약 (TL;DR)

AWS에서는 두 가지 평가 영역이 중요하며, 이들은 하나의 핵심 아이디어인 "LLM이 다른 모델의 출력을 점수화한다"는 개념을 공유합니다.

  1. Bedrock 모델 평가 (Bedrock model evaluation) — 모델을 _선정(picking)_하기 위한 오프라인 방식. 생성기(Generator) + 판사(judge), 프롬프트 데이터셋, 콘솔 및 S3에 저장되는 점수와 근거(rationales).
  2. AgentCore 평가 (AgentCore Evaluations) — _운영 환경의 에이전트를 신뢰(trusting)_하기 위한 온라인 및 온디맨드(on-demand) 방식. 실제 트레이스를 0–1 척도로 점수화하는 내장된 LLM-as-a-judge 평가기를 통해 CloudWatch로 게시됩니다.

업그레이드의 핵심은 점수 그 자체가 아닙니다. 점수가 _그 점수를 만들어낸 트레이스에 부착되어 있다는 점_입니다. 이는 온도계와 진단의 차이와 같습니다. 또한 텔레메트리가 OpenTelemetry와 호환되기 때문에, 동일한 스팬(span)을 OTel Collector를 통해 Langfuse, Arize Phoenix, Datadog 또는 Grafana로 확장하여 보낼 수 있습니다.

  • 판사는 숫자(점수)를 제공합니다.
  • 트레이스는 그 이유를 알려줍니다.
  • OpenTelemetry는 이를 이식 가능하게 만듭니다.
  • 교정(Calibration)은 이를 정직하게 유지합니다.

0.91 → 0.30 실패 모드 (The 0.91 → 0.30 Failure Mode)

그 어떤 지연 시간(Latency)이나 에러율(Error-rate) 대시보드도 절대 잡아낼 수 없는 실제 운영 환경에서의 실패 사례가 여기 있습니다. AWS의 해당 기능에 대한 자체 re:Invent 2025 세션(AIM3348)에서, 그들은 도구 선택 정확도(Tool-selection accuracy)가 운영 환경에서 0.91에서 0.30으로 떨어진 여행 에이전트를 보여주었습니다. 에이전트는 여전히 도구를 호출하는 데에는 '성공'하고 있었습니다. 단지 잘못된 도구를 호출하고 있었을 뿐입니다. 지연 시간은 정상이었고, 에러도 없었습니다. 문제가 된 것은 바로 '판단력(Judgment)'이었으며, 오직 평가 레이어(Evaluation layer)만이 이를 드러냈습니다. (AWS는 이를 AIM3348 세션에서 사용했습니다. 저는 이를 벤치마크나 예상된 하락이 아닌, 설명적인 운영 회귀(Production-regression) 패턴으로 다루고 있습니다.)

그것이 바로 격차입니다. 전통적인 서비스는 p99 200ms 미만, 에러율 0.1% 미만과 같이 논쟁의 여지 없이 통과하거나 실패를 결정짓는 객관적인 지표를 가집니다. 반면 에이전트는 주관적인 질문을 던집니다. 답변이 유용했는가? 올바른 도구를 선택했는가? 대화가 목표에 도달했는가? 출력이 안전한가? 이러한 것들은 정규 표현식(Regex)으로 처리할 수 없으며, BLEU/ROUGE는 단어 패턴만 일치시킬 뿐 이해도를 측정하지는 못합니다.

기존 워크플로우의 솔직한 모습은 이랬습니다. 질문 20개를 던지고, 답변을 읽고, 느낌대로 결정한 뒤, 배포하고, 행운을 빌었습니다. 이는 확장할 수 없으며, 누군가 "이게 제대로 작동한다는 걸 어떻게 알 수 있죠?"라고 물을 때 무너집니다. 따라서 "더 나은 판단력"이란 에이전트를 더 많이 신뢰하라는 뜻이 아닙니다. 그것은 각각의 주관적인 질문을 인간이나 파이프라인이 조치할 수 있는 일관되고 비교 가능한 숫자로 변환하라는 뜻입니다. 이것이 바로 LLM-as-a-judge가 하는 역할이며, AWS는 과거에 수개월이 걸리던 내부 구축 작업(In-house plumbing)을 관리형 서비스로 전환했습니다.

모델 평가(Model Evaluation) vs AgentCore 평가(AgentCore Evaluations)

사람들이 끊임없이 혼동하기 때문에, 이 두 제품을 명확히 구분해야 합니다.

**Amazon Bedrock 모델 평가 (model evaluation)**는 모델을 _선택(choosing)_하기 위한 것입니다. 생성 모델(generator)이 데이터셋의 프롬프트에 답변하면, 평가자(evaluator/judge) 모델이 각 쌍의 점수를 매기고 그 이유를 설명합니다. AWS는 자동 지표(exact match, BLEU, ROUGE) 및 인간 평가와 함께 2024년 12월 모델 평가를 위한 LLM-as-a-judge를 도입했습니다. 사용자는 평가자(judge)를 선택하고, 지표(정확성, 완전성, 어조, 그리고 유해성 및 거부와 같은 책임감 있는 AI 지표)를 선택하며, 직접 프롬프트를 가져와 작업(job) 간에 비교할 수 있습니다. 이는 배포 전 오프라인 단계에서 내 데이터로 어떤 모델이 승리하는지 확인하는 과정입니다.

**AgentCore 평가 (AgentCore Evaluations)**는 _이미 실행 중인 에이전트를 신뢰(trusting)_하기 위한 것입니다. 2025년 12월 2일 re:Invent에서 발표되었으며, 현재 2026년 3월 31일부로 일반적으로 사용 가능(generally available)해진 이 기능은 관리형 평가자(managed evaluators)를 사용하여 실제 에이전트 트레이스(real agent traces) — 즉, 멀티턴 세션(multi-turn sessions) 및 도구 호출(tool calls) — 를 지속적으로 또는 요청 시에 평가합니다. 결과는 CloudWatch Logs에 게시되고, 점수는 지연 시간(latency) 및 토큰 텔레메트리(telemetry)와 함께 CloudWatch Metrics에 게시됩니다.

이 기능은 12개 이상의 내장 평가자(AWS 자료에서는 13개로 언급)를 제공하며, 모두 0–1 사이의 점수로 매겨지고 참조 데이터가 필요 없는(reference-free) 방식입니다. 즉, 미리 라벨링된 정답(golden answer)이 필요하지 않으므로 실제 트래픽(live traffic)에 바로 적용할 수 있습니다. 네 가지 제품군이 있습니다:

  • 응답 품질 (Response quality) — 정확성(correctness), 충실도(faithfulness), 유용성(helpfulness), 관련성(relevance), 간결성(conciseness), 일관성(coherence), 지시 이행(instruction-following), 거부(refusal).
  • 안전성 (Safety) — 유해성(harmfulness), 고정관념(stereotyping).
  • 작업 완료 (Task completion) — 목표 성공률 (세션 수준): 대화가 사용자의 목적을 달성했는가?
  • 컴포넌트 수준 (Component level) — 도구 선택 정확도(tool selection accuracy), 도구 파라미터 정확도(tool parameter accuracy). (이 제품군이 0.91 → 0.30 하락을 잡아냈습니다.)

커스텀 평가기(Custom evaluators)를 사용하면 자신만의 판정 모델(judge model), 프롬프트(prompt), 그리고 점수 산정 스키마(scoring schema)(트레이스(trace), 세션(session), 또는 도구 호출(tool call)별)를 도입할 수 있습니다. 제 경험상, 기본 제공되는 평가기(built-ins)는 일반적인 초기 사례들을 충분히 다룹니다. 커스텀 평가기는 준수 사항(compliance)이나 브랜드 보이스(brand voice)와 같이 일반적인 평가기가 표현할 수 없는 도메인 특화된 루브릭(rubric)이 필요할 때만 사용하십시오.

결론 — 모델 평가(model evaluation)는 _무엇을 구축할지_를 결정하고, AgentCore 평가(AgentCore Evaluations)는 _배포한 것을 계속 신뢰할 수 있을지_를 결정합니다. 첫 번째는 모델 결정 시마다 한 번씩 사용하고, 두 번째는 영원히 실행하십시오. 처음부터 13개를 쓰지 말고 유용성(helpfulness), 도구 선택 정확도(tool-selection accuracy), 목표 성공률(goal success rate) 세 가지 평가기로 시작하십시오.

더 나은 판단은 숫자 플러스 트레이스에서 나온다

점수만으로는 온도계에 불과합니다. 유용성이 0.71이라고 하면 걱정은 되지만 왜 그런지는 알 수 없습니다. 핵심적인 레버리지는 _점수가 해당 점수를 생성한 트레이스(trace)와 결합되어 있다는 점_입니다. 목표 성공률이 떨어지면, CloudWatch Metrics 집계 데이터에서

결론 — 온라인 평가는 모니터링(monitoring)이며, 온디맨드(on-demand) 평가는 테스트(testing)입니다. 이 두 가지를 결합하는 것이 바로 "가끔 평가하는 단계"에서 "평가가 곧 배포의 기준이 되는 단계"로 나아가는 방법입니다.

텔레메트리(Telemetry)가 OpenTelemetry이므로, 아키텍처는 여러분의 것입니다

이 부분이 개발자(DEV)에게 가장 관련성이 높은 부분입니다. 텔레메트리가 OpenTelemetry이기 때문에, 평가는 특정 벤더의 대시보드에만 종속될 필요가 없습니다.

AgentCore Evaluations는 표준 라이브러리인 OpenTelemetry (opentelemetry-instrumentation-langchain), OpenInference (openinference-instrumentation-langchain), 그리고 ADOT (AWS Distro for OpenTelemetry)를 통해 계측(instrumented)된 에이전트 텔레메트리를 소비합니다. Strands Agents와 LangGraph는 기본적으로 지원되며, 그 외의 것들은 직접 계측하면 됩니다. AgentCore Observability는 OpenTelemetry 호환 텔레메트리를 방출하므로, CloudWatch뿐만 아니라 Datadog, LangSmith, Langfuse와도 통합할 수 있습니다.

공통된 어휘는 OpenTelemetry GenAI semantic conventions입니다. 이는 아직 개발(Development) 단계에 있지만, 업계가 나아가고 있는 수렴 지점입니다. 이를 통해 예측 가능한 스팬 트리(span tree)를 얻을 수 있습니다:

invoke_agent                         (최상위 에이전트 실행)
  ├── chat            gen_ai.request.model, gen_ai.usage.input_tokens,
  │                   gen_ai.usage.output_tokens, gen_ai.response.finish_reasons
...

알아둘 만한 기본 개인정보 보호 설정: 계측은 기본적으로 프롬프트 내용이나 도구 인자(tool arguments)를 캡처하지 않습니다. gen_ai.input.messages, gen_ai.output.messages, gen_ai.system_instructions는 선택 사항(opt-in)입니다. 평가자가 판단을 내리기 위해서는 어느 정도의 콘텐츠가 필요하므로, 전체가 아닌 선택적으로 캡처를 활성화하십시오.

두 가지 데이터 소스가 옵션을 정의합니다: AgentCore 런타임(Runtime) 에이전트 엔드포인트, 또는 CloudWatch 로그 그룹(에이전트가 어디서 실행되든 트레이스(trace)를 CloudWatch로 전송하는 경우)입니다. 후자의 경우, 평가는 AgentCore 호스팅 여부에 의존하지 않음을 의미합니다.

중간에 OpenTelemetry Collector를 배치하면 하나의 트레이스 스트림(trace stream)이 AWS 네이티브 평가와 기존에 실행 중인 모든 것을 동시에 수행할 수 있습니다. 즉, 이중 계측(double-instrumentation)이 필요하지 않습니다.

"어떤 다운스트림 백엔드(downstream backend)를 사용할 것인가"에 대한 더 정교한 버전이자, 2026년 중반쯤 읽어볼 만한 솔직한 견해입니다 (아직 누구도 완전히 승리하지 못했습니다. 스팬(span)당 과금 방식이 여전히 정해지지 않았으므로, 이식성(portability)을 위해 최적화하십시오):

LangChain/LangGraph 내부 사용 시        → LangSmith
OTel 중립성 + 플랫폼 엔지니어링(platform eng)    → Arize Phoenix (OSS)
평가가 배포를 주도해야 함 (Evals should drive deploys)        → Braintrust
...

결론 — OpenTelemetry Collector를 팬아웃(fan-out) 지점으로 만들고, 특정 벤더의 SDK가 아닌 GenAI 시맨틱 컨벤션(semantic conventions)에 맞춰 계측(instrument)하십시오. 그렇게 하면 에이전트 코드를 수정하지 않고도 내일 당장 다운스트림 백엔드를 교체할 수 있는 이식성을 유지할 수 있습니다.

최소한의 (개념적) 설정

어떤 백엔드를 사용하든 설정 순서는 다음과 같습니다. 프로세스 라이프사이클 초기 단계에 OpenTelemetry SDK와 OTLP 익스포터(exporter)를 추가하십시오. LLM 클라이언트 스팬(span)을 위해 자동 계측(Traceloop의 OpenLLMetry 또는 Arize의 OpenInference)을 무료로 추가하고, 최상위 에이전트 함수를 invoke_agent 스팬으로 감싸십시오.

export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export OTEL_SERVICE_NAME="claims-triage-agent"
...

Collector는 샘플링(sampling)을 수행하고, 민감한 속성을 가리며(redact), 라우팅하는 곳입니다. 개념적 형태는 다음과 같습니다 (익스포터/엔드포인트 이름은 배포 환경에 따라 다를 수 있습니다):

receivers:
  otlp:
    protocols:
...

이제 개인정보 보호 또는 샘플링 변경은 재계측(re-instrumentation) 프로젝트가 아니라, 설정 파일 하나를 수정하는 작업이 됩니다.

CI/CD에 평가 연결하기

온디맨드(On-demand) 평가는 "평가 체계가 있다"는 상태를 실제 품질 게이트(quality gate)로 전환하는 핵심입니다. 다음은 개념적인 형태입니다 — 이 기능은 프리뷰(preview)에서 GA(General Availability)로 이동하면서 명칭이 변경되었으므로, 현재 문서와 정확한 API 표면(API surface)을 확인하십시오:

import boto3

client = boto3.client("bedrock-agentcore-control")
...

CI/CD에 통합하면 품질이 저하될 때 배포를 차단합니다:

# .github/workflows/agent-quality-gate.yml
name: Agent Quality Gate
on:
...

단위 테스트 (unit-test) 스위트와 동일한 방식입니다. 다만 "테스트"가 확률론적 판사 (probabilistic judge)라는 점이 다릅니다. 따라서 임계값 (threshold)은 절대적인 진리가 아니라 정책적 결정입니다. 0.7은 많은 팀에게 합리적인 시작점이지만, 엄격하게 강제하기 전에 인간의 검토 (human review)를 통해 보정하십시오. 단순히 절대적인 하한선에 도달했을 때가 아니라, 성능 퇴보 (regression)가 발생했을 때 실패로 처리하십시오 — 0.91에서 0.30으로의 붕괴는 단순히 낮은 숫자가 아니라 '하락'이었습니다.

점수가 당신을 속이고 있는 지점

판사 (judge)는 모델의 의견이지, 계측기로부터 얻은 측정값이 아닙니다. 다음 사항들을 모든 수치 옆에 염두에 두십시오:

AI 자동 생성 콘텐츠

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

원문 바로가기
0

댓글

0