[Spring AI] Spring Boot에 LLM을 도입하기 전 꼭 알아야 할 RAG 개념 정리

2025. 7. 15. 21:55·AI
이 글은 AI, RAG에 대해 기술적으로 전혀 모르는 상황에서 인앱 AI를 도입하기 위한 기본 개념을 정리합니다. 
이 개념을 이해한 후에, 아래 Spring AI  실습 글을 보시길 바랍니다.
(이 글에서 Spring AI는 직접적으로 다루진 않습니다.)

[Spring] - Spring AI + RAG 임베디드 AI 구축 방법

 

[Spring] Spring AI + RAG 임베디드 AI 구축 방법

시작하기 전에, 이 글은 개념 정리는 없는 실습 글입니다.RAG 및 AI 개념에 대해 정리한 글이 있으니, 참고하세요.[Spring AI] Spring Boot에 LLM을 도입하기 전 꼭 알아야 할 RAG 개념 정리 [Spring AI] Spring Bo

innovation123.tistory.com

 

인앱 AI


인앱 AI는 생성형 AI가 세상에 공개된(일반적인, 구글 검색하면 나오는) 데이터를 기반으로 답변하는 것이 아닌,

내 애플리케이션 내의 데이터를 기반으로 유저의 질문에 대답할 수 있도록 하는 것이다.

 

이 인앱 AI는 RAG 기술을 통해 구현할 수 있다.

 

RAG(Retrieval-Augmented Generation)


RAG란?

RAG는 검색 기반 생성형 AI 기술이다.

쉽게 말하면, AI가 뭔가를 생성하기전에 먼저 정해진 범위 내에서 관련된 정보를 찾아보고 나서 답변을 만드는 개념이다.

 

일반적인 생성형 AI(chat gpt 등)은 이미 학습된 지식만 가지고 답변한다. (최근에는 Web 검색을 해서 답변하기도 한다.)

그러나 인앱 AI에서 필요로 하는 해당 애플리케이션 내에만 존재하는 데이터는 일반적인 AI가 알지 못한다. 

따라서 실시간으로 내 데이터를 검색해서 생성형 AI에게 정보를 전달하는 방식이 필요하다.

이때 필요한 게 바로 RAG이다.

 

RAG의 구성

1. 질문받기 (Query)

유저가 "우리 회사 육아휴직은 최대 몇 개월까지 가능한가요?"라고 질문한다.

일반적인 AI는 "우리 회사"에 대해서도 모르고, 우리 회사의 육아휴직 정책에 대해서도 알지 못한다.

 

2. 검색 (Retrieval)

AI는 미리 저장해 둔 데이터 (회사 규정집, 회사 게시판 게시글 등)에서 이 질문과 관련 있는 내용을 찾아낸다.

이때, vector DB와 임베딩(embedding)이란 기술이 사용된다.

 

3. 생성

찾은 내용을 바탕으로 생성형 AI가 답변(자연어)을 생성한다.

"육아휴직은 최대 12개월까지 사용하실 수 있습니다."라고 답변한다.

위에서 찾은 아래와 같은 정보를 바탕으로 답변을 생성했기 때문에 가능한 일이다.
[참고 문서]
1. 육아휴직은 최대 12개월까지 사용할 수 있으며, 분할 사용이 가능합니다.
2. 육아휴직 신청은 최소 30일 전에 인사팀에 신청해야 하며, 승인 절차가 필요합니다.​

 

이처럼 사전에 알지 못했던 데이터를 참조하여 마치 알고 있는 것처럼 답변할 수 있게 된다.

 

이제 Vector DB에 대해 알아보자. Vector DB가 뭔데 AI가 사용할 수 있도록 검색할 수 있을까?

 

Vector(벡터) DB


RAG에서 “검색(Retrieval)” 단계에서 중요한 역할을 하는 것이 바로 Vector DB이다. 

"그냥 RDB에 LIKE 검색이나, Elastic Search와 같은 검색엔진에서 검색하면 안 될까?"라는 질문이 생길 수 있다.

 

일반 검색의 한계

일반적인 데이터베이스나 검색엔진은 키워드 기반 검색을 한다.

즉, 질문에 "육아휴직"이라는 단어가 없으면 "휴직 관련 정책"이라는 문서도 못 찾을 수 있다.

 

그러나 실제로 사람은 "출산휴가"라고 써 있어도 "육아휴직"과 비슷하다고 느낀다.

이런 의미 기반 검색(semantic search)을 가능하게 해주는 것이 바로 Vector DB입니다.

 

Vector란?

먼저 Vector를 이해해야 한다.

Vector는 숫자의 배열이다. 

AI는 문장(자연어)을 숫자의 배열인 벡터로 변환한다.. 이를 임베딩(embedding)이라고 부른다.

예:
• “육아휴직이란 무엇인가요?” → [0.123, -0.456, 0.789, …]
• “출산 후 사용할 수 있는 휴가 종류는?” → [0.128, -0.460, 0.781, …]

