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. 주요 메타 정보 (각기 얻는 방법은 확인 필요)
| 항목 | 타입 | 설명 | 실무 활용 |
|---|---|---|---|
| usage | Usage | 토큰 사용량 정보 (input / output / total) | 비용 계산, 로깅 |
| model | String | 응답 생성에 사용된 모델명 | 모델별 성능/비용 분석 |
| finishReason | String | 응답 종료 이유 (stop, length 등) | 응답 잘림 여부 판단 |
| id | String | 요청/응답 고유 ID | 추적, 디버깅 |
| createdAt | Timestamp / Instant | 응답 생성 시간 | 로그 분석 |
| latency (간접) | Long (직접 없음) | 응답 시간 (직접 측정 필요) | 성능 모니터링 |
This post is licensed under CC BY 4.0 by the author.