AI 메타데이터

AI 메타데이터 (AI Metadata)

OpenAI의 ChatGPT 같은 AI를 사용하면 리소스가 소비되고, AI 제공자가 API를 통한 요청과 사용량을 바탕으로 반환하는 메트릭이 생성돼요. 소비는 보통 월 단위 같은 특정 시간대에 이루어진 요청 수나 사용된 토큰 형태로 나타나는데, AI 제공자는 이를 기준으로 소비를 측정하고 한도를 리셋해요. 요금 한도(rate limit)는 AI 제공자에 가입할 때 선택한 플랜에 따라 직접 결정돼요. Spring AI는 AI 제공자가 API에서 반환하는 메타데이터를 들여다볼 수 있는 API를 제공해서, AI(모델) 소비와 전반적인 사용량에 대한 통찰을 얻을 수 있게 도와줘요.

출처: 문서

본문

AI(예: OpenAI의 ChatGPT)를 사용하면 리소스가 소비되고, AI 제공자가 AI를 통해 API로 보낸 사용량과 요청을 기반으로 하는 메트릭이 생성돼요. 소비는 일반적으로 월 단위 같은 특정 시간대에 이루어진 요청 수나 사용된 토큰의 형태로, AI 제공자는 이 소비를 측정하고 한도를 리셋할 때 사용해요. 요금 한도는 AI 제공자에 가입할 때 선택한 플랜에 따라 직접 결정돼요. 예를 들어 OpenAI의 rate limits와 plans에 대한 세부 사항은 링크를 따라가면 확인할 수 있어요.

AI(모델) 소비와 일반적인 사용량에 대한 통찰을 얻기 위해, Spring AI는 AI 제공자가 자신들의 API에서 반환하는 메타데이터를 들여다볼 수 있는(introspect) API를 제공해요.

Spring AI는 이 메트릭을 조사하기 위한 세 가지 기본 인터페이스를 정의해요: GenerationMetadata, RateLimit, Usage. 이 인터페이스들은 모두 AI 요청에 의해 반환되고 시작된 ChatResponse에서 프로그래밍 방식으로 접근할 수 있어요.

GenerationMetadata interface

GenerationMetadata 인터페이스는 다음과 같이 정의돼요:

GenerationMetadata interface

interface GenerationMetadata {

	default RateLimit getRateLimit() {
		return RateLimit.NULL;
	}

	default Usage getUsage() {
		return Usage.NULL;
	}

}

GenerationMetadata 인스턴스는 AI 제공자의 API를 통해 AI 요청이 이루어지고 AI 응답이 반환될 때 Spring AI가 자동으로 만들어요. AI 제공자 메타데이터에 접근하려면 ChatResponse에서 다음과 같이 가져올 수 있어요:

Get access to GenerationMetadata from ChatResponse

@Service
class MyService {

	ApplicationObjectType askTheAi(ServiceRequest request) {

        Prompt prompt = createPrompt(request);

        ChatResponse response = chatModel.call(prompt);

        // Process the chat response

        GenerationMetadata metadata = response.getMetadata();

        // Inspect the AI metadata returned in the chat response of the AI providers API

        Long totalTokensUsedInAiPromptAndResponse = metadata.getUsage().getTotalTokens();

        // Act on this information somehow
	}
}

상상해볼 수 있듯이, AI를 사용하는 자신의 Spring 애플리케이션에 요금 한도를 적용하거나, 토큰 사용량에 영향을 주는 Prompt 크기를 제한하는 일을 자동화되고 지능적이며 실시간으로 처리할 수 있어요.

최소한 이 메트릭들을 수집해서 소비량을 모니터링하고 보고하는 데 사용할 수도 있어요.

RateLimit

RateLimit 인터페이스는 AI 요청을 할 때 AI 제공자가 API 사용량에 대해 반환하는 실제 정보에 접근할 수 있게 해줘요.

RateLimit interface

interface RateLimit {

	Long getRequestsLimit();

	Long getRequestsRemaining();

	Duration getRequestsReset();

	Long getTokensLimit();

	Long getTokensRemaining();

	Duration getTokensReset();

}

requestsLimit과 requestsRemaining은 가입 시 선택한 AI 제공자 플랜을 기준으로, 주어진 시간대에 총 몇 번의 AI 요청을 할 수 있는지와 남은 잔액을 알려줘요. requestsReset은 시간대가 만료되고 선택한 플랜에 따라 한도가 리셋되기까지의 남은 시간을 Duration으로 반환해요.

tokensLimit, tokensRemaining, tokensReset 메서드는 요청 메서드와 비슷하지만, 토큰 한도, 잔액, 리셋에 초점을 맞춰요.

RateLimit 인스턴스는 다음과 같이 GenerationMetadata에서 가져올 수 있어요:

Get access to RateLimit from GenerationMetadata

RateLimit rateLimit = generationMetadata.getRateLimit();

Long tokensRemaining = this.rateLimit.getTokensRemaining();

// do something interesting with the RateLimit metadata

OpenAI 같은 AI 제공자의 경우, rate limit 메타데이터는 OkHttp 같은 HTTP 클라이언트를 통해 접근할 수 있는 (REST) API의 HTTP headers에 담겨 반환돼요.

이 작업은 비용이 많이 들 수 있기 때문에, rate limit AI 메타데이터 수집은 반드시 명시적으로 활성화해야 해요. Spring Boot의 application.properties에서 Spring AI 프로퍼티로 활성화할 수 있어요. 예:

Enable API rate limit collection from AI metadata

# Spring Boot application.properties
spring.ai.openai.metadata.rate-limit-metrics-enabled=true

Usage

위에서 본 것처럼 Usage 데이터는 GenerationMetadata 객체에서 얻을 수 있어요. Usage 인터페이스는 다음과 같이 정의돼요:

Usage interface

interface Usage {

	Long getPromptTokens();

	Long getGenerationTokens();

	default Long getTotalTokens() {
		return getPromptTokens() + getGenerationTokens();
	}

}

메서드 이름은 자명하지만, AI가 Prompt를 처리하고 응답을 생성하는 데 필요했던 토큰 수를 알려줘요.

totalTokens는 promptTokens와 generationTokens의 합이에요. Spring AI가 기본적으로 계산하지만, 이 정보는 OpenAI의 AI 응답에서도 반환돼요.

더 알아보기 (Learn more)