3차시. RAG 기본 구조 깊이 있게 이해하기
2. 준비 단계 상세 설명
출처: 원본 PDF 03차시_RAG기본구조깊이있게이해하기.pdf 3~6쪽 · 쪽 그림 3쪽 4쪽 5쪽 6쪽
2-1) Ingestion (문서 로딩)
Ingestion은 "섭취" 또는 "로딩"이라는 의미입니다. 쉽게 말해, 우리가 준비한 문서 파일들을 프로그램이 읽을 수 있도록 메모리에 로드하는 작업입니다.
🏢 실제 회사 예시
여러분이 고객지원팀이라고 가정합시다. 회사에 다음과 같은 문서들이 있습니다.
• 제품 매뉴얼 (manual.pdf)
• 자주 묻는 질문 (faq.txt)
• 배송 정책 (shipping_policy.docx)
• 반환 정책 (return_policy.pdf)
이 모든 문서를 프로그램으로 읽어서 메모리에 올리는 것이 Ingestion입니다.
💡 Ingestion의 세부 과정
1단계: 파일 형식 인식 (PDF인지, 텍스트인지, Word인지 판단)
2단계: 파일 열기 (해당 형식의 라이브러리 사용)
3단계: 텍스트 추출 (파일에서 실제 텍스트 꺼내기)
4단계: 메모리에 저장 (프로그램이 접근할 수 있도록 준비)
결과: 모든 문서의 텍스트가 하나의 큰 문자열로 준비됨
2-2) Chunking (텍스트 분할)
앞서 로드한 문서들은 매우 큽니다. 예를 들어 100페이지짜리 제품 매뉴얼을 한 번에 AI에게 전달할 수는 없습니다. AI의 Context Window에는 한계가 있기 때문입니다.
🍕 음식 비유로 이해하기
전체 피자를 입에 넣을 수 없으니 한 입 크기로 잘라서 먹습니다.
RAG의 Chunking도 비슷합니다. 큰 문서를 작은 조각(chunk)으로 나눠서 각각을 벡터로 변환하고 검색합니다.
📋 Chunking의 실제 예시
원본 문서
"제품 A의 기술 사양. 가로 100cm, 세로 50cm, 높이 30cm. 무게는 20kg. 재질은 알루미늄. 색상은 검은 색과 흰색. 보증 기간은 2년입니다."
Chunk 1 — "제품 A의 기술 사양. 가로 100cm, 세로 50cm, 높이 30cm. 무게는 20kg."
Chunk 2 — "재질은 알루미늄. 색상은 검은색과 흰색. 보증 기간은 2년입니다."
⚠️ Chunk Size의 선택이 중요합니다
너무 작은 Chunk (100 단어) — 정보가 너무 단편적이어서 맥락 파악이 어려움
적절한 Chunk (300-500 단어) — 충분한 정보를 담으면서도 의미 있는 단위
너무 큰 Chunk (2000 단어) — Context Window를 낭비하고, 불필요한 정보까지 포함
다음 차시에서 Chunk Size를 조정해서 결과를 비교해볼 것입니다!
2-3) Embedding (벡터 변환) — 가장 중요한 단계
출처: 원본 PDF 4~5쪽
Embedding은 RAG에서 가장 신비로운 단계입니다. 텍스트(예: "안녕하세요")를 숫자 배열(벡터)로 변환하는 작업입니다. 이것이 검색을 가능하게 하는 핵심 기술입니다.
🔄 Embedding의 과정
입력 — "우리 회사의 2024년 매출은 100억원입니다"
변환 과정 — 특별한 AI 모델(Embedding Model)이 이 문장을 분석합니다
출력 — [0.23, -0.15, 0.87, 0.12, -0.45, 0.66, … (384개 또는 그 이상)]
이렇게 변환된 숫자 배열을 "벡터"라고 부릅니다.
💡 왜 텍스트를 벡터로 변환할까?
1. 검색 효율성 — 벡터 간의 거리를 계산하는 것이 텍스트 비교보다 훨씬 빠릅니다
2. 의미 유사성 — 의미가 비슷한 문장들은 벡터도 비슷해집니다
3. 수학적 연산 — 벡터는 수학적 연산이 가능해서 복잡한 검색이 가능합니다
핵심: 벡터는 "의미를 숫자로 표현한 것"입니다!
🤔 벡터 이해하기 — 간단한 예시
실제로는 384개 또는 1536개의 숫자를 사용하지만, 이해를 위해 3개로 단순화하겠습니다.
"안녕하세요" → [0.8, 0.2, -0.1]
"안녕" → [0.75, 0.25, 0.0]
"고양이" → [-0.5, 0.9, 0.3]
보시다시피 "안녕하세요"와 "안녕"은 벡터도 비슷합니다! 하지만 "고양이"는 완전히 다릅니다. 이것이바로 벡터의 마법입니다.
2-4) Vector DB에 저장
출처: 원본 PDF 5~6쪽
모든 Chunk를 Embedding으로 변환했으면, 이제 그것들을 저장해야 합니다. 일반 데이터베이스가 아닌 Vector Database에 저장합니다.
| Vector ID | 원본 텍스트 | 벡터 |
|---|---|---|
| 1 | "제품 A의 기술 사양. 가로 100cm…" | [0.23, -0.15, 0.87, …] |
| 2 | "재질은 알루미늄. 색상은…" | [0.45, 0.12, -0.30, …] |
| 3 | "보증 기간은 2년입니다" | [-0.12, 0.56, 0.24, …] |
| 4 | "배송은 3-5일 소요됩니다" | [0.78, -0.05, 0.19, …] |
이렇게 모든 Chunk가 원본 텍스트와 벡터 쌍으로 저장됩니다.
🏢 유명한 Vector DB들
Pinecone — 클라우드 기반, 관리가 쉬움
Weaviate — 오픈소스, 커뮤니티 활발
Chroma — 가볍고 로컬에서 실행 가능 (우리 과정에서 사용)
FAISS — Facebook이 만든 고성능 검색 라이브러리
Milvus — 대규모 벡터 검색용
이 과정에서는 주로 Chroma와 FAISS를 사용합니다!