JSCODE Logo
블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] RAG Advisors 구현

JSCODE 시니
JSCODE 시니
2026. 06. 13.
author
JSCODE 시니
category
Spring AI
createdAt
Jun 13, 2026 09:53 AM
isPublic
isPublic
series
실무에 바로 적용하는 Spring AI: Spring 서비스에 챗봇·RAG·MCP 도입하기
slug
practice-implementing-rag-advisors
type
post
updatedAt

✅ 1. 실무에서 사용하는 두 가지 Advisor

  • QuestionAnswerAdvisor
    • 사용자의 질문을 받으면 Vector DB에서 관련 문서를 찾아 프롬프트에 끼워 넣고 답변을 생성하는 가장 기본적인 RAG 흐름을 제공
    • 구조가 단순해서 빠르게 초기 프로토타입을 만들 때 유용
  • RetrievalAugmentationAdvisor **
    • 단순한 검색을 넘어, RAG 시스템을 레고 블록처럼 자유롭게 조립하고 확장할 수 있게 해주는 고급형 Advisor
    • 새로운 검색 기법이나 문서 정제 기술(패러다임)이 등장했을 때, 전체 코드를 갈아엎을 필요 없이 필요한 모듈(블록)만 갈아 끼워 대응할 수 있는 유연함을 제공
 
 
 

✅ 2. 의존성 추가

implementation("org.springframework.ai:spring-ai-rag:2.0.0-M6")
 
 
 

✅ 3. 코드 구현

application.yaml
vectorstore: in-memory: enabled: true
RagConfig.java
@ConditionalOnProperty(prefix = "app.vectorstore.in-memory", name = "enabled", havingValue = "true") @Bean public VectorStore vectorStore(EmbeddingModel embeddingModel){ return SimpleVectorStore.builder(embeddingModel).build(); }
@Bean public RetrievalAugmentationAdvisor retrievalAugmentationAdvisor(VectorStore vectorStore, ChatClient.Builder chatClientBuilder){ // 1. 문서검색기 도구 // Vector DB에서 유사도 30%(0.3) 이상인 문서를 최대 3개(topK) 찾아오도록 세팅 VectorStoreDocumentRetriever documentRetriever = VectorStoreDocumentRetriever.builder() .vectorStore(vectorStore) .similarityThreshold(0.3) .topK(3) .build(); // 2. 프롬프트 결합기 도구 // 검색된 문서가 하나도 없더라도 에러를 내지말고 LLM에게 유연하게 넘기도록 세팅 ContextualQueryAugmenter queryAugmenter = ContextualQueryAugmenter.builder() .allowEmptyContext(true) .build(); // 3. 쿼리 익스펜더 MultiQueryExpander queryExpander = MultiQueryExpander.builder() .chatClientBuilder(chatClientBuilder) .build(); // 4. 쿼리 트랜스포머 TranslationQueryTransformer queryTransformer = TranslationQueryTransformer.builder() .chatClientBuilder(chatClientBuilder) .targetLanguage("korean") .build(); //5. 최종 합체 return RetrievalAugmentationAdvisor.builder() .documentRetriever(documentRetriever) .queryAugmenter(queryAugmenter) // ~~~ 다양한 도구들 .queryExpander(queryExpander) .queryTransformers(queryTransformer) .build(); }