Post

05 Spring AI 공통처리 & 토큰확인

05 Spring AI 공통처리 & 토큰확인

1. Note

  • 역시 자바스럽게 공통처리 방법
    • 특정 시스템메시지를 아에 입혀놓음녀 전체 AI가 써먹기는 좋기는 할듯
    • MSA라면 서비스마다 사용하는 메시지를 담아놓고 처리하면 될듯!
  • 토큰으로 시작해서 토큰으로 끝나는 것 같은데…
    • 어떻게 토큰을 사용해야하는가!
    • 어떻게 토큰을 관리해야하는가!

2. chat 공통 반영

1. Configuration 설정

1. 설정방법

1
2
3
4
5
6
7
8
9
10
11
    // yml에 등록된 설정을 바탕으로 ChatClient를 생성하며,
    // 공통 지침(defaultSystem)만 여기서 추가
    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {    
      return builder
          .defaultSystem("""
              당신은 친절하고 도움이 되는 AI 어시스턴트입니다.
              사용자의 질문에 정확하고 이해하기 쉽게 답변해주세요.
              """)
          .build();
    } 

2. defaultSystem() (전역 페르소나 부여)

  • 역할: 모든 대화 요청의 맨 앞에 자동으로 붙는 “지시 사항”
    • 이점: 개별 서비스 로직에서 매번 “너는 AI 비서야”라고 말해줄 필요가 없음
    • 일관성: 어떤 기능(채팅, 요약, 번역)에서 호출하더라도 AI는 동일한 말투와 규칙을 따르게 됨

3. ChatClient.Builder 활용

  • Spring Boot가 application.yml 설정을 읽어 미리 준비해둔 Builder를 주입받게됨
  • API 키, 베이스 URL, 선택된 모델명(gemini-2.0-flash-lite 등)을 자동으로 포함하고 있어 코드가 매우 간결해짐

4. 유지보수의 편의성

  • AI의 말투를 바꾸거나 특정 주의사항을 추가하고 싶을 때,
  • 비즈니스 로직(Service)을 수정할 필요 없이 이 설정 파일의 defaultSystem 내용만 수정

2. service

1
2
3
4
5
6
7
8
9
  private final ChatClient chatClient; // 빈생성

  @PostMapping("/chat")
  public String chat(@RequestBody String message) {
    return chatClient.prompt() // 여기서 사용함
        .user(message) // 프롬프트 메세지를 등록하는 메시지
        .call() // LLM API 전송
        .content(); // 문자열로 결과 반환
  }

3. 실사용 토큰

1. 토큰

  • 실제로 AI에게 질문후에 사용된 토큰을 확인하는 방법
  • 토큰량에따라 통제를 하거나 조절할 수 있음
  • 토큰은 곧 비용이기 때문에 관리가 필요!

2. 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  @Service
  public class ChatService {
  
      private final TokenLogger tokenLogger;
  
      public String ask(String question) {
          //AI 에게 값을 받음 (response)
          ChatResponse response = chatClient.prompt()
              .user(question)
              .call()
              .chatResponse();
          
          // 메타정보 
          tokenLogger.log(response.getMetadata().getUsage());
  
          // AI 답변
          response.getResult().getOutput().getContent();
      }
  }

3. 주요 메타 정보 (각기 얻는 방법은 확인 필요)

항목타입설명실무 활용
usageUsage토큰 사용량 정보 (input / output / total)비용 계산, 로깅
modelString응답 생성에 사용된 모델명모델별 성능/비용 분석
finishReasonString응답 종료 이유 (stop, length 등)응답 잘림 여부 판단
idString요청/응답 고유 ID추적, 디버깅
createdAtTimestamp / Instant응답 생성 시간로그 분석
latency (간접)Long (직접 없음)응답 시간 (직접 측정 필요)성능 모니터링
This post is licensed under CC BY 4.0 by the author.