실무에 바로 적용하는 Spring AI: Spring 서비스에 챗봇·RAG·MCP 도입하기
understanding-spring-ai-advisor
✅ 1. Spring AI Advisor의 정의
- AI 모델과 주고받는 요청과 응답을 중간에서 가로채 데이터를 동적으로 수정, 확장, 차단할 수 있게 해주는 컴포넌트
- 스프링 웹 개발의 인터셉터, 필터, 정통 AOP와 동일한 역할을 수행함
✅ 2. Advisor의 핵심 동작 원리: 스택(Stack) 구조
Advisor 체인은 내부적으로 스택 구조로 동작함
이로 인해 요청할 때와 응답받을 때의 처리 순서가 반대로 뒤집히는 특징을 가짐
- 실행순서 규칙 :
getOrder() 메서드가 반환하는 값이 작을수록(우선순위가 높을수록) 체인의 가장 바깥쪽(맨 위)에 위치함
- 데이터 흐름 :
- 요청(Request) 단계 : 우선순위가 높은(Order 값이 작은) Advisor가 가장 먼저 요청을 가로채서 전처리함
- 응답(Response) 단계 : 우선순위가 높은(Order 값이 작은) Advisor가 가장 마지막에 응답을 가로채서 후처리함
✅ 3. 예시 코드
ChatMemory chatMemory = ... // Initialize your chat memory store
VectorStore vectorStore = ... // Initialize your vector store
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(
MessageChatMemoryAdvisor.builder(chatMemory).build(), // chat-memory advisor
QuestionAnswerAdvisor.builder(vectorStore).build() // RAG advisor
)
.build();
var conversationId = "678";
String response = this.chatClient.prompt()
// Set advisor parameters at runtime
.advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, conversationId))
.user("지난번에 물어본 사내 복지 혜택 다시 알려줘.")
.call()
.content();
✅ 4. 내장 Advisor 종류
- Chat Memory Advisors (대화 흐름 관리)
- MessageChatMemoryAdvisor : 대화 이력을 유저/AI 메시지 구조 그대로 유지하며 프롬프트에 추가함
- PromptChatMemoryAdvisor : 과거 대화를 단순 텍스트로 뽑아서 시스템 프롬프트에 삽입함
- Question Answering Advisors (RAG 검색 증강 생성)
- QuestionAnswerAdvisor : Vector DB 자동 연동 등의 패턴을 수행함
- RetrievalAugmentationAdvisor : 고도화된 RAG 아키텍처를 구현할 때 사용함
- Reasoning & Safety Advisors (추론 및 보안)
- ReReadingAdvisor (RE2) : LLM의 추론 능력을 높이기 위해 입력된 질문을 한 번 더 읽게끔 프롬프트를 자동으로 보강해 줌.
- SafeGuardAdvisor : AI 모델이 해롭거나 부적절한 답변을 생성하지 않도록 사전에 방어막을 쳐줌.