실무에 바로 적용하는 Spring AI: Spring 서비스에 챗봇·RAG·MCP 도입하기
practice-implementing-rag-advisors
✅ 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();
}