<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LLMOps Archives -</title>
	<atom:link href="https://blog.kwt.co.kr/tag/llmops/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.kwt.co.kr/tag/llmops/</link>
	<description>여러분의 돈과 시간을 낭비하지마세요.</description>
	<lastBuildDate>Wed, 30 Sep 2026 13:00:33 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>

<image>
	<url>https://blog.kwt.co.kr/wp-content/uploads/2022/07/cropped-logo_bg-32x32.jpg</url>
	<title>LLMOps Archives -</title>
	<link>https://blog.kwt.co.kr/tag/llmops/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>AI 에이전트 추적 실무: OpenTelemetry로 지연·토큰·도구 호출 연결하기</title>
		<link>https://blog.kwt.co.kr/ai-agent-tracing-opentelemetry-guide/</link>
					<comments>https://blog.kwt.co.kr/ai-agent-tracing-opentelemetry-guide/#respond</comments>
		
		<dc:creator><![CDATA[시간 조절자]]></dc:creator>
		<pubDate>Mon, 24 Aug 2026 00:07:08 +0000</pubDate>
				<category><![CDATA[기술]]></category>
		<category><![CDATA[AI 에이전트]]></category>
		<category><![CDATA[LLMOps]]></category>
		<category><![CDATA[OpenTelemetry]]></category>
		<category><![CDATA[트레이싱]]></category>
		<guid isPermaLink="false">https://blog.kwt.co.kr/ai-agent-tracing-opentelemetry-guide/</guid>

					<description><![CDATA[<p>AI 에이전트의 요청·모델·검색·도구 호출을 OpenTelemetry trace와 span으로 연결하는 방법을 정리했다. 최소 속성, Python 예시, 개인정보·비용·경보 체크리스트를 다룬다.</p>
<p>The post <a href="https://blog.kwt.co.kr/ai-agent-tracing-opentelemetry-guide/">AI 에이전트 추적 실무: OpenTelemetry로 지연·토큰·도구 호출 연결하기</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>AI 에이전트 장애를 제대로 추적하려면 모델 호출 로그만 모아서는 부족하다. <strong>사용자 요청 하나를 루트 trace로 만들고, 에이전트 실행·모델 호출·검색·도구 호출·최종 응답을 parent-child span으로 연결해야 한다.</strong> 그래야 느린 구간, 토큰 급증 지점, 실패한 도구와 재시도 원인을 한 화면에서 찾을 수 있다. OpenTelemetry를 공통 전송 계층으로 두면 특정 관측 제품에 종속되지 않고 시작할 수 있다.</p>



<div class="wp-block-group has-border-color has-background" style="border-color:#bfdbfe;border-width:1px;background-color:#eff6ff;padding-top:20px;padding-right:22px;padding-bottom:20px;padding-left:22px"><div class="wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-1 wp-block-group-is-layout-constrained">


<h2 class="wp-block-heading has-medium-font-size">핵심 요약</h2>



<ul class="wp-block-list">
<li>첫 도입 범위는 <strong>trace_id, 단계, 지연, 상태, 토큰 사용량, 도구 이름</strong>으로 제한한다. 프롬프트와 응답 원문은 기본 수집 대상에서 뺀다.</li>



<li>하나의 사용자 요청 아래에 agent·model·tool·retrieval span을 중첩해야 병목과 실패 전파 경로가 보인다.</li>



<li>운영 대시보드는 평균보다 p95 지연, 오류율, 재시도율, 요청당 토큰, 도구별 실패율을 우선한다.</li>



<li>OpenTelemetry GenAI 의미 규약은 별도 저장소로 이동해 계속 진화 중이므로 속성 이름을 코드 전역에 박지 말고 매핑 계층을 둔다.</li>
</ul>


</div></div>



<h2 class="wp-block-heading">AI 에이전트 추적은 일반 API 추적과 무엇이 다른가</h2>



<p>일반 HTTP API는 요청 하나가 몇 개의 서비스 span으로 끝나는 경우가 많다. AI 에이전트는 한 요청 안에서 모델이 계획을 세우고, 여러 도구를 호출하고, 결과가 부족하면 모델을 다시 부르는 반복 구조를 가진다. 최종 응답은 성공했어도 중간 검색이 세 번 실패했거나 불필요한 모델 재호출로 비용이 커졌을 수 있다.</p>



<p>OpenAI Agents SDK 공식 문서는 기본 trace가 runner, task, turn, agent, generation, function tool, guardrail, handoff span을 포함한다고 설명한다. 특정 SDK를 쓰지 않더라도 이 계층은 실무 설계의 좋은 기준이 된다. 핵심은 로그 줄을 시간순으로 모으는 것이 아니라 <strong>어떤 단계가 어떤 부모 작업에서 파생됐는지</strong> 보존하는 데 있다.</p>



<figure class="wp-block-table"><table><thead><tr><th>질문</th><th>로그만 있을 때</th><th>연결된 trace가 있을 때</th></tr></thead><tbody><tr><td>왜 12초가 걸렸나</td><td>타임스탬프를 수동 대조한다.</td><td>모델·검색·도구 span의 지연을 분해한다.</td></tr><tr><td>왜 토큰이 늘었나</td><td>요청별 합계만 보이기 쉽다.</td><td>모델 재호출과 단계별 토큰을 찾는다.</td></tr><tr><td>어디서 실패했나</td><td>예외 문자열을 검색한다.</td><td>오류 span과 부모 agent 실행을 함께 본다.</td></tr><tr><td>같은 대화인가</td><td>사용자 ID에 의존하기 쉽다.</td><td>가명화한 session/thread 키로 trace를 묶는다.</td></tr></tbody></table></figure>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="1050" height="600" src="https://blog.kwt.co.kr/wp-content/uploads/2026/08/ai-agent-trace-flow.png" alt="사용자 요청부터 에이전트 모델 도구 최종 응답까지 연결된 트레이스 구조" class="wp-image-2805" style="width:640px;height:auto"/><figcaption class="wp-element-caption">요청·에이전트·모델·도구·응답을 하나의 trace로 연결한 구조<br />출처: OpenTelemetry·OpenAI Agents SDK 공식 문서 기반 구성</figcaption></figure></div>


<h2 class="wp-block-heading">먼저 정할 최소 span 구조</h2>



<p>처음부터 모든 이벤트를 수집하면 비용과 개인정보 위험만 커진다. 아래 다섯 단계로 시작하면 대부분의 운영 질문에 답할 수 있다. 에이전트가 검색을 쓰지 않으면 retrieval span은 생략하고, 여러 도구를 병렬 실행한다면 같은 부모 아래에 형제 span으로 둔다.</p>



<figure class="wp-block-table"><table><thead><tr><th>span</th><th>부모</th><th>최소 기록값</th><th>주요 질문</th></tr></thead><tbody><tr><td>request / workflow</td><td>없음</td><td>trace_id, route, total latency, status</td><td>요청 전체가 성공했는가</td></tr><tr><td>agent run</td><td>request</td><td>agent name, iteration, handoff</td><td>몇 번 계획하고 위임했는가</td></tr><tr><td>model call</td><td>agent run</td><td>provider, model, input/output token, latency</td><td>비용과 지연이 어디서 늘었는가</td></tr><tr><td>retrieval / tool</td><td>agent run</td><td>tool name, duration, status, retry count</td><td>어떤 외부 작업이 실패했는가</td></tr><tr><td>final response</td><td>request</td><td>result status, quality signal</td><td>최종 결과가 기준을 통과했는가</td></tr></tbody></table></figure>



<p>W3C Trace Context의 <code>traceparent</code>를 서비스 경계에서 전달하면 웹 API, 작업 큐, 도구 서버가 같은 분산 trace에 참여할 수 있다. 다만 대화 전체를 하나의 무한히 긴 trace로 만들기보다 <strong>사용자 요청 단위 trace</strong>와 별도의 가명 session key를 함께 쓰는 편이 조회와 보존에 유리하다.</p>



<h2 class="wp-block-heading">속성은 표준·조직·민감정보로 나눠 관리한다</h2>



<p>OpenTelemetry 공식 사이트의 GenAI 의미 규약 페이지는 2026년 8월 현재 관련 규약이 별도 <code>semantic-conventions-genai</code> 저장소로 이동했다고 안내한다. 새 저장소에는 agent, inference, tool, retrieval 등 span 문서와 참조 시나리오가 있다. 아직 변할 수 있는 이름을 애플리케이션 곳곳에 직접 쓰면 업그레이드 비용이 커진다.</p>



<figure class="wp-block-table"><table><thead><tr><th>구분</th><th>예시</th><th>운영 원칙</th></tr></thead><tbody><tr><td>표준 후보</td><td>operation, provider, model, token usage, error type</td><td>공식 규약의 안정성 상태를 확인하고 exporter 앞에서 매핑한다.</td></tr><tr><td>조직 속성</td><td>service tier, feature flag, release, tenant class</td><td>개인 식별값 대신 운영 분류만 넣는다.</td></tr><tr><td>상관관계</td><td>trace_id, span_id, parent span, pseudonymous session</td><td>원본 사용자 ID를 그대로 넣지 않는다.</td></tr><tr><td>본문 데이터</td><td>prompt, response, tool arguments</td><td>기본 비수집, 필요 시 별도 동의·마스킹·짧은 보존을 적용한다.</td></tr></tbody></table></figure>



<p>Langfuse 공식 OpenTelemetry 문서도 GenAI 속성 규약이 진화 중이며 수신 OTel trace를 자체 데이터 모델로 매핑한다고 밝힌다. 또한 baggage는 서비스와 외부 API 경계를 따라 전파되므로 비밀번호, API 키, 개인정보를 넣지 말라고 경고한다. 검색 필터 편의를 위해 민감값을 baggage에 넣는 설계는 피해야 한다.</p>



<h2 class="wp-block-heading">Python에서 최소 추적을 붙이는 순서</h2>



<p>다음 코드는 특정 LLM 프레임워크 자동 계측에 기대지 않고 구조를 이해하기 위한 최소 예시다. OpenTelemetry Python 공식 문서의 <code>TracerProvider</code>, <code>BatchSpanProcessor</code>, current span 구조를 따른다. <code>app.*</code> 속성은 이 글의 조직 예시이며 공식 GenAI 속성으로 오해하면 안 된다.</p>



<pre class="wp-block-code"><code>from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

provider = TracerProvider()
provider.add_span_processor(
    BatchSpanProcessor(OTLPSpanExporter())
)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(&quot;agent-service&quot;)

with tracer.start_as_current_span(&quot;agent.request&quot;) as root:
    root.set_attribute(&quot;app.route&quot;, &quot;support-agent&quot;)

    with tracer.start_as_current_span(&quot;agent.model_call&quot;) as model_span:
        model_span.set_attribute(&quot;app.model&quot;, selected_model)
        result = call_model(messages)
        model_span.set_attribute(&quot;app.input_tokens&quot;, result.input_tokens)
        model_span.set_attribute(&quot;app.output_tokens&quot;, result.output_tokens)

    with tracer.start_as_current_span(&quot;agent.tool_call&quot;) as tool_span:
        tool_span.set_attribute(&quot;app.tool&quot;, &quot;knowledge_search&quot;)
        docs = search_knowledge(result.query)</code></pre>



<ol class="wp-block-list">
<li><strong>개발 환경에서 console exporter로 구조를 먼저 확인한다.</strong> 부모·자식 관계가 끊기지 않는지 본다.</li>



<li><strong>OTLP exporter를 Collector 또는 관측 백엔드에 연결한다.</strong> 애플리케이션이 각 제품의 전용 전송 코드를 직접 갖지 않게 한다.</li>



<li><strong>모델·도구 wrapper 한 곳에서 속성을 정규화한다.</strong> 프레임워크가 바뀌어도 대시보드 키를 유지한다.</li>



<li><strong>오류와 재시도를 이벤트 또는 span 상태로 남긴다.</strong> 최종 성공만 기록하면 숨은 실패 비용을 놓친다.</li>



<li><strong>샘플링과 보존 기간을 부하 테스트로 결정한다.</strong> trace 자체가 서비스 병목이 되지 않는지 확인한다.</li>
</ol>



<h2 class="wp-block-heading">운영 대시보드는 다섯 지표부터 만든다</h2>



<p>대시보드에 모든 속성을 올리기보다 장애와 비용 결정을 직접 바꾸는 지표를 먼저 둔다. 아래 경보선은 제품 공식값이 아니라 초기 운영을 위한 예시다. 서비스의 정상 기준선을 수집한 뒤 조정해야 한다.</p>



<figure class="wp-block-table"><table><thead><tr><th>지표</th><th>보는 이유</th><th>초기 점검 조건 예시</th></tr></thead><tbody><tr><td>요청 p95 지연</td><td>느린 소수 요청이 사용자 경험을 좌우한다.</td><td>기준선 대비 2배가 15분 지속</td></tr><tr><td>모델 호출 횟수/요청</td><td>루프와 불필요한 재계획을 찾는다.</td><td>상한 초과 요청 비율 증가</td></tr><tr><td>입력·출력 토큰/요청</td><td>비용 급증과 컨텍스트 팽창을 찾는다.</td><td>배포 전후 중앙값·p95 비교</td></tr><tr><td>도구별 오류·재시도율</td><td>외부 API와 검색 장애를 분리한다.</td><td>특정 도구 오류율이 기준선 초과</td></tr><tr><td>완료율·품질 신호</td><td>빠르지만 실패한 응답을 걸러낸다.</td><td>status OK와 평가 통과를 함께 집계</td></tr></tbody></table></figure>



<p>토큰 단가를 연결할 때는 모델과 컨텍스트 구간, 캐시 읽기·쓰기, Batch 여부에 따라 가격표가 달라질 수 있다. 따라서 span에는 계산된 비용만 남기기보다 provider, model, 입력·출력·캐시 토큰을 보존하고 비용 계산기를 별도 버전으로 관리하는 편이 감사와 재계산에 유리하다.</p>



<h2 class="wp-block-heading">개인정보와 비용 때문에 실패하는 지점</h2>



<ul class="wp-block-list">
<li><strong>프롬프트 원문 기본 수집:</strong> 고객 정보, 소스코드, API 키가 trace 백엔드로 복제될 수 있다. 메타데이터 우선 원칙을 적용한다.</li>



<li><strong>모든 span 100% 장기 보존:</strong> 트래픽과 도구 호출 수가 늘면 저장·인덱싱 비용이 빠르게 커진다. 정상 요청은 head sampling, 오류·고지연은 tail sampling을 검토한다.</li>



<li><strong>비동기 경계의 context 손실:</strong> 큐 worker와 병렬 도구 실행에서 부모 context를 전달하지 않으면 trace가 여러 조각으로 갈라진다.</li>



<li><strong>속성의 무제한 cardinality:</strong> 원문 URL, 사용자 ID, 임의 오류 메시지를 인덱스 필드로 쓰면 조회 비용이 커진다. 정규화한 코드와 제한된 분류를 쓴다.</li>



<li><strong>관측 백엔드 실패의 서비스 전파:</strong> exporter는 batch와 짧은 timeout을 쓰고, 추적 전송 실패 때문에 사용자 요청까지 실패하지 않게 분리한다.</li>
</ul>



<p>OpenAI Agents SDK 문서는 추적이 기본 활성화될 수 있고, 전역 환경변수·코드·개별 실행 설정으로 끌 수 있다고 안내한다. 또한 Zero Data Retention 정책을 쓰는 조직에는 해당 trace 기능을 사용할 수 없다고 명시한다. 사용하는 SDK의 기본값과 데이터 정책을 배포 전에 반드시 확인해야 한다.</p>



<h2 class="wp-block-heading">도입 단계별 체크리스트</h2>



<figure class="wp-block-table"><table><thead><tr><th>단계</th><th>완료 조건</th><th>중단 조건</th></tr></thead><tbody><tr><td>1. 로컬 구조</td><td>요청→agent→model/tool 계층이 보인다.</td><td>부모 context가 자주 끊긴다.</td></tr><tr><td>2. 스테이징 OTLP</td><td>Collector 수신과 exporter 재시도가 확인된다.</td><td>전송이 응답 지연을 유의미하게 늘린다.</td></tr><tr><td>3. 민감정보 점검</td><td>샘플 trace에 원문·키·개인정보가 없다.</td><td>마스킹 이전 데이터가 남는다.</td></tr><tr><td>4. 제한 배포</td><td>p95·오류·토큰·도구율 대시보드가 동작한다.</td><td>cardinality와 저장량을 예측할 수 없다.</td></tr><tr><td>5. 운영 확대</td><td>장애 한 건을 trace로 재현해 원인을 찾는다.</td><td>수집은 되지만 실제 운영 질문에 답하지 못한다.</td></tr></tbody></table></figure>



<p>이미 개념과 제품 선택부터 정리해야 한다면 <a href="https://blog.kwt.co.kr/ai-agent-observability-guide/">AI 에이전트 관측성 가이드</a>와 <a href="https://blog.kwt.co.kr/ai-agent-observability-tools-comparison/">Langfuse·LangSmith·Phoenix·OpenTelemetry 비교</a>를 먼저 보는 편이 낫다. 비용 분석까지 확장하려면 <a href="https://blog.kwt.co.kr/ai-agent-cost-tracking-guide/">AI 에이전트 비용 추적 가이드</a>를 함께 연결하면 된다.</p>



<h2 class="wp-block-heading">FAQ</h2>



<h3 class="wp-block-heading">로그와 trace를 둘 다 남겨야 하나</h3>



<p>둘의 역할이 다르다. trace는 요청의 단계와 부모·자식 관계, 지연을 보여주고 로그는 상세 사건과 디버그 문맥을 제공한다. 로그에 trace_id와 span_id를 넣어 상호 이동할 수 있게 만드는 구성이 실용적이다.</p>



<h3 class="wp-block-heading">프롬프트와 응답을 저장하지 않으면 디버깅이 불가능하지 않나</h3>



<p>대부분의 운영 장애는 모델명, 지연, 토큰, 도구 입력의 분류, 상태, 오류 코드만으로도 1차 진단이 가능하다. 원문이 꼭 필요한 평가 환경은 별도 동의, 마스킹, 접근 제어, 짧은 보존 기간을 적용해 분리한다.</p>



<h3 class="wp-block-heading">OpenTelemetry만 설치하면 AI 비용도 자동으로 계산되나</h3>



<p>그렇지 않다. OpenTelemetry는 신호와 context를 수집·전송하는 기반이다. 모델별 단가와 캐시·컨텍스트 구간을 반영한 비용 계산 로직 또는 이를 지원하는 백엔드가 별도로 필요하다.</p>



<h3 class="wp-block-heading">trace는 요청마다 하나가 좋은가, 대화마다 하나가 좋은가</h3>



<p>일반적으로 사용자 요청마다 trace를 만들고 가명 session 또는 thread 키로 여러 trace를 묶는 편이 낫다. 대화 전체를 하나의 장기 trace로 만들면 크기, 시간 제한, 조회가 복잡해진다.</p>



<h3 class="wp-block-heading">가장 먼저 경보로 만들 지표는 무엇인가</h3>



<p>오류율과 요청 p95 지연을 먼저 두고, 모델 호출 횟수와 요청당 토큰을 추가하는 순서가 현실적이다. 도구가 핵심인 서비스라면 도구별 오류·재시도율도 첫 단계에 포함한다.</p>



<h2 class="wp-block-heading">참고 자료</h2>



<ul class="wp-block-list">
<li><a href="https://github.com/open-telemetry/semantic-conventions-genai">OpenTelemetry GenAI Semantic Conventions 저장소</a></li>



<li><a href="https://github.com/open-telemetry/semantic-conventions-genai/blob/main/docs/gen-ai/gen-ai-agent-spans.md">OpenTelemetry GenAI Agent Spans</a></li>



<li><a href="https://opentelemetry.io/docs/languages/python/instrumentation/">OpenTelemetry Python Instrumentation</a></li>



<li><a href="https://openai.github.io/openai-agents-python/tracing/">OpenAI Agents SDK Tracing</a></li>



<li><a href="https://langfuse.com/docs/opentelemetry/get-started">Langfuse OpenTelemetry 문서</a></li>



<li><a href="https://www.w3.org/TR/trace-context/">W3C Trace Context</a></li>
</ul>



<p>문서 확인 기준일은 2026년 8월 24일이다. OpenTelemetry GenAI 의미 규약은 진화 중이므로 실제 적용 전 저장소의 최신 상태와 사용하는 SDK·백엔드의 지원 범위를 다시 확인해야 한다.</p>



<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"로그와 trace를 둘 다 남겨야 하나","acceptedAnswer":{"@type":"Answer","text":"trace는 요청 단계와 관계·지연을, 로그는 상세 사건을 담당한다. 로그에 trace_id와 span_id를 넣어 함께 쓰는 편이 좋다."}},{"@type":"Question","name":"프롬프트와 응답을 저장하지 않으면 디버깅이 불가능하지 않나","acceptedAnswer":{"@type":"Answer","text":"메타데이터만으로 1차 진단이 가능하다. 원문은 별도 동의·마스킹·접근 제어·짧은 보존 기간을 적용한 환경에서만 수집한다."}},{"@type":"Question","name":"OpenTelemetry만 설치하면 AI 비용도 자동으로 계산되나","acceptedAnswer":{"@type":"Answer","text":"아니다. 모델별 단가와 캐시·컨텍스트 구간을 반영한 비용 계산 로직이나 백엔드가 별도로 필요하다."}},{"@type":"Question","name":"trace는 요청마다 하나가 좋은가, 대화마다 하나가 좋은가","acceptedAnswer":{"@type":"Answer","text":"요청마다 trace를 만들고 가명 session 또는 thread 키로 여러 trace를 묶는 방식이 일반적으로 관리하기 쉽다."}},{"@type":"Question","name":"가장 먼저 경보로 만들 지표는 무엇인가","acceptedAnswer":{"@type":"Answer","text":"오류율과 요청 p95 지연을 우선하고 모델 호출 횟수, 요청당 토큰, 도구 오류·재시도율을 추가한다."}}]}</script>
		<div class="wpulike wpulike-robeen " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="Like Button"
					data-ulike-id="2806"
					data-ulike-nonce="fc3ba7106e"
					data-ulike-type="post"
					data-ulike-template="wpulike-robeen"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_2806"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></div>
	<p>The post <a href="https://blog.kwt.co.kr/ai-agent-tracing-opentelemetry-guide/">AI 에이전트 추적 실무: OpenTelemetry로 지연·토큰·도구 호출 연결하기</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kwt.co.kr/ai-agent-tracing-opentelemetry-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>RAG 평가 실무 가이드: 검색 품질과 답변 품질을 분리하는 법</title>
		<link>https://blog.kwt.co.kr/rag-evaluation-retrieval-answer-quality-guide/</link>
					<comments>https://blog.kwt.co.kr/rag-evaluation-retrieval-answer-quality-guide/#respond</comments>
		
		<dc:creator><![CDATA[시간 조절자]]></dc:creator>
		<pubDate>Wed, 19 Aug 2026 00:07:42 +0000</pubDate>
				<category><![CDATA[기술]]></category>
		<category><![CDATA[AI Evals]]></category>
		<category><![CDATA[LangSmith]]></category>
		<category><![CDATA[LLMOps]]></category>
		<category><![CDATA[RAG]]></category>
		<category><![CDATA[RAG 평가]]></category>
		<category><![CDATA[검색 품질]]></category>
		<guid isPermaLink="false">https://blog.kwt.co.kr/rag-evaluation-retrieval-answer-quality-guide/</guid>

					<description><![CDATA[<p>RAG 평가를 검색, 컨텍스트, 답변으로 분리해 Recall@K·MRR·nDCG·근거성·정확성을 측정하고 회귀 테스트로 운영하는 방법을 정리했다.</p>
<p>The post <a href="https://blog.kwt.co.kr/rag-evaluation-retrieval-answer-quality-guide/">RAG 평가 실무 가이드: 검색 품질과 답변 품질을 분리하는 법</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>RAG 품질을 올리려면 최종 답변 점수 하나만 봐서는 안 된다. <strong>검색이 필요한 문서를 찾았는지, 가져온 문서에 잡음이 얼마나 섞였는지, 답변이 근거를 지켰는지</strong>를 분리해 측정해야 한다. 그래야 임베딩·청킹·검색 파라미터 문제를 프롬프트나 모델 문제로 오진하지 않는다.</p>



<div class="wp-block-group summary-box has-border-color has-background" style="border-color:#dbeafe;border-width:1px;background-color:#eff6ff;margin-top:24px;margin-bottom:24px;padding-top:18px;padding-right:20px;padding-bottom:18px;padding-left:20px"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p><strong>핵심 요약</strong></p>



<ul class="wp-block-list">
<li>검색기는 Recall@K·MRR·nDCG와 관련 문서 비율로 평가한다.</li>



<li>생성기는 근거성, 답변 관련성, 정답 정확성, 거절 품질로 평가한다.</li>



<li>정답 문서가 있는 질문과 없는 질문을 섞고, 실제 운영 로그의 실패 사례를 계속 추가한다.</li>



<li>LLM 심사 점수는 사람 라벨과 일치도를 확인한 뒤 회귀 테스트에 사용한다.</li>



<li>출시 기준은 평균점수보다 핵심 질문 실패율과 안전 관련 실패 건수로 잡는 편이 낫다.</li>
</ul>
</div></div>



<h2 class="wp-block-heading">RAG 평가는 검색과 답변을 따로 봐야 한다</h2>



<p>RAG는 질문, 검색, 컨텍스트 조립, 답변 생성의 연쇄 시스템이다. 정답이 틀렸다는 결과만 기록하면 어느 단계가 고장 났는지 알 수 없다. 검색 결과에 정답 문서가 없었다면 생성 모델을 바꿔도 해결되지 않는다. 반대로 정답 문서가 들어왔는데 답변이 근거를 벗어났다면 검색 튜닝보다 프롬프트·모델·출력 검증을 손봐야 한다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>평가 구간</th><th>확인할 질문</th><th>대표 지표</th><th>실패 시 먼저 볼 곳</th></tr></thead><tbody><tr><td>테스트셋</td><td>실제 사용 질문을 반영했는가</td><td>유형·난도·언어별 분포</td><td>운영 로그와 라벨 기준</td></tr><tr><td>검색</td><td>필요한 문서를 상위 K개 안에 찾았는가</td><td>Recall@K, MRR, nDCG@K</td><td>청킹, 임베딩, 필터, 하이브리드 검색</td></tr><tr><td>컨텍스트</td><td>관련 없는 문서가 답변을 방해하는가</td><td>Context Precision, 노이즈 민감도</td><td>K값, 재랭커, 문서 중복</td></tr><tr><td>답변</td><td>질문에 답하고 근거를 지켰는가</td><td>근거성, 관련성, 정확성</td><td>프롬프트, 모델, 인용·거절 규칙</td></tr></tbody></table></figure>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1050" height="620" src="https://blog.kwt.co.kr/wp-content/uploads/2026/08/rag-evaluation-pipeline-1.png" alt="RAG 평가를 테스트셋 검색 컨텍스트 답변으로 나눈 구성도" class="wp-image-2789" style="width:620px;height:auto"/><figcaption class="wp-element-caption">검색과 답변을 분리한 RAG 평가 흐름<br />출처: Ragas·LangSmith 공식 문서 기반 재구성</figcaption></figure></div>


<h2 class="wp-block-heading">테스트셋은 정답보다 실패 조건부터 설계한다</h2>



<p>처음부터 수천 건을 만들 필요는 없다. 도입 초기는 핵심 업무 질문 50~100건으로 시작하되 질문 유형을 의도적으로 나누는 편이 실용적이다. 단순 사실 조회만 넣으면 실제 서비스의 긴 질문, 모호한 표현, 문서에 답이 없는 질문을 놓친다. 이후 운영 로그에서 실패 사례를 골라 테스트셋을 늘린다.</p>



<ol class="wp-block-list">
<li><strong>정답이 한 문서에 있는 질문</strong>: 기본 검색 성능을 확인한다.</li>



<li><strong>여러 문서를 조합해야 하는 질문</strong>: 다중 근거 회수와 합성을 확인한다.</li>



<li><strong>문서에 답이 없는 질문</strong>: 근거 없는 생성 대신 모른다고 답하는지 본다.</li>



<li><strong>날짜·버전이 충돌하는 질문</strong>: 최신 문서 우선순위와 메타데이터 필터를 본다.</li>



<li><strong>오탈자·약어·한국어와 영어가 섞인 질문</strong>: 실제 입력 변형에 견디는지 본다.</li>



<li><strong>권한 밖 문서를 묻는 질문</strong>: 검색 단계에서 접근 제어가 지켜지는지 본다.</li>
</ol>



<p>각 행에는 질문, 기대 답변, 관련 문서 ID, 반드시 포함할 사실, 허용 가능한 변형, 중요도, 실패 유형을 저장한다. 정답 문서 라벨이 없으면 검색 Recall을 계산할 수 없으므로 최소한 핵심 질문에는 관련 문서 ID를 사람이 붙이는 것이 좋다.</p>



<pre class="wp-block-code"><code>{
  "question": "환불 요청 가능 기간은?",
  "reference_answer": "수령 후 7일 이내",
  "relevant_doc_ids": ["policy-2026-08"],
  "must_include": ["7일"],
  "risk": "high",
  "expected_behavior": "answer_with_citation"
}</code></pre>



<h2 class="wp-block-heading">검색 품질은 Recall@K 하나로 끝나지 않는다</h2>



<p>검색 평가는 관련 문서 라벨이 있을 때 가장 명확하다. Pinecone의 정보검색 평가 설명처럼 Recall@K는 관련 문서를 얼마나 놓치지 않았는지, MRR은 첫 관련 결과가 얼마나 위에 있는지, nDCG는 여러 결과의 관련도와 순서를 함께 본다. 서비스 목적에 따라 우선순위가 달라진다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>지표</th><th>무엇을 측정하는가</th><th>잘 맞는 상황</th><th>주의점</th></tr></thead><tbody><tr><td>Recall@K</td><td>관련 문서 중 상위 K개 안에 찾은 비율</td><td>필요한 근거를 놓치면 안 되는 검색</td><td>K를 키우면 잡음과 생성 비용도 늘 수 있다</td></tr><tr><td>Precision@K</td><td>상위 K개 중 관련 문서의 비율</td><td>짧고 깨끗한 컨텍스트가 중요한 경우</td><td>관련 문서 전체를 놓치는 문제는 따로 봐야 한다</td></tr><tr><td>MRR</td><td>첫 관련 문서 순위의 역수 평균</td><td>정답 문서 하나를 빨리 찾는 FAQ</td><td>두 번째 이후 관련 문서 품질을 거의 반영하지 않는다</td></tr><tr><td>nDCG@K</td><td>관련도 등급과 순위를 함께 반영</td><td>부분 관련·핵심 관련을 구분할 수 있는 검색</td><td>등급 라벨 비용과 기준 합의가 필요하다</td></tr><tr><td>Context Precision</td><td>관련 컨텍스트가 앞쪽에 배치됐는지 평가</td><td>LLM 심사 기반으로 문맥 잡음을 점검</td><td>심사 모델과 프롬프트 변화에 영향을 받는다</td></tr></tbody></table></figure>



<p>실무에서는 Recall@K를 먼저 확보한 뒤 Precision과 지연·토큰 비용을 함께 줄이는 순서가 안전하다. 정답 문서를 못 가져오는 상태에서 컨텍스트를 짧게 만드는 것은 품질 개선이 아니라 근거 삭제가 될 수 있다. 검색 구조 자체를 설계하는 단계라면 <a href="https://blog.kwt.co.kr/graphrag-rag-vector-search-knowledge-graph/">GraphRAG와 벡터 검색의 차이</a>도 함께 확인할 수 있다.</p>



<h2 class="wp-block-heading">답변 평가는 근거성·관련성·정확성을 분리한다</h2>



<p>LangSmith 공식 RAG 평가 튜토리얼은 답변과 정답의 정확성, 답변과 질문의 관련성, 답변과 검색 문서의 근거성, 검색 문서와 질문의 관련성을 서로 다른 비교로 정의한다. 이 분리가 중요하다. 근거에는 충실하지만 질문에 답하지 않는 문장도 있고, 그럴듯하고 유용하지만 문서에 없는 사실을 덧붙인 답변도 있기 때문이다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>평가 항목</th><th>비교 대상</th><th>판정 질문</th></tr></thead><tbody><tr><td>정확성</td><td>생성 답변 <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 기준 답변</td><td>필수 사실이 맞고 충돌하는 내용이 없는가</td></tr><tr><td>답변 관련성</td><td>생성 답변 <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 사용자 질문</td><td>질문을 직접 해결하며 불필요하게 벗어나지 않는가</td></tr><tr><td>근거성</td><td>생성 답변 <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 검색 문서</td><td>답변의 주장마다 검색 문서에서 근거를 찾을 수 있는가</td></tr><tr><td>검색 관련성</td><td>검색 문서 <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 사용자 질문</td><td>가져온 문서가 질문 해결에 실제로 필요한가</td></tr><tr><td>거절 품질</td><td>답변 <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 문서 부재·정책</td><td>근거가 없거나 권한이 없을 때 안전하게 중단하는가</td></tr></tbody></table></figure>



<p>Ragas도 Context Precision·Context Recall·Response Relevancy·Faithfulness 같은 RAG 전용 지표를 제공한다. 다만 도구가 내놓은 0~1 점수를 절대적인 품질로 해석하면 안 된다. OpenAI 평가 가이드도 자동 지표를 사람 판단으로 보정하고, 실제 분포를 반영한 과업별 평가를 만들며, 변경 때마다 지속 평가할 것을 권한다.</p>



<h2 class="wp-block-heading">최소 운영 절차는 7단계면 충분하다</h2>



<ol class="wp-block-list">
<li><strong>성공 기준을 먼저 쓴다.</strong> 예를 들어 핵심 정책 질문은 관련 문서가 상위 5개 안에 있어야 하고, 답변은 문서에 없는 숫자를 만들면 실패로 정의한다.</li>



<li><strong>실제 질문을 유형별로 모은다.</strong> 정상·경계·적대·답 없음 질문을 섞는다.</li>



<li><strong>관련 문서와 기준 답변을 라벨링한다.</strong> 위험도가 높은 질문부터 사람이 검수한다.</li>



<li><strong>검색기를 단독 실행한다.</strong> 답변 모델을 호출하기 전에 Recall@K·MRR·지연을 저장한다.</li>



<li><strong>생성기를 고정된 검색 결과로 평가한다.</strong> 검색 변동과 답변 변동을 분리한다.</li>



<li><strong>자동 심사와 사람 판정을 맞춘다.</strong> 불일치 사례를 보고 루브릭과 예시를 보완한다.</li>



<li><strong>모든 변경에서 회귀 테스트한다.</strong> 임베딩, 청킹, 프롬프트, 모델, 재랭커 변경 전후를 같은 데이터셋으로 비교한다.</li>
</ol>



<p>평가 결과를 실행 단위 trace와 연결하면 원인 분석이 빨라진다. 검색 결과, 프롬프트 버전, 모델, 토큰, 지연, 평가 점수를 함께 남기는 방법은 <a href="https://blog.kwt.co.kr/ai-agent-observability-tools-comparison/">AI 에이전트 관측 도구 비교</a>와 <a href="https://blog.kwt.co.kr/ai-agent-cost-tracking-guide/">AI 에이전트 비용 추적 가이드</a>에서 이어서 볼 수 있다.</p>



<h2 class="wp-block-heading">점수 조합으로 실패 원인을 좁힌다</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>관찰된 패턴</th><th>가능성이 큰 원인</th><th>다음 실험</th></tr></thead><tbody><tr><td>Recall은 낮고 근거성은 높다</td><td>가져온 문서에는 충실하지만 정답 문서를 놓침</td><td>청킹·필터·하이브리드 검색·재랭커 비교</td></tr><tr><td>Recall은 높고 Context Precision이 낮다</td><td>K가 크거나 중복·주변 문서가 많음</td><td>K 축소, 중복 제거, 재랭킹</td></tr><tr><td>검색은 좋고 근거성이 낮다</td><td>프롬프트 또는 생성 모델이 문서 밖 사실을 추가</td><td>인용 강제, 주장 단위 검증, 거절 규칙</td></tr><tr><td>근거성은 높고 관련성이 낮다</td><td>문서를 요약했지만 질문에 직접 답하지 않음</td><td>답변 형식과 필수 항목 루브릭 보강</td></tr><tr><td>오프라인은 좋고 운영 불만이 많다</td><td>테스트셋이 실제 사용자 분포를 반영하지 못함</td><td>운영 로그 샘플링과 실패 사례 추가</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">비용과 보안도 평가 설계에 포함한다</h2>



<p>LLM 심사기를 모든 운영 요청에 붙이면 품질 점검 비용과 지연이 커진다. 배포 전에는 전체 회귀 세트를 돌리고, 운영 중에는 위험도 기반 표본 추출과 실패 감지 후 재평가를 섞는 방식이 현실적이다. 규칙으로 판정 가능한 인용 유무·JSON 스키마·금칙어·문서 ID 일치 여부는 코드 평가기로 처리하고, 의미 판단이 필요한 항목만 LLM 심사기에 맡긴다.</p>



<p>외부 평가 서비스나 심사 모델로 질문·검색 문서·답변을 보내면 개인정보와 사내 문서가 함께 반출될 수 있다. 운영 전 데이터 보존 정책, 학습 사용 여부, 리전, 암호화, 접근 제어를 확인해야 한다. 테스트셋에는 고객 식별자를 가명 처리하고, 권한 필터가 적용된 문서만 평가 파이프라인에 전달한다.</p>



<h2 class="wp-block-heading">FAQ</h2>



<h3 class="wp-block-heading">정답 데이터가 없어도 RAG 평가를 시작할 수 있나?</h3>



<p>가능하다. 질문과 답변의 관련성, 답변과 검색 문서의 근거성, 질문과 검색 문서의 관련성은 기준 답변 없이도 LLM 심사나 사람 검토로 볼 수 있다. 다만 검색 Recall과 최종 정확성을 신뢰성 있게 측정하려면 핵심 질문부터 관련 문서와 기준 답변을 붙여야 한다.</p>



<h3 class="wp-block-heading">Ragas와 LangSmith 중 무엇을 써야 하나?</h3>



<p>Ragas는 코드 중심으로 RAG 지표를 조합하고 자체 파이프라인에 넣을 때 편하다. LangSmith는 데이터셋, 실험 비교, trace와 평가를 관리형 워크플로로 묶고 싶을 때 유리하다. 도구보다 먼저 평가 데이터 스키마와 합격 기준을 정해야 나중에 교체하기 쉽다.</p>



<h3 class="wp-block-heading">RAG 품질의 합격 점수는 몇 점으로 잡아야 하나?</h3>



<p>모든 서비스에 통하는 단일 점수는 없다. 현재 시스템의 기준선을 같은 테스트셋에서 측정하고, 핵심 질문의 실패 허용치와 안전 관련 실패 0건 같은 운영 기준을 먼저 둔다. 평균점수 상승보다 기존 정상 사례를 깨뜨리지 않았는지와 고위험 질문 실패가 줄었는지를 우선한다.</p>



<h2 class="wp-block-heading">참고자료</h2>



<ul class="wp-block-list">
<li><a href="https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/">Ragas 공식 문서: RAG 평가 지표 목록</a></li>



<li><a href="https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/context_precision/">Ragas 공식 문서: Context Precision</a></li>



<li><a href="https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/faithfulness/">Ragas 공식 문서: Faithfulness</a></li>



<li><a href="https://docs.langchain.com/langsmith/evaluate-rag-tutorial">LangSmith 공식 문서: Evaluate a RAG application</a></li>



<li><a href="https://platform.openai.com/docs/guides/evaluation-best-practices">OpenAI 공식 문서: Evaluation best practices</a></li>



<li><a href="https://www.pinecone.io/learn/offline-evaluation/">Pinecone: Evaluation Measures in Information Retrieval</a></li>
</ul>



<p><em>자료와 문서 경로는 2026년 8월 19일 확인했다.</em></p>



<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"정답 데이터가 없어도 RAG 평가를 시작할 수 있나?","acceptedAnswer":{"@type":"Answer","text":"질문과 답변의 관련성, 답변과 검색 문서의 근거성은 기준 답변 없이도 평가할 수 있다. 다만 검색 Recall과 최종 정확성을 측정하려면 핵심 질문부터 관련 문서와 기준 답변을 붙여야 한다."}},{"@type":"Question","name":"Ragas와 LangSmith 중 무엇을 써야 하나?","acceptedAnswer":{"@type":"Answer","text":"Ragas는 코드 중심 지표 조합에, LangSmith는 데이터셋·실험·trace를 묶은 관리형 워크플로에 적합하다. 도구보다 평가 스키마와 합격 기준을 먼저 정해야 한다."}},{"@type":"Question","name":"RAG 품질의 합격 점수는 몇 점으로 잡아야 하나?","acceptedAnswer":{"@type":"Answer","text":"보편적인 단일 합격 점수는 없다. 같은 테스트셋의 현재 기준선, 핵심 질문 실패 허용치, 안전 관련 실패 건수를 기준으로 정해야 한다."}}]}</script>

		<div class="wpulike wpulike-robeen " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="Like Button"
					data-ulike-id="2790"
					data-ulike-nonce="fd5a5873dd"
					data-ulike-type="post"
					data-ulike-template="wpulike-robeen"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_2790"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></div>
	<p>The post <a href="https://blog.kwt.co.kr/rag-evaluation-retrieval-answer-quality-guide/">RAG 평가 실무 가이드: 검색 품질과 답변 품질을 분리하는 법</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kwt.co.kr/rag-evaluation-retrieval-answer-quality-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI 에이전트 비용 추적 가이드: 토큰·캐시·도구 호출 비용을 팀별로 관리하는 법</title>
		<link>https://blog.kwt.co.kr/ai-agent-cost-tracking-guide/</link>
					<comments>https://blog.kwt.co.kr/ai-agent-cost-tracking-guide/#respond</comments>
		
		<dc:creator><![CDATA[시간 조절자]]></dc:creator>
		<pubDate>Thu, 30 Jul 2026 02:34:52 +0000</pubDate>
				<category><![CDATA[기술]]></category>
		<category><![CDATA[AI 에이전트]]></category>
		<category><![CDATA[Langfuse]]></category>
		<category><![CDATA[LiteLLM]]></category>
		<category><![CDATA[LLMOps]]></category>
		<category><![CDATA[OpenTelemetry]]></category>
		<guid isPermaLink="false">https://blog.kwt.co.kr/?p=2748</guid>

					<description><![CDATA[<p>AI 에이전트의 토큰·캐시·도구 호출·재시도 비용을 실행 단위로 계산하고 팀·프로젝트별로 배부하는 방법을 정리했다.</p>
<p>The post <a href="https://blog.kwt.co.kr/ai-agent-cost-tracking-guide/">AI 에이전트 비용 추적 가이드: 토큰·캐시·도구 호출 비용을 팀별로 관리하는 법</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>AI 에이전트 비용 추적은 모델 API 청구액을 보는 것으로 끝나지 않는다. <strong>사용자 목표 하나를 완료한 실행(run)을 기준으로 LLM 토큰, 캐시, 도구 API, 재시도, 관측 저장비를 합산하고 팀·프로젝트·기능별로 배부해야 한다.</strong> 월별 총액만 보면 어떤 에이전트가 비용을 만들었는지, 실패한 실행에 얼마를 썼는지, 캐시가 실제로 절감됐는지 알 수 없다.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>핵심 요약</strong>: 최상위 trace는 사용자 작업 1건으로 잡고, 그 아래 LLM 호출과 도구 호출을 span으로 기록한다. 모든 trace에 팀·사용자·프로젝트·환경 태그를 붙인다. 비용은 입력·출력·cache read·cache write·reasoning 토큰을 분리해 계산하고, 외부 API와 재시도 비용까지 더한다. 대시보드는 총비용보다 실행당 비용, 성공 실행당 비용, 실패 비용, 캐시 적중률을 먼저 보여줘야 한다.</p>
</blockquote>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="1035" height="585" src="https://blog.kwt.co.kr/wp-content/uploads/2026/07/ai-agent-cost-tracking-breakdown-2026.png" alt="AI 에이전트 월간 비용 구성: LLM 호출 1848달러, 재시도 147.84달러, 외부 도구 API 132달러, 관측·저장 250달러" class="wp-image-2747" style="width:500px;height:auto"/><figcaption class="wp-element-caption">AI 에이전트 월간 총비용은 모델 호출비 외 재시도·도구·관측 비용까지 포함해야 한다.<br>출처: 월 44,000회 가정 자체 계산</figcaption></figure></div>


<h2 class="wp-block-heading">요청당 비용이 아니라 실행당 총원가를 봐야 한다</h2>



<p>일반 챗봇은 사용자 메시지 한 번과 모델 호출 한 번이 비교적 가깝다. AI 에이전트는 한 작업 안에서 계획을 만들고, 여러 모델을 호출하고, 검색·브라우저·데이터베이스·코드 실행 도구를 사용하고, 실패하면 다시 시도한다. 한 번의 사용자 요청이 10개의 LLM 호출과 20개의 도구 호출로 늘어날 수 있다.</p>



<p>따라서 비용의 기본 단위를 HTTP 요청이나 모델 호출로 잡으면 업무 원가를 계산하기 어렵다. 가장 실용적인 단위는 다음 세 단계다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>단위</th><th>의미</th><th>답할 수 있는 질문</th></tr></thead><tbody>
<tr><td><strong>Span</strong></td><td>LLM 호출, 도구 호출, 검색, 평가 같은 개별 작업</td><td>어느 단계에서 비용과 지연이 발생했나</td></tr>
<tr><td><strong>Trace / Run</strong></td><td>사용자 목표 하나를 처리한 전체 실행</td><td>이 작업을 완료하는 데 총 얼마가 들었나</td></tr>
<tr><td><strong>Session / Project</strong></td><td>여러 실행을 묶은 사용자 세션·팀·프로젝트</td><td>누가 어떤 기능에서 예산을 사용했나</td></tr>
</tbody></table></figure>




<p>기존 <a href="https://blog.kwt.co.kr/ai-agent-observability-guide/">AI 에이전트 관측성 가이드</a>가 trace 설계와 운영 안전성을 설명했다면, 이 글은 trace에 비용 데이터를 붙여 원가와 예산을 통제하는 방법에 집중한다.</p>



<h2 class="wp-block-heading">AI 에이전트 총비용 계산식</h2>



<p>에이전트 실행 1건의 총비용은 다음 네 항목을 합쳐 계산한다.</p>



<p><strong>실행 총비용 = LLM 비용 + 도구·검색 비용 + 재시도·낭비 비용 + 인프라·관측 비용</strong></p>



<h3 class="wp-block-heading">1. LLM 비용</h3>



<p>LLM 비용도 단순히 전체 입력 토큰에 입력 단가를 곱하면 안 된다.</p>



<ul class="wp-block-list">
<li>일반 입력 토큰</li>

<li>cache read 입력 토큰</li>

<li>cache write 또는 cache creation 토큰</li>

<li>출력 토큰</li>

<li>reasoning 출력 토큰</li>

<li>이미지·오디오·영상 입력</li>

<li>Batch·Priority·Long context 같은 별도 요율</li>
</ul>



<p>제공자마다 캐시 분류와 과금 방식이 다르므로 <code>input_tokens</code> 하나로 합쳐 저장하면 나중에 정확한 재계산이 어렵다. 모델별 최신 단가와 캐시 차이는 <a href="https://blog.kwt.co.kr/2026-h2-llm-comparison-token-cost-coding-agent/">2026년 하반기 LLM 비교</a>에서 확인할 수 있다.</p>



<h3 class="wp-block-heading">2. 도구·검색 비용</h3>



<p>에이전트가 호출하는 외부 도구도 원가에 포함한다.</p>



<ul class="wp-block-list">
<li>웹 검색 API와 크롤링 서비스</li>

<li>지도·번역·OCR·음성 API</li>

<li>벡터 데이터베이스 검색·저장</li>

<li>브라우저 실행과 샌드박스 컴퓨팅</li>

<li>코드 인터프리터·GPU 작업</li>

<li>문자·메일·결제·업무 SaaS API</li>
</ul>



<p>도구가 무료 티어에 들어가더라도 호출 횟수와 사용량은 기록해야 한다. 무료 한도를 넘는 순간 비용 구조가 바뀌고, 공급자가 요금제를 변경했을 때 과거 사용량으로 영향을 계산해야 하기 때문이다.</p>



<h3 class="wp-block-heading">3. 재시도와 낭비 비용</h3>



<p>실패 후 같은 프롬프트를 다시 호출한 비용, 잘못된 도구 인자로 반복 실행한 비용, 종료 조건 없이 루프를 돈 비용은 모델 청구서에는 정상 사용량으로 표시된다. 운영 관점에서는 별도 낭비 비용이다.</p>



<p>다음 값을 구분한다.</p>



<ul class="wp-block-list">
<li>최초 시도 비용</li>

<li>자동 재시도 비용</li>

<li>오류 복구 비용</li>

<li>사용자 취소 이후 발생한 비용</li>

<li>실패로 끝난 실행의 전체 비용</li>

<li>평가·검증 모델의 추가 비용</li>
</ul>



<h3 class="wp-block-heading">4. 인프라와 관측 비용</h3>



<p>자체 호스팅 모델의 GPU 비용뿐 아니라 trace 저장소, 로그, 객체 스토리지, 데이터 웨어하우스와 대시보드 비용도 포함한다. SaaS 관측성 도구가 이벤트 수나 보존 기간에 따라 과금된다면 에이전트 실행 원가에 배부해야 한다.</p>



<h2 class="wp-block-heading">월 44,000회 실행 비용 계산 예시</h2>



<p>다음은 특정 모델 추천이 아니라 계산 구조를 설명하기 위한 가상 단가 예시다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>조건</th><th>가정</th></tr></thead><tbody>
<tr><td>사용자</td><td>100명</td></tr>
<tr><td>사용자당 일일 실행</td><td>20회</td></tr>
<tr><td>월 근무일</td><td>22일</td></tr>
<tr><td>월 실행 수</td><td>44,000회</td></tr>
<tr><td>실행당 입력</td><td>20K 토큰</td></tr>
<tr><td>실행당 출력</td><td>2K 토큰</td></tr>
<tr><td>Cache hit</td><td>입력의 50%</td></tr>
<tr><td>1M 토큰 단가</td><td>일반 입력 $2, cache read $0.20, 출력 $10</td></tr>
<tr><td>추가 재시도</td><td>기본 LLM 비용의 8%</td></tr>
<tr><td>외부 도구 API</td><td>실행당 $0.003</td></tr>
<tr><td>관측·저장</td><td>월 $250</td></tr>
</tbody></table></figure>




<p>캐시가 없으면 실행당 LLM 비용은 $0.06, 월 $2,640이다. 입력의 절반이 cache hit라면 실행당 $0.042, 월 $1,848로 내려가 <strong>$792, 30%를 절감</strong>한다.</p>



<p>하지만 최종 원가는 여기서 끝나지 않는다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>비용 항목</th><th>월 비용</th></tr></thead><tbody>
<tr><td>캐시 반영 LLM 호출</td><td>$1,848.00</td></tr>
<tr><td>재시도·복구</td><td>$147.84</td></tr>
<tr><td>외부 도구 API</td><td>$132.00</td></tr>
<tr><td>관측·저장</td><td>$250.00</td></tr>
<tr><td><strong>합계</strong></td><td><strong>$2,377.84</strong></td></tr>
</tbody></table></figure>




<p>완료 실행 1건당 총원가는 약 <strong>$0.054</strong>다. 모델 호출비 외 항목은 $529.84로 전체의 약 <strong>22.3%</strong>다. 모델 공급자 대시보드만 봤다면 이 비용을 제품 원가에서 놓치게 된다.</p>



<h2 class="wp-block-heading">반드시 기록해야 할 비용 필드</h2>



<p>OpenTelemetry의 GenAI semantic conventions는 2026년 7월 기준 별도 <code>semantic-conventions-genai</code> 저장소로 이동했으며 상태가 <strong>Development</strong>다. 속성명은 바뀔 수 있으므로 버전을 고정하고 변경 이력을 확인해야 한다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>영역</th><th>필드 예시</th><th>용도</th></tr></thead><tbody>
<tr><td>추적 식별자</td><td><code>trace_id</code>, <code>span_id</code>, <code>run_id</code>, <code>conversation_id</code></td><td>개별 호출을 사용자 작업과 연결</td></tr>
<tr><td>조직 배부</td><td><code>tenant_id</code>, <code>team_id</code>, <code>user_id</code>, <code>project_id</code>, <code>environment</code></td><td>팀·고객·환경별 비용 집계</td></tr>
<tr><td>에이전트</td><td><code>gen_ai.agent.name</code>, <code>gen_ai.workflow.name</code>, agent version</td><td>어느 에이전트·버전이 비용을 만들었는지 확인</td></tr>
<tr><td>모델</td><td><code>gen_ai.provider.name</code>, <code>gen_ai.request.model</code>, <code>gen_ai.response.model</code></td><td>요청 모델과 실제 응답 모델·fallback 구분</td></tr>
<tr><td>토큰</td><td><code>gen_ai.usage.input_tokens</code>, <code>gen_ai.usage.output_tokens</code></td><td>기본 토큰 사용량</td></tr>
<tr><td>캐시</td><td><code>gen_ai.usage.cache_read.input_tokens</code>, <code>gen_ai.usage.cache_creation.input_tokens</code></td><td>캐시 절감·생성 비용 계산</td></tr>
<tr><td>추론</td><td><code>gen_ai.usage.reasoning.output_tokens</code></td><td>reasoning 토큰을 일반 출력과 분리</td></tr>
<tr><td>도구</td><td><code>gen_ai.tool.name</code>, tool type, 호출 상태, 외부 비용</td><td>검색·DB·브라우저·코드 실행 원가</td></tr>
<tr><td>실행 상태</td><td>iteration, retry count, error type, termination reason</td><td>재시도와 무한 루프 비용 분리</td></tr>
<tr><td>가격 기준</td><td>price version, currency, estimated/actual, billing tier</td><td>단가 변경과 청구서 대조</td></tr>
<tr><td>품질</td><td>success, user acceptance, evaluator score</td><td>싸지만 실패하는 실행 구분</td></tr>
</tbody></table></figure>




<p><code>tenant_id</code>, <code>team_id</code>, 가격과 비용 필드는 조직별 custom attribute로 설계할 수 있다. OpenTelemetry 표준 속성과 자체 속성을 구분하고 접두어 규칙을 정해야 한다.</p>



<p>프롬프트·응답 전문을 저장하지 않아도 비용 추적은 가능하다. 개인정보와 소스코드 유출이 우려되면 본문은 마스킹하거나 저장하지 않고 토큰 수, 모델, 도구명, 상태와 비용만 남긴다.</p>



<h2 class="wp-block-heading">가격표는 호출 시점에 버전으로 저장한다</h2>



<p>비용을 조회할 때 현재 가격표를 과거 토큰에 곱하면 안 된다. 모델 가격, 캐시 할인, Long context 기준과 공급자 티어는 바뀐다. 호출 시점에 다음 정보를 함께 저장하는 편이 안전하다.</p>



<ul class="wp-block-list">
<li>적용한 모델 가격표 버전과 유효일</li>

<li>요청 모델과 공급자가 반환한 실제 모델</li>

<li>Standard·Batch·Priority 같은 요금 티어</li>

<li>Short·Long context 구간</li>

<li>cache read·cache write 단가</li>

<li>통화와 환율 기준일</li>

<li>추정 비용인지 공급자 확정 비용인지</li>
</ul>



<p>실시간 대시보드는 추정 비용으로 빠르게 보여주고, 하루 한 번 공급자 usage·청구 데이터와 대조해 확정 비용을 보정할 수 있다. 둘 사이 차이는 반올림, 지연 집계, 공유 캐시, 무료 크레딧, 약정 할인과 공급자별 토큰 분류에서 발생한다.</p>



<h2 class="wp-block-heading">팀·사용자·프로젝트별 비용 배부</h2>



<p>배부 태그는 Gateway나 에이전트 진입점에서 강제로 붙여야 한다. 개발자가 각 모델 호출마다 직접 넣게 하면 누락이 생긴다.</p>



<h3 class="wp-block-heading">권장 배부 계층</h3>



<ol class="wp-block-list">
<li><strong>Tenant 또는 고객사</strong>: B2B 서비스의 고객별 원가와 마진</li>

<li><strong>Team</strong>: 부서·개발팀별 예산</li>

<li><strong>Project 또는 기능</strong>: 코드 리뷰, 문서 생성, 고객지원 같은 기능별 원가</li>

<li><strong>User</strong>: 과도한 사용과 교육 필요 사용자 식별</li>

<li><strong>Agent·Workflow·Version</strong>: 버전 변경 전후 비용 비교</li>

<li><strong>Environment</strong>: production, staging, eval 비용 분리</li>
</ol>



<p>예를 들어 같은 고객지원 에이전트라도 <code>refund-agent:v3</code>가 v2보다 성공률은 2% 높지만 실행당 비용이 40% 늘었다면 품질 개선과 원가 상승을 함께 판단할 수 있다. 총 토큰만 보면 이 의사결정이 불가능하다.</p>



<p><a href="https://blog.kwt.co.kr/ai-gateway-cloudflare-litellm-guide/">AI Gateway</a>를 통과하도록 구성하면 모델 키, 라우팅, 공통 태그와 비용 제한을 한 지점에서 적용하기 쉽다.</p>



<h2 class="wp-block-heading">도구별 역할: 하나로 모두 해결하려 하지 않는다</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>도구</th><th>주 역할</th><th>공식 비용 기능</th><th>예산 차단</th><th>배포 형태</th><th>주의점</th></tr></thead><tbody>
<tr><td><strong>Langfuse</strong></td><td>LLM·에이전트 trace, 평가, 대시보드</td><td>input·output·cached·audio·image usage와 모델 가격 기반 비용</td><td>Gateway와 별도 설계</td><td>Cloud·Self-host</td><td>신규 모델·커스텀 단가 최신화 필요</td></tr>
<tr><td><strong>LangSmith</strong></td><td>LangChain·LangGraph 중심 tracing·평가</td><td>LLM 비용과 tool·retrieval custom run 비용을 Other로 집계</td><td>evaluator 비용 제한 제공, 일반 실행 hard cap은 별도</td><td>Cloud·엔터프라이즈 Self-host</td><td>프레임워크 결합도와 데이터 보관 정책 확인</td></tr>
<tr><td><strong>Phoenix</strong></td><td>OpenTelemetry·OpenInference 기반 오픈소스 관측성</td><td>token count와 모델 가격으로 span·trace·session·project 롤업</td><td>별도 Gateway 필요</td><td>Self-host·Arize 서비스</td><td>Phoenix와 Arize AX 제품 구분 필요</td></tr>
<tr><td><strong>LiteLLM</strong></td><td>멀티 모델 Gateway와 spend control</td><td>100개 이상 모델의 key·user·team별 spend 추적</td><td>개인·팀·에이전트 budget·rate limit</td><td>Self-host 중심·Enterprise</td><td>정확한 모델 매핑과 DB 운영 필요</td></tr>
<tr><td><strong>Cloudflare AI Gateway</strong></td><td>관리형 Gateway·분석·정책</td><td>요청·토큰·캐시·오류·provider 비용 분석</td><td>Spend limits 기능 제공</td><td>Cloudflare 관리형</td><td>세부 업무 trace는 별도 관측성 도구와 연결</td></tr>
<tr><td><strong>OpenTelemetry</strong></td><td>공급자 중립 trace·metric 표준</td><td>토큰·모델·도구 속성 표준화</td><td>없음</td><td>Collector와 원하는 backend</td><td>완성 제품이 아니며 GenAI 규약이 Development 상태</td></tr>
</tbody></table></figure>




<p>선택은 “가장 많은 기능”보다 통제 위치에 따라 달라진다.</p>



<ul class="wp-block-list">
<li>모델 호출 전에 예산을 막아야 한다면 LiteLLM·Cloudflare 같은 Gateway 계층이 필요하다.</li>

<li>실행 원인과 품질을 분석하려면 Langfuse·LangSmith·Phoenix 같은 trace backend가 필요하다.</li>

<li>제품 종속을 줄이고 여러 backend로 보내려면 OpenTelemetry Collector를 중간에 둔다.</li>

<li>작은 팀은 Gateway 1개와 관측성 backend 1개로 시작하는 편이 운영 부담이 낮다.</li>
</ul>



<h2 class="wp-block-heading">비용 대시보드에 넣을 10개 패널</h2>



<p>월간 총비용만 크게 표시한 대시보드는 원인을 알려주지 않는다. 최소한 다음 패널이 필요하다.</p>



<ol class="wp-block-list">
<li>총비용과 전일·전주 대비 증감</li>

<li>성공 실행당 평균·P50·P95 비용</li>

<li>실패 실행과 취소 실행의 비용</li>

<li>팀·고객·프로젝트별 비용</li>

<li>모델·공급자·요금 티어별 비용</li>

<li>일반 입력·cache read·cache write·출력 토큰 비중</li>

<li>Cache hit 비율과 절감 추정액</li>

<li>도구별 호출 수·성공률·외부 API 비용</li>

<li>에이전트 iteration·retry 분포</li>

<li>품질 점수 대비 비용</li>
</ol>



<p>평균만 보면 소수의 폭주 실행을 놓칠 수 있다. P95 실행 비용, 하루 최대 실행 비용과 상위 20개 비싼 trace를 바로 열 수 있어야 한다.</p>



<h2 class="wp-block-heading">예산 알림과 무한 루프 차단 기준</h2>



<p>비용 통제는 월말 보고서보다 실행 중 제한이 중요하다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>통제 지점</th><th>권장 규칙 예시</th></tr></thead><tbody>
<tr><td>팀 월 예산</td><td>70% 정보 알림, 90% 경고, 100% 신규 저우선순위 작업 제한</td></tr>
<tr><td>실행당 예산</td><td>예상 비용이 상한을 넘으면 저가 모델 전환 또는 사용자 승인</td></tr>
<tr><td>반복 횟수</td><td>agent iteration·tool retry 최대값 설정</td></tr>
<tr><td>P95 비용</td><td>최근 7일 기준의 2배를 넘으면 이상 징후 알림</td></tr>
<tr><td>Cache hit</td><td>기준선 아래로 떨어지면 프롬프트 prefix 변경 검사</td></tr>
<tr><td>실패 비용</td><td>실패 실행 비용 비중이 임계값을 넘으면 배포 중단 검토</td></tr>
<tr><td>도구 비용</td><td>유료 검색·브라우저·GPU 호출 전에 남은 예산 검사</td></tr>
</tbody></table></figure>




<p>숫자는 서비스 위험도와 마진에 맞춰 정해야 한다. 결제·배포·데이터 삭제 같은 중요한 작업을 예산 때문에 중간에 강제 종료하면 더 큰 장애가 날 수 있다. hard cap은 안전하게 재개할 수 있는 작업에 적용하고, 중요한 작업은 승인·fallback·grace budget을 둔다.</p>



<h2 class="wp-block-heading">최소 비용 추적 도입 순서</h2>



<h3 class="wp-block-heading">1단계: 공통 식별자와 토큰 기록</h3>



<p>사용자 작업 하나에 <code>trace_id</code>와 <code>run_id</code>를 만들고 모든 LLM·도구 호출에 전파한다. provider, request model, response model, 입력·출력·캐시 토큰을 기록한다.</p>



<h3 class="wp-block-heading">2단계: 가격 계산기와 버전 추가</h3>



<p>모델별 가격표를 코드에 흩어놓지 않고 중앙 cost map으로 관리한다. 가격 버전, 통화, 요금 티어와 estimated cost를 span에 붙인다.</p>



<h3 class="wp-block-heading">3단계: 조직 배부 태그 강제</h3>



<p>Gateway나 공통 SDK에서 tenant, team, user, project, environment, agent version을 필수화한다. 태그가 없으면 production 호출을 거부하거나 <code>unallocated</code> 비용으로 따로 집계한다.</p>



<h3 class="wp-block-heading">4단계: 도구·재시도 비용 연결</h3>



<p>외부 API 호출 span에 단가와 사용량을 붙인다. retry count, iteration, error type과 termination reason을 기록해 실패 비용을 분리한다.</p>



<h3 class="wp-block-heading">5단계: 대시보드와 알림</h3>



<p>총비용, 성공 실행당 비용, 실패 비용, cache hit, P95 비용과 상위 고비용 trace를 먼저 만든다. 이후 팀 예산과 실행당 상한을 적용한다.</p>



<h3 class="wp-block-heading">6단계: 공급자 청구서와 대조</h3>



<p>매일 provider usage와 내부 추정 비용을 비교한다. 차이가 일정 수준을 넘으면 가격표·모델 매핑·캐시 분류·시간대 기준을 점검한다.</p>



<h2 class="wp-block-heading">운영 체크리스트</h2>



<ul class="wp-block-list">
<li>사용자 목표 1건을 하나의 trace로 묶었는가</li>

<li>모든 모델·도구 호출에 같은 run ID가 전파되는가</li>

<li>request model과 response model을 분리했는가</li>

<li>일반 입력·cache read·cache creation·출력을 구분했는가</li>

<li>reasoning·이미지·오디오 사용량을 별도로 기록하는가</li>

<li>외부 검색·브라우저·DB·GPU 비용을 포함했는가</li>

<li>retry·iteration·실패 비용을 분리했는가</li>

<li>팀·사용자·프로젝트·환경 태그가 필수인가</li>

<li>가격표 버전과 요금 티어를 저장하는가</li>

<li>실시간 추정액을 공급자 청구 데이터와 대조하는가</li>

<li>프롬프트 전문 없이도 비용 분석이 가능한가</li>

<li>실행당 budget과 무한 루프 제한이 있는가</li>
</ul>



<h2 class="wp-block-heading">FAQ</h2>



<h3 class="wp-block-heading">AI 에이전트 비용 추적과 일반 LLM 비용 추적은 무엇이 다른가?</h3>



<p>일반 LLM 비용 추적은 모델 호출별 토큰과 금액을 본다. AI 에이전트 비용 추적은 하나의 사용자 목표 아래 여러 LLM 호출, 도구 실행, 재시도, 평가와 인프라 비용을 합쳐 실행 총원가를 계산한다.</p>



<h3 class="wp-block-heading">OpenTelemetry만 도입하면 비용 계산이 끝나나?</h3>



<p>아니다. OpenTelemetry는 trace와 GenAI 속성을 표준화하지만 제품별 가격표, 조직 배부, 외부 도구 단가와 예산 차단은 별도로 구현하거나 관측성·Gateway 제품을 연결해야 한다. GenAI semantic conventions도 2026년 7월 기준 Development 상태다.</p>



<h3 class="wp-block-heading">Langfuse와 LiteLLM 중 무엇을 써야 하나?</h3>



<p>역할이 다르다. Langfuse는 trace·평가·비용 분석 backend에 가깝고 LiteLLM은 모델 Gateway와 key·user·team 예산 통제에 강하다. 비용 차단과 원인 분석이 모두 필요하면 함께 사용할 수 있다.</p>



<h3 class="wp-block-heading">프롬프트와 응답을 저장해야 비용을 계산할 수 있나?</h3>



<p>필수는 아니다. 모델, 토큰 유형별 사용량, 도구명, 상태, 재시도와 가격 버전만으로 비용을 계산할 수 있다. 민감한 프롬프트는 마스킹하거나 저장하지 않는 편이 안전하다.</p>



<h3 class="wp-block-heading">캐시 적중률이 높으면 비용도 같은 비율로 줄어드나?</h3>



<p>아니다. 캐시 할인은 캐시된 입력 부분에만 적용된다. 출력, reasoning, cache write, 도구 API와 관측 비용은 그대로 남는다. 전체 절감률은 입력 비중과 cache read 단가에 따라 달라진다.</p>



<h3 class="wp-block-heading">공급자 대시보드 금액과 내부 계산이 다른 이유는 무엇인가?</h3>



<p>시간대, 집계 지연, 반올림, 무료 크레딧, 약정 할인, 실제 응답 모델, 캐시 분류와 가격표 버전 차이 때문이다. 내부 값은 실시간 통제를 위한 추정액으로 사용하고 공급자 usage·청구 데이터로 정기 보정해야 한다.</p>



<h2 class="wp-block-heading">참고 자료</h2>



<ul class="wp-block-list">
<li><a href="https://github.com/open-telemetry/semantic-conventions-genai">OpenTelemetry GenAI Semantic Conventions Repository</a> — GenAI span·agent·tool·token 속성 표준</li>

<li><a href="https://langfuse.com/docs/observability/features/token-and-cost-tracking">Langfuse Token &amp; Cost Tracking</a> — usage 유형과 모델 가격 기반 비용 계산</li>

<li><a href="https://docs.langchain.com/langsmith/cost-tracking">LangSmith Cost Tracking</a> — LLM·tool·retrieval custom cost와 대시보드</li>

<li><a href="https://arize.com/docs/phoenix/tracing/how-to-tracing/cost-tracking">Arize Phoenix Cost Tracking</a> — span·trace·session·project 비용 롤업</li>

<li><a href="https://docs.litellm.ai/docs/proxy/cost_tracking">LiteLLM Spend Tracking</a> — key·user·team별 spend 추적</li>

<li><a href="https://docs.litellm.ai/docs/proxy/users">LiteLLM Budgets and Rate Limits</a> — 개인·팀·에이전트 예산과 실행 제한</li>

<li><a href="https://developers.cloudflare.com/ai-gateway/observability/analytics/">Cloudflare AI Gateway Analytics</a> — 요청·토큰·캐시·오류·비용 분석</li>
</ul>



<p>*제품 기능과 문서 상태는 2026년 7월 29일 확인 기준이며 이후 변경될 수 있다.*</p>




<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"AI 에이전트 비용 추적과 일반 LLM 비용 추적은 무엇이 다른가?","acceptedAnswer":{"@type":"Answer","text":"일반 LLM 비용 추적은 모델 호출별 토큰과 금액을 본다. AI 에이전트 비용 추적은 하나의 사용자 목표 아래 여러 LLM 호출, 도구 실행, 재시도, 평가와 인프라 비용을 합쳐 실행 총원가를 계산한다."}},{"@type":"Question","name":"OpenTelemetry만 도입하면 비용 계산이 끝나나?","acceptedAnswer":{"@type":"Answer","text":"아니다. OpenTelemetry는 trace와 GenAI 속성을 표준화하지만 제품별 가격표, 조직 배부, 외부 도구 단가와 예산 차단은 별도로 구현하거나 관측성·Gateway 제품을 연결해야 한다."}},{"@type":"Question","name":"Langfuse와 LiteLLM 중 무엇을 써야 하나?","acceptedAnswer":{"@type":"Answer","text":"역할이 다르다. Langfuse는 trace·평가·비용 분석 backend에 가깝고 LiteLLM은 모델 Gateway와 key·user·team 예산 통제에 강하다. 두 기능이 모두 필요하면 함께 사용할 수 있다."}},{"@type":"Question","name":"프롬프트와 응답을 저장해야 비용을 계산할 수 있나?","acceptedAnswer":{"@type":"Answer","text":"필수는 아니다. 모델, 토큰 유형별 사용량, 도구명, 상태, 재시도와 가격 버전만으로 비용을 계산할 수 있다."}},{"@type":"Question","name":"캐시 적중률이 높으면 비용도 같은 비율로 줄어드나?","acceptedAnswer":{"@type":"Answer","text":"아니다. 캐시 할인은 캐시된 입력 부분에만 적용된다. 출력, reasoning, cache write, 도구 API와 관측 비용은 그대로 남는다."}},{"@type":"Question","name":"공급자 대시보드 금액과 내부 계산이 다른 이유는 무엇인가?","acceptedAnswer":{"@type":"Answer","text":"시간대, 집계 지연, 반올림, 무료 크레딧, 약정 할인, 실제 응답 모델, 캐시 분류와 가격표 버전 차이 때문이다."}}]}</script>
		<div class="wpulike wpulike-robeen " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="Like Button"
					data-ulike-id="2748"
					data-ulike-nonce="a299caf951"
					data-ulike-type="post"
					data-ulike-template="wpulike-robeen"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_2748"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></div>
	<p>The post <a href="https://blog.kwt.co.kr/ai-agent-cost-tracking-guide/">AI 에이전트 비용 추적 가이드: 토큰·캐시·도구 호출 비용을 팀별로 관리하는 법</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kwt.co.kr/ai-agent-cost-tracking-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI Gateway 비교 2026: Cloudflare vs LiteLLM, 운영 기준 7가지</title>
		<link>https://blog.kwt.co.kr/ai-gateway-cloudflare-litellm-guide/</link>
					<comments>https://blog.kwt.co.kr/ai-gateway-cloudflare-litellm-guide/#respond</comments>
		
		<dc:creator><![CDATA[시간 조절자]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 01:02:00 +0000</pubDate>
				<category><![CDATA[기술]]></category>
		<category><![CDATA[AI Gateway]]></category>
		<category><![CDATA[AI 인프라]]></category>
		<category><![CDATA[Cloudflare AI Gateway]]></category>
		<category><![CDATA[LiteLLM]]></category>
		<category><![CDATA[LLMOps]]></category>
		<guid isPermaLink="false">https://blog.kwt.co.kr/?p=2682</guid>

					<description><![CDATA[<p>Cloudflare AI Gateway와 LiteLLM Proxy를 2026년 9월 30일 공식 문서 기준으로 비교했다. 9월 24일 Cloudflare 로그 요금 정책 변경(신규 고객 Workers Logs 전환)과 LiteLLM v1.103.1까지의 갱신 내용, 운영 기준을 정리했다.</p>
<p>The post <a href="https://blog.kwt.co.kr/ai-gateway-cloudflare-litellm-guide/">AI Gateway 비교 2026: Cloudflare vs LiteLLM, 운영 기준 7가지</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>AI Gateway를 처음 도입한다면 관리형인 Cloudflare AI Gateway로 관측과 rate limit부터 시작하고, 팀별 예산·가상 키·복잡한 fallback이 필요해질 때 LiteLLM Proxy를 검토하는 편이 현실적이다.</strong> Cloudflare는 빠른 도입과 낮은 운영 부담이 강점이고, LiteLLM은 통제 범위가 넓은 대신 데이터베이스·배포·업그레이드 책임이 따라온다. 2026년 9월 30일 공식 문서를 기준으로 두 제품의 차이와 실패 조건을 다시 정리했다. 이번 확인에서 Cloudflare가 9월 24일부터 첫 Gateway 생성 시점에 따라 로그 요금제를 나누는 정책을 공식화했고, LiteLLM은 한 달간 17개 안정 버전이 나오며 최신 안정 버전이 v1.103.1(9월 30일)까지 올라갔다.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1400" height="788" src="https://blog.kwt.co.kr/wp-content/uploads/2026/07/ai-gateway-guide.jpg" alt="AI Gateway가 여러 LLM 제공자 호출을 중앙에서 제어하는 구조" class="wp-image-2681"/><figcaption class="wp-element-caption">AI Gateway는 인증·라우팅·비용·로그 정책을 애플리케이션 밖으로 분리한다.</figcaption></figure>



<div class="wp-block-group has-border-color has-background" style="border-color:#dbeafe;border-width:1px;background-color:#eff6ff;padding-top:18px;padding-right:18px;padding-bottom:18px;padding-left:18px"><div class="wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-3 wp-block-group-is-layout-constrained">
<h3 class="wp-block-heading">핵심 요약</h3>



<ul class="wp-block-list"><li><strong>운영 부담을 줄이고 관측·캐시·rate limit을 빠르게 붙이려면 Cloudflare AI Gateway</strong>가 유리하다.</li><li><strong>세밀한 라우팅, 가상 키, 팀별 예산, 자체 정책과 데이터 통제가 필요하면 LiteLLM Proxy</strong>가 맞다.</li><li>둘은 완전한 대체재가 아니다. Cloudflare를 외곽 관측 계층, LiteLLM을 내부 정책 계층으로 조합할 수도 있다.</li><li>도입 판단은 기능 수보다 장애 격리, 로그 보존, 키 회전, DB 의존성, 업그레이드 책임을 기준으로 내려야 한다.</li></ul>
</div></div>



<h2 class="wp-block-heading">AI Gateway가 필요한 시점은 기능 개수가 아니라 운영 경계로 판단한다</h2>



<p>앱 한 개가 모델 한 개를 호출하는 단계라면 별도 Gateway가 오히려 장애 지점만 늘릴 수 있다. 반대로 여러 서비스가 같은 제공자 키를 공유하거나, 모델 장애가 곧 전체 장애로 이어지거나, 팀별 비용을 사후 집계하고 있다면 공통 계층을 둘 이유가 생긴다.</p>



<figure class="wp-block-table"><table><thead><tr><th>신호</th><th>직접 호출 유지</th><th>Gateway 검토</th></tr></thead><tbody><tr><td>애플리케이션 수</td><td>1개, 소유 팀이 명확함</td><td>여러 서비스·에이전트가 공통 모델을 호출함</td></tr><tr><td>모델·제공자</td><td>단일 제공자에 고정</td><td>복수 제공자 라우팅·fallback이 필요함</td></tr><tr><td>비용 통제</td><td>월 청구서 사후 확인으로 충분</td><td>키·팀·사용자별 예산과 rate limit이 필요함</td></tr><tr><td>장애 대응</td><td>앱 코드에서 재시도 가능</td><td>공통 timeout·retry·circuit breaker 정책이 필요함</td></tr><tr><td>보안·감사</td><td>키 수가 적고 접근 주체가 제한됨</td><td>키 회전, 감사 로그, 민감정보 정책을 중앙화해야 함</td></tr></tbody></table></figure>



<p>핵심은 “Gateway가 있으면 안정적이다”가 아니다. Gateway 자체의 장애와 설정 오류를 감당할 운영 주체가 있는지 먼저 확인해야 한다.</p>



<h2 class="wp-block-heading">Cloudflare AI Gateway와 LiteLLM 비교표</h2>



<figure class="wp-block-table"><table><thead><tr><th>판단 기준</th><th>Cloudflare AI Gateway</th><th>LiteLLM Proxy</th></tr></thead><tbody><tr><td>운영 형태</td><td>Cloudflare 관리형 서비스</td><td>컨테이너·Kubernetes 등에 자체 배포</td></tr><tr><td>빠른 도입</td><td>기존 호출 URL 변경 중심으로 시작하기 쉬움</td><td>프록시 배포, 시크릿, 저장소와 모니터링 구성이 필요함</td></tr><tr><td>관측</td><td>대시보드 분석, 로그, 비용, OpenTelemetry 연동 제공</td><td>비용 추적, 로그·콜백·메트릭과 관리자 UI를 자체 환경에서 운영</td></tr><tr><td>라우팅</td><td>OpenAI 호환 API와 dynamic routing 제공</td><td>Router 기반 load balancing, retry, provider/model fallback 제공</td></tr><tr><td>예산·키</td><td>spend limit·rate limiting과 BYOK 기능 제공</td><td>virtual key·사용자·팀·에이전트 단위 예산과 TPM/RPM 정책 제공</td></tr><tr><td>캐시</td><td>동일 요청의 텍스트·이미지 응답 캐시 지원</td><td>프록시 캐시와 제공자 prompt caching 연계 가능</td></tr><tr><td>데이터 경계</td><td>Cloudflare 서비스 경계를 통과함</td><td>자체 네트워크와 저장소 정책 안에서 통제 가능</td></tr><tr><td>주요 책임</td><td>Cloudflare 계정·정책·로그 보존 설정</td><td>DB, 고가용성, 버전 고정, 마이그레이션, 보안 패치까지 직접 책임</td></tr></tbody></table></figure>



<p>Cloudflare 공식 가격 문서는 현재 핵심 기능인 대시보드 분석·캐시·rate limiting을 무료로 제공한다고 설명한다. 다만 <strong>2026년 9월 24일부터 로그 요금 정책이 첫 Gateway 생성 시점 기준으로 나뉜다</strong>. 이날 이후 첫 Gateway를 만드는 신규 고객은 Workers Logs 요금·보존 정책을 따르고, 이전에 Gateway를 만든 기존 고객은 종전 Legacy Logs를 유지한다. Legacy Logs의 저장 한도는 Workers Free에서 전체 Gateway 합계 10만 건, Workers Paid에서 Gateway당 1천만 건이다. 신규 고객에게 적용되는 Workers Logs는 Free에서 하루 20만 로그 이벤트·3일 보존, Paid에서 월 2천만 로그 이벤트 포함 후 추가 100만건당 $0.60·7일 보존이다. 즉 신규 도입 검토라면 “무료” 안내만 보고 로그 비용을 0으로 잡으면 안 된다. 향후 일부 기능이 유료화될 수 있다는 안내도 있으므로 “영구 무료”로 해석하면 안 된다.</p>



<p>LiteLLM 공식 문서는 100개 이상 LLM을 OpenAI 형식으로 호출하고 Router의 retry·fallback, Proxy의 virtual key·비용 추적·관리자 UI를 제공한다고 밝힌다. 확인 시점(2026년 9월 30일)의 최신 안정 버전은 v1.103.1이며, 9월 초 v1.99.x 이후 약 한 달 동안 v1.100.0부터 v1.103.1까지 17개 안정 버전이 나왔다. 지금은 Docker 이미지와 PyPI 패키지가 모두 v1.103.1로 일치하지만, v1.99.1처럼 Docker에만 배포되고 PyPI가 한 버전 뒤처지는 구간이 반복되어 왔으므로 배포 방식별 버전을 매번 확인해야 한다. 이 기간의 변경은 신규 정책 엔진의 스트리밍 응답 post_call 가드레일, 제공자 키가 오류 traceback에 노출되지 않도록 하는 수정, spend_logs 조회 안정화 등 운영에 영향 주는 항목 위주다. 운영 환경에서는 latest 태그를 따라가기보다 이미지 digest와 버전을 고정하고 변경 내역·DB 마이그레이션을 검토해야 한다.</p>



<h2 class="wp-block-heading">선택 흐름: 관리형 우선인가, 통제권 우선인가</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1050" height="570" src="https://blog.kwt.co.kr/wp-content/uploads/2026/08/ai-gateway-decision-flow-2026.png" alt="Cloudflare AI Gateway와 LiteLLM Proxy 선택 흐름도" class="wp-image-2796" style="width:640px;height:auto"/><figcaption class="wp-element-caption">AI Gateway 운영 방식 선택 흐름<br />출처: Cloudflare·LiteLLM 공식 문서 기준 재구성</figcaption></figure></div>


<h3 class="wp-block-heading">Cloudflare AI Gateway가 맞는 경우</h3>



<ul class="wp-block-list"><li>전담 플랫폼 팀 없이 로그·분석·캐시·rate limit을 빠르게 붙여야 한다.</li><li>Cloudflare 계정과 Workers 운영 체계가 이미 있고 관리 지점을 늘리고 싶지 않다.</li><li>초기에는 단순한 제공자 전환과 관측이 핵심이며 복잡한 조직별 권한 모델은 아직 필요하지 않다.</li><li>Gateway 서버와 DB의 고가용성을 직접 운영할 여력이 없다.</li></ul>



<h3 class="wp-block-heading">LiteLLM Proxy가 맞는 경우</h3>



<ul class="wp-block-list"><li>모델별 배포군을 묶어 load balancing하고 오류 유형별 fallback을 세밀하게 제어해야 한다.</li><li>가상 키를 발급하고 팀·사용자·에이전트별 예산과 TPM/RPM을 중앙에서 강제해야 한다.</li><li>요청·응답 데이터가 외부 관리형 Gateway를 통과하면 안 되는 보안 요구가 있다.</li><li>PostgreSQL, 시크릿 관리, 모니터링, 무중단 업그레이드를 책임질 운영 역량이 있다.</li></ul>



<h3 class="wp-block-heading">두 제품을 함께 쓰는 경우</h3>



<p>혼합 구조도 가능하다. 예를 들어 외부 트래픽은 Cloudflare에서 인증·DLP·rate limit·관측을 처리하고, 내부에서는 LiteLLM이 모델 배포군과 팀별 예산을 관리할 수 있다. 다만 retry와 rate limit을 양쪽에 중복 적용하면 지연과 증폭 재시도가 생긴다. 각 계층의 책임을 문서로 나누고 timeout 합계가 사용자 요청 제한을 넘지 않게 설계해야 한다.</p>



<h2 class="wp-block-heading">실무 도입 순서: 한 번에 모든 기능을 켜지 않는다</h2>



<ol class="wp-block-list"><li><strong>기준선을 측정한다.</strong> 현재 모델별 요청 수, p50·p95 지연, 429·5xx 비율, 토큰 비용을 최소 1주 기록한다.</li><li><strong>관측만 연결한다.</strong> 라우팅을 바꾸기 전에 로그 필드, 사용자 식별자, 민감정보 마스킹과 보존 기간을 검증한다.</li><li><strong>rate limit을 shadow 기준으로 계산한다.</strong> 정상 피크를 차단하지 않도록 경고 단계부터 시작한다.</li><li><strong>timeout과 retry 예산을 정한다.</strong> 앱·Gateway·제공자 SDK가 각각 재시도하지 않도록 소유 계층을 하나로 정한다.</li><li><strong>동일 품질의 fallback부터 시험한다.</strong> 컨텍스트 길이, 도구 호출, 구조화 출력이 호환되지 않는 모델을 무조건 대체 모델로 두지 않는다.</li><li><strong>장애 주입 테스트를 한다.</strong> 429, 500, timeout, 잘못된 키, DB 단절, 로그 저장 실패를 재현하고 복구 경로를 확인한다.</li><li><strong>점진적으로 트래픽을 전환한다.</strong> 내부 사용자와 낮은 위험 요청부터 시작해 오류율과 비용 변화를 비교한다.</li></ol>



<h2 class="wp-block-heading">운영에서 자주 실패하는 다섯 가지 조건</h2>



<figure class="wp-block-table"><table><thead><tr><th>실패 조건</th><th>왜 위험한가</th><th>대응</th></tr></thead><tbody><tr><td>중첩 재시도</td><td>앱·Gateway·SDK가 각각 재시도해 요청 폭증과 비용 증가가 생김</td><td>재시도 소유 계층 하나, 최대 시도 횟수와 총 시간 예산 지정</td></tr><tr><td>의미가 다른 모델 fallback</td><td>도구 호출·JSON 스키마·안전 정책 차이로 조용한 품질 저하 발생</td><td>호환성 테스트와 평가셋 통과 모델만 fallback 그룹에 포함</td></tr><tr><td>원문 로그 무기한 저장</td><td>개인정보·API 키·프롬프트 비밀이 장기간 남음</td><td>필드별 마스킹, 최소 보존 기간, 접근 감사 적용</td></tr><tr><td>Gateway 단일 인스턴스</td><td>공통 계층이 전체 AI 기능의 단일 장애점이 됨</td><td>헬스체크, 다중 인스턴스, 우회 또는 fail-open/closed 정책 명시</td></tr><tr><td>버전 자동 추종</td><td>설정 스키마·DB 변경이 예고 없이 운영에 반영됨</td><td>이미지 digest 고정, staging 검증, 롤백과 DB 백업 준비</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">비용과 보안에서 반드시 확인할 체크리스트</h2>



<ul class="wp-block-list"><li>Gateway 사용료뿐 아니라 로그 저장소, DB, 캐시, egress, 모니터링 비용을 합산한다. Cloudflare는 2026년 9월 24일 이후 첫 Gateway를 만들면 Workers Logs 요금(월 2천만 로그 이벤트 초과분 100만건당 $0.60)이 적용되므로 신규 도입 시 로그 단가를 먼저 계산한다.</li><li>제공자 키는 앱에 남기지 않고 Gateway의 시크릿 저장소 또는 외부 secret manager로 이동한다.</li><li>사용자·팀·서비스 계정을 구분하고 공유 키를 피한다.</li><li>프롬프트와 응답 본문을 꼭 저장해야 하는지 검토하고, 기본값은 최소 수집으로 둔다.</li><li>캐시는 동일 요청에만 적용되는지, 사용자별 데이터가 잘못 공유될 가능성이 없는지 확인한다. Cloudflare 캐시는 공식 문서상 동일 요청의 텍스트·이미지 응답에 적용된다.</li><li>비용 한도 도달 시 차단할지, 저가 모델로 내릴지, 관리자 승인을 요구할지 정책을 미리 정한다.</li><li>LiteLLM 예산 기능은 공식 문서상 DB의 지출 기록을 기준으로 강제되므로 DB 없는 배포에서 동일한 통제를 기대하면 안 된다.</li><li>LiteLLM은 Docker 이미지와 PyPI의 최신 버전이 다를 수 있다(예: v1.99.1은 Docker에만 배포). 배포 방식을 먼저 정하고 이미지 태그·패키지 버전·서명(cosign) 검증 절차를 각각 고정한다.</li></ul>



<h2 class="wp-block-heading">관련 글</h2>



<ul class="wp-block-list"><li><a href="https://blog.kwt.co.kr/ai-agent-cost-tracking-guide/">AI 에이전트 비용 추적 가이드</a> — Gateway에 넣을 비용 태그와 팀별 관리 기준을 정리했다.</li><li><a href="https://blog.kwt.co.kr/ai-agent-observability-tools-comparison/">AI 에이전트 관측 도구 비교</a> — Gateway 로그 이후 trace·평가 계층을 선택할 때 참고할 수 있다.</li><li><a href="https://blog.kwt.co.kr/rag-evaluation-retrieval-answer-quality-guide/">RAG 평가 실무 가이드</a> — fallback이나 라우팅 변경 전 품질 회귀를 검증하는 방법을 다룬다.</li></ul>



<h2 class="wp-block-heading">FAQ</h2>



<h3 class="wp-block-heading">AI Gateway는 트래픽이 적어도 필요한가?</h3>



<p>단일 앱·단일 모델이고 키 관리와 장애 대응이 단순하다면 바로 도입할 필요는 없다. 다만 여러 서비스가 키를 공유하거나 비용 귀속이 불분명해지는 시점부터 중앙 계층의 가치가 커진다.</p>



<h3 class="wp-block-heading">Cloudflare AI Gateway와 LiteLLM 중 어느 쪽이 더 저렴한가?</h3>



<p>Cloudflare는 핵심 기능이 현재 무료지만 로그 비용을 먼저 확인해야 한다. 2026년 9월 24일 이후 첫 Gateway를 만들면 Workers Logs 요금제가 적용되어 월 2천만 로그 이벤트를 넘을 때 100만건당 $0.60이 부과된다. LiteLLM은 오픈소스여도 서버·DB·관측·업그레이드 인력이 비용이다. 월 요청 수보다 운영 인력과 데이터 보존 요구를 포함한 총소유비용으로 비교해야 한다.</p>



<h3 class="wp-block-heading">fallback에 더 저렴한 모델을 넣으면 비용이 항상 줄어드는가?</h3>



<p>그렇지 않다. 출력 형식이나 도구 호출 호환성이 낮으면 재시도와 품질 회귀가 늘 수 있다. 같은 평가셋과 실패 조건을 통과한 모델만 그룹에 넣고, 비용과 성공률을 함께 봐야 한다.</p>



<h2 class="wp-block-heading">참고 자료</h2>



<ul class="wp-block-list"><li><a href="https://developers.cloudflare.com/ai-gateway/" rel="noopener">Cloudflare AI Gateway 공식 문서</a> (확인: 2026-09-30)</li><li><a href="https://developers.cloudflare.com/ai-gateway/reference/pricing/" rel="noopener">Cloudflare AI Gateway Pricing</a> — 9월 24일 로그 요금 정책 변경 (확인: 2026-09-30)</li><li><a href="https://developers.cloudflare.com/workers/observability/logs/workers-logs/" rel="noopener">Cloudflare Workers Logs 요금·보존 정책</a> (확인: 2026-09-30)</li><li><a href="https://developers.cloudflare.com/ai-gateway/features/caching/" rel="noopener">Cloudflare AI Gateway Caching</a> (확인: 2026-09-30)</li><li><a href="https://developers.cloudflare.com/ai-gateway/usage/chat-completion/" rel="noopener">Cloudflare Unified API (OpenAI 호환)</a> (확인: 2026-09-30)</li><li><a href="https://docs.litellm.ai/docs/" rel="noopener">LiteLLM 공식 문서</a></li><li><a href="https://docs.litellm.ai/docs/proxy/reliability" rel="noopener">LiteLLM Fallbacks 공식 문서</a></li><li><a href="https://docs.litellm.ai/docs/proxy/users" rel="noopener">LiteLLM Budgets·Rate Limits 공식 문서</a></li><li><a href="https://github.com/BerriAI/litellm/releases/tag/v1.103.1" rel="noopener">LiteLLM v1.103.1 릴리스</a> (2026-09-30)</li></ul>

		<div class="wpulike wpulike-robeen " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="Like Button"
					data-ulike-id="2682"
					data-ulike-nonce="aa3b726db3"
					data-ulike-type="post"
					data-ulike-template="wpulike-robeen"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_2682"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></div>
	<p>The post <a href="https://blog.kwt.co.kr/ai-gateway-cloudflare-litellm-guide/">AI Gateway 비교 2026: Cloudflare vs LiteLLM, 운영 기준 7가지</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kwt.co.kr/ai-gateway-cloudflare-litellm-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI 에이전트 관측성 가이드: 로그만으로는 부족한 이유</title>
		<link>https://blog.kwt.co.kr/ai-agent-observability-guide/</link>
					<comments>https://blog.kwt.co.kr/ai-agent-observability-guide/#respond</comments>
		
		<dc:creator><![CDATA[시간 조절자]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 00:14:35 +0000</pubDate>
				<category><![CDATA[기술]]></category>
		<category><![CDATA[AI 에이전트]]></category>
		<category><![CDATA[AI 운영]]></category>
		<category><![CDATA[LLMOps]]></category>
		<category><![CDATA[OpenTelemetry]]></category>
		<category><![CDATA[관측성]]></category>
		<guid isPermaLink="false">https://blog.kwt.co.kr/?p=2679</guid>

					<description><![CDATA[<p>AI 에이전트 운영에서는 서버 로그만으로 부족하다. LLM 호출, 도구 실행, 비용, 승인, 실패 원인을 하나의 trace로 연결해 추적하는 관측성 설계 방법을 정리한다.</p>
<p>The post <a href="https://blog.kwt.co.kr/ai-agent-observability-guide/">AI 에이전트 관측성 가이드: 로그만으로는 부족한 이유</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>AI 에이전트 관측성</strong>은 LLM 호출, 도구 실행, 비용, 오류, 사용자 승인, 최종 산출물을 하나의 실행 흐름으로 추적하는 운영 체계다. 챗봇 응답 품질만 보는 단계에서는 없어도 버틸 수 있지만, AI 에이전트가 파일을 수정하고 터미널을 실행하고 외부 API를 호출하기 시작하면 관측성은 선택 기능이 아니라 운영 안전장치가 된다.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1400" height="788" src="https://blog.kwt.co.kr/wp-content/uploads/2026/07/ai-agent-observability-guide.jpg" alt="AI 에이전트 관측성 대시보드 개념도: LLM 호출, 도구 실행, 비용, 오류 추적" class="wp-image-2678"/><figcaption class="wp-element-caption">AI 에이전트 관측성은 LLM 호출, 도구 실행, 비용, 지연 시간, 실패 원인을 하나의 실행 흐름으로 연결해 보는 운영 체계다.</figcaption></figure>



<div style="border:1px solid #dbeafe;background:#eff6ff;padding:18px;border-radius:12px;margin:24px 0;">
<strong>핵심 요약</strong>
<ul>
<li>AI 에이전트 운영에서는 서버 로그만으로는 부족하다.</li>
<li>LLM 호출, 도구 실행, 비용, 승인, 실패 원인을 같은 trace 안에서 봐야 한다.</li>
<li>관측성 설계가 없으면 “왜 비용이 늘었는지”, “왜 파일이 바뀌었는지”, “왜 작업이 실패했는지”를 사후에 설명하기 어렵다.</li>
<li>OpenTelemetry의 Generative AI semantic conventions, OpenAI Agents SDK tracing, Claude Code usage monitoring, LangSmith 같은 도구가 이 흐름을 빠르게 표준화하고 있다.</li>
</ul>
</div>



<h2 class="wp-block-heading">왜 AI 에이전트에는 별도 관측성이 필요한가</h2>



<p>전통적인 웹 서비스 관측성은 요청, 응답 시간, 오류율, CPU, 메모리, 데이터베이스 쿼리를 중심으로 설계됐다. 그러나 AI 에이전트는 여기에 새로운 실행 단계를 추가한다. 사용자의 자연어 요청을 해석하고, 모델을 호출하고, 필요한 도구를 고르고, 파일이나 API를 조작하고, 실패하면 다시 시도한다. 같은 “요청 1건” 안에 여러 번의 LLM 호출과 여러 개의 도구 실행이 들어갈 수 있다.</p>



<p>문제는 실패 지점이 훨씬 다양해진다는 점이다. 모델이 요구사항을 잘못 이해했을 수도 있고, 도구 인자가 틀렸을 수도 있고, 권한 승인이 거절됐을 수도 있고, API rate limit에 걸렸을 수도 있고, 테스트 실패 후 복구 전략을 잘못 선택했을 수도 있다. 단순히 “500 오류가 났다”는 로그만으로는 원인을 설명하기 어렵다.</p>



<h2 class="wp-block-heading">일반 서버 로그와 AI 에이전트 관측성의 차이</h2>



<figure class="wp-block-table"><table><thead><tr><th>구분</th><th>일반 서버 로그</th><th>AI 에이전트 관측성</th></tr></thead><tbody><tr><td>기본 단위</td><td>HTTP 요청, 배치 작업, 서버 이벤트</td><td>사용자 목표, LLM 호출, 도구 실행, 산출물</td></tr><tr><td>주요 지표</td><td>응답 시간, 오류율, 리소스 사용량</td><td>토큰, 비용, 모델, 도구 성공률, 재시도, 승인 이력</td></tr><tr><td>실패 원인</td><td>예외, 네트워크, DB 오류</td><td>프롬프트 오해, 컨텍스트 누락, 도구 인자 오류, 권한 문제, 모델 불안정성</td></tr><tr><td>보안 이슈</td><td>개인정보 로그, 인증 토큰 노출</td><td>프롬프트 내 비밀 정보, 도구 권한 남용, 파일/터미널 실행 이력</td></tr><tr><td>분석 목표</td><td>장애 복구와 성능 개선</td><td>장애 복구, 비용 통제, 품질 평가, 감사 가능성 확보</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">반드시 추적해야 할 9가지 항목</h2>



<ol class="wp-block-list">
<li><strong>작업 목표</strong>: 사용자가 무엇을 요청했는지, 에이전트가 어떤 목표로 해석했는지 기록한다.</li>

<li><strong>모델명과 버전</strong>: 같은 프롬프트라도 모델과 버전에 따라 결과가 달라진다.</li>

<li><strong>토큰 사용량과 비용</strong>: 입력 토큰, 출력 토큰, 캐시 사용량, 모델별 단가를 추적한다.</li>

<li><strong>도구 호출 이력</strong>: 파일 읽기, 파일 수정, 터미널 실행, 브라우저 조작, API 호출을 span 단위로 남긴다.</li>

<li><strong>도구 인자와 결과</strong>: 어떤 명령이나 API 파라미터가 실행됐고 어떤 결과가 돌아왔는지 확인 가능해야 한다.</li>

<li><strong>사용자 승인 이력</strong>: 위험한 명령, 외부 전송, 배포, 결제성 작업은 승인 여부와 시점을 남긴다.</li>

<li><strong>재시도와 복구 경로</strong>: 실패 후 같은 방식을 반복했는지, 다른 전략으로 전환했는지 확인한다.</li>

<li><strong>최종 산출물</strong>: 생성된 PR, 파일, 문서, 배포 URL, 테스트 결과를 trace와 연결한다.</li>

<li><strong>민감정보 처리 상태</strong>: 프롬프트와 응답에 개인정보, API 키, 내부 문서가 포함됐는지 마스킹 여부를 남긴다.</li>
</ol>



<h2 class="wp-block-heading">AI 에이전트 trace는 어떻게 설계해야 하나</h2>



<p>가장 실용적인 방식은 사용자 요청 하나를 최상위 trace로 보고, 그 아래에 LLM 호출과 도구 실행을 span으로 나누는 구조다. OpenTelemetry는 trace, metric, log를 함께 다루는 관측성 표준이며, 최근에는 Generative AI semantic conventions를 통해 모델명, 토큰 사용량, 프롬프트 관련 이벤트, 응답 관련 속성을 표현하는 방향을 제시한다.</p>



<div style="border:1px solid #e5e7eb;background:#f9fafb;padding:16px;border-radius:10px;margin:22px 0;font-family:monospace;white-space:pre-wrap;">user_task trace
├─ llm.call: intent 분석
├─ tool.call: 파일 검색
├─ llm.call: 수정 계획 생성
├─ tool.call: 파일 수정
├─ tool.call: 테스트 실행
├─ llm.call: 실패 원인 분석
└─ final_artifact: PR 또는 문서 생성</div>



<p>이 구조를 쓰면 “작업이 실패했다”가 아니라 “테스트 실행 span에서 실패했고, 이후 모델이 원인을 잘못 추론해 같은 명령을 반복했다”처럼 설명할 수 있다. 운영자는 모델 품질 문제, 도구 문제, 권한 문제, 외부 API 문제를 분리해 볼 수 있다.</p>



<h2 class="wp-block-heading">비용 관측성은 별도 대시보드로 봐야 한다</h2>



<p>AI 에이전트 비용은 사용자가 체감하기 전에 급격히 늘 수 있다. 특히 장기 작업, 대용량 컨텍스트, 반복 테스트, 멀티 에이전트 작업에서는 요청 1건이 여러 모델 호출로 쪼개진다. 그래서 단순 월별 API 청구액보다 작업 단위 비용을 보는 것이 중요하다.</p>



<figure class="wp-block-table"><table><thead><tr><th>비용 항목</th><th>확인할 질문</th><th>운영 기준 예시</th></tr></thead><tbody><tr><td>입력 토큰</td><td>불필요한 파일이나 로그가 매번 들어가는가</td><td>프로젝트 문서 요약 캐시 사용</td></tr><tr><td>출력 토큰</td><td>모델이 과도하게 긴 설명을 반복하는가</td><td>작업별 응답 길이 제한</td></tr><tr><td>재시도 비용</td><td>같은 실패를 반복하는가</td><td>동일 오류 2회 후 사람 승인 필요</td></tr><tr><td>고급 모델 사용</td><td>모든 단계에 최고가 모델이 필요한가</td><td>계획/검토/실행 모델 분리</td></tr><tr><td>도구 실행 비용</td><td>외부 API나 검색 호출이 과도한가</td><td>도메인별 rate limit 설정</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">보안 관측성: 무엇을 남기고 무엇을 지울 것인가</h2>



<p>AI 에이전트 관측성에서 가장 위험한 함정은 “모든 프롬프트와 응답을 그대로 저장하면 디버깅이 쉬워진다”는 생각이다. 실제 운영 환경에서는 프롬프트 안에 고객 정보, 내부 코드, API 키, 장애 로그, 사내 문서가 섞일 수 있다. 관측성은 감사 가능성을 높여야 하지만, 동시에 새로운 정보 유출 경로가 되면 안 된다.</p>



<ul class="wp-block-list">
<li>API 키, 토큰, 비밀번호 패턴은 저장 전에 마스킹한다.</li>

<li>원문 프롬프트 저장은 기본값이 아니라 옵션으로 둔다.</li>

<li>고위험 도구 호출은 인자 전체보다 요약과 해시를 저장하는 방식을 검토한다.</li>

<li>trace 접근 권한은 개발자 전체가 아니라 운영상 필요한 인원으로 제한한다.</li>

<li>보관 기간을 정하고 오래된 원문 로그는 삭제하거나 비식별화한다.</li>
</ul>



<h2 class="wp-block-heading">운영 성숙도별 도입 순서</h2>



<figure class="wp-block-table"><table><thead><tr><th>단계</th><th>해야 할 일</th><th>목표</th></tr></thead><tbody><tr><td>1단계</td><td>LLM 호출 횟수, 토큰, 비용 기록</td><td>비용 폭증 방지</td></tr><tr><td>2단계</td><td>도구 호출과 오류를 작업 trace로 연결</td><td>실패 원인 분석</td></tr><tr><td>3단계</td><td>승인 이력과 파일 변경 이력 연결</td><td>감사 가능성 확보</td></tr><tr><td>4단계</td><td>모델별 성공률과 재시도율 비교</td><td>모델 라우팅 최적화</td></tr><tr><td>5단계</td><td>품질 평가와 산출물 리뷰 결과 연결</td><td>에이전트 개선 루프 구축</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">개인 AI 에이전트 서버에도 필요한 이유</h2>



<p>개인 맥미니나 홈서버에서 OpenClaw 같은 AI 에이전트 서버를 운영할 때도 관측성은 필요하다. 개인 환경에서는 대규모 SRE 조직이 없기 때문에 오히려 기록이 더 중요하다. 언제 어떤 모델이 어떤 파일을 읽고 수정했는지, 어떤 명령이 실패했는지, 비용이 어느 작업에서 늘었는지 알 수 없으면 문제를 재현하기 어렵다.</p>



<p>처음부터 복잡한 대시보드를 만들 필요는 없다. 작업 ID, 모델명, 토큰, 도구 호출, 오류, 최종 산출물 링크만 JSON 로그로 남겨도 출발점으로 충분하다. 이후 필요해지면 OpenTelemetry collector, Grafana, LangSmith, 자체 대시보드 같은 도구로 확장할 수 있다.</p>



<h2 class="wp-block-heading">AI 에이전트 관측성 체크리스트</h2>



<ul class="wp-block-list">
<li>사용자 요청 하나에 고유한 작업 ID가 붙는가</li>

<li>LLM 호출마다 모델명, 입력/출력 토큰, 비용이 남는가</li>

<li>도구 호출 인자와 결과가 trace 안에 연결되는가</li>

<li>파일 수정, 터미널 실행, 외부 API 호출은 별도 span으로 남는가</li>

<li>사용자 승인 여부와 승인 시점이 기록되는가</li>

<li>프롬프트와 응답 원문 저장 정책이 정해져 있는가</li>

<li>민감정보 마스킹이 저장 전에 적용되는가</li>

<li>실패 후 재시도 횟수와 복구 전략을 볼 수 있는가</li>

<li>최종 산출물과 테스트 결과가 작업 기록에 연결되는가</li>
</ul>



<h2 class="wp-block-heading">FAQ</h2>



<h3 class="wp-block-heading">AI 에이전트 관측성이 일반 로그와 다른 점은 무엇인가?</h3>



<p>일반 로그가 서버 요청과 오류를 남기는 데 초점을 둔다면 AI 에이전트 관측성은 LLM 호출, 프롬프트, 도구 실행, 권한 승인, 비용, 재시도, 최종 산출물을 하나의 작업 흐름으로 연결해 추적한다.</p>



<h3 class="wp-block-heading">AI 에이전트 운영에서 반드시 기록해야 할 지표는 무엇인가?</h3>



<p>최소한 모델명, 토큰 사용량, 비용, 지연 시간, 도구 호출 성공률, 재시도 횟수, 사용자 승인 이력, 오류 원인, 최종 산출물 링크를 기록해야 한다.</p>



<h3 class="wp-block-heading">프롬프트와 응답을 모두 저장해도 되는가?</h3>



<p>항상 저장하면 위험하다. 개인정보, API 키, 내부 문서, 고객 데이터가 포함될 수 있으므로 마스킹, 샘플링, 보관 기간, 접근 권한을 먼저 정해야 한다.</p>



<h3 class="wp-block-heading">OpenTelemetry만 쓰면 AI 에이전트 관측성이 완성되는가?</h3>



<p>아니다. OpenTelemetry는 공통 추적 포맷과 파이프라인을 제공하지만, 어떤 이벤트를 남기고 어떤 실패를 경보로 볼지는 서비스 정책과 평가 기준으로 별도 설계해야 한다.</p>



<h3 class="wp-block-heading">개인 AI 에이전트 서버에도 관측성이 필요한가?</h3>



<p>필요하다. 개인 서버라도 모델 비용, 파일 수정 이력, 도구 호출 실패, 장기 작업 중단 원인을 확인할 수 없으면 운영과 디버깅이 어려워진다.</p>



<h2 class="wp-block-heading">참고 자료</h2>



<ul class="wp-block-list">
<li><a href="https://opentelemetry.io/docs/concepts/observability-primer/" target="_blank" rel="noreferrer noopener">OpenTelemetry Observability Primer</a></li>

<li><a href="https://opentelemetry.io/docs/specs/semconv/gen-ai/" target="_blank" rel="noreferrer noopener">OpenTelemetry Generative AI Semantic Conventions</a></li>

<li><a href="https://openai.github.io/openai-agents-python/tracing/" target="_blank" rel="noreferrer noopener">OpenAI Agents SDK Tracing</a></li>

<li><a href="https://docs.anthropic.com/en/docs/claude-code/monitoring-usage" target="_blank" rel="noreferrer noopener">Anthropic Claude Code Monitoring Usage</a></li>

<li><a href="https://docs.langchain.com/langsmith/observability" target="_blank" rel="noreferrer noopener">LangSmith Observability</a></li>
</ul>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "AI 에이전트 관측성이 일반 로그와 다른 점은 무엇인가?", "acceptedAnswer": {"@type": "Answer", "text": "일반 로그가 서버 요청과 오류를 남기는 데 초점을 둔다면 AI 에이전트 관측성은 LLM 호출, 프롬프트, 도구 실행, 권한 승인, 비용, 재시도, 최종 산출물을 하나의 작업 흐름으로 연결해 추적한다."}}, {"@type": "Question", "name": "AI 에이전트 운영에서 반드시 기록해야 할 지표는 무엇인가?", "acceptedAnswer": {"@type": "Answer", "text": "최소한 모델명, 토큰 사용량, 비용, 지연 시간, 도구 호출 성공률, 재시도 횟수, 사용자 승인 이력, 오류 원인, 최종 산출물 링크를 기록해야 한다."}}, {"@type": "Question", "name": "프롬프트와 응답을 모두 저장해도 되는가?", "acceptedAnswer": {"@type": "Answer", "text": "항상 저장하면 위험하다. 개인정보, API 키, 내부 문서, 고객 데이터가 포함될 수 있으므로 마스킹, 샘플링, 보관 기간, 접근 권한을 먼저 정해야 한다."}}, {"@type": "Question", "name": "OpenTelemetry만 쓰면 AI 에이전트 관측성이 완성되는가?", "acceptedAnswer": {"@type": "Answer", "text": "아니다. OpenTelemetry는 공통 추적 포맷과 파이프라인을 제공하지만, 어떤 이벤트를 남기고 어떤 실패를 경보로 볼지는 서비스 정책과 평가 기준으로 별도 설계해야 한다."}}, {"@type": "Question", "name": "개인 AI 에이전트 서버에도 관측성이 필요한가?", "acceptedAnswer": {"@type": "Answer", "text": "필요하다. 개인 서버라도 모델 비용, 파일 수정 이력, 도구 호출 실패, 장기 작업 중단 원인을 확인할 수 없으면 운영과 디버깅이 어려워진다."}}]}</script>

		<div class="wpulike wpulike-robeen " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="Like Button"
					data-ulike-id="2679"
					data-ulike-nonce="ad4c4a2f8c"
					data-ulike-type="post"
					data-ulike-template="wpulike-robeen"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_2679"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></div>
	<p>The post <a href="https://blog.kwt.co.kr/ai-agent-observability-guide/">AI 에이전트 관측성 가이드: 로그만으로는 부족한 이유</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kwt.co.kr/ai-agent-observability-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
