본문 바로가기

AI

[AI Study] 청크, 벡터DB, RAG란? - 개념 쉽게 이해하기

[AI Study] 청크, 벡터DB, RAG란? - 개념 쉽게 이해하기

RAG가 뭐길래? 어려워 보이지만 사실은 간단합니다!


🎯 문제 상황

일반 ChatGPT의 한계:

질문: "우리 회사 휴가 정책이 뭐야?"
ChatGPT: "죄송하지만 귀사의 정보를 모릅니다" ❌

왜 그럴까요?

  • ChatGPT는 2023년까지의 학습 데이터만 알고 있음
  • 우리 회사 문서는 학습하지 못함
  • 최신 정보도 모름

 

RAG로 해결:

질문: "우리 회사 휴가 정책이 뭐야?"
→ 회사 문서 검색
→ ChatGPT가 문서 보고 답변
ChatGPT: "연차 15일, 병가 10일입니다" ✅

📚 RAG를 이해하기 위한 3가지 개념

RAG를 이해하려면 먼저 3가지 개념을 알아야 합니다:

  1. 청크 (Chunk)
  2. 벡터 DB (Vector Database)
  3. RAG (Retrieval-Augmented Generation)

하나씩 차근차근 알아봅시다!


1️⃣ 청크 (Chunk)

정의

"긴 문서를 작은 조각으로 자르는 것"

 

왜 필요한가?

상황:

  • 5000자짜리 긴 문서가 있음
  • 이걸 통째로 GPT한테 주면?

 

문제점:

전체 문서 (5000자) → GPT
→ 토큰 5000개 사용
→ 비용 많이 나옴 💸
→ 응답도 느림 🐢
→ 불필요한 내용까지 다 전달

 

해결책:

필요한 부분 (1000자)만 → GPT
→ 토큰 1000개 사용
→ 비용 80% 절감 ✅
→ 응답 빠름 ⚡
→ 관련 내용만 전달

 

비유

책을 페이지로 나누기:

원본 문서 (전체 책)
    ↓
청크 1 (1페이지)
청크 2 (2페이지)
청크 3 (3페이지)
청크 4 (4페이지)
청크 5 (5페이지)

필요한 페이지만 찾아서 읽으면 되죠!

 

실제 예시

원본 문서:

Python은 1991년 귀도 반 로섬이 만든 프로그래밍 언어입니다.
문법이 간단하고 읽기 쉬우며 다양한 라이브러리를 지원합니다.
인공지능, 웹 개발, 데이터 분석 등 다양한 분야에서 사용됩니다.
변수는 x = 10처럼 선언하고, 조건문은 if x > 5: print("크다")로 작성합니다.
반복문은 for i in range(10): print(i)로 작성합니다.

 

청크로 분할 (200자씩):

[청크 1]
Python은 1991년 귀도 반 로섬이 만든 프로그래밍 언어입니다.
문법이 간단하고 읽기 쉬우며 다양한 라이브러리를 지원합니다.

[청크 2]
인공지능, 웹 개발, 데이터 분석 등 다양한 분야에서 사용됩니다.
변수는 x = 10처럼 선언하고,

[청크 3]
조건문은 if x > 5: print("크다")로 작성합니다.
반복문은 for i in range(10): print(i)로 작성합니다.

2️⃣ 벡터 DB (Vector Database)

정의

"의미로 검색하는 데이터베이스"

 

일반 DB와 뭐가 다른가?

일반 데이터베이스:

SELECT * FROM docs WHERE title = "Python"

→ 제목이 정확히 "Python"인 것만 찾음
→ "파이썬", "파이선", "프로그래밍 언어" 못 찾음 ❌

 

벡터 데이터베이스:

search("파이썬")

→ "Python" ✅
→ "파이선" ✅
→ "프로그래밍 언어" ✅
→ "코딩" ✅
→ "개발" ✅

의미가 비슷하면 다 찾아줌!

 