이 숫자들의 분포를 통해 두 문장이 얼마나 유사한지를 계산할 수 있다.

주로 코사인유사도(cosine similarity) 혹은 유클리드 거리(Euclidean distance)를 통해 두 벡터 간의 유사도(거리)를 계산한다.

 

Vector DB의 역할

Vector DB는 이렇게 벡터로 변환된 문서나 문장 등의 데이터를 저장하고,

유저의 질문도 벡터로 바꿔서 가장 가까운(의미적으로 유사한) 벡터들을 찾아주는 DB이다.

 

즉, 아래처럼 작동한다.

  1. 사내 규정집 문서를 쪼개서 벡터로 변환하여 Vector DB에 저장해 둠
  2. 유저가 질문을 입력하면, AI가 이 질문도 Vector로 변환
  3. (1)의 벡터들 중, (2)의 벡터와 유사한 벡터를 찾아서 전달

결과적으로 Vector DB는 데이터를 벡터 형태로 저장해 뒀다가, 특정 벡터(=질문)와 가장 관련 있는 내용을 빠르게 찾아준다.

 

그럼 이러한 프롬프트 작성이 가능하다.

AI 질문 프롬프트: 
다음은 회사의 정책 문서입니다. 이 문서를 참고해서 사용자 질문에 정확히 답해주세요.

[참고 문서]
1. 육아휴직은 최대 12개월까지 사용할 수 있으며, 분할 사용이 가능합니다.
2. 육아휴직 신청은 최소 30일 전에 인사팀에 신청해야 하며, 승인 절차가 필요합니다.

[사용자 질문]
육아휴직은 최대 몇 개월까지 가능한가요?
AI 답변:
"육아휴직은 최대 12개월까지 사용하실 수 있습니다."

 

Embedding(임베딩)


임베딩(Embedding)은 AI가 문장, 단어 같은 자연어를 숫자로 변환하는 기술이다.

앞서 설명했던 벡터(Vector)를 만들기 위해 꼭 필요한 과정이기도 하다.

 

임베딩이 필요한 이유

AI는 인간처럼 언어의 의미를 이해하지 못한다.

대신 문장을 숫자의 배열(=벡터)로 바꿔서, 그 숫자들의 거리나 방향을 수학적으로 계산하는 방식으로 의미를 비교한다.

 

즉, "육아휴직"과 "출산휴가"처럼 단어는 다르지만 의미가 비슷한 문장들을,

숫자로 바꿨을 때 비슷한 벡터가 되도록 해주는 게 임베딩이다.

예시
"육아휴직이란?" → [0.123, -0.456, 0.789, …]
"출산 후 사용할 수 있는 휴가 종류는?" → [0.128, -0.460, 0.781, …]
→ 이 두 벡터는 서로 가까운 위치에 있음 → 의미가 유사하다고 판단

 

위와 같이, AI가 "문장의 의미"를 수치화할 수 있게 만들어주는 것이 임베딩이다.

 

임베딩 방법

문장을 숫자 벡터로 변환하는 것은 특정 AI 모델이 수행한다. 
이 모델을 임베딩 모델(Embedding Model)이라고 한다.

 

Chat GPT가 제공하는 임베딩 모델과 Gemini가 제공하는 임베딩 모델은 다를 것이고,

같은 문장을 넣더라도, 모델마다 임베딩 된 벡터 값은 서로 달라질 수 있다.

 

모델 종류설명사용 예시

OpenAI text-embedding-3-small 고성능, 상용 API 기반 Spring AI + OpenAI 연동 시
HuggingFace all-MiniLM-L6-v2 오픈소스, 성능 좋고 가벼움 자체 서버에서 사용 가능
BGE, E5 등 의미 기반 검색 특화 검색 성능에 집중할 때 사용

 

임베딩 모델은 문장을 넣으면 벡터를 출력해 주는 함수처럼 작동한다고 볼 수 있다.
# (예시1: GPT)
embedding = gptModel.embed("육아휴직 제도")
# 결과: [0.112, -0.045, 0.823, ...]

# (예시2: Gemini)
embedding = geminiModel.embed("육아휴직 제도")
# 결과: [0.003, 0.562, -0.191, ...]

 

두 모델은 같은 "육아휴직 제도"를 입력받았지만,

출력 벡터는 전혀 다르며, 유사도 비교 기준도 모델마다 다르다.

 

따라서 Open AI의 Chat GPT 모델을 사용할 거면, 임베딩도 Open AI의 임베딩 모델을 이용해야 한다.

 

Chunking 이란?

실제 서비스에서는 하나의 문서가 한두 문장이 아니라 수천 자에 이르기도 한다.

그런 문서를 통째로 임베딩하면, 벡터 하나에 너무 많은 정보가 담겨 검색 시 원하는 부분을 정확히 찾기 어렵다.

 

그래서 하나의 문서를 일정 단위로 쪼개서(chunk) 각각 임베딩 한다. 이 과정을 청킹(chunking)이라고 한다.

chunking을 통해 나중에 유저가 질문할 때, 해당 내용이 담긴 chunk 만 정확히 검색해서 AI에게 전달할 수 있다.

 

chunking이 중요한 이유

  • 너무 긴 문장은 AI가 한 번에 이해하기 어렵다 (토큰 제한)
  • 쪼개면 검색 정확도도 올라간다
  • 불필요한 정보가 프롬프트에 들어가는 걸 막아준다 (비용 ↓, 응답 품질 ↑)

 

이제 이 개념들을 바탕으로, Spring AI를 이용해 실제로 어떻게 구현할 수 있는지 확인 보자.

 

Spring AI


Spring AI는 Spring Boot 환경에서 OpenAI, HuggingFace 등 다양한 LLM을 손쉽게 연동할 수 있도록 도와주는 라이브러리이다.

복잡한 LLM API 호출 과정을 추상화하여 간편하게 이용할 수 있게 해 준다.

 

위에서 알게 된 내용을 구현한다면 아래와 같은 흐름이 될 것이다.

 

임베딩

// 임베딩
// 문서 업로드 API
List<String> chunks = splitIntoChunks(document);
for (String chunk : chunks) {
    float[] embedding = embeddingModel.embed(chunk);
    vectorDb.save(embedding, chunk);
}
// 벡터 DB에 문서 저장됨

 

유저 질문 / AI 응답

// 유저가 AI에 질문
// 1. 유저가 질문 입력
String userQuestion = "육아휴직은 최대 몇개월까지 가능한가요?";

// 2. 질문을 임베딩 후, 관련 문서 검색
float[] questionEmbedding = embeddingModel.embed(userQuestion);
List<String> relevantChunks = vectorDb.searchSimilar(questionEmbedding);

// 3. 검색된 문서를 프롬프트에 삽입
String prompt = buildPrompt(relevantChunks, userQuestion);

// 4. 생성형 AI에게 전달 → 응답 생성
String answer = gptModel.generate(prompt);

// 5. 응답 반환
return answer;

 

반응형
저작자표시 (새창열림)

'AI' 카테고리의 다른 글

[ AI ] 바이브 코딩/에이전틱 코딩 개발 방법론 - AI 모델간 planning 교차 검증  (0) 2026.01.24
[ Claude ] 클로드 코드 상세 세팅 알아보기  (0) 2026.01.24
[ AI ] 클로드 스킬(Claude Skills, Agent Skill) 사용 방법, 커스텀해서 에이전트 만들기  (2) 2026.01.16
[Spring AI] 벡터 DB - Qdrant 스프링부트 연동과 ollama를 이용한 임베딩  (0) 2025.09.01
Spring AI로 RAG 챗봇 만들기 – Ollama, pgvector 부터 API 까지  (1) 2025.07.15
'AI' 카테고리의 다른 글
  • [ Claude ] 클로드 코드 상세 세팅 알아보기
  • [ AI ] 클로드 스킬(Claude Skills, Agent Skill) 사용 방법, 커스텀해서 에이전트 만들기
  • [Spring AI] 벡터 DB - Qdrant 스프링부트 연동과 ollama를 이용한 임베딩
  • Spring AI로 RAG 챗봇 만들기 – Ollama, pgvector 부터 API 까지
HSRyuuu
HSRyuuu
Web Server Developer hsryuuu
  • HSRyuuu
    HS_dev_log
    HSRyuuu
  • 전체
    오늘
    어제
  • 링크

    • Github
    • 전체 글 보기 (251)
      • Spring (37)
      • Infra & DevOps (20)
      • Java (25)
      • AI (8)
      • Database (28)
      • Web & Network (14)
      • 자료구조 & 알고리즘 (30)
      • Computer Science (24)
      • Frontend (17)
        • Vue.js & Nuxt.js (9)
        • JSP_Thymeleaf (7)
      • etc (48)
        • 오픈소스 라이브러리 (5)
        • 코딩테스트 (13)
        • Trouble Shooting (7)
        • Tech Interview (6)
        • Book Review (9)
        • 끄적끄적... (6)
        • 개인 프로젝트 (2)
  • 태그

    SQL
    자료구조
    제로베이스
    백엔드기술면접
    Database
    TechInterview
    백준
    백엔드공부
    기술면접
    MySQL
    Nuxt3
    web
    트랜잭션
    cleancode
    개발자
    백엔드스쿨
    클린코드
    Java
    Spring
    Redisson
    Linux
    리눅스
    mybatis
    Redis
    Queue
    JPA
    백엔드
    docker
    SpringBoot
    HTTP
  • 블로그 메뉴

    • 홈
    • 태그
  • hELLO· Designed By정상우.v4.10.4
HSRyuuu
[Spring AI] Spring Boot에 LLM을 도입하기 전 꼭 알아야 할 RAG 개념 정리
상단으로

티스토리툴바