bedaily.me
AI2026년 4월 25일3분 읽기

Spring AI로 RAG 파이프라인 구축하기

Spring AI를 사용해 문서를 벡터화하고 LLM과 결합한 Retrieval-Augmented Generation 파이프라인을 Java로 구현하는 방법을 설명합니다.

Spring AIRAGLLMJavaVector DB

RAG란?

Retrieval-Augmented Generation(RAG)은 LLM의 고정된 학습 데이터 한계를 극복하기 위해, 질문과 관련된 문서를 실시간으로 검색해 프롬프트에 함께 넣어주는 패턴입니다. Spring AI는 이 과정을 Java 생태계에서 쉽게 구현할 수 있는 추상화를 제공합니다.

RAG는 빌드 타임의 적재(ingestion)와 런타임의 질의(query) 두 단계로 나뉘며, 둘은 VectorStore를 공유합니다.

① 적재 (빌드 타임)문서TextReaderTokenTextSplitter청크 분할EmbeddingModel임베딩 생성add()VectorStorepgvector② 질의 (런타임)질문유사 검색similaritySearch topK=4QuestionAnswerAdvisor프롬프트 보강ChatClient → LLM답변유사 문서 조회
RAG 파이프라인 — 적재 단계가 문서를 임베딩해 VectorStore에 쌓고, 질의 단계가 유사 문서를 검색해 프롬프트를 보강한다

의존성 추가

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-vector-store-pgvector</artifactId>
</dependency>

문서 적재 (Ingestion)

@Component
public class DocumentIngester {
    private final VectorStore vectorStore;
    private final TokenTextSplitter splitter = new TokenTextSplitter();

    public void ingest(Resource resource) {
        var reader = new TextReader(resource);
        var docs = splitter.apply(reader.read());
        vectorStore.add(docs);
    }
}

TokenTextSplitter는 청크 단위로 문서를 분할하고, VectorStore.add()가 임베딩 생성 후 pgvector에 저장합니다.

질의 응답 (Query)

@Service
public class RagService {
    private final ChatClient chatClient;
    private final VectorStore vectorStore;

    public String ask(String question) {
        // QuestionAnswerAdvisor가 유사 문서 검색과 프롬프트 보강을 모두 수행한다
        var qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore)
            .searchRequest(SearchRequest.builder().topK(4).build())
            .build();

        return chatClient.prompt()
            .advisors(qaAdvisor)
            .user(question)
            .call()
            .content();
    }
}

QuestionAnswerAdvisor를 사용하면 유사 문서 검색과 프롬프트 보강을 자동으로 처리합니다.

application.yml 설정

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-4o-mini
      embedding:
        options:
          model: text-embedding-3-small
  datasource:
    url: jdbc:postgresql://localhost:5432/ragdb

주요 고려사항

청크 크기 튜닝

기본 청크 크기(800 토큰)가 항상 최선은 아닙니다. 문서 구조에 따라 TokenTextSplitterdefaultChunkSize를 조정하세요.

메타데이터 필터링

특정 카테고리 문서만 검색하려면:

var b = new FilterExpressionBuilder();
var filter = b.eq("category", "devops").build();
vectorStore.similaritySearch(
    SearchRequest.builder()
        .query(question)
        .filterExpression(filter)
        .topK(4)
        .build()
);

정리

Spring AI의 VectorStore + QuestionAnswerAdvisor 조합으로 RAG 파이프라인을 Java 코드 몇 줄로 구현할 수 있습니다. 다음 단계로는 ReRanker 추가와 Hybrid Search(키워드 + 벡터) 도입을 고려해보세요.

주간 기술 뉴스레터

Backend · AI · Java 핵심 내용을 매주 이메일로 보내드립니다.