어떻게 작동하나?

1단계: 임베딩 (Embedding)

텍스트를 숫자 벡터로 변환:

"Python은 프로그래밍 언어다"
    ↓ OpenAI Embeddings API
[0.23, -0.51, 0.82, 0.15, ..., -0.33]  
(1536개의 숫자)

"파이썬은 코딩 언어다"
    ↓
[0.25, -0.48, 0.85, 0.12, ..., -0.31]  
(비슷한 숫자들!)

"사과는 맛있는 과일이다"
    ↓
[0.91, 0.12, -0.45, 0.88, ..., 0.67]  
(완전 다른 숫자들!)

 

2단계: 거리 계산

Python ↔ 파이썬
→ 거리: 0.05 (가까움 = 의미가 비슷함)

Python ↔ 사과
→ 거리: 0.95 (멀음 = 의미가 다름)

 

시각화

2D로 단순화하면:

좌표 평면에 표시:

Python (2, 8)  ●
                 \
파이썬 (3, 7)     ● ← 가까이 있음!
                   \
프로그래밍 (4, 6)   ●



사과 (9, 1)         ● ← 멀리 떨어짐!

실제로는 1536차원 공간에서 계산합니다!

 

검색 과정

1. 질문: "파이썬 함수"

2. 질문을 벡터로 변환
   "파이썬 함수" → [0.24, -0.49, ...]

3. 벡터DB에서 가까운 것 찾기

4. 결과:
   - "def greet(): ..." (거리: 0.12) ✅
   - "Python 함수 정의" (거리: 0.15) ✅
   - "함수는 재사용..." (거리: 0.23) ✅

3️⃣ RAG (Retrieval-Augmented Generation)

정의

"검색 증강 생성"

풀어 쓰면:

  • Retrieval (검색): 문서 찾기
  • Augmented (증강): 문서 추가
  • Generation (생성): GPT가 답변

= 문서 검색 + GPT 답변

 

작동 과정

1️⃣ 질문
   사용자: "Python 함수는 어떻게 정의해?"

2️⃣ 검색 (Retrieval)
   벡터DB에서 "함수" 관련 청크 찾기
   → 찾음: "def greet(name): return f'Hello, {name}!'"

3️⃣ 증강 (Augmented)
   GPT에게 문서와 질문을 함께 전달:
   
   "다음 문서를 참고해서 답변해줘:
    
    문서: def greet(name): return f'Hello, {name}!'
    
    질문: Python 함수는 어떻게 정의해?"

4️⃣ 생성 (Generation)
   GPT: "def 키워드를 사용하여 함수를 정의합니다.
         예를 들어 def greet(name): return f'Hello, {name}!'
         처럼 작성할 수 있습니다."

 

비유: 도서관 사서

1. 손님 (사용자)
   "Python 함수에 대한 책 어디 있어요?"

2. 사서 (RAG 시스템)
   [책장에서 관련 책 찾기] ← Retrieval
   
3. 사서
   [책 펼쳐서 해당 페이지 읽기] ← Augmented
   
4. 사서
   "3장 12페이지에 있습니다!" ← Generation

🔄 전체 흐름

사전 작업 (한 번만)

1. 문서 업로드
   Python_tutorial.pdf

2. 청크로 분할
   → 청크 1 (1000자)
   → 청크 2 (1000자)
   → 청크 3 (1000자)

3. 임베딩 생성
   → 청크 1 → [0.23, -0.51, ...]
   → 청크 2 → [0.25, -0.48, ...]
   → 청크 3 → [0.26, -0.47, ...]

4. 벡터DB에 저장
   → Chroma DB에 저장 완료!

 

질문할 때 (매번)

1. 질문 입력
   "Python 함수는?"

2. 질문을 벡터로 변환
   "Python 함수는?" → [0.24, -0.49, ...]

3. 벡터DB 검색
   가까운 청크 3개 찾기:
   → 청크 1 (유사도: 0.95)
   → 청크 2 (유사도: 0.87)
   → 청크 5 (유사도: 0.82)

4. GPT에 전달
   "문서: [청크 1, 2, 5]
    질문: Python 함수는?"

5. GPT 답변
   "def 키워드로 정의합니다..."

💡 실전 예시

시나리오: 회사 업무 매뉴얼

업로드한 문서:

출장 신청 규정
- 출장 3일 전까지 신청서 제출
- 승인은 2일 내 완료
- 경조사 출장은 당일 신청 가능

휴가 규정
- 연차: 15일
- 병가: 10일
- 경조사 휴가: 즉시 가능

재택근무 규정
- 주 2회 허용
- 사전 신청 필수

 

RAG 없이 (일반 ChatGPT)

질문: "출장 신청은 언제까지 해야 해?"

ChatGPT: "일반적으로 출장 1주일 전에 신청하는 것이 좋습니다." ❌

→ 우리 회사 규정(3일 전)을 모름!

 

RAG 사용

질문: "출장 신청은 언제까지 해야 해?"

1. 벡터DB 검색
   → "출장 신청 규정" 청크 찾음

2. GPT에 전달
   "문서: 출장 3일 전까지 신청서 제출
    질문: 출장 신청은 언제까지?"

3. GPT 답변
   "출장 3일 전까지 신청서를 제출해야 합니다." ✅

→ 회사 문서 기반 정확한 답변!

🎯 핵심 정리

3가지 개념

개념 역할 비유
청크 문서를 작게 자르기 책 → 페이지로 나누기
벡터DB 의미로 검색하기 구글 검색
RAG 검색 + GPT 답변 도서관 사서

 

왜 각각 필요한가?

청크:

  • 긴 문서 전체를 GPT에 주면 비용↑, 속도↓
  • 필요한 부분만 찾아서 주면 효율적

 

벡터DB:

  • 정확한 단어 매칭 대신 의미로 검색
  • "파이썬"으로 검색해도 "Python" 찾아줌

 

RAG:

  • ChatGPT 지식 + 내 문서 정보
  • 최신 정보, 회사 정보도 정확하게 답변

🆚 비교표

ChatGPT vs RAG

구분 일반 ChatGPT RAG
지식 출처 학습 데이터 (2023년까지) 내가 업로드한 문서
회사 정보 모름 ❌ 알고 있음 ✅
최신 정보 모름 ❌ 문서 업데이트 시 반영 ✅
정확도 일반적인 답변 문서 기반 정확한 답변
비용 저렴 약간 더 비쌈 (검색 비용 추가)
속도 빠름 약간 느림 (검색 시간 추가)

✅ 이해도 체크

Q1. 청크란 무엇인가요?

긴 문서를 작은 조각으로 자른 것.
예: 5000자 문서 → 1000자씩 5개 청크로 분할

 

Q2. 벡터DB는 일반 DB와 어떻게 다른가요?

일반 DB: 정확한 단어만 검색
벡터 DB: 의미가 비슷한 것도 검색
예: "파이썬" 검색 시 "Python", "프로그래밍" 모두 찾아줌

 

Q3. RAG의 3단계는?

  1. Retrieval (검색): 관련 문서 찾기
  2. Augmented (증강): 문서를 GPT에 추가
  3. Generation (생성): GPT가 답변 생성

 

Q4. 왜 RAG를 사용하나요?

ChatGPT가 모르는 정보(회사 문서, 최신 정보 등)를
내 문서에서 찾아서 정확하게 답변하게 만들기 위해


🚀 다음 단계

이제 개념을 이해했으니, 직접 만들어봅시다!

다음 포스팅: [AI Study]  LangChain으로 RAG 시스템 구축하기

실제 코드로 RAG 시스템을 구현해보겠습니다!


 

반응형

'AI' 카테고리의 다른 글

[AI Study] Kotlin + Langfuse로 OpenAI API 모니터링하기  (0) 2026.01.